mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-13 15:01:49 +00:00
add transform vectors/matrices nan/inf check
This commit is contained in:
parent
35498e1c0f
commit
f1d85000e4
3 changed files with 54 additions and 0 deletions
|
|
@ -162,4 +162,19 @@ namespace util {
|
||||||
|
|
||||||
return a + glm::ivec3(glm::round(glm::vec3(vec) * t));
|
return a + glm::ivec3(glm::round(glm::vec3(vec) * t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <int n, typename T = float>
|
||||||
|
bool is_nan_or_inf(const glm::vec<n, T>& vector) {
|
||||||
|
return glm::any(glm::isnan(vector)) || glm::any(glm::isinf(vector));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int n, typename T = float>
|
||||||
|
bool is_nan_or_inf(const glm::mat<n, n, T>& matrix) {
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
if (is_nan_or_inf(matrix[i])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#include "Transform.hpp"
|
#include "Transform.hpp"
|
||||||
|
|
||||||
#include "data/dv_util.hpp"
|
#include "data/dv_util.hpp"
|
||||||
|
#include "maths/util.hpp"
|
||||||
|
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
|
||||||
|
|
@ -31,3 +32,28 @@ void Transform::deserialize(const dv::value& root) {
|
||||||
dv::get_vec(root, "size", size);
|
dv::get_vec(root, "size", size);
|
||||||
dv::get_mat(root, "rot", rot);
|
dv::get_mat(root, "rot", rot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Transform::checkValue(const glm::vec3& vector) {
|
||||||
|
if (util::is_nan_or_inf(vector)) {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
throw std::invalid_argument(
|
||||||
|
"invalid vector: " + std::to_string(vector.x) + ", " +
|
||||||
|
std::to_string(vector.y) + ", " + std::to_string(vector.z)
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Transform::checkValue(const glm::mat3& matrix) {
|
||||||
|
if (util::is_nan_or_inf(matrix)) {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
throw std::invalid_argument("invalid matrix (contains nan or inf)");
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
#define GLM_ENABLE_EXPERIMENTAL
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
#include <glm/vec3.hpp>
|
#include <glm/vec3.hpp>
|
||||||
#include <glm/mat4x4.hpp>
|
#include <glm/mat4x4.hpp>
|
||||||
#include <glm/gtx/norm.hpp>
|
#include <glm/gtx/norm.hpp>
|
||||||
|
|
@ -24,11 +25,17 @@ struct Transform {
|
||||||
void refresh();
|
void refresh();
|
||||||
|
|
||||||
inline void setRot(const glm::mat3& m) {
|
inline void setRot(const glm::mat3& m) {
|
||||||
|
if (!checkValue(m)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
rot = m;
|
rot = m;
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void setSize(const glm::vec3& v) {
|
inline void setSize(const glm::vec3& v) {
|
||||||
|
if (!checkValue(v)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (glm::distance2(displaySize, v) >= EPSILON) {
|
if (glm::distance2(displaySize, v) >= EPSILON) {
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
|
|
@ -36,9 +43,15 @@ struct Transform {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void setPos(const glm::vec3& v) {
|
inline void setPos(const glm::vec3& v) {
|
||||||
|
if (!checkValue(v)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (glm::distance2(displayPos, v) >= EPSILON) {
|
if (glm::distance2(displayPos, v) >= EPSILON) {
|
||||||
dirty = true;
|
dirty = true;
|
||||||
}
|
}
|
||||||
pos = v;
|
pos = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool checkValue(const glm::vec3& v);
|
||||||
|
static bool checkValue(const glm::mat3& v);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue