Last active
August 29, 2015 14:24
-
-
Save tgfrerer/d7b7d151b06f88f9a761 to your computer and use it in GitHub Desktop.
utility methods for GLSL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ------------------------------------------------------------ | |
// Math | |
// ------------------------------------------------------------ | |
float map(in float val_, in float range_min_, in float range_max_, in float min_, in float max_){ | |
return ( min_ + ((max_ - min_)/(range_max_ - range_min_)) * clamp(val_, range_min_, range_max_)); | |
} | |
vec2 map(in vec2 val_, in vec2 range_min_, in vec2 range_max_, in vec2 min_, in vec2 max_){ | |
return ( min_ + ((max_ - min_)/(range_max_ - range_min_)) * clamp(val_, range_min_, range_max_)); | |
} | |
vec3 map(in vec3 val_, in vec3 range_min_, in vec3 range_max_, in vec3 min_, in vec3 max_){ | |
return ( min_ + ((max_ - min_)/(range_max_ - range_min_)) * clamp(val_, range_min_, range_max_)); | |
} | |
vec4 map(in vec4 val_, in vec4 range_min_, in vec4 range_max_, in vec4 min_, in vec4 max_){ | |
return ( min_ + ((max_ - min_)/(range_max_ - range_min_)) * clamp(val_, range_min_, range_max_)); | |
} | |
// --------- | |
vec4 getQuaternionForRotation( | |
const in float angle, /// angle in radians | |
const in vec3 axis) /// axis as a normalised vec3 | |
{ | |
vec4 _v; | |
const float epsilon = 0.0000001; | |
float length = length(axis); | |
if (length < epsilon) { | |
// ~zero length axis, so reset rotation to zero. | |
return vec4(0.0, 0.0, 0.0, 1.0); | |
} | |
float inversenorm = 1.0 / length; | |
float coshalfangle = cos( 0.5 * angle ); | |
float sinhalfangle = sin( 0.5 * angle ); | |
_v.x = axis.x * sinhalfangle * inversenorm; | |
_v.y = axis.y * sinhalfangle * inversenorm; | |
_v.z = axis.z * sinhalfangle * inversenorm; | |
_v.w = coshalfangle; | |
return _v; | |
} | |
// --------- | |
mat4 quatAsMatrix4x4(const in vec4 q) | |
// from OpenGL Mathematics (glm.g-truc.net) | |
// glm/gtc/quaternion.inl | |
{ | |
mat4 _mat; | |
_mat[0][0] = 1 - 2 * q.y * q.y - 2 * q.z * q.z; | |
_mat[0][1] = 2 * q.x * q.y + 2 * q.w * q.z; | |
_mat[0][2] = 2 * q.x * q.z - 2 * q.w * q.y; | |
_mat[0][3] = 0.0; | |
_mat[1][0] = 2 * q.x * q.y - 2 * q.w * q.z; | |
_mat[1][1] = 1 - 2 * q.x * q.x - 2 * q.z * q.z; | |
_mat[1][2] = 2 * q.y * q.z + 2 * q.w * q.x; | |
_mat[1][3] = 0.0; | |
_mat[2][0] = 2 * q.x * q.z + 2 * q.w * q.y; | |
_mat[2][1] = 2 * q.y * q.z - 2 * q.w * q.x; | |
_mat[2][2] = 1 - 2 * q.x * q.x - 2 * q.y * q.y; | |
_mat[2][3] = 0.0; | |
_mat[3][0] = 0.0; | |
_mat[3][1] = 0.0; | |
_mat[3][2] = 0.0; | |
_mat[3][3] = 1.0; | |
return _mat; | |
} | |
// ------------------------------------------------------------ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment