parent
							
								
									b7ee25e227
								
							
						
					
					
						commit
						d0c57e7afd
					
				
				 3 changed files with 236 additions and 236 deletions
			
			
		@ -1,232 +1,232 @@ | 
				
			||||
///////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||
/// OpenGL Mathematics (glm.g-truc.net)
 | 
				
			||||
///
 | 
				
			||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
 | 
				
			||||
/// Permission 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:
 | 
				
			||||
/// 
 | 
				
			||||
/// The above copyright notice and this permission notice shall be included in
 | 
				
			||||
/// all copies or substantial portions of the Software.
 | 
				
			||||
/// 
 | 
				
			||||
/// Restrictions:
 | 
				
			||||
///		By making use of the Software for military purposes, you choose to make
 | 
				
			||||
///		a Bunny unhappy.
 | 
				
			||||
/// 
 | 
				
			||||
/// THE 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.
 | 
				
			||||
///
 | 
				
			||||
/// @ref core
 | 
				
			||||
/// @file glm/core/dummy.cpp
 | 
				
			||||
/// @date 2011-01-19 / 2011-06-15
 | 
				
			||||
/// @author Christophe Riccio
 | 
				
			||||
///
 | 
				
			||||
/// GLM is a header only library. There is nothing to compile. 
 | 
				
			||||
/// dummy.cpp exist only a wordaround for CMake file.
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||
 | 
				
			||||
#define GLM_MESSAGES | 
				
			||||
#include <glm/glm.hpp> | 
				
			||||
#include <glm/ext.hpp> | 
				
			||||
#include <limits> | 
				
			||||
 | 
				
			||||
struct material | 
				
			||||
{ | 
				
			||||
	glm::vec4 emission; // Ecm
 | 
				
			||||
	glm::vec4 ambient; // Acm
 | 
				
			||||
	glm::vec4 diffuse; // Dcm
 | 
				
			||||
	glm::vec4 specular; // Scm
 | 
				
			||||
	float shininess; // Srm
 | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
struct light | 
				
			||||
{ | 
				
			||||
	glm::vec4 ambient; // Acli
 | 
				
			||||
	glm::vec4 diffuse; // Dcli
 | 
				
			||||
	glm::vec4 specular; // Scli
 | 
				
			||||
	glm::vec4 position; // Ppli
 | 
				
			||||
	glm::vec4 halfVector; // Derived: Hi
 | 
				
			||||
	glm::vec3 spotDirection; // Sdli
 | 
				
			||||
	float spotExponent; // Srli
 | 
				
			||||
	float spotCutoff; // Crli
 | 
				
			||||
	// (range: [0.0,90.0], 180.0)
 | 
				
			||||
	float spotCosCutoff; // Derived: cos(Crli)
 | 
				
			||||
	// (range: [1.0,0.0],-1.0)
 | 
				
			||||
	float constantAttenuation; // K0
 | 
				
			||||
	float linearAttenuation; // K1
 | 
				
			||||
	float quadraticAttenuation;// K2
 | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// Sample 1
 | 
				
			||||
#include <glm/vec3.hpp>// glm::vec3 | 
				
			||||
#include <glm/geometric.hpp>// glm::cross, glm::normalize | 
				
			||||
 | 
				
			||||
glm::vec3 computeNormal | 
				
			||||
( | 
				
			||||
	glm::vec3 const & a, | 
				
			||||
	glm::vec3 const & b, | 
				
			||||
	glm::vec3 const & c | 
				
			||||
) | 
				
			||||
{ | 
				
			||||
	return glm::normalize(glm::cross(c - a, b - a)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
typedef unsigned int GLuint; | 
				
			||||
#define GL_FALSE 0 | 
				
			||||
void glUniformMatrix4fv(GLuint, int, int, float*){} | 
				
			||||
 | 
				
			||||
// Sample 2
 | 
				
			||||
#include <glm/vec3.hpp> // glm::vec3 | 
				
			||||
#include <glm/vec4.hpp> // glm::vec4, glm::ivec4 | 
				
			||||
#include <glm/mat4x4.hpp> // glm::mat4 | 
				
			||||
#include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective | 
				
			||||
#include <glm/gtc/type_ptr.hpp> // glm::value_ptr | 
				
			||||
void func(GLuint LocationMVP, float Translate, glm::vec2 const & Rotate) | 
				
			||||
{ | 
				
			||||
	glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); | 
				
			||||
	glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate)); | 
				
			||||
	glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f)); | 
				
			||||
	glm::mat4 View = glm::rotate(ViewRotateX, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); | 
				
			||||
	glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f)); | 
				
			||||
	glm::mat4 MVP = Projection * View * Model; | 
				
			||||
	glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// Sample 3
 | 
				
			||||
