From a642d592de8ac30921cf2d290f9a713f0bf92f82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Sat, 18 May 2024 00:53:54 +0200
Subject: [PATCH] fix translation and rotation in export

---
 src/algo/include/algo/misc.hpp      |  2 +-
 src/algo/src/misc.cpp               | 32 ++++++++++++++++++++++++-----
 src/filein/src/rofiworld_loader.cpp |  7 ++-----
 3 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/src/algo/include/algo/misc.hpp b/src/algo/include/algo/misc.hpp
index 1cb5819..a8fb3ca 100644
--- a/src/algo/include/algo/misc.hpp
+++ b/src/algo/include/algo/misc.hpp
@@ -24,7 +24,7 @@ bool AABB_intersect(const AABB &fst_aabb, const AABB &snd_aabb, const node_ptr &
 
 std::pair<std::size_t, std::size_t> get_pad_width_height_from_connector_count(const std::vector<connector_ptr> &connectors);
 
-glm::vec3 convertToRoFICoordinates(const glm::vec3 &position);
+glm::vec3 convertToRoFICoordinates(const glm::vec3 &position, const glm::vec3 &to_voxel_center);
 glm::mat4 convertToRoFICoordinates(const glm::mat4 &matrix);
 
 #endif
\ No newline at end of file
diff --git a/src/algo/src/misc.cpp b/src/algo/src/misc.cpp
index 59a3910..439800e 100644
--- a/src/algo/src/misc.cpp
+++ b/src/algo/src/misc.cpp
@@ -109,16 +109,38 @@ std::pair<std::size_t, std::size_t> get_pad_width_height_from_connector_count(co
     return { static_cast<std::size_t>(max_x_pos) + 1, static_cast<std::size_t>(max_y_pos) + 1 };
 }
 
-glm::vec3 convertToRoFICoordinates(const glm::vec3 &position)
+glm::vec3 convertToRoFICoordinates(const glm::vec3 &position, const glm::vec3 &to_voxel_center)
 {
-    return glm::vec3(position.z, position.x, position.y);
+    const auto voxel_position = position + to_voxel_center * 0.5f;
+    return glm::vec3(voxel_position.z, voxel_position.x, voxel_position.y);
 }
 
 glm::mat4 convertToRoFICoordinates(const glm::mat4 &matrix)
 {
-    auto m = glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f))) 
-           * glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f)))
-           * matrix;
+    // E -> E'
+
+    // auto m = // glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(0.0f, 0.0f, -1.0f))) 
+    //          glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(0.0f, -1.0f, 0.0f)))
+    //        * glm::toMat4(glm::angleAxis(glm::radians(90.0f), glm::vec3(-1.0f, 0.0f, 0.0f)))
+    //     //    * matrix 
+    //     //    * r_matrix;
+    //        * corrected_matrix;
+
+    const auto A_neg_X_local_correction_matrix = glm::mat4(0, 0, 1, 0, // col X
+                                    0, -1, 0, 0, // col Y
+                                    1, 0, 0, 0, // col Z
+                                    0, 0, 0, 1 // col W
+                                    );
+
+    const auto corrected_component_matrix = matrix * A_neg_X_local_correction_matrix;
+
+    const auto magic_matrix = glm::mat4(0, 1, 0, 0, // col X
+                                        0, 0, 1, 0, // col Y
+                                        1, 0, 0, 0, // col Z
+                                        0, 0, 0, 1  // col W
+                                        );
+        
+    auto m = magic_matrix * corrected_component_matrix;
 
     m[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
     return m;
diff --git a/src/filein/src/rofiworld_loader.cpp b/src/filein/src/rofiworld_loader.cpp
index 29ebc7f..8184a4e 100644
--- a/src/filein/src/rofiworld_loader.cpp
+++ b/src/filein/src/rofiworld_loader.cpp
@@ -142,8 +142,7 @@ void export_spaceJoint(boost::json::array &spaceJoints_array, const rofiworld_pt
 void export_spaceJoint_point(boost::json::object &spaceJoint_object, const node_ptr node)
 {
     boost::json::array point_array;
-    const auto position = convertToRoFICoordinates(node->getPositionWorld());
-    // const auto position = node->getPositionWorld();
+    const auto position = convertToRoFICoordinates(node->getPositionWorld(), node->getRotationAxisZWorld());
 
     for (int i = 0; i < 3; ++i)
         point_array.emplace_back(position[i]);
@@ -167,9 +166,7 @@ void export_spaceJoint_joint(boost::json::object &spaceJoint_object, const node_
 
 void export_spaceJoint_joint_matrix(boost::json::object &joint_object, const node_ptr node)
 {
-    auto component_coord_convert = glm::toMat4(glm::rotation(glm::vec3(0.0f, 0.0f, -1.0f), -node->getRotationAxisZWorld()));
-    // auto rotation_mat = convertToRoFICoordinates(component_coord_convert);
-    auto rotation_mat = component_coord_convert;
+    auto rotation_mat = convertToRoFICoordinates(node->getRotationMatWorld());
     float epsilon = 0.00001f;
     bool is_identity = true;
 
-- 
GitLab