From b5f2f748a8de385bfec4128fd8581e508bb81e12 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 22 Dec 2022 16:11:29 +0100
Subject: [PATCH] Set localPose instead of changing only the internal
 visualization model and then forgetting about this special transform forever.
 F**k everyone not using Coin, right?

---
 VirtualRobot/CMakeLists.txt                   |  1 +
 .../CoinVisualizationFactory.cpp              | 39 -------------------
 .../CoinVisualizationFactory.h                |  4 --
 .../Visualization/VisualizationFactory.cpp    | 26 +++++++++++++
 .../Visualization/VisualizationFactory.h      |  2 +-
 5 files changed, 28 insertions(+), 44 deletions(-)
 create mode 100644 VirtualRobot/Visualization/VisualizationFactory.cpp

diff --git a/VirtualRobot/CMakeLists.txt b/VirtualRobot/CMakeLists.txt
index d3c336303..f09afe8aa 100644
--- a/VirtualRobot/CMakeLists.txt
+++ b/VirtualRobot/CMakeLists.txt
@@ -347,6 +347,7 @@ SET(SOURCES
     Visualization/TriMeshModel.cpp
     Visualization/TriMeshUtils.cpp
     Visualization/Visualization.cpp
+    Visualization/VisualizationFactory.cpp
     Visualization/VisualizationNode.cpp
 
     Workspace/Manipulability.cpp
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index fe1f66031..3e9cd8a83 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -4345,45 +4345,6 @@ namespace VirtualRobot
         return root;
     }
 
-    void CoinVisualizationFactory::applyDisplacement(VisualizationNodePtr o, Eigen::Matrix4f& m)
-    {
-        if (!o)
-        {
-            return;
-        }
-
-
-        if (o->getType() != getName())
-        {
-            VR_ERROR << "Skipping Visualization type " << o->getType() << ", but factory is of type " << getName() << std::endl;
-            return;
-        }
-
-        CoinVisualizationNode* cvn = dynamic_cast<CoinVisualizationNode*>(o.get());
-
-        if (cvn)
-        {
-            SoNode* n = cvn->getCoinVisualization();
-
-            if (n)
-            {
-                SoSeparator* s = new SoSeparator;
-                s->ref();
-                SoMatrixTransform* ma = getMatrixTransformScaleMM2M(m);
-                s->addChild(ma);
-                s->addChild(n->copy(FALSE));
-
-                cvn->setVisualization(s);
-                //o.reset(new CoinVisualizationNode(s));
-                s->unrefNoDelete();
-            }
-        }
-        else
-        {
-            VR_WARNING << "Invalid type casting to CoinVisualizationNode?!" << std::endl;
-        }
-    }
-
 
     SoGroup* CoinVisualizationFactory::convertSoFileChildren(SoGroup* orig)
     {
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
index 0afb2907d..eaf8b1878 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
@@ -107,10 +107,6 @@ namespace VirtualRobot
             \return A VisualizationNode containing the visualization.
         */
         VisualizationNodePtr createEllipse(float x, float y, float z, bool showAxes = true, float axesHeight = 4.0f, float axesWidth = 8.0f) override;
-        /*!
-            Move local visualization by homogeneous matrix m. MM is used.
-        */
-        void applyDisplacement(VisualizationNodePtr o, Eigen::Matrix4f& m) override;
 
         /*!
             Create an empty VisualizationNode.
diff --git a/VirtualRobot/Visualization/VisualizationFactory.cpp b/VirtualRobot/Visualization/VisualizationFactory.cpp
new file mode 100644
index 000000000..3a4f8a592
--- /dev/null
+++ b/VirtualRobot/Visualization/VisualizationFactory.cpp
@@ -0,0 +1,26 @@
+/**
+* @package    VirtualRobot
+* @author     Rainer Kartmann
+* @copyright  2022 Rainer Kartmann
+*/
+
+#include "VisualizationFactory.h"
+
+#include <VirtualRobot/Visualization/VisualizationNode.h>
+
+
+namespace VirtualRobot
+{
+
+    void
+    VisualizationFactory::applyDisplacement(VisualizationNodePtr visu,
+                                            Eigen::Matrix4f& displacement)
+    {
+        if (visu)
+        {
+            visu->setLocalPose(displacement);
+        }
+    }
+
+
+} // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index ef9da305c..94f1142cd 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -206,7 +206,7 @@ namespace VirtualRobot
         /*!
             Move local visualization by homogeneous matrix m. (MM)
         */
-        virtual void applyDisplacement(VisualizationNodePtr /*o*/, Eigen::Matrix4f& /*m*/) {}
+        virtual void applyDisplacement(VisualizationNodePtr visu, Eigen::Matrix4f& displacement);
 
         /*!
             Create an empty VisualizationNode.
-- 
GitLab