Merge pull request #777 from MihailRis/add-transform-values-nan/inf-check

add transform vectors/matrices nan/inf check
This commit is contained in:
MihailRis 2026-02-02 20:16:32 +03:00 • committed by GitHub
commit 2aee918d41
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 89 additions and 2 deletions

View file

@ -1,5 +1,24 @@
#include "libentity.hpp"
#include "maths/util.hpp"
static void check_valid(const glm::vec3& vec) {
if (util::is_nan_or_inf(vec)) {
throw std::invalid_argument(
"invalid vector: " + std::to_string(vec.x) + ", " +
std::to_string(vec.y) + ", " + std::to_string(vec.z)
);
}
}
static void check_valid(const glm::mat3& vec) {
if (util::is_nan_or_inf(vec)) {
throw std::invalid_argument(
"invalid matrix (contains nan or inf values)"
);
}
}
static int l_get_pos(lua::State* L) {
if (auto entity = get_entity(L, 1)) {
return lua::pushvec3(L, entity->getTransform().pos);
@ -10,6 +29,7 @@ static int l_get_pos(lua::State* L) {
static int l_set_pos(lua::State* L) {
if (auto entity = get_entity(L, 1)) {
auto vec = lua::tovec3(L, 2);
check_valid(vec);
entity->getTransform().setPos(vec);
entity->getRigidbody().hitbox.position = vec;
}
@ -25,7 +45,9 @@ static int l_get_size(lua::State* L) {
static int l_set_size(lua::State* L) {
if (auto entity = get_entity(L, 1)) {
entity->getTransform().setSize(lua::tovec3(L, 2));
auto vec = lua::tovec3(L, 2);
check_valid(vec);
entity->getTransform().setSize(vec);
}
return 0;
}
@ -39,7 +61,9 @@ static int l_get_rot(lua::State* L) {
static int l_set_rot(lua::State* L) {
if (auto entity = get_entity(L, 1)) {
entity->getTransform().setRot(lua::tomat4(L, 2));
auto matrix = lua::tomat4(L, 2);
check_valid(matrix);
entity->getTransform().setRot(matrix);
}
return 0;
}

View file

@ -162,4 +162,19 @@ namespace util {
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;
}
}

View file

@ -1,9 +1,13 @@
#include "Transform.hpp"
#include "data/dv_util.hpp"
#include "debug/Logger.hpp"
#include "maths/util.hpp"
#include <glm/gtc/matrix_transform.hpp>
static debug::Logger logger("entity-transform");
void Transform::refresh() {
combined = glm::mat4(1.0f);
combined = glm::translate(combined, pos);
@ -31,3 +35,34 @@ void Transform::deserialize(const dv::value& root) {
dv::get_vec(root, "size", size);
dv::get_mat(root, "rot", rot);
}
bool Transform::checkValue(const glm::vec3& vector, std::string_view name) {
if (util::is_nan_or_inf(vector)) {
auto message = "invalid vector attempted set to " + std::string(name) +
" : " + std::to_string(vector.x) + ", " +
std::to_string(vector.y) + ", " +
std::to_string(vector.z);
#ifndef NDEBUG
throw std::invalid_argument(message);
#else
logger.warning() << message;
return false;
#endif
}
return true;
}
bool Transform::checkValue(const glm::mat3& matrix, std::string_view name) {
if (util::is_nan_or_inf(matrix)) {
auto message =
"invalid matrix (contains nan or inf) attempted set to " +
std::string(name);
#ifndef NDEBUG
throw std::invalid_argument(message);
#else
logger.warning() << message;
return false;
#endif
}
return true;
}

View file

@ -2,6 +2,7 @@
#define GLM_ENABLE_EXPERIMENTAL
#include <stdexcept>
#include <glm/vec3.hpp>
#include <glm/mat4x4.hpp>
#include <glm/gtx/norm.hpp>
@ -24,11 +25,17 @@ struct Transform {
void refresh();
inline void setRot(const glm::mat3& m) {
if (!checkValue(m, "rotation")) {
return;
}
rot = m;
dirty = true;
}
inline void setSize(const glm::vec3& v) {
if (!checkValue(v, "size")) {
return;
}
if (glm::distance2(displaySize, v) >= EPSILON) {
dirty = true;
}
@ -36,9 +43,15 @@ struct Transform {
}
inline void setPos(const glm::vec3& v) {
if (!checkValue(v, "position")) {
return;
}
if (glm::distance2(displayPos, v) >= EPSILON) {
dirty = true;
}
pos = v;
}
static bool checkValue(const glm::vec3& v, std::string_view name);
static bool checkValue(const glm::mat3& v, std::string_view name);
};