From 0a8be6e180ecd9aab46316b9a5d3031e6d759969 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20=C5=A0toura=C4=8D?= <525032@mail.muni.cz>
Date: Wed, 15 May 2024 17:17:53 +0200
Subject: [PATCH] change pad to be on E:XY, RT:YZ axes

---
 src/algo/src/misc.cpp            | 12 ++++-----
 src/edit/include/edit/editor.hpp |  1 +
 src/edit/src/editor.cpp          | 45 +++++++++++++++++---------------
 src/filein/src/module_loader.cpp | 14 ++++++----
 4 files changed, 40 insertions(+), 32 deletions(-)

diff --git a/src/algo/src/misc.cpp b/src/algo/src/misc.cpp
index 0effe7d..91b3441 100644
--- a/src/algo/src/misc.cpp
+++ b/src/algo/src/misc.cpp
@@ -94,17 +94,17 @@ 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)
 {
     float max_x_pos = 0;
-    float max_z_pos = 0;
+    float max_y_pos = 0;
     for (const auto &connector : connectors)
     {
         const auto &con_node = connector->getNode();
-        const auto x_pos = con_node->getPositionWorld().x;
-        const auto z_pos = con_node->getPositionWorld().z;
+        const auto x_pos = con_node->getPositionLocal().x;
+        const auto y_pos = con_node->getPositionLocal().y;
         if (x_pos > max_x_pos)
             max_x_pos = x_pos;
-        if (z_pos > max_z_pos)
-            max_z_pos = z_pos;
+        if (y_pos > max_y_pos)
+            max_y_pos = y_pos;
     }
 
-    return { static_cast<std::size_t>(max_x_pos) + 1, static_cast<std::size_t>(max_z_pos) + 1 };
+    return { static_cast<std::size_t>(max_x_pos) + 1, static_cast<std::size_t>(max_y_pos) + 1 };
 }
\ No newline at end of file
diff --git a/src/edit/include/edit/editor.hpp b/src/edit/include/edit/editor.hpp
index 4e322de..4d11a5a 100644
--- a/src/edit/include/edit/editor.hpp
+++ b/src/edit/include/edit/editor.hpp
@@ -420,6 +420,7 @@ private:
     void initializePad();
     void initializeUnknown();
     void createPad(std::size_t &width, std::size_t &height);
+    void generatePad(std::size_t &width, std::size_t &height);
     void setVoxelGraphToScene(voxel_graph_ptr prev_vg, voxel_graph_ptr new_vg);
     void addVoxelGraphToScene(voxel_graph_ptr vg);
     void removeVoxelGraphFromScene(voxel_graph_ptr vg);
diff --git a/src/edit/src/editor.cpp b/src/edit/src/editor.cpp
index c10f614..21f187d 100644
--- a/src/edit/src/editor.cpp
+++ b/src/edit/src/editor.cpp
@@ -1054,17 +1054,9 @@ void Editor::initializePad()
     using namespace rofi;
 
     module_type_voxel_graphs[pad] = std::make_shared<VoxelGraph>();
-    auto open_con_node = Node::create(glm::vec3(0.0f, 0.0f, 0.0f), get_connector_face_rotation(glm::vec3(0.0f, 1.0f, 0.0f)));
-    auto open_connector = module_type_voxel_graphs[pad]->addConnector(open_con_node, connector_type::open);
-    addConnectorMesh(open_con_node, connector_type::fixed);
-    open_con_node->addObject(open_connector);
-
-    auto pad_board_node = Node::create(glm::vec3(0.0f, -0.5f, 0.0f));
-    auto pad_board = module_type_voxel_graphs[pad]->addPadBoard(pad_board_node);
-    scene->addMesh(pad_board_node, pad_board_mesh);
-    pad_board_node->addObject(pad_board);
-
-    module_type_voxel_graphs[pad]->join(open_connector, pad_board, enum_to_vec(side::y_pos));
+    std::size_t initial_width = 1;
+    std::size_t initial_height = 1;
+    generatePad(initial_width, initial_height);
 }
 
 void Editor::initializeUnknown()
@@ -1091,19 +1083,32 @@ void Editor::createPad(std::size_t &width, std::size_t &height)
 
     module_type_voxel_graphs[pad] = std::make_shared<VoxelGraph>();
 