#include <glm/vec2.hpp>// glm::vec2 | 
				
			||||
#include <glm/packing.hpp>// glm::packUnorm2x16 | 
				
			||||
#include <glm/integer.hpp>// glm::uint | 
				
			||||
#include <glm/gtc/type_precision.hpp>// glm::i8vec2, glm::i32vec2 | 
				
			||||
std::size_t const VertexCount = 4; | 
				
			||||
// Float quad geometry
 | 
				
			||||
std::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2); | 
				
			||||
glm::vec2 const PositionDataF32[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::vec2(-1.0f,-1.0f), | 
				
			||||
	glm::vec2( 1.0f,-1.0f), | 
				
			||||
	glm::vec2( 1.0f, 1.0f), | 
				
			||||
	glm::vec2(-1.0f, 1.0f) | 
				
			||||
	}; | 
				
			||||
// Half-float quad geometry
 | 
				
			||||
std::size_t const PositionSizeF16 = VertexCount * sizeof(glm::uint); | 
				
			||||
glm::uint const PositionDataF16[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, -1.0f))), | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, -1.0f))), | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, 1.0f))), | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, 1.0f))) | 
				
			||||
}; | 
				
			||||
// 8 bits signed integer quad geometry
 | 
				
			||||
std::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2); | 
				
			||||
glm::i8vec2 const PositionDataI8[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::i8vec2(-1,-1), | 
				
			||||
	glm::i8vec2( 1,-1), | 
				
			||||
	glm::i8vec2( 1, 1), | 
				
			||||
	glm::i8vec2(-1, 1) | 
				
			||||
}; | 
				
			||||
// 32 bits signed integer quad geometry
 | 
				
			||||
std::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2); | 
				
			||||
