13#include <janus/core/JanusTypes.hpp>
14#include <janus/math/Quaternion.hpp>
15#include <yaml-cpp/yaml.h>
24template <
typename T>
struct convert<janus::Vec3<T>> {
26 static Node
encode(
const janus::Vec3<T> &v) {
28 node.push_back(v.x());
29 node.push_back(v.y());
30 node.push_back(v.z());
35 static bool decode(
const Node &node, janus::Vec3<T> &v) {
36 if (!node.IsSequence() || node.size() != 3) {
40 v = janus::Vec3<T>{node[0].as<T>(), node[1].as<T>(),
43 }
catch (
const YAML::Exception &) {
54template <
typename T>
struct convert<janus::Quaternion<T>> {
56 static Node
encode(
const janus::Quaternion<T> &q) {
66 static bool decode(
const Node &node, janus::Quaternion<T> &q) {
67 if (!node.IsSequence() || node.size() != 4) {
71 q = janus::Quaternion<T>{node[0].as<T>(),
76 }
catch (
const YAML::Exception &) {
87template <
typename T>
struct convert<janus::Mat3<T>> {
89 static Node
encode(
const janus::Mat3<T> &m) {
91 for (
int i = 0; i < 3; ++i) {
93 for (
int j = 0; j < 3; ++j) {
94 row.push_back(m(i, j));
102 static bool decode(
const Node &node, janus::Mat3<T> &m) {
103 if (!node.IsSequence()) {
110 if (node.size() == 3 && node[0].IsSequence()) {
111 for (
int i = 0; i < 3; ++i) {
112 if (node[i].size() != 3) {
115 for (
int j = 0; j < 3; ++j) {
116 m(i, j) = node[i][j].as<T>();
124 if (node.size() == 9) {
125 for (
int i = 0; i < 3; ++i) {
126 for (
int j = 0; j < 3; ++j) {
127 m(i, j) = node[i * 3 + j].as<T>();
132 }
catch (
const YAML::Exception &) {
146inline Emitter &
operator<<(Emitter &emitter,
const janus::Vec3<T> &v) {
147 emitter << YAML::Flow << YAML::BeginSeq;
148 emitter << v.x() << v.y() << v.z();
149 emitter << YAML::EndSeq;
155inline Emitter &
operator<<(Emitter &emitter,
const janus::Quaternion<T> &q) {
156 emitter << YAML::Flow << YAML::BeginSeq;
157 emitter << q.w << q.x << q.y << q.z;
158 emitter << YAML::EndSeq;
164inline Emitter &
operator<<(Emitter &emitter,
const janus::Mat3<T> &m) {
165 emitter << YAML::BeginSeq;
166 for (
int i = 0; i < 3; ++i) {
167 emitter << YAML::Flow << YAML::BeginSeq;
168 emitter << m(i, 0) << m(i, 1) << m(i, 2);
169 emitter << YAML::EndSeq;
171 emitter << YAML::EndSeq;
Definition YamlConvert.hpp:17
Emitter & operator<<(Emitter &emitter, const janus::Vec3< T > &v)
Emit Vec3 to YAML stream.
Definition YamlConvert.hpp:146
static Node encode(const janus::Mat3< T > &m)
Encode Mat3 to nested YAML sequence.
Definition YamlConvert.hpp:89
static bool decode(const Node &node, janus::Mat3< T > &m)
Decode YAML sequence to Mat3 (nested or flat).
Definition YamlConvert.hpp:102
static bool decode(const Node &node, janus::Quaternion< T > &q)
Decode YAML sequence to Quaternion.
Definition YamlConvert.hpp:66
static Node encode(const janus::Quaternion< T > &q)
Encode Quaternion to YAML sequence [w, x, y, z].
Definition YamlConvert.hpp:56
static Node encode(const janus::Vec3< T > &v)
Encode Vec3 to YAML sequence [x, y, z].
Definition YamlConvert.hpp:26
static bool decode(const Node &node, janus::Vec3< T > &v)
Decode YAML sequence to Vec3.
Definition YamlConvert.hpp:35