Skip to content

Commit

Permalink
Merge pull request #1203 from robotology/changeVisualColor
Browse files Browse the repository at this point in the history
Added possibility to change only one specific visual
  • Loading branch information
traversaro authored Sep 17, 2024
2 parents 9d9cb44 + c04db86 commit 147fb75
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 50 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

cmake_minimum_required(VERSION 3.16)

project(iDynTree VERSION 12.4.0
project(iDynTree VERSION 12.5.0
LANGUAGES C CXX)

# Disable in source build, unless Eclipse is used
Expand Down
8 changes: 8 additions & 0 deletions src/visualization/include/iDynTree/Visualizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,14 @@ class IModelVisualization
*/
virtual bool setLinkColor(const LinkIndex& linkIndex, const ColorViz& linkColor) = 0;

/**
* Set the color of a single visual of a given link.
*
* This will overwrite the material of the visual, but it can be
* reset by resetLinkColor.
*/
virtual bool setVisualColor(const LinkIndex& linkIndex, const std::string& visualName, const ColorViz& visualColor) = 0;

/**
* Set the transparency of a given link of the model.
*
Expand Down
1 change: 1 addition & 0 deletions src/visualization/src/DummyImplementations.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ class DummyModelVisualization : public IModelVisualization
virtual void setModelColor(const ColorViz & ) {}
virtual void resetModelColor() {}
virtual bool setLinkColor(const LinkIndex &, const ColorViz &) { return false; }
virtual bool setVisualColor(const LinkIndex& , const std::string& , const ColorViz& ) { return false; };
virtual bool setLinkTransparency(const LinkIndex&, const double) { return false; }
virtual void setModelTransparency(const double ) {}
virtual bool resetLinkColor(const LinkIndex &) { return false; }
Expand Down
2 changes: 2 additions & 0 deletions src/visualization/src/IrrlichtUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,8 @@ namespace iDynTree
geomNode->setPosition(idyntree2irr_pos(geom->getLink_H_geometry().getPosition()));
geomNode->setRotation(idyntree2irr_rot(geom->getLink_H_geometry().getRotation()));

geomNode->setName(geom->getName().c_str());

return geomNode;
}

Expand Down
125 changes: 76 additions & 49 deletions src/visualization/src/ModelVisualization.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,68 @@ ModelVisualization& ModelVisualization::operator=(const ModelVisualization& /*ot
return *this;
}

bool ModelVisualization::changeVisualsColor(const LinkIndex& linkIndex, const ColorViz& color, const std::string& name)
{
irr::video::SColor col = idyntree2irrlicht(color).toSColor();
bool changed = false;

for (size_t geom = 0; geom < pimpl->geomNodes[linkIndex].size(); geom++)
{
if (pimpl->geomNodes[linkIndex][geom] && (name.empty() ||
std::string(pimpl->geomNodes[linkIndex][geom]->getName()) == name))
{
irr::scene::ISceneNode* geomNode = pimpl->geomNodes[linkIndex][geom];

for (size_t mat = 0; mat < geomNode->getMaterialCount(); mat++)
{
irr::video::SMaterial geomMat = geomNode->getMaterial(mat);

// R
geomMat.AmbientColor.setRed(col.getRed());
geomMat.DiffuseColor.setRed(col.getRed());
geomMat.SpecularColor.setRed(col.getRed());
geomMat.EmissiveColor.setRed(col.getRed());

// G
geomMat.AmbientColor.setGreen(col.getGreen());
geomMat.DiffuseColor.setGreen(col.getGreen());
geomMat.SpecularColor.setGreen(col.getGreen());
geomMat.EmissiveColor.setGreen(col.getGreen());

// B
geomMat.AmbientColor.setBlue(col.getBlue());
geomMat.DiffuseColor.setBlue(col.getBlue());
geomMat.SpecularColor.setBlue(col.getBlue());
geomMat.EmissiveColor.setBlue(col.getBlue());

geomMat.AmbientColor.setAlpha(col.getAlpha());
geomMat.DiffuseColor.setAlpha(col.getAlpha());
geomMat.SpecularColor.setAlpha(col.getAlpha());
geomMat.EmissiveColor.setAlpha(col.getAlpha());

if (color.a < 1.0)
{
geomMat.MaterialType = irr::video::EMT_TRANSPARENT_VERTEX_ALPHA;
}
else
{
geomMat.MaterialType = irr::video::EMT_SOLID;
}


geomNode->getMaterial(mat) = geomMat;
}
geomNode->setMaterialFlag(irr::video::EMF_BACK_FACE_CULLING, false);
geomNode->setMaterialFlag(irr::video::EMF_NORMALIZE_NORMALS, true);
geomNode->setMaterialFlag(irr::video::EMF_COLOR_MATERIAL, false);
geomNode->setMaterialFlag(irr::video::EMF_BLEND_OPERATION, true);

changed = true;
}
}
return changed;
}

bool ModelVisualization::init(const Model& model,
const std::string instanceName,
irr::scene::ISceneManager * sceneManager)
Expand Down Expand Up @@ -338,57 +400,22 @@ bool ModelVisualization::setLinkColor(const LinkIndex& linkIndex, const ColorViz
return false;
}

irr::video::SColor col = idyntree2irrlicht(linkColor).toSColor();
for(size_t geom=0; geom < pimpl->geomNodes[linkIndex].size(); geom++)
{
if( pimpl->geomNodes[linkIndex][geom] )
{
irr::scene::ISceneNode * geomNode = pimpl->geomNodes[linkIndex][geom];

for( size_t mat = 0; mat < geomNode->getMaterialCount(); mat++)
{
irr::video::SMaterial geomMat = geomNode->getMaterial(mat);

// R
geomMat.AmbientColor.setRed(col.getRed());
geomMat.DiffuseColor.setRed(col.getRed());
geomMat.SpecularColor.setRed(col.getRed());
geomMat.EmissiveColor.setRed(col.getRed());

// G
geomMat.AmbientColor.setGreen(col.getGreen());
geomMat.DiffuseColor.setGreen(col.getGreen());
geomMat.SpecularColor.setGreen(col.getGreen());
geomMat.EmissiveColor.setGreen(col.getGreen());

// B
geomMat.AmbientColor.setBlue(col.getBlue());
geomMat.DiffuseColor.setBlue(col.getBlue());
geomMat.SpecularColor.setBlue(col.getBlue());
geomMat.EmissiveColor.setBlue(col.getBlue());

geomMat.AmbientColor.setAlpha(col.getAlpha());
geomMat.DiffuseColor.setAlpha(col.getAlpha());
geomMat.SpecularColor.setAlpha(col.getAlpha());
geomMat.EmissiveColor.setAlpha(col.getAlpha());

if (linkColor.a < 1.0)
{
geomMat.MaterialType = irr::video::EMT_TRANSPARENT_VERTEX_ALPHA;
}
else
{
geomMat.MaterialType = irr::video::EMT_SOLID;
}
changeVisualsColor(linkIndex, linkColor);
return true;
}

bool ModelVisualization::setVisualColor(const LinkIndex& linkIndex, const std::string& visualName, const ColorViz& visualColor)
{
if (linkIndex < 0 || linkIndex >= pimpl->geomNodes.size())
{
reportError("ModelVisualization", "setVisualColor", "invalid link index");
return false;
}

geomNode->getMaterial(mat) = geomMat;
}
geomNode->setMaterialFlag(irr::video::EMF_BACK_FACE_CULLING, false);
geomNode->setMaterialFlag(irr::video::EMF_NORMALIZE_NORMALS, true);
geomNode->setMaterialFlag(irr::video::EMF_COLOR_MATERIAL, false);
geomNode->setMaterialFlag(irr::video::EMF_BLEND_OPERATION, true);
}
if (!changeVisualsColor(linkIndex, visualColor, visualName))
{
reportError("ModelVisualization", "setVisualColor", "Visual name not found");
return false;
}
return true;
}
Expand Down
9 changes: 9 additions & 0 deletions src/visualization/src/ModelVisualization.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ class ModelVisualization: public IModelVisualization
// Disable copy for now
ModelVisualization(const ModelVisualization& other);
ModelVisualization& operator=(const ModelVisualization& other);

/**
* @param[in] linkIndex Index of the link
* @param[in] color The color to assign to the specified visual
* @param[in] visualName the name of the visual for which to change the color, or "" to set all the visual of the links
* @return true if all went ok, false otherwise
*/
bool changeVisualsColor(const LinkIndex& linkIndex, const ColorViz& color, const std::string& visualName = "");
public:
ModelVisualization();
~ModelVisualization();
Expand All @@ -36,6 +44,7 @@ class ModelVisualization: public IModelVisualization
virtual void setModelColor(const ColorViz & modelColor);
virtual void resetModelColor();
virtual bool setLinkColor(const LinkIndex& linkIndex, const ColorViz& linkColor);
virtual bool setVisualColor(const LinkIndex& linkIndex, const std::string& visualName, const ColorViz& visualColor);
virtual bool resetLinkColor(const LinkIndex& linkIndex);
virtual std::vector< std::string > getLinkNames();
virtual bool setLinkVisibility(const std::string & linkName, bool isVisible);
Expand Down

0 comments on commit 147fb75

Please sign in to comment.