Skip to content

Commit 320229e

Browse files
add quick mesh color adapter for offline visualization (#58)
1 parent 8b085b2 commit 320229e

3 files changed

Lines changed: 67 additions & 1 deletion

File tree

hydra_visualizer/include/hydra_visualizer/adapters/mesh_color.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,32 @@ struct SeenDurationMeshColoring : public MeshColoring {
186186

187187
void declare_config(SeenDurationMeshColoring::Config& config);
188188

189+
/**
190+
* @brief Functor to partially apply a color functor
191+
*
192+
* Points with a positive distance to the plane will use the child coloring functor,
193+
* otherwise they will use the original mesh color
194+
*/
195+
struct SplitMeshColoring : public MeshColoring {
196+
struct Config {
197+
config::VirtualConfig<MeshColoring> coloring;
198+
Eigen::Vector3f normal = Eigen::Vector3f::Ones();
199+
Eigen::Vector3f origin = Eigen::Vector3f::Zero();
200+
spark_dsg::Color default_color = spark_dsg::Color::gray();
201+
} const config;
202+
203+
explicit SplitMeshColoring(const Config& config);
204+
virtual ~SplitMeshColoring() = default;
205+
206+
void setMesh(const spark_dsg::Mesh& mesh) override;
207+
spark_dsg::Color getVertexColor(const spark_dsg::Mesh& mesh, size_t i) const override;
208+
209+
private:
210+
MeshColoring::Ptr coloring_;
211+
};
212+
213+
void declare_config(SplitMeshColoring::Config& config);
214+
189215
/**
190216
* @brief Utility class to color a mesh based on a mesh coloring for visualization.
191217
*/

hydra_visualizer/src/adapters/mesh_color.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
#include "hydra_visualizer/adapters/mesh_color.h"
22

33
#include <config_utilities/config.h>
4+
#include <config_utilities/types/eigen_matrix.h>
5+
#include <config_utilities/validation.h>
46

57
#include "hydra_visualizer/color/color_parsing.h"
68

79
namespace hydra {
10+
namespace {
11+
12+
static const auto splt_reg =
13+
config::RegistrationWithConfig<MeshColoring,
14+
SplitMeshColoring,
15+
SplitMeshColoring::Config>("SplitMeshColoring");
16+
17+
}
818

919
using spark_dsg::Color;
1020
using spark_dsg::Mesh;
@@ -124,6 +134,35 @@ void SeenDurationMeshColoring::setMaxDuration(spark_dsg::Mesh::Timestamp max) {
124134
max_ = max;
125135
}
126136

137+
void declare_config(SplitMeshColoring::Config& config) {
138+
using namespace config;
139+
name("SplitMeshColoring::Config");
140+
config.coloring.setOptional();
141+
field(config.coloring, "coloring");
142+
field(config.normal, "normal");
143+
field(config.origin, "origin");
144+
field(config.default_color, "default_color");
145+
}
146+
147+
SplitMeshColoring::SplitMeshColoring(const Config& config)
148+
: config(config::checkValid(config)), coloring_(config.coloring.create()) {}
149+
150+
void SplitMeshColoring::setMesh(const Mesh& mesh) {
151+
if (coloring_) {
152+
coloring_->setMesh(mesh);
153+
}
154+
}
155+
156+
Color SplitMeshColoring::getVertexColor(const Mesh& mesh, size_t i) const {
157+
const auto& pos = mesh.pos(i);
158+
const auto dist = config.normal.dot(pos - config.origin);
159+
if (dist >= 0.0f && coloring_) {
160+
return coloring_->getVertexColor(mesh, i);
161+
}
162+
163+
return mesh.has_colors ? mesh.color(i) : config.default_color;
164+
}
165+
127166
MeshColorAdapter::MeshColorAdapter(const Mesh& mesh, MeshColoring::ConstPtr coloring)
128167
: mesh(mesh), coloring_(std::move(coloring)) {
129168
if (coloring_) {

hydra_visualizer/src/plugins/mesh_plugin.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ MeshPlugin::MeshPlugin(const Config& config,
6464
ianvs::NodeHandle nh,
6565
const std::string& name)
6666
: VisualizerPlugin(name),
67-
config_("mesh_plugin", config::checkValid(config)),
67+
config_(
68+
"mesh_plugin", config::checkValid(config), [this]() { has_change_ = true; }),
6869
mesh_pub_(nh.create_publisher<kimera_pgmo_msgs::msg::Mesh>(
6970
name, rclcpp::QoS(1).transient_local())) {}
7071

0 commit comments

Comments
 (0)