diff --git a/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.cpp b/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.cpp index aff982525aa9d36f8774463e00d3d622d7dbdd12..1acd8b4e7847bac18dde8939141f73060bbd89bd 100644 --- a/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.cpp +++ b/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.cpp @@ -19,16 +19,31 @@ namespace armarx transform = new SoTransform; material = new SoMaterial; - seperator = new SoSeparator; - seperator->addChild(units); - seperator->addChild(transform); - seperator->addChild(material); + separator = new SoSeparator; + separator->addChild(units); + separator->addChild(transform); + separator->addChild(material); + } + + void ElementVisualization::updateBase(Element const& element) + { + auto& p = element.pose; + transform->translation.setValue(p.x, p.y, p.z); + transform->rotation.setValue(p.qx, p.qy, p.qz, p.qw); + transform->scaleFactor.setValue(element.scale, element.scale, element.scale); + + auto color = element.color; + const float conv = 1.0f / 255.0f; + SbColor coinColor(conv * color.r, conv * color.g, conv * color.b); + material->ambientColor.setValue(coinColor); + material->diffuseColor.setValue(coinColor); + material->transparency.setValue(1.0f - conv * color.a); + } std::unique_ptr<ElementVisualization> ElementVisualizer::create(const Element& element) { - std::unique_ptr<ElementVisualization> result(createElement_()); - result->seperator->addChild(result->getNode()); + std::unique_ptr<ElementVisualization> result(createDerived()); update(element, result.get()); return result; @@ -36,24 +51,8 @@ namespace armarx bool ElementVisualizer::update(Element const& element, ElementVisualization* visu) { - if (visu->transform) - { - auto& p = element.pose; - visu->transform->translation.setValue(p.x, p.y, p.z); - visu->transform->rotation.setValue(p.qx, p.qy, p.qz, p.qw); - visu->transform->scaleFactor.setValue(element.scale, element.scale, element.scale); - } - if (visu->material) - { - auto color = element.color; - const float conv = 1.0f / 255.0f; - SbColor coinColor(conv * color.r, conv * color.g, conv * color.b); - visu->material->ambientColor.setValue(coinColor); - visu->material->diffuseColor.setValue(coinColor); - visu->material->transparency.setValue(1.0f - conv * color.a); - } - - return updateElement_(element, visu); + visu->updateBase(element); + return updateDerived(element, visu); } } } diff --git a/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.h b/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.h index dbab6fe521e9373d291135c9f70d7c0566057406..13cb06f47540009c319422c176eba8f132872c16 100644 --- a/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.h +++ b/source/RobotAPI/components/ArViz/Coin/ElementVisualizer.h @@ -22,12 +22,12 @@ namespace armarx virtual ~ElementVisualization() = default; - virtual SoNode* getNode() = 0; + void updateBase(Element const& element); - SoSeparator* seperator = nullptr; - SoUnits* units = nullptr; - SoTransform* transform = nullptr; - SoMaterial* material = nullptr; + SoSeparator* separator; + SoUnits* units; + SoTransform* transform; + SoMaterial* material; }; template <typename NodeT> @@ -40,11 +40,6 @@ namespace armarx node = new NodeType; } - NodeType* getNode() final - { - return node; - } - NodeType* node; }; @@ -53,31 +48,34 @@ namespace armarx public: virtual ~ElementVisualizer() = default; - virtual std::unique_ptr<ElementVisualization> create(Element const& element) final; - virtual bool update(Element const& element, ElementVisualization* visu) final; + std::unique_ptr<ElementVisualization> create(Element const& element); + bool update(Element const& element, ElementVisualization* visu); - virtual ElementVisualization* createElement_() = 0; - virtual bool updateElement_(Element const& element, ElementVisualization* data) = 0; + virtual ElementVisualization* createDerived() = 0; + virtual bool updateDerived(Element const& element, ElementVisualization* data) = 0; }; template <typename DataT> - class TypedElementVisualizer2 : public ElementVisualizer + class TypedElementVisualizer : public ElementVisualizer { public: using DataType = DataT; using ElementType = typename DataType::ElementType; - DataType* createElement_() override + DataType* createDerived() final { - return new DataType; + DataType* result = new DataType; + result->separator->addChild(result->node); + return result; } - bool updateElement_(Element const& element_, ElementVisualization* data_) override + bool updateDerived(Element const& element_, ElementVisualization* data_) final { auto const& element = static_cast<ElementType const&>(element_); auto* data = dynamic_cast<DataType*>(data_); if (data) { + // We want to call update with the correctly downcasted arguments return data->update(element); } return false; diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp index f396ff632e4511f3fee5e2ac80ff3c51d4ce7c03..bcd0eda902ca828cb1e8bbfdb273bd1a840e397c 100644 --- a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp +++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp @@ -155,7 +155,7 @@ namespace armarx case Element_ADD: { // Remove old element and create a new one below - layer.node->removeChild(oldElement.seperator); + layer.node->removeChild(oldElement.separator); } break; case Element_UPDATE: @@ -168,14 +168,14 @@ namespace armarx else { // Types are different, so we delete the old element and create a new one - layer.node->removeChild(oldElement.seperator); + layer.node->removeChild(oldElement.separator); } } break; case Element_DELETE: { layer.elements.erase(oldElementIter); - layer.node->removeChild(oldElement.seperator); + layer.node->removeChild(oldElement.separator); continue; } break; @@ -193,9 +193,9 @@ namespace armarx continue; } auto elementVisu = visualizer.create(updatedElement); - if (elementVisu->seperator) + if (elementVisu->separator) { - layer.node->addChild(elementVisu->seperator); + layer.node->addChild(elementVisu->separator); layer.elements[updatedElement.id] = std::move(elementVisu); } else diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerArrow.h b/source/RobotAPI/components/ArViz/Coin/VisualizerArrow.h index e66b3dbb33a4908f8b8408d428addde44ee6bdd8..adf85ebb98b0147358821b1235934513bf1f9b04 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerArrow.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerArrow.h @@ -53,7 +53,7 @@ namespace armarx::viz::coin SoCone* cone; }; - struct VisualizerArrow : TypedElementVisualizer2<VisualizationArrow> + struct VisualizerArrow : TypedElementVisualizer<VisualizationArrow> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerArrowCircle.h b/source/RobotAPI/components/ArViz/Coin/VisualizerArrowCircle.h index 984bfd9e52349c2cacf059a1b6294809d8cc7271..5904df956f0da0411547931cc8e72c1ef73c8ace 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerArrowCircle.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerArrowCircle.h @@ -66,7 +66,7 @@ namespace armarx::viz::coin } }; - struct VisualizerArrowCircle: TypedElementVisualizer2<VisualizationArrowCircle> + struct VisualizerArrowCircle: TypedElementVisualizer<VisualizationArrowCircle> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerBox.h b/source/RobotAPI/components/ArViz/Coin/VisualizerBox.h index 0750f7a5a29b7aa4a0f1242a05637dec242270bf..9a553c89771d2c13b96ad7038939c89339497e59 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerBox.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerBox.h @@ -21,7 +21,7 @@ namespace armarx::viz::coin } }; - class VisualizerBox : public TypedElementVisualizer2<VisualizationBox> + class VisualizerBox : public TypedElementVisualizer<VisualizationBox> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerCylinder.h b/source/RobotAPI/components/ArViz/Coin/VisualizerCylinder.h index db85f4c9f43c71728012894515ef5a784dba4797..389ca4bdbcbf60a0131f6973a1c791d66d9b9895 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerCylinder.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerCylinder.h @@ -20,7 +20,7 @@ namespace armarx::viz::coin } }; - class VisualizerCylinder : public TypedElementVisualizer2<VisualizationCylinder> + class VisualizerCylinder : public TypedElementVisualizer<VisualizationCylinder> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerLine.h b/source/RobotAPI/components/ArViz/Coin/VisualizerLine.h index c5100af6b69aebf9414e301786dbc2e65ef647c0..cf2a102bea97568a16bf5ae07b2d17ff50a13511 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerLine.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerLine.h @@ -43,7 +43,7 @@ namespace armarx::viz::coin SoCoordinate3* coordinate3; }; - struct VisualizerLine: TypedElementVisualizer2<VisualizationLine> + struct VisualizerLine: TypedElementVisualizer<VisualizationLine> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerMesh.h b/source/RobotAPI/components/ArViz/Coin/VisualizerMesh.h index e2eb2848d56de9ba95dd816585c25d5ddb36c530..d6f8e43bf639ba63e90b86a516f8307e43c6eb0e 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerMesh.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerMesh.h @@ -131,7 +131,7 @@ namespace armarx::viz::coin std::vector<int32_t> matInx; }; - struct VisualizerMesh: TypedElementVisualizer2<VisualizationMesh> + struct VisualizerMesh: TypedElementVisualizer<VisualizationMesh> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerPointCloud.h b/source/RobotAPI/components/ArViz/Coin/VisualizerPointCloud.h index cfd055f9432c16b2e9f970b5ac227ea738934cc9..9503849e272799b37a7dadd93715b98ba6b71213 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerPointCloud.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerPointCloud.h @@ -69,7 +69,7 @@ namespace armarx::viz::coin std::vector<SbVec3f> coords; }; - struct VisualizerPointCloud: TypedElementVisualizer2<VisualizationPointCloud> + struct VisualizerPointCloud: TypedElementVisualizer<VisualizationPointCloud> { }; diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerPolygon.h b/source/RobotAPI/components/ArViz/Coin/VisualizerPolygon.h index 11b8fda3e9db0c77d17fa9fc6210a4a3ebf05659..05c7fbcaaf928757d86864f4b5577f96aa604be2 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerPolygon.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerPolygon.h @@ -93,7 +93,7 @@ namespace armarx::viz::coin SoMaterial* lineMaterial; }; - struct VisualizerPolygon : TypedElementVisualizer2<VisualizationPolygon> + struct VisualizerPolygon : TypedElementVisualizer<VisualizationPolygon> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerPose.h b/source/RobotAPI/components/ArViz/Coin/VisualizerPose.h index 5f496242c9cefef69269f3e411331abc0ed29a0b..fb7825add74e8a8918b9e632c9719797bddca1ae 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerPose.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerPose.h @@ -154,7 +154,7 @@ namespace armarx::viz::coin std::array<SoTransform*, 3> t2_; }; - struct VisualizerPose: TypedElementVisualizer2<VisualizationPose> + struct VisualizerPose: TypedElementVisualizer<VisualizationPose> { }; diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerRobot.h b/source/RobotAPI/components/ArViz/Coin/VisualizerRobot.h index 47f8f3ce548025bb5af01d140a91c9c764fa8767..d0228d2ce05c41cd7be791f1aaf97b83c5e38e70 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerRobot.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerRobot.h @@ -23,7 +23,7 @@ namespace armarx::viz::coin } }; - struct VisualizerRobot: TypedElementVisualizer2<VisualizationRobot> + struct VisualizerRobot: TypedElementVisualizer<VisualizationRobot> { }; } diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerSphere.h b/source/RobotAPI/components/ArViz/Coin/VisualizerSphere.h index 9510c5daab48ef7d93b0a814405d8e8494b64369..f2f9f065a00e6aeda26f63505a3f7a88a9a4e832 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerSphere.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerSphere.h @@ -19,7 +19,7 @@ namespace armarx::viz::coin } }; - struct VisualizerSphere: TypedElementVisualizer2<VisualizationSphere> + struct VisualizerSphere: TypedElementVisualizer<VisualizationSphere> { }; diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizerText.h b/source/RobotAPI/components/ArViz/Coin/VisualizerText.h index f4d4fd55c719cee2eb21310352a11eabc067fc63..8046f5be0fdc9a0c128643a3ae09111cbf5133dc 100644 --- a/source/RobotAPI/components/ArViz/Coin/VisualizerText.h +++ b/source/RobotAPI/components/ArViz/Coin/VisualizerText.h @@ -20,7 +20,7 @@ namespace armarx::viz::coin } }; - struct VisualizerText: TypedElementVisualizer2<VisualizationText> + struct VisualizerText: TypedElementVisualizer<VisualizationText> { }; }