From d33e173749bb24ab3beb0d6cf9f245d30480cb88 Mon Sep 17 00:00:00 2001
From: Fabian Paus <fabian.paus@kit.edu>
Date: Mon, 8 Jun 2020 18:09:24 +0200
Subject: [PATCH] ArViz: VisualizationRobot cache current color and only change
 if needed

---
 .../ArViz/Coin/VisualizationRobot.cpp         | 41 +++++++++++--------
 .../ArViz/Coin/VisualizationRobot.h           |  1 +
 2 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.cpp b/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.cpp
index 7c466cdac..71786aac9 100644
--- a/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.cpp
+++ b/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.cpp
@@ -136,26 +136,33 @@ namespace armarx::viz::coin
 
         if (loadedDrawStyle & data::ModelDrawStyle::OVERRIDE_COLOR)
         {
-            int numChildren = node->getNumChildren();
-            for (int i = 0; i < numChildren; i++)
+            if (loadedColor.r != element.color.r
+                    || loadedColor.g != element.color.g
+                    || loadedColor.b != element.color.b
+                    || loadedColor.a != element.color.a)
             {
-                SoSeparator* nodeSep = static_cast<SoSeparator*>(node->getChild(i));
-                // The first entry must be a SoMaterial (see recreateVisualizationNodes)
-                SoMaterial* m = dynamic_cast<SoMaterial*>(nodeSep->getChild(0));
-                if (!m)
+                int numChildren = node->getNumChildren();
+                for (int i = 0; i < numChildren; i++)
                 {
-                    ARMARX_WARNING << "Error at node with index: " << i;
-                    continue;
+                    SoSeparator* nodeSep = static_cast<SoSeparator*>(node->getChild(i));
+                    // The first entry must be a SoMaterial (see recreateVisualizationNodes)
+                    SoMaterial* m = dynamic_cast<SoMaterial*>(nodeSep->getChild(0));
+                    if (!m)
+                    {
+                        ARMARX_WARNING << "Error at node with index: " << i;
+                        continue;
+                    }
+
+                    auto color = element.color;
+                    const float conv = 1.0f / 255.0f;
+                    float a = color.a * conv;
+                    SbColor coinColor(conv * color.r, conv * color.g, conv * color.b);
+                    m->diffuseColor = coinColor;
+                    m->ambientColor = coinColor;
+                    m->transparency = 1.0f - a;
+                    m->setOverride(true);
                 }
-
-                auto color = element.color;
-                const float conv = 1.0f / 255.0f;
-                float a = color.a * conv;
-                SbColor coinColor(conv * color.r, conv * color.g, conv * color.b);
-                m->diffuseColor = coinColor;
-                m->ambientColor = coinColor;
-                m->transparency = 1.0f - a;
-                m->setOverride(true);
+                loadedColor = element.color;
             }
         }
         IceUtil::Time time_color = IceUtil::Time::now();
diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.h b/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.h
index cb6699735..63aa3f1f8 100644
--- a/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.h
+++ b/source/RobotAPI/components/ArViz/Coin/VisualizationRobot.h
@@ -25,6 +25,7 @@ namespace armarx::viz::coin
 
         LoadedRobot loaded;
         int loadedDrawStyle = data::ModelDrawStyle::ORIGINAL;
+        armarx::viz::data::Color loadedColor{0, 0, 0, 0};
     };
 
     void clearRobotCache();
-- 
GitLab