+    generatePad(width, height);
+
+    is_creating_pad = false;
+
+    voxel_graph = module_type_voxel_graphs[pad];
+    addVoxelGraphToScene(voxel_graph);
+}
+
+void Editor::generatePad(std::size_t &width, std::size_t &height)
+{
+    using enum build_mode_I;
+    using namespace rofi;
+
     for ( int x = 0; x < width; ++x ) 
     {
-        for ( int z = 0; z < height; ++z ) 
+        for ( int y = 0; y < height; ++y ) 
         {
             float x_pos = static_cast<float>(x);
-            float z_pos = static_cast<float>(z);
+            float y_pos = static_cast<float>(y);
 
-            auto open_con_node = Node::create(glm::vec3(x_pos, 0.0f, z_pos), get_connector_face_rotation(glm::vec3(0.0f, 1.0f, 0.0f)));
+            auto open_con_node = Node::create(glm::vec3(x_pos, y_pos, 0.0f), get_connector_face_rotation(glm::vec3(0.0f, 0.0f, 1.0f)));
             auto open_connector = module_type_voxel_graphs[pad]->addConnector(open_con_node, connector_type::open);
             addConnectorMesh(open_con_node, connector_type::fixed);
             open_con_node->addObject(open_connector);
 
-            auto pad_board_node = Node::create(glm::vec3(x_pos, -0.5f, z_pos));
+            auto pad_board_node = Node::create(glm::vec3(x_pos, y_pos, -0.5f), glm::angleAxis(glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f)));
             auto pad_board = module_type_voxel_graphs[pad]->addPadBoard(pad_board_node);
             scene->addMesh(pad_board_node, pad_board_mesh);
             pad_board_node->addObject(pad_board);
@@ -1111,11 +1116,6 @@ void Editor::createPad(std::size_t &width, std::size_t &height)
             module_type_voxel_graphs[pad]->join(open_connector, pad_board, enum_to_vec(side::y_pos));
         }
     }
-
-    is_creating_pad = false;
-
-    voxel_graph = module_type_voxel_graphs[pad];
-    addVoxelGraphToScene(voxel_graph);
 }
 
 void Editor::setVoxelGraphToScene(voxel_graph_ptr prev_vg, voxel_graph_ptr new_vg)
@@ -2621,7 +2621,10 @@ void Editor::teleportModulesByConnectors(const connector_ptr source_connector, c
     source_parent->rotateRotationQuat(glm::angleAxis(oriented_angle, destination_facing));
     // Rotate to selected cardinality
     // Have to use -radians because cardinality is from destination to source and this needs to rotate the source to the destination
-    auto orientation = source_is_head || destination_is_head ? glm::radians(rofi::cardinal_to_degree(selected_cardinality)) : -glm::radians(rofi::cardinal_to_degree(selected_cardinality));
+    auto orientation = source_is_head || destination_is_head 
+                       ? glm::radians(rofi::cardinal_to_degree(selected_cardinality)) 
+                       : -glm::radians(rofi::cardinal_to_degree(selected_cardinality));
+
     source_parent->rotateRotationQuat(glm::angleAxis(orientation, destination_facing));
 
     // Translation
diff --git a/src/filein/src/module_loader.cpp b/src/filein/src/module_loader.cpp
index 92cee9f..d000433 100644
--- a/src/filein/src/module_loader.cpp
+++ b/src/filein/src/module_loader.cpp
@@ -703,17 +703,17 @@ voxel_graph_ptr import_pad(const boost::json::array &components_array, const boo
 
     for ( int x = 0; x < width; ++x ) 
     {
-        for ( int z = 0; z < height; ++z ) 
+        for ( int y = 0; y < height; ++y ) 
         {
             float x_pos = static_cast<float>(x);
-            float z_pos = static_cast<float>(z);
+            float y_pos = static_cast<float>(y);
 
-            auto open_con_node = Node::create(glm::vec3(x_pos, 0.0f, z_pos), get_connector_face_rotation(glm::vec3(0.0f, 1.0f, 0.0f)));
+            auto open_con_node = Node::create(glm::vec3(x_pos, y_pos, 0.0f), get_connector_face_rotation(glm::vec3(0.0f, 0.0f, 1.0f)));
             auto open_connector = vg->addConnector(open_con_node, connector_type::open);
             // addConnectorMesh(open_con_node, connector_type::fixed);
             // open_con_node->addObject(open_connector);
 
-            auto pad_board_node = Node::create(glm::vec3(x_pos, -0.5f, z_pos));
+            auto pad_board_node = Node::create(glm::vec3(x_pos, y_pos, -0.5f), glm::angleAxis(glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f)));
             auto pad_board = vg->addPadBoard(pad_board_node);
             // scene->addMesh(pad_board_node, pad_board_mesh);
             // pad_board_node->addObject(pad_board);
@@ -964,7 +964,11 @@ std::pair<uint64_t, uint64_t> get_pad_width_height_from_joints(const std::size_t
         return {1, 1};
 
     if (roficom_count > from_to_std.size())
-        return {roficom_count, 1};
+    {
+       return std::get<2>(from_to_std.back())[3].z == 1.0f 
+              ? std::pair<uint64_t, uint64_t>{roficom_count, 1} 
+              : std::pair<uint64_t, uint64_t>{ 1, roficom_count };
+    }
 
     uint64_t max_to_from_0 = 0;
 
-- 
GitLab