/// @ref core | |
/// @file glm/core/dummy.cpp | |
/// | |
/// 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; | |
} |