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