From 7887318def8ad4fa5bcdb04b1dfd00a4762fb83e Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sun, 23 Apr 2017 19:31:00 -0600 Subject: [PATCH] common: move vec_from_mangle and mangle_from_vec to mathlib --- common/mathlib.cc | 30 ++++++++++++++++++++++++++++++ include/common/mathlib.hh | 2 ++ include/light/settings.hh | 2 -- light/settings.cc | 31 +------------------------------ 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/common/mathlib.cc b/common/mathlib.cc index 6f3a0cf4..3c26ab6e 100644 --- a/common/mathlib.cc +++ b/common/mathlib.cc @@ -137,6 +137,36 @@ glm::vec3 CosineWeightedHemisphereSample(float u1, float u2) return glm::vec3(x, y, z); } +glm::vec3 vec_from_mangle(const glm::vec3 &m) +{ + const glm::vec3 tmp = m * static_cast(Q_PI / 180.0f); + + const glm::vec3 v(cos(tmp[0]) * cos(tmp[1]), + sin(tmp[0]) * cos(tmp[1]), + sin(tmp[1])); + return v; +} + +glm::vec3 mangle_from_vec(const glm::vec3 &v) +{ + const glm::vec3 up(0, 0, 1); + const glm::vec3 east(1, 0, 0); + const glm::vec3 north(0, 1, 0); + + // get rotation about Z axis + float x = glm::dot(east, v); + float y = glm::dot(north, v); + float theta = atan2f(y, x); + + // get angle away from Z axis + float cosangleFromUp = glm::dot(up, v); + cosangleFromUp = qmin(qmax(-1.0f, cosangleFromUp), 1.0f); + float radiansFromUp = acosf(cosangleFromUp); + + const glm::vec3 mangle = glm::vec3(theta, -(radiansFromUp - Q_PI/2.0), 0) * static_cast(180.0f / Q_PI); + return mangle; +} + // Returns a 3x3 matrix that rotates (0,0,1) to the given surface normal. glm::mat3x3 RotateFromUpToSurfaceNormal(const glm::vec3 &surfaceNormal) { diff --git a/include/common/mathlib.hh b/include/common/mathlib.hh index 0ed5b64a..f1bcac8a 100644 --- a/include/common/mathlib.hh +++ b/include/common/mathlib.hh @@ -222,6 +222,8 @@ const char *VecStrf(const vec3_t vec); void UniformPointOnSphere(vec3_t dir, float u, float v); void RandomDir(vec3_t dir); glm::vec3 CosineWeightedHemisphereSample(float u1, float u2); +glm::vec3 vec_from_mangle(const glm::vec3 &m); +glm::vec3 mangle_from_vec(const glm::vec3 &v); glm::mat3x3 RotateFromUpToSurfaceNormal(const glm::vec3 &surfaceNormal); bool AABBsDisjoint(const vec3_t minsA, const vec3_t maxsA, const vec3_t minsB, const vec3_t maxsB); void AABB_Init(vec3_t mins, vec3_t maxs, const vec3_t pt); diff --git a/include/light/settings.hh b/include/light/settings.hh index ce312052..91ac69ac 100644 --- a/include/light/settings.hh +++ b/include/light/settings.hh @@ -42,8 +42,6 @@ enum class vec3_transformer_t { NORMALIZE_COLOR_TO_255 }; -glm::vec3 vec_from_mangle(const glm::vec3 &m); -glm::vec3 mangle_from_vec(const glm::vec3 &v); void normalize_color_format(vec3_t color); class lockable_setting_t { diff --git a/light/settings.cc b/light/settings.cc index 9481899c..0ffa82c4 100644 --- a/light/settings.cc +++ b/light/settings.cc @@ -19,36 +19,7 @@ */ #include - -glm::vec3 vec_from_mangle(const glm::vec3 &m) -{ - const glm::vec3 tmp = m * static_cast(Q_PI / 180.0f); - - const glm::vec3 v(cos(tmp[0]) * cos(tmp[1]), - sin(tmp[0]) * cos(tmp[1]), - sin(tmp[1])); - return v; -} - -glm::vec3 mangle_from_vec(const glm::vec3 &v) -{ - const glm::vec3 up(0, 0, 1); - const glm::vec3 east(1, 0, 0); - const glm::vec3 north(0, 1, 0); - - // get rotation about Z axis - float x = glm::dot(east, v); - float y = glm::dot(north, v); - float theta = atan2f(y, x); - - // get angle away from Z axis - float cosangleFromUp = glm::dot(up, v); - cosangleFromUp = qmin(qmax(-1.0f, cosangleFromUp), 1.0f); - float radiansFromUp = acosf(cosangleFromUp); - - const glm::vec3 mangle = glm::vec3(theta, -(radiansFromUp - Q_PI/2.0), 0) * static_cast(180.0f / Q_PI); - return mangle; -} +#include /* detect colors with components in 0-1 and scale them to 0-255 */ void