From 67c3db727f59fdea52c876623a4ca1a6c6d6449a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Tue, 7 May 2024 13:27:46 +0200
Subject: [PATCH] add enum cardinal conversion

---
 src/edit/src/editor.cpp             | 12 +++++--
 src/rofi/include/rofi/connector.hpp |  2 ++
 src/rofi/src/connector.cpp          | 51 ++++++++++++++++++++---------
 3 files changed, 48 insertions(+), 17 deletions(-)

diff --git a/src/edit/src/editor.cpp b/src/edit/src/editor.cpp
index f078a19..a1853a0 100644
--- a/src/edit/src/editor.cpp
+++ b/src/edit/src/editor.cpp
@@ -2483,9 +2483,17 @@ void Editor::teleportModulesByConnectors(const connector_ptr source_connector, c
     auto first_con_parent_diff = first_con_node->getPositionWorld() - first_parent->getPositionWorld();
     first_parent->setPosVec(second_world_pos - first_con_parent_diff);
 
-    // auto destination_facing = -destination_connector->getNode()->getRotationAxisZWorld();
-    // auto source_facing = -first_con_node->getRotationAxisZWorld();
+    auto destination_facing = -destination_connector->getNode()->getRotationAxisZWorld();
+    auto destination_north = destination_connector->getNode()->getRotationAxisXWorld();
+    auto source_facing = -first_con_node->getRotationAxisZWorld();
+    auto source_north = source_connector->getNode()->getRotationAxisXWorld();
+
+    // rotate to face each other
+    // first_parent->rotateRotationQuat(glm::angleAxis)
     
+    // rotate to selected cardinality
+    // auto north_delta = glm::orientedAngle(source_north, destination_north, )
+    // first_parent->rotateRotationQuat(glm::angleAxis())
 }
 
 void Editor::rotateModule(module_ptr selected_module, glm::vec3 &rotation_angles)
diff --git a/src/rofi/include/rofi/connector.hpp b/src/rofi/include/rofi/connector.hpp
index 13cc831..fa8bbf7 100644
--- a/src/rofi/include/rofi/connector.hpp
+++ b/src/rofi/include/rofi/connector.hpp
@@ -203,6 +203,8 @@ public:
 
 enum class side vec_to_enum(glm::vec3 local_direction);
 glm::vec3 enum_to_vec(enum class side s);
+cardinal degree_to_cardinal(float degree_angle);
+float cardinal_to_degree(cardinal orientation);
 
 }
 
diff --git a/src/rofi/src/connector.cpp b/src/rofi/src/connector.cpp
index bf78a04..f90561c 100644
--- a/src/rofi/src/connector.cpp
+++ b/src/rofi/src/connector.cpp
@@ -2,8 +2,6 @@
 
 #include <rofi/voxel.hpp>
 
-#include <iostream>
-
 namespace rofi
 {
 
@@ -79,25 +77,15 @@ bool Connector::shares_module_link(connector_ptr fst_connector, connector_ptr sn
 
 cardinal Connector::get_mutual_orientation(connector_ptr fst_connector, connector_ptr snd_connector)
 {
+    ASSUMPTION(Connector::shares_module_link(fst_connector, snd_connector));
+
     auto fst_north = fst_connector->getNode()->getRotationAxisXWorld();
     auto snd_north = snd_connector->getNode()->getRotationAxisXWorld();
     auto oriented_angle = glm::degrees(glm::orientedAngle(fst_north, 
                                                           snd_north, 
                                                           fst_connector->getNode()->getRotationAxisZWorld()));
 
-    std::cout << "oriented angle: " << oriented_angle << std::endl;
-
-    float epsilon = 0.001f;
-    if (glm::epsilonEqual(oriented_angle, 0.0f, epsilon))
-        return North;
-    if (glm::epsilonEqual(oriented_angle, -90.0f, epsilon))
-        return East;
-    if (glm::epsilonEqual(oriented_angle, 180.0f, epsilon))
-        return South;
-    if (glm::epsilonEqual(oriented_angle, 90.0f, epsilon))
-        return West;
-
-    ASSUMPTION(false);    
+    return degree_to_cardinal(oriented_angle);
 }
 
 bool Connector::hasModuleLink() const
@@ -394,4 +382,37 @@ glm::vec3 enum_to_vec(side s)
     }
 }
 
+cardinal degree_to_cardinal(float degree_angle)
+{
+    float epsilon = 0.001f;
+    if (glm::epsilonEqual(degree_angle, 0.0f, epsilon))
+        return North;
+    if (glm::epsilonEqual(degree_angle, -90.0f, epsilon))
+        return East;
+    if (glm::epsilonEqual(degree_angle, 180.0f, epsilon))
+        return South;
+    if (glm::epsilonEqual(degree_angle, 90.0f, epsilon))
+        return West;
+
+    ASSUMPTION(false);    
+}
+float cardinal_to_degree(cardinal orientation)
+{
+    switch(orientation)
+    {
+        using enum cardinal;
+        case North:
+            return 0.0f;
+        case East:
+            return -90.0f;
+        case South:
+            return 180.0f;
+        case West:
+            return 90.0f;
+        default:
+            ASSUMPTION(false);
+            return 0.0f;
+    }
+}
+
 }
\ No newline at end of file
-- 
GitLab