1b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///////////////////////////////////////////////////////////////////////////////////
2b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// OpenGL Mathematics (glm.g-truc.net)
3b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
4b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
5b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// Permission is hereby granted, free of charge, to any person obtaining a copy
6b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// of this software and associated documentation files (the "Software"), to deal
7b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// in the Software without restriction, including without limitation the rights
8b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// copies of the Software, and to permit persons to whom the Software is
10b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// furnished to do so, subject to the following conditions:
11b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
12b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// The above copyright notice and this permission notice shall be included in
13b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// all copies or substantial portions of the Software.
14b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
15b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// THE SOFTWARE.
22b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
23b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @ref core
24b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @file glm/core/dummy.cpp
25b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @date 2011-01-19 / 2011-06-15
26b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// @author Christophe Riccio
27b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///
28b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// GLM is a header only library. There is nothing to compile.
29b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/// dummy.cpp exist only a wordaround for CMake file.
30b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG///////////////////////////////////////////////////////////////////////////////////
31b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
32b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define GLM_FORCE_RADIANS
33b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define GLM_MESSAGES
34b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "../glm.hpp"
35b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <limits>
36b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
37b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstruct material
38b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
39b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 emission; // Ecm
40b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 ambient; // Acm
41b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 diffuse; // Dcm
42b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 specular; // Scm
43b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	float shininess; // Srm
44b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG};
45b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
46b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstruct light
47b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
48b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 ambient; // Acli
49b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 diffuse; // Dcli
50b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 specular; // Scli
51b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 position; // Ppli
52b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 halfVector; // Derived: Hi
53b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 spotDirection; // Sdli
54b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	float spotExponent; // Srli
55b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	float spotCutoff; // Crli
56b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	// (range: [0.0,90.0], 180.0)
57b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	float spotCosCutoff; // Derived: cos(Crli)
58b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	// (range: [1.0,0.0],-1.0)
59b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	float constantAttenuation; // K0
60b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	float linearAttenuation; // K1
61b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	float quadraticAttenuation;// K2
62b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG};
63b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
64b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
65b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Sample 1
66b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/vec3.hpp>// glm::vec3
67b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/geometric.hpp>// glm::cross, glm::normalize
68b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
69b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGglm::vec3 computeNormal
70b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG(
71b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 const & a,
72b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 const & b,
73b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 const & c
74b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG)
75b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
76b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	return glm::normalize(glm::cross(c - a, b - a));
77b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG}
78b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
79b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGtypedef unsigned int GLuint;
80b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define GL_FALSE 0
81b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGvoid glUniformMatrix4fv(GLuint, int, int, float*){}
82b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
83b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Sample 2
84b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/vec3.hpp> // glm::vec3
85b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/vec4.hpp> // glm::vec4, glm::ivec4
86b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/mat4x4.hpp> // glm::mat4
87b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective
88b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/gtc/type_ptr.hpp> // glm::value_ptr
89b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGvoid func(GLuint LocationMVP, float Translate, glm::vec2 const & Rotate)
90b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
91b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f);
92b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate));
93b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f));
94b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::mat4 View = glm::rotate(ViewRotateX, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f));
95b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));
96b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::mat4 MVP = Projection * View * Model;
97b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP));
98b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG}
99b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
100b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Sample 3
101b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/vec2.hpp>// glm::vec2
102b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/packing.hpp>// glm::packUnorm2x16
103b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/integer.hpp>// glm::uint
104b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/gtc/type_precision.hpp>// glm::i8vec2, glm::i32vec2
105b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstd::size_t const VertexCount = 4;
106b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Float quad geometry
107b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstd::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2);
108b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGglm::vec2 const PositionDataF32[VertexCount] =
109b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
110b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec2(-1.0f,-1.0f),
111b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec2( 1.0f,-1.0f),
112b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec2( 1.0f, 1.0f),
113b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec2(-1.0f, 1.0f)
114b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	};
115b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Half-float quad geometry
116b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstd::size_t const PositionSizeF16 = VertexCount * sizeof(glm::uint);
117b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGglm::uint const PositionDataF16[VertexCount] =
118b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
119b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, -1.0f))),
120b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, -1.0f))),
121b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, 1.0f))),
122b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, 1.0f)))
123b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG};
124b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// 8 bits signed integer quad geometry
125b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstd::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2);
126b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGglm::i8vec2 const PositionDataI8[VertexCount] =
127b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
128b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i8vec2(-1,-1),
129b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i8vec2( 1,-1),
130b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i8vec2( 1, 1),
131b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i8vec2(-1, 1)
132b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG};
133b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// 32 bits signed integer quad geometry
134b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstd::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2);
135b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGglm::i32vec2 const PositionDataI32[VertexCount] =
136b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
137b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i32vec2 (-1,-1),
138b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i32vec2 ( 1,-1),
139b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i32vec2 ( 1, 1),
140b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::i32vec2 (-1, 1)
141b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG};
142b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
143b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGstruct intersection
144b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
145b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec4 position;
146b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 normal;
147b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG};
148b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
149b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG/*
150b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Sample 4
151b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/vec3.hpp>// glm::vec3
152b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/geometric.hpp>// glm::normalize, glm::dot, glm::reflect
153b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/exponential.hpp>// glm::pow
154b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <glm/gtc/random.hpp>// glm::vecRand3
155b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGglm::vec3 lighting
156b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG(
157b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	intersection const & Intersection,
158b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	material const & Material,
159b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	light const & Light,
160b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 const & View
161b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG)
162b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
163b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 Color(0.0f);
164b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	glm::vec3 LightVertor(glm::normalize(
165b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		Light.position - Intersection.position +
166b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		glm::vecRand3(0.0f, Light.inaccuracy));
167b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG
168b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	if(!shadow(Intersection.position, Light.position, LightVertor))
169b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	{
170b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		float Diffuse = glm::dot(Intersection.normal, LightVector);
171b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		if(Diffuse <= 0.0f)
172b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG			return Color;
173b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		if(Material.isDiffuse())
174b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG			Color += Light.color() * Material.diffuse * Diffuse;
175b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		if(Material.isSpecular())
176b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		{
177b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG			glm::vec3 Reflect(glm::reflect(
178b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG				glm::normalize(-LightVector),
179b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG				glm::normalize(Intersection.normal)));
180b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG			float Dot = glm::dot(Reflect, View);
181b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG			float Base = Dot > 0.0f ? Dot : 0.0f;
182b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG			float Specular = glm::pow(Base, Material.exponent);
183b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG			Color += Material.specular * Specular;
184b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG		}
185b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	}
186b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG	return Color;
187b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG}
188b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG*/
189b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGint main()
190b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{
191	return 0;
192}
193