glm::i32vec2 const PositionDataI32[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::i32vec2 (-1,-1), | 
				
			||||
	glm::i32vec2 ( 1,-1), | 
				
			||||
	glm::i32vec2 ( 1, 1), | 
				
			||||
	glm::i32vec2 (-1, 1) | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
struct intersection | 
				
			||||
{ | 
				
			||||
	glm::vec4 position; | 
				
			||||
	glm::vec3 normal; | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
// Sample 4
 | 
				
			||||
#include <glm/vec3.hpp>// glm::vec3 | 
				
			||||
#include <glm/geometric.hpp>// glm::normalize, glm::dot, glm::reflect | 
				
			||||
#include <glm/exponential.hpp>// glm::pow | 
				
			||||
#include <glm/gtc/random.hpp>// glm::vecRand3 | 
				
			||||
glm::vec3 lighting | 
				
			||||
( | 
				
			||||
	intersection const & Intersection, | 
				
			||||
	material const & Material, | 
				
			||||
	light const & Light, | 
				
			||||
	glm::vec3 const & View | 
				
			||||
) | 
				
			||||
{ | 
				
			||||
	glm::vec3 Color(0.0f); | 
				
			||||
	glm::vec3 LightVertor(glm::normalize( | 
				
			||||
		Light.position - Intersection.position + | 
				
			||||
		glm::vecRand3(0.0f, Light.inaccuracy)); | 
				
			||||
 | 
				
			||||
	if(!shadow(Intersection.position, Light.position, LightVertor)) | 
				
			||||
	{ | 
				
			||||
		float Diffuse = glm::dot(Intersection.normal, LightVector); | 
				
			||||
		if(Diffuse <= 0.0f) | 
				
			||||
			return Color; | 
				
			||||
		if(Material.isDiffuse()) | 
				
			||||
			Color += Light.color() * Material.diffuse * Diffuse; | 
				
			||||
		if(Material.isSpecular()) | 
				
			||||
		{ | 
				
			||||
			glm::vec3 Reflect(glm::reflect( | 
				
			||||
				glm::normalize(-LightVector), | 
				
			||||
				glm::normalize(Intersection.normal))); | 
				
			||||
			float Dot = glm::dot(Reflect, View); | 
				
			||||
			float Base = Dot > 0.0f ? Dot : 0.0f; | 
				
			||||
			float Specular = glm::pow(Base, Material.exponent); | 
				
			||||
			Color += Material.specular * Specular; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
	return Color; | 
				
			||||
} | 
				
			||||
*/ | 
				
			||||
 | 
				
			||||
 | 
				
			||||
template <typename T, glm::precision P, template<typename, glm::precision> class vecType> | 
				
			||||
T normalizeDotA(vecType<T, P> const & x, vecType<T, P> const & y) | 
				
			||||
{ | 
				
			||||
	return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#define GLM_TEMPLATE_GENTYPE typename T, glm::precision P, template<typename, glm::precision> class | 
				
			||||
 | 
				
			||||
template <GLM_TEMPLATE_GENTYPE vecType> | 
				
			||||
T normalizeDotB(vecType<T, P> const & x, vecType<T, P> const & y) | 
				
			||||
{ | 
				
			||||
	return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
template <typename vecType> | 
				
			||||
typename vecType::value_type normalizeDotC(vecType const & a, vecType const & b) | 
				
			||||
{ | 
				
			||||
	return glm::dot(a, b) * glm::inversesqrt(glm::dot(a, a) * glm::dot(b, b)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
int main() | 
				
			||||
{ | 
				
			||||
	glm::vec1 o(1); | 
				
			||||
	glm::vec2 a(1); | 
				
			||||
	glm::vec3 b(1); | 
				
			||||
	glm::vec4 c(1); | 
				
			||||
 | 
				
			||||
	glm::quat q; | 
				
			||||
	glm::dualquat p; | 
				
			||||
 | 
				
			||||
	glm::mat4 m(1); | 
				
			||||
 | 
				
			||||
	float a0 = normalizeDotA(a, a); | 
				
			||||
	float b0 = normalizeDotB(b, b); | 
				
			||||
	float c0 = normalizeDotC(c, c); | 
				
			||||
 | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
///////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||
/// OpenGL Mathematics (glm.g-truc.net)
 | 
				
			||||
///
 | 
				
			||||
/// Copyright (c) 2005 - 2015 G-Truc Creation (www.g-truc.net)
 | 
				
			||||
/// Permission 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:
 | 
				
			||||
/// 
 | 
				
			||||
/// The above copyright notice and this permission notice shall be included in
 | 
				
			||||
/// all copies or substantial portions of the Software.
 | 
				
			||||
/// 
 | 
				
			||||
/// Restrictions:
 | 
				
			||||
///		By making use of the Software for military purposes, you choose to make
 | 
				
			||||
///		a Bunny unhappy.
 | 
				
			||||
/// 
 | 
				
			||||
/// THE 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.
 | 
				
			||||
///
 | 
				
			||||
/// @ref core
 | 
				
			||||
/// @file glm/core/dummy.cpp
 | 
				
			||||
/// @date 2011-01-19 / 2011-06-15
 | 
				
			||||
/// @author Christophe Riccio
 | 
				
			||||
///
 | 
				
			||||
/// GLM is a header only library. There is nothing to compile. 
 | 
				
			||||
/// dummy.cpp exist only a wordaround for CMake file.
 | 
				
			||||
///////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||
 | 
				
			||||
#define GLM_MESSAGES | 
				
			||||
#include <glm/glm.hpp> | 
				
			||||
#include <glm/ext.hpp> | 
				
			||||
#include <limits> | 
				
			||||
 | 
				
			||||
struct material | 
				
			||||
{ | 
				
			||||
	glm::vec4 emission; // Ecm
 | 
				
			||||
	glm::vec4 ambient; // Acm
 | 
				
			||||
	glm::vec4 diffuse; // Dcm
 | 
				
			||||
	glm::vec4 specular; // Scm
 | 
				
			||||
	float shininess; // Srm
 | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
struct light | 
				
			||||
{ | 
				
			||||
	glm::vec4 ambient; // Acli
 | 
				
			||||
	glm::vec4 diffuse; // Dcli
 | 
				
			||||
	glm::vec4 specular; // Scli
 | 
				
			||||
	glm::vec4 position; // Ppli
 | 
				
			||||
	glm::vec4 halfVector; // Derived: Hi
 | 
				
			||||
	glm::vec3 spotDirection; // Sdli
 | 
				
			||||
	float spotExponent; // Srli
 | 
				
			||||
	float spotCutoff; // Crli
 | 
				
			||||
	// (range: [0.0,90.0], 180.0)
 | 
				
			||||
	float spotCosCutoff; // Derived: cos(Crli)
 | 
				
			||||
	// (range: [1.0,0.0],-1.0)
 | 
				
			||||
	float constantAttenuation; // K0
 | 
				
			||||
	float linearAttenuation; // K1
 | 
				
			||||
	float quadraticAttenuation;// K2
 | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// Sample 1
 | 
				
			||||
#include <glm/vec3.hpp>// glm::vec3 | 
				
			||||
#include <glm/geometric.hpp>// glm::cross, glm::normalize | 
				
			||||
 | 
				
			||||
glm::vec3 computeNormal | 
				
			||||
( | 
				
			||||
	glm::vec3 const & a, | 
				
			||||
	glm::vec3 const & b, | 
				
			||||
	glm::vec3 const & c | 
				
			||||
) | 
				
			||||
{ | 
				
			||||
	return glm::normalize(glm::cross(c - a, b - a)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
typedef unsigned int GLuint; | 
				
			||||
#define GL_FALSE 0 | 
				
			||||
void glUniformMatrix4fv(GLuint, int, int, float*){} | 
				
			||||
 | 
				
			||||
// Sample 2
 | 
				
			||||
#include <glm/vec3.hpp> // glm::vec3 | 
				
			||||
#include <glm/vec4.hpp> // glm::vec4, glm::ivec4 | 
				
			||||
#include <glm/mat4x4.hpp> // glm::mat4 | 
				
			||||
#include <glm/gtc/matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective | 
				
			||||
#include <glm/gtc/type_ptr.hpp> // glm::value_ptr | 
				
			||||
void func(GLuint LocationMVP, float Translate, glm::vec2 const & Rotate) | 
				
			||||
{ | 
				
			||||
	glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); | 
				
			||||
	glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Translate)); | 
				
			||||
	glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Rotate.y, glm::vec3(-1.0f, 0.0f, 0.0f)); | 
				
			||||
	glm::mat4 View = glm::rotate(ViewRotateX, Rotate.x, glm::vec3(0.0f, 1.0f, 0.0f)); | 
				
			||||
	glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f)); | 
				
			||||
	glm::mat4 MVP = Projection * View * Model; | 
				
			||||
	glUniformMatrix4fv(LocationMVP, 1, GL_FALSE, glm::value_ptr(MVP)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
// Sample 3
 | 
				
			||||
#include <glm/vec2.hpp>// glm::vec2 | 
				
			||||
#include <glm/packing.hpp>// glm::packUnorm2x16 | 
				
			||||
#include <glm/integer.hpp>// glm::uint | 
				
			||||
#include <glm/gtc/type_precision.hpp>// glm::i8vec2, glm::i32vec2 | 
				
			||||
std::size_t const VertexCount = 4; | 
				
			||||
// Float quad geometry
 | 
				
			||||
std::size_t const PositionSizeF32 = VertexCount * sizeof(glm::vec2); | 
				
			||||
glm::vec2 const PositionDataF32[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::vec2(-1.0f,-1.0f), | 
				
			||||
	glm::vec2( 1.0f,-1.0f), | 
				
			||||
	glm::vec2( 1.0f, 1.0f), | 
				
			||||
	glm::vec2(-1.0f, 1.0f) | 
				
			||||
	}; | 
				
			||||
// Half-float quad geometry
 | 
				
			||||
std::size_t const PositionSizeF16 = VertexCount * sizeof(glm::uint); | 
				
			||||
glm::uint const PositionDataF16[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, -1.0f))), | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, -1.0f))), | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2( 1.0f, 1.0f))), | 
				
			||||
	glm::uint(glm::packUnorm2x16(glm::vec2(-1.0f, 1.0f))) | 
				
			||||
}; | 
				
			||||
// 8 bits signed integer quad geometry
 | 
				
			||||
std::size_t const PositionSizeI8 = VertexCount * sizeof(glm::i8vec2); | 
				
			||||
glm::i8vec2 const PositionDataI8[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::i8vec2(-1,-1), | 
				
			||||
	glm::i8vec2( 1,-1), | 
				
			||||
	glm::i8vec2( 1, 1), | 
				
			||||
	glm::i8vec2(-1, 1) | 
				
			||||
}; | 
				
			||||
// 32 bits signed integer quad geometry
 | 
				
			||||
std::size_t const PositionSizeI32 = VertexCount * sizeof(glm::i32vec2); | 
				
			||||
glm::i32vec2 const PositionDataI32[VertexCount] = | 
				
			||||
{ | 
				
			||||
	glm::i32vec2 (-1,-1), | 
				
			||||
	glm::i32vec2 ( 1,-1), | 
				
			||||
	glm::i32vec2 ( 1, 1), | 
				
			||||
	glm::i32vec2 (-1, 1) | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
struct intersection | 
				
			||||
{ | 
				
			||||
	glm::vec4 position; | 
				
			||||
	glm::vec3 normal; | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
/*
 | 
				
			||||
// Sample 4
 | 
				
			||||
#include <glm/vec3.hpp>// glm::vec3 | 
				
			||||
#include <glm/geometric.hpp>// glm::normalize, glm::dot, glm::reflect | 
				
			||||
#include <glm/exponential.hpp>// glm::pow | 
				
			||||
#include <glm/gtc/random.hpp>// glm::vecRand3 | 
				
			||||
glm::vec3 lighting | 
				
			||||
( | 
				
			||||
	intersection const & Intersection, | 
				
			||||
	material const & Material, | 
				
			||||
	light const & Light, | 
				
			||||
	glm::vec3 const & View | 
				
			||||
) | 
				
			||||
{ | 
				
			||||
	glm::vec3 Color(0.0f); | 
				
			||||
	glm::vec3 LightVertor(glm::normalize( | 
				
			||||
		Light.position - Intersection.position + | 
				
			||||
		glm::vecRand3(0.0f, Light.inaccuracy)); | 
				
			||||
 | 
				
			||||
	if(!shadow(Intersection.position, Light.position, LightVertor)) | 
				
			||||
	{ | 
				
			||||
		float Diffuse = glm::dot(Intersection.normal, LightVector); | 
				
			||||
		if(Diffuse <= 0.0f) | 
				
			||||
			return Color; | 
				
			||||
		if(Material.isDiffuse()) | 
				
			||||
			Color += Light.color() * Material.diffuse * Diffuse; | 
				
			||||
		if(Material.isSpecular()) | 
				
			||||
		{ | 
				
			||||
			glm::vec3 Reflect(glm::reflect( | 
				
			||||
				glm::normalize(-LightVector), | 
				
			||||
				glm::normalize(Intersection.normal))); | 
				
			||||
			float Dot = glm::dot(Reflect, View); | 
				
			||||
			float Base = Dot > 0.0f ? Dot : 0.0f; | 
				
			||||
			float Specular = glm::pow(Base, Material.exponent); | 
				
			||||
			Color += Material.specular * Specular; | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
	return Color; | 
				
			||||
} | 
				
			||||
*/ | 
				
			||||
 | 
				
			||||
 | 
				
			||||
template <typename T, glm::precision P, template<typename, glm::precision> class vecType> | 
				
			||||
T normalizeDotA(vecType<T, P> const & x, vecType<T, P> const & y) | 
				
			||||
{ | 
				
			||||
	return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
#define GLM_TEMPLATE_GENTYPE typename T, glm::precision P, template<typename, glm::precision> class | 
				
			||||
 | 
				
			||||
template <GLM_TEMPLATE_GENTYPE vecType> | 
				
			||||
T normalizeDotB(vecType<T, P> const & x, vecType<T, P> const & y) | 
				
			||||
{ | 
				
			||||
	return glm::dot(x, y) * glm::inversesqrt(glm::dot(x, x) * glm::dot(y, y)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
template <typename vecType> | 
				
			||||
typename vecType::value_type normalizeDotC(vecType const & a, vecType const & b) | 
				
			||||
{ | 
				
			||||
	return glm::dot(a, b) * glm::inversesqrt(glm::dot(a, a) * glm::dot(b, b)); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
int main() | 
				
			||||
{ | 
				
			||||
	glm::vec1 o(1); | 
				
			||||
	glm::vec2 a(1); | 
				
			||||
	glm::vec3 b(1); | 
				
			||||
	glm::vec4 c(1); | 
				
			||||
 | 
				
			||||
	glm::quat q; | 
				
			||||
	glm::dualquat p; | 
				
			||||
 | 
				
			||||
	glm::mat4 m(1); | 
				
			||||
 | 
				
			||||
	float a0 = normalizeDotA(a, a); | 
				
			||||
	float b0 = normalizeDotB(b, b); | 
				
			||||
	float c0 = normalizeDotC(c, c); | 
				
			||||
 | 
				
			||||
	return 0; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
					Loading…
					
					
				
		Reference in New Issue