Skip to content

Commit 1f6f2dd

Browse files
authored
Merge pull request #101 from resibots/placeholders
Define placeholders for text
2 parents 705c9c4 + 28b292b commit 1f6f2dd

17 files changed

+215
-66
lines changed

src/examples/cameras.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ class MyApp : public robot_dart::gui::magnum::GlfwApplication {
1414
// we synchronize by default if we have the graphics activated
1515
simu->scheduler().set_sync(true);
1616
// enable summary text when graphics activated
17-
simu->enable_summary_text(true);
17+
simu->enable_text_panel(true);
18+
simu->enable_status_bar(true);
1819
}
1920

2021
protected:

src/examples/talos.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ int main()
5959
Eigen::VectorXd commands = (init_positions + delta_pos) - robot->positions(dofs);
6060
robot->set_commands(commands, dofs);
6161
}
62+
6263
simu.step_world();
6364
}
6465

src/python/simu.cpp

+21-5
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,20 @@ namespace robot_dart {
5151
// TextData
5252
using simu::TextData;
5353
py::class_<TextData, std::shared_ptr<TextData>>(m, "TextData")
54-
.def(py::init<const std::string&, const Eigen::Affine2d&, const Eigen::Vector4d&>(),
54+
.def(py::init<const std::string&, const Eigen::Affine2d&, const Eigen::Vector4d&, std::uint8_t, bool, const Eigen::Vector4d&>(),
5555
py::arg("text"),
5656
py::arg("transformation") = Eigen::Affine2d::Identity(),
57-
py::arg("color") = Eigen::Vector4d(1, 1, 1, 1))
57+
py::arg("color") = Eigen::Vector4d(1, 1, 1, 1),
58+
py::arg("alignment") = (1 | 3 << 3),
59+
py::arg("draw_background") = false,
60+
py::arg("background_color") = Eigen::Vector4d(0, 0, 0, 0.75))
5861

5962
.def_readwrite("text", &TextData::text)
6063
.def_readwrite("transformation", &TextData::transformation)
61-
.def_readwrite("color", &TextData::color);
64+
.def_readwrite("color", &TextData::color)
65+
.def_readwrite("alignment", &TextData::alignment)
66+
.def_readwrite("draw_background", &TextData::draw_background)
67+
.def_readwrite("background_color", &TextData::background_color);
6268

6369
// RobotDARTSimu class
6470
py::class_<RobotDARTSimu>(m, "RobotDARTSimu")
@@ -131,13 +137,23 @@ namespace robot_dart {
131137
.def("remove_robot", (void (RobotDARTSimu::*)(size_t)) & RobotDARTSimu::remove_robot)
132138
.def("clear_robots", &RobotDARTSimu::clear_robots)
133139

134-
.def("enable_summary_text", &RobotDARTSimu::enable_summary_text,
140+
.def("enable_text_panel", &RobotDARTSimu::enable_text_panel,
135141
py::arg("enable") = true)
142+
.def("text_panel_text", &RobotDARTSimu::text_panel_text)
143+
.def("set_text_panel", &RobotDARTSimu::set_text_panel,
144+
py::arg("str") = "")
145+
146+
.def("enable_status_bar", &RobotDARTSimu::enable_status_bar,
147+
py::arg("enable") = true)
148+
.def("status_bar_text", &RobotDARTSimu::status_bar_text)
136149

137150
.def("add_text", &RobotDARTSimu::add_text, py::return_value_policy::reference,
138151
py::arg("text"),
139152
py::arg("transformation") = Eigen::Affine2d::Identity(),
140-
py::arg("color") = Eigen::Vector4d(1, 1, 1, 1))
153+
py::arg("color") = Eigen::Vector4d(1, 1, 1, 1),
154+
py::arg("alignment") = (1 | 3 << 3),
155+
py::arg("draw_bg") = false,
156+
py::arg("bg_color") = Eigen::Vector4d(0, 0, 0, 0.75))
141157

142158
.def("add_floor", &RobotDARTSimu::add_floor,
143159
py::arg("floor_width") = 10.,

src/robot_dart/gui/magnum/base_application.cpp

+13-6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include <Magnum/MeshTools/CompressIndices.h>
2020
#include <Magnum/MeshTools/Interleave.h>
2121
#include <Magnum/Primitives/Axis.h>
22+
#include <Magnum/Primitives/Square.h>
23+
2224
#include <Magnum/Trade/MeshData.h>
2325
#include <Magnum/Trade/PhongMaterialData.h>
2426

@@ -148,6 +150,9 @@ namespace robot_dart {
148150
_3D_axis_shader.reset(new Magnum::Shaders::VertexColor3D);
149151
_3D_axis_mesh.reset(new Magnum::GL::Mesh);
150152

153+
_background_shader.reset(new Magnum::Shaders::Flat2D);
154+
_background_mesh.reset(new Magnum::GL::Mesh{Magnum::MeshTools::compile(Magnum::Primitives::squareSolid())});
155+
151156
Magnum::Trade::MeshData axis_data = Magnum::Primitives::axis3D();
152157

153158
Magnum::GL::Buffer axis_vertices;
@@ -174,12 +179,11 @@ namespace robot_dart {
174179
_font->fillGlyphCache(*_glyph_cache,
175180
"abcdefghijklmnopqrstuvwxyz"
176181
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
177-
"0123456789:-+,.!° ");
182+
"0123456789:-+*,.!° /|[]()_");
178183

179-
/* Initialize dynamic text */
180-
_dynamic_text.reset(new Magnum::Text::Renderer2D(*_font, *_glyph_cache, 32.0f, Magnum::Text::Alignment::TopLeft));
181-
/* Reserve 100 characters for drawing debug text */
182-
_dynamic_text->reserve(100, Magnum::GL::BufferUsage::DynamicDraw, Magnum::GL::BufferUsage::StaticDraw);
184+
/* Initialize buffers for text */
185+
_text_vertices.reset(new Magnum::GL::Buffer);
186+
_text_indices.reset(new Magnum::GL::Buffer);
183187

184188
/* Initialize text shader */
185189
_text_shader.reset(new Magnum::Shaders::DistanceFieldVector2D);
@@ -639,10 +643,13 @@ namespace robot_dart {
639643
_shadow_color_cube_map.reset();
640644
_3D_axis_shader.reset();
641645
_3D_axis_mesh.reset();
646+
_background_mesh.reset();
647+
_background_shader.reset();
642648
_text_shader.reset();
643649
_glyph_cache.reset();
644650
_font.reset();
645-
_dynamic_text.reset();
651+
_text_vertices.reset();
652+
_text_indices.reset();
646653

647654
_camera.reset();
648655
_shadow_camera.reset();

src/robot_dart/gui/magnum/base_application.hpp

+36-6
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
#include <Magnum/Platform/WindowlessCglApplication.h>
2929
#endif
3030
#include <Magnum/Shaders/DistanceFieldVector.h>
31+
#include <Magnum/Shaders/Flat.h>
3132
#include <Magnum/Shaders/VertexColor.h>
33+
3234
#include <Magnum/Text/AbstractFont.h>
3335
#include <Magnum/Text/DistanceFieldGlyphCache.h>
3436
#include <Magnum/Text/Renderer.h>
@@ -106,6 +108,19 @@ namespace robot_dart {
106108
bool draw_debug = true;
107109
};
108110

111+
struct DebugDrawData {
112+
Magnum::Shaders::VertexColor3D* axes_shader;
113+
Magnum::GL::Mesh* axes_mesh;
114+
Magnum::Shaders::Flat2D* background_shader;
115+
Magnum::GL::Mesh* background_mesh;
116+
117+
Magnum::Shaders::DistanceFieldVector2D* text_shader;
118+
Magnum::GL::Buffer* text_vertices;
119+
Magnum::GL::Buffer* text_indices;
120+
Magnum::Text::AbstractFont* font;
121+
Magnum::Text::DistanceFieldGlyphCache* cache;
122+
};
123+
109124
class BaseApplication {
110125
public:
111126
BaseApplication(const GraphicsConfiguration& configuration = GraphicsConfiguration());
@@ -153,11 +168,22 @@ namespace robot_dart {
153168
// Image filled with depth buffer values
154169
GrayscaleImage raw_depth_image();
155170

156-
// Access to members
157-
Magnum::Shaders::VertexColor3D& axes_shader() { return *_3D_axis_shader; }
158-
Magnum::GL::Mesh& axes_mesh() { return *_3D_axis_mesh; }
159-
Magnum::Shaders::DistanceFieldVector2D* text_shader() { return &*_text_shader; }
160-
Magnum::Text::Renderer2D* text_renderer() { return &*_dynamic_text; }
171+
// Access to debug data
172+
DebugDrawData debug_draw_data()
173+
{
174+
DebugDrawData data;
175+
data.axes_shader = &*_3D_axis_shader;
176+
data.background_shader = &*_background_shader;
177+
data.axes_mesh = &*_3D_axis_mesh;
178+
data.background_mesh = &*_background_mesh;
179+
data.text_shader = &*_text_shader;
180+
data.text_vertices = &*_text_vertices;
181+
data.text_indices = &*_text_indices;
182+
data.font = &*_font;
183+
data.cache = &*_glyph_cache;
184+
185+
return data;
186+
}
161187

162188
protected:
163189
/* Magnum */
@@ -194,12 +220,16 @@ namespace robot_dart {
194220
/* Debug visualization */
195221
std::unique_ptr<Magnum::GL::Mesh> _3D_axis_mesh;
196222
std::unique_ptr<Magnum::Shaders::VertexColor3D> _3D_axis_shader;
223+
std::unique_ptr<Magnum::GL::Mesh> _background_mesh;
224+
std::unique_ptr<Magnum::Shaders::Flat2D> _background_shader;
225+
197226
/* Text visualization */
198227
std::unique_ptr<Magnum::Shaders::DistanceFieldVector2D> _text_shader;
199228
Corrade::PluginManager::Manager<Magnum::Text::AbstractFont> _font_manager;
200229
Corrade::Containers::Pointer<Magnum::Text::DistanceFieldGlyphCache> _glyph_cache;
201230
Corrade::Containers::Pointer<Magnum::Text::AbstractFont> _font;
202-
Corrade::Containers::Pointer<Magnum::Text::Renderer2D> _dynamic_text;
231+
Corrade::Containers::Pointer<Magnum::GL::Buffer> _text_vertices;
232+
Corrade::Containers::Pointer<Magnum::GL::Buffer> _text_indices;
203233

204234
/* Importer */
205235
Corrade::PluginManager::Manager<Magnum::Trade::AbstractImporter> _importer_manager;

src/robot_dart/gui/magnum/glfw_application.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ namespace robot_dart {
8181
_camera->strafe(_speed_strafe);
8282

8383
/* Draw with main camera */
84-
_camera->draw(_drawables, Magnum::GL::defaultFramebuffer, Magnum::PixelFormat::RGB8Unorm, _simu, *_3D_axis_shader, *_3D_axis_mesh, &*_text_shader, &*_dynamic_text, _draw_debug);
84+
_camera->draw(_drawables, Magnum::GL::defaultFramebuffer, Magnum::PixelFormat::RGB8Unorm, _simu, debug_draw_data(), _draw_debug);
8585

8686
swapBuffers();
8787
}

src/robot_dart/gui/magnum/graphics.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ namespace robot_dart {
88
// we synchronize by default if we have the graphics activated
99
simu->scheduler().set_sync(true);
1010
// enable summary text when graphics activated
11-
simu->enable_summary_text(true);
11+
simu->enable_text_panel(true);
12+
simu->enable_status_bar(true);
1213
}
1314
} // namespace magnum
1415
} // namespace gui

src/robot_dart/gui/magnum/gs/camera.cpp

+35-11
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ namespace robot_dart {
251251
#endif
252252
}
253253

254-
void Camera::draw(Magnum::SceneGraph::DrawableGroup3D& drawables, Magnum::GL::AbstractFramebuffer& framebuffer, Magnum::PixelFormat format, RobotDARTSimu* simu, Magnum::Shaders::VertexColor3D& axes_shader, Magnum::GL::Mesh& axes_mesh, Magnum::Shaders::DistanceFieldVector2D* text_shader, Magnum::Text::Renderer2D* text_renderer, bool draw_debug)
254+
void Camera::draw(Magnum::SceneGraph::DrawableGroup3D& drawables, Magnum::GL::AbstractFramebuffer& framebuffer, Magnum::PixelFormat format, RobotDARTSimu* simu, const DebugDrawData& debug_data, bool draw_debug)
255255
{
256256
// TO-DO: Maybe check if world moved?
257257
std::vector<std::pair<std::reference_wrapper<Magnum::SceneGraph::Drawable3D>, Magnum::Matrix4>>
@@ -287,29 +287,53 @@ namespace robot_dart {
287287
Magnum::Matrix4 world_transform = Magnum::Matrix4(Magnum::Matrix4d(axis.first->getWorldTransform().matrix()));
288288
Magnum::Matrix4 scaling = Magnum::Matrix4::scaling(Magnum::Vector3(axis.second, axis.second, axis.second));
289289

290-
axes_shader.setTransformationProjectionMatrix(_camera->projectionMatrix() * _camera->cameraMatrix() * world_transform * scaling)
291-
.draw(axes_mesh);
290+
debug_data.axes_shader->setTransformationProjectionMatrix(_camera->projectionMatrix() * _camera->cameraMatrix() * world_transform * scaling)
291+
.draw(*debug_data.axes_mesh);
292292
}
293293

294294
/* Draw text */
295-
if (text_shader && text_renderer) {
295+
if (debug_data.text_shader && debug_data.text_vertices) {
296296
using namespace Magnum::Math::Literals;
297297
Magnum::GL::Renderer::disable(Magnum::GL::Renderer::Feature::DepthTest);
298298
Magnum::GL::Renderer::disable(Magnum::GL::Renderer::Feature::FaceCulling);
299299

300+
// bind glyph texture
301+
debug_data.text_shader->bindVectorTexture(debug_data.cache->texture());
302+
300303
for (auto& text : simu->gui_data()->drawing_texts()) {
301-
text_renderer->render(text->text);
302-
// std::cout << text_renderer->rectangle().sizeX() << std::endl;
304+
if (text->text.empty()) // ignore empty strings
305+
continue;
306+
307+
Magnum::GL::Mesh mesh;
308+
Magnum::Range2D rectangle;
309+
std::tie(mesh, rectangle) = Magnum::Text::Renderer2D::render(*debug_data.font, *debug_data.cache, 28.f, text->text, *debug_data.text_vertices, *debug_data.text_indices, Magnum::GL::BufferUsage::StaticDraw, Magnum::Text::Alignment(text->alignment));
310+
303311
auto viewport = Magnum::Vector2{_camera->viewport()};
304312
auto big = viewport.max();
305-
auto scaling = Magnum::Vector2{big / 1024.f};
306-
(*text_shader)
307-
.setTransformationProjectionMatrix(Magnum::Matrix3::projection(viewport) * Magnum::Matrix3(Magnum::Matrix3d(text->transformation)) * Magnum::Matrix3::scaling(scaling))
313+
auto text_scaling = Magnum::Matrix3::scaling(Magnum::Vector2{big / 1024.f});
314+
auto extra_tr = Magnum::Matrix3(Magnum::Math::IdentityInit);
315+
if ((text->alignment & Magnum::Text::Implementation::AlignmentVertical) == Magnum::Text::Implementation::AlignmentLine) // if line (bottom) alignment, push the text a bit above
316+
extra_tr = Magnum::Matrix3::translation({0.f, 0.25f * rectangle.sizeY()});
317+
318+
auto text_tr = Magnum::Matrix3(Magnum::Matrix3d(text->transformation));
319+
320+
if (text->draw_background) {
321+
auto bg_scaling = Magnum::Matrix3::scaling(Magnum::Vector2{viewport[0], rectangle.sizeY()});
322+
323+
// draw the background
324+
(*debug_data.background_shader)
325+
.setTransformationProjectionMatrix(Magnum::Matrix3::projection(viewport) * text_tr * text_scaling * bg_scaling)
326+
.setColor(Magnum::Vector4(Magnum::Vector4d(text->background_color)))
327+
.draw(*debug_data.background_mesh);
328+
}
329+
330+
(*debug_data.text_shader)
331+
.setTransformationProjectionMatrix(Magnum::Matrix3::projection(viewport) * text_tr * extra_tr * text_scaling)
308332
// .setTransformationProjectionMatrix(Magnum::Matrix3::projection(Magnum::Vector2{_camera->viewport()}) * Magnum::Matrix3::translation(Magnum::Vector2{-text_renderer->rectangle().sizeX() / 2.f, -text_renderer->rectangle().sizeY() / 2.f}) * Magnum::Matrix3(Magnum::Matrix3d(text.transformation)))
309333
.setColor(Magnum::Vector4(Magnum::Vector4d(text->color)))
310-
.setOutlineRange(0.5f, 1.0f)
334+
.setOutlineRange(0.4f, 0.45f)
311335
.setSmoothness(0.075f)
312-
.draw(text_renderer->mesh());
336+
.draw(mesh);
313337
}
314338

315339
Magnum::GL::Renderer::enable(Magnum::GL::Renderer::Feature::DepthTest);

src/robot_dart/gui/magnum/gs/camera.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
namespace robot_dart {
2222
namespace gui {
2323
namespace magnum {
24+
struct DebugDrawData;
25+
2426
namespace gs {
2527
// This is partly code from the ThirdPersonCameraController of https://github.com/alexesDev/magnum-tips
2628
class Camera : public Object3D {
@@ -69,7 +71,7 @@ namespace robot_dart {
6971
Corrade::Containers::Optional<Magnum::Image2D>& image() { return _image; }
7072
Corrade::Containers::Optional<Magnum::Image2D>& depth_image() { return _depth_image; }
7173

72-
void draw(Magnum::SceneGraph::DrawableGroup3D& drawables, Magnum::GL::AbstractFramebuffer& framebuffer, Magnum::PixelFormat format, RobotDARTSimu* simu, Magnum::Shaders::VertexColor3D& axes_shader, Magnum::GL::Mesh& axes_mesh, Magnum::Shaders::DistanceFieldVector2D* text_shader, Magnum::Text::Renderer2D* text_renderer, bool draw_debug = true);
74+
void draw(Magnum::SceneGraph::DrawableGroup3D& drawables, Magnum::GL::AbstractFramebuffer& framebuffer, Magnum::PixelFormat format, RobotDARTSimu* simu, const DebugDrawData& debug_data, bool draw_debug = true);
7375

7476
private:
7577
Object3D* _yaw_object;

src/robot_dart/gui/magnum/sensor/camera.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ namespace robot_dart {
7878
_framebuffer.clear(Magnum::GL::FramebufferClear::Color | Magnum::GL::FramebufferClear::Depth);
7979

8080
/* Draw with this camera */
81-
_camera->draw(_magnum_app->drawables(), _framebuffer, _format, _simu, _magnum_app->axes_shader(), _magnum_app->axes_mesh(), _magnum_app->text_shader(), _magnum_app->text_renderer(), _draw_debug);
81+
_camera->draw(_magnum_app->drawables(), _framebuffer, _format, _simu, _magnum_app->debug_draw_data(), _draw_debug);
8282
}
8383

8484
std::string Camera::type() const { return "rgb_camera"; }

src/robot_dart/gui/magnum/windowless_gl_application.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ namespace robot_dart {
7474
_framebuffer.clear(Magnum::GL::FramebufferClear::Color | Magnum::GL::FramebufferClear::Depth);
7575

7676
/* Draw with main camera */
77-
_camera->draw(_drawables, _framebuffer, _format, _simu, *_3D_axis_shader, *_3D_axis_mesh, &*_text_shader, &*_dynamic_text, _draw_debug);
77+
_camera->draw(_drawables, _framebuffer, _format, _simu, debug_draw_data(), _draw_debug);
7878

7979
// if (_index % 10 == 0) {
8080
// intptr_t tt = (intptr_t)_glx_context;

src/robot_dart/gui/magnum/windowless_graphics.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ namespace robot_dart {
88
// we should not synchronize by default if we want windowless graphics (usually used only for sensors)
99
simu->scheduler().set_sync(false);
1010
// disable summary text when windowless graphics activated
11-
simu->enable_summary_text(false);
11+
simu->enable_text_panel(false);
12+
simu->enable_status_bar(false);
1213
}
1314
} // namespace magnum
1415
} // namespace gui

src/robot_dart/gui_data.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ namespace robot_dart {
2525
std::vector<std::shared_ptr<simu::TextData>> text_drawings;
2626

2727
public:
28-
std::shared_ptr<simu::TextData> add_text(const std::string& text, const Eigen::Affine2d& tf = Eigen::Affine2d::Identity(), Eigen::Vector4d color = Eigen::Vector4d(1, 1, 1, 1))
28+
std::shared_ptr<simu::TextData> add_text(const std::string& text, const Eigen::Affine2d& tf = Eigen::Affine2d::Identity(), Eigen::Vector4d color = Eigen::Vector4d(1, 1, 1, 1), std::uint8_t alignment = (1 | 3 << 3), bool draw_bg = false, Eigen::Vector4d bg_color = Eigen::Vector4d(0, 0, 0, 0.75))
2929
{
30-
text_drawings.emplace_back(new TextData{text, tf, color});
30+
text_drawings.emplace_back(new TextData{text, tf, color, alignment, draw_bg, bg_color});
3131

3232
return text_drawings.back();
3333
}

0 commit comments

Comments
 (0)