Skip to content

Instantly share code, notes, and snippets.

@tgfrerer
Last active August 29, 2015 14:24
Show Gist options
  • Save tgfrerer/d7b7d151b06f88f9a761 to your computer and use it in GitHub Desktop.
Save tgfrerer/d7b7d151b06f88f9a761 to your computer and use it in GitHub Desktop.
utility methods for GLSL
// ------------------------------------------------------------
// 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