Rebuild trinity visualizer from bare SDL and OpenGL to using Raylib. Added Code for serial parsing on linux. Current functionality reads incoming quaternion packet data coming in over serial and displays the values and also visualizes with a cube, connect and disconnect is implemented. Essentially rebuild the functionality of the old version with added linux support.

This commit is contained in:
2026-09-13 19:44:26 +02:00
commit 62abf4d5d6
821 changed files with 239694 additions and 0 deletions
+497
View File
@@ -0,0 +1,497 @@
/// @ref gtx_string_cast
#include <cstdarg>
#include <cstdio>
namespace glm{
namespace detail
{
template <typename T>
struct cast
{
typedef T value_type;
};
template <>
struct cast<float>
{
typedef double value_type;
};
GLM_FUNC_QUALIFIER std::string format(const char* message, ...) {
std::size_t const STRING_BUFFER(4096);
assert(message != NULL);
assert(strlen(message) < STRING_BUFFER);
char buffer[STRING_BUFFER];
va_list list;
#if GLM_COMPILER & GLM_COMPILER_CLANG
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wformat-nonliteral"
#endif
va_start(list, message);
vsnprintf(buffer, STRING_BUFFER, message, list);
va_end(list);
#if GLM_COMPILER & GLM_COMPILER_CLANG
# pragma clang diagnostic pop
#endif
return buffer;
}
static const char* LabelTrue = "true";
static const char* LabelFalse = "false";
template<typename T, bool isFloat = false>
struct literal
{
GLM_FUNC_QUALIFIER static char const * value() {return "%d";}
};
template<typename T>
struct literal<T, true>
{
GLM_FUNC_QUALIFIER static char const * value() {return "%f";}
};
# if GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC
template<>
struct literal<uint64_t, false>
{
GLM_FUNC_QUALIFIER static char const * value() {return "%lld";}
};
template<>
struct literal<int64_t, false>
{
GLM_FUNC_QUALIFIER static char const * value() {return "%lld";}
};
# endif//GLM_MODEL == GLM_MODEL_32 && GLM_COMPILER && GLM_COMPILER_VC
template<typename T>
struct prefix{};
template<>
struct prefix<float>
{
GLM_FUNC_QUALIFIER static char const * value() {return "";}
};
template<>
struct prefix<double>
{
GLM_FUNC_QUALIFIER static char const * value() {return "d";}
};
template<>
struct prefix<bool>
{
GLM_FUNC_QUALIFIER static char const * value() {return "b";}
};
template<>
struct prefix<uint8_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "u8";}
};
template<>
struct prefix<int8_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "i8";}
};
template<>
struct prefix<uint16_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "u16";}
};
template<>
struct prefix<int16_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "i16";}
};
template<>
struct prefix<uint32_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "u";}
};
template<>
struct prefix<int32_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "i";}
};
template<>
struct prefix<uint64_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "u64";}
};
template<>
struct prefix<int64_t>
{
GLM_FUNC_QUALIFIER static char const * value() {return "i64";}
};
template<typename matType>
struct compute_to_string
{};
template<qualifier Q>
struct compute_to_string<vec<1, bool, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<1, bool, Q> const& x)
{
return detail::format("bvec1(%s)",
x[0] ? detail::LabelTrue : detail::LabelFalse);
}
};
template<qualifier Q>
struct compute_to_string<vec<2, bool, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<2, bool, Q> const& x)
{
return detail::format("bvec2(%s, %s)",
x[0] ? detail::LabelTrue : detail::LabelFalse,
x[1] ? detail::LabelTrue : detail::LabelFalse);
}
};
template<qualifier Q>
struct compute_to_string<vec<3, bool, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<3, bool, Q> const& x)
{
return detail::format("bvec3(%s, %s, %s)",
x[0] ? detail::LabelTrue : detail::LabelFalse,
x[1] ? detail::LabelTrue : detail::LabelFalse,
x[2] ? detail::LabelTrue : detail::LabelFalse);
}
};
template<qualifier Q>
struct compute_to_string<vec<4, bool, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<4, bool, Q> const& x)
{
return detail::format("bvec4(%s, %s, %s, %s)",
x[0] ? detail::LabelTrue : detail::LabelFalse,
x[1] ? detail::LabelTrue : detail::LabelFalse,
x[2] ? detail::LabelTrue : detail::LabelFalse,
x[3] ? detail::LabelTrue : detail::LabelFalse);
}
};
template<typename T, qualifier Q>
struct compute_to_string<vec<1, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<1, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%svec1(%s)",
PrefixStr,
LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<vec<2, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<2, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%svec2(%s, %s)",
PrefixStr,
LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0]),
static_cast<typename cast<T>::value_type>(x[1]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<vec<3, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<3, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%svec3(%s, %s, %s)",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0]),
static_cast<typename cast<T>::value_type>(x[1]),
static_cast<typename cast<T>::value_type>(x[2]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<vec<4, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(vec<4, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%svec4(%s, %s, %s, %s)",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0]),
static_cast<typename cast<T>::value_type>(x[1]),
static_cast<typename cast<T>::value_type>(x[2]),
static_cast<typename cast<T>::value_type>(x[3]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<2, 2, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<2, 2, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat2x2((%s, %s), (%s, %s))",
PrefixStr,
LiteralStr, LiteralStr,
LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<2, 3, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<2, 3, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat2x3((%s, %s, %s), (%s, %s, %s))",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<2, 4, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<2, 4, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat2x4((%s, %s, %s, %s), (%s, %s, %s, %s))",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<3, 2, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<3, 2, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat3x2((%s, %s), (%s, %s), (%s, %s))",
PrefixStr,
LiteralStr, LiteralStr,
LiteralStr, LiteralStr,
LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]),
static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<3, 3, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<3, 3, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat3x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s))",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]),
static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<3, 4, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<3, 4, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat3x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]),
static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<4, 2, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<4, 2, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat4x2((%s, %s), (%s, %s), (%s, %s), (%s, %s))",
PrefixStr,
LiteralStr, LiteralStr,
LiteralStr, LiteralStr,
LiteralStr, LiteralStr,
LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]),
static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]),
static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<4, 3, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<4, 3, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat4x3((%s, %s, %s), (%s, %s, %s), (%s, %s, %s), (%s, %s, %s))",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]),
static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]),
static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<mat<4, 4, T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(mat<4, 4, T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%smat4x4((%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s), (%s, %s, %s, %s))",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x[0][0]), static_cast<typename cast<T>::value_type>(x[0][1]), static_cast<typename cast<T>::value_type>(x[0][2]), static_cast<typename cast<T>::value_type>(x[0][3]),
static_cast<typename cast<T>::value_type>(x[1][0]), static_cast<typename cast<T>::value_type>(x[1][1]), static_cast<typename cast<T>::value_type>(x[1][2]), static_cast<typename cast<T>::value_type>(x[1][3]),
static_cast<typename cast<T>::value_type>(x[2][0]), static_cast<typename cast<T>::value_type>(x[2][1]), static_cast<typename cast<T>::value_type>(x[2][2]), static_cast<typename cast<T>::value_type>(x[2][3]),
static_cast<typename cast<T>::value_type>(x[3][0]), static_cast<typename cast<T>::value_type>(x[3][1]), static_cast<typename cast<T>::value_type>(x[3][2]), static_cast<typename cast<T>::value_type>(x[3][3]));
}
};
template<typename T, qualifier Q>
struct compute_to_string<qua<T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(qua<T, Q> const& q)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%squat(%s, {%s, %s, %s})",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(q.w),
static_cast<typename cast<T>::value_type>(q.x),
static_cast<typename cast<T>::value_type>(q.y),
static_cast<typename cast<T>::value_type>(q.z));
}
};
template<typename T, qualifier Q>
struct compute_to_string<tdualquat<T, Q> >
{
GLM_FUNC_QUALIFIER static std::string call(tdualquat<T, Q> const& x)
{
char const * PrefixStr = prefix<T>::value();
char const * LiteralStr = literal<T, std::numeric_limits<T>::is_iec559>::value();
std::string FormatStr(detail::format("%sdualquat((%s, {%s, %s, %s}), (%s, {%s, %s, %s}))",
PrefixStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr,
LiteralStr, LiteralStr, LiteralStr, LiteralStr));
return detail::format(FormatStr.c_str(),
static_cast<typename cast<T>::value_type>(x.real.w),
static_cast<typename cast<T>::value_type>(x.real.x),
static_cast<typename cast<T>::value_type>(x.real.y),
static_cast<typename cast<T>::value_type>(x.real.z),
static_cast<typename cast<T>::value_type>(x.dual.w),
static_cast<typename cast<T>::value_type>(x.dual.x),
static_cast<typename cast<T>::value_type>(x.dual.y),
static_cast<typename cast<T>::value_type>(x.dual.z));
}
};
}//namespace detail
template<class matType>
GLM_FUNC_QUALIFIER std::string to_string(matType const& x)
{
return detail::compute_to_string<matType>::call(x);
}
}//namespace glm