112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/////////////////////////////////////////////////////////////////////////////////// 212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// OpenGL Mathematics (glm.g-truc.net) 312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// 412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) 512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// Permission is hereby granted, free of charge, to any person obtaining a copy 612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// of this software and associated documentation files (the "Software"), to deal 712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// in the Software without restriction, including without limitation the rights 812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// copies of the Software, and to permit persons to whom the Software is 1012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// furnished to do so, subject to the following conditions: 1112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// 1212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// The above copyright notice and this permission notice shall be included in 1312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// all copies or substantial portions of the Software. 1412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// 1512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 2112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// THE SOFTWARE. 2212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// 2312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// @ref core 2412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// @file glm/core/dummy.cpp 2512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// @date 2011-01-19 / 2011-06-15 2612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// @author Christophe Riccio 2712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// 2812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// GLM is a header only library. There is nothing to compile. 2912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/// dummy.cpp exist only a wordaround for CMake file. 3012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/////////////////////////////////////////////////////////////////////////////////// 3112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 3212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#define GLM_FORCE_RADIANS 3312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#define GLM_MESSAGES 3412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include "../glm.hpp" 3512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <limits> 3612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 3712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstruct material 3812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 3912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 emission; // Ecm 4012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 ambient; // Acm 4112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 diffuse; // Dcm 4212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 specular; // Scm 4312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float shininess; // Srm 4412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen}; 4512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstruct light 4612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 4712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 ambient; // Acli 4812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 diffuse; // Dcli 4912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 specular; // Scli 5012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 position; // Ppli 5112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 halfVector; // Derived: Hi 5212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 spotDirection; // Sdli 5312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float spotExponent; // Srli 5412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float spotCutoff; // Crli 5512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen // (range: [0.0,90.0], 180.0) 5612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float spotCosCutoff; // Derived: cos(Crli) 5712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen // (range: [1.0,0.0],-1.0) 5812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float constantAttenuation; // K0 5912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float linearAttenuation; // K1 6012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float quadraticAttenuation;// K2 6112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen}; 6212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 6312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// Sample 1 6412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/vec3.hpp>// glm::vec3 6512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/geometric.hpp>// glm::cross, glm::normalize 6612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 6712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenglm::vec3 computeNormal 6812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen( 6912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 const & a, 7012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 const & b, 7112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 const & c 7212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen) 7312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 7412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen return glm::normalize(glm::cross(c - a, b - a)); 7512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen} 7612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 7712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblentypedef unsigned int GLuint; 7812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#define GL_FALSE 0 7912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenvoid glUniformMatrix4fv(GLuint, int, int, float*){} 8012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 8112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// Sample 2 8212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/vec3.hpp> // glm::vec3 8312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/vec4.hpp> // glm::vec4, glm::ivec4 8412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/mat4x4.hpp> // glm::mat4 8512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective 8612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/gtc/type_ptr.hpp> // glm::value_ptr 8712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenvoid func(GLuint LocationMVP, float Translate, glm::vec2 const & Rotate) 8812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 8912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); 9012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate)); 9112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f)); 9212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::mat4 View = glm::rotate(ViewRotateX, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); 9312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f)); 9412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::mat4 MVP = Projection * View * Model; 9512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP)); 9612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen} 9712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 9812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// Sample 3 9912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/vec2.hpp>// glm::vec2 10012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/packing.hpp>// glm::packUnorm2x16 10112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/integer.hpp>// glm::uint 10212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/gtc/type_precision.hpp>// glm::i8vec2, glm::i32vec2 10312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstd::size_t const VertexCount = 4; 10412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// Float quad geometry 10512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstd::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2); 10612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenglm::vec2 const PositionDataF32[VertexCount] = 10712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 10812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec2(-1.0f,-1.0f), 10912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec2( 1.0f,-1.0f), 11012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec2( 1.0f, 1.0f), 11112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec2(-1.0f, 1.0f) 11212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen }; 11312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// Half-float quad geometry 11412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstd::size_t const PositionSizeF16 = VertexCount * sizeof(glm::uint); 11512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenglm::uint const PositionDataF16[VertexCount] = 11612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 11712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, -1.0f))), 11812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, -1.0f))), 11912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, 1.0f))), 12012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, 1.0f))) 12112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen}; 12212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// 8 bits signed integer quad geometry 12312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstd::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2); 12412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenglm::i8vec2 const PositionDataI8[VertexCount] = 12512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 12612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i8vec2(-1,-1), 12712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i8vec2( 1,-1), 12812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i8vec2( 1, 1), 12912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i8vec2(-1, 1) 13012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen}; 13112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// 32 bits signed integer quad geometry 13212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstd::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2); 13312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenglm::i32vec2 const PositionDataI32[VertexCount] = 13412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 13512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i32vec2 (-1,-1), 13612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i32vec2 ( 1,-1), 13712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i32vec2 ( 1, 1), 13812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::i32vec2 (-1, 1) 13912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen}; 14012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 14112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenstruct intersection 14212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 14312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec4 position; 14412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 normal; 14512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen}; 14612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 14712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen/* 14812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen// Sample 4 14912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/vec3.hpp>// glm::vec3 15012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/geometric.hpp>// glm::normalize, glm::dot, glm::reflect 15112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/exponential.hpp>// glm::pow 15212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen#include <glm/gtc/random.hpp>// glm::vecRand3 15312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenglm::vec3 lighting 15412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen( 15512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen intersection const & Intersection, 15612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen material const & Material, 15712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen light const & Light, 15812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 const & View 15912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen) 16012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 16112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 Color(0.0f); 16212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 LightVertor(glm::normalize( 16312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen Light.position - Intersection.position + 16412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vecRand3(0.0f, Light.inaccuracy)); 16512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen 16612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen if(!shadow(Intersection.position, Light.position, LightVertor)) 16712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen { 16812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float Diffuse = glm::dot(Intersection.normal, LightVector); 16912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen if(Diffuse <= 0.0f) 17012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen return Color; 17112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen if(Material.isDiffuse()) 17212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen Color += Light.color() * Material.diffuse * Diffuse; 17312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen if(Material.isSpecular()) 17412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen { 17512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::vec3 Reflect(glm::reflect( 17612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::normalize(-LightVector), 17712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen glm::normalize(Intersection.normal))); 17812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float Dot = glm::dot(Reflect, View); 17912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float Base = Dot > 0.0f ? Dot : 0.0f; 18012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen float Specular = glm::pow(Base, Material.exponent); 18112156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen Color += Material.specular * Specular; 18212156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen } 18312156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen } 18412156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen return Color; 18512156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen} 18612156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen*/ 18712156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblenint main() 18812156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen{ 18912156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen return 0; 19012156bdeb0730e42e52b0d228b2ec897271ba59aMike Weiblen} 191