diff --git a/CMakeLists.txt b/CMakeLists.txt index be5ae2f..6c60572 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ cmake_policy(SET CMP0057 NEW) find_package(Rock) rock_init(base 1.0) +rock_feature(NOCURDIR) set(CMAKE_CXX_STANDARD 11) diff --git a/manifest.xml b/manifest.xml index bbcaea4..ccea530 100644 --- a/manifest.xml +++ b/manifest.xml @@ -19,5 +19,7 @@ + + stable diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 24f487b..b6d3a23 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,6 +8,7 @@ if(SISL_FOUND) Spline.cpp Trajectory.cpp ) + set(BASE-TYPES_EXTRA_DEPS_CMAKE SISL) endif() rock_library( @@ -118,10 +119,10 @@ rock_library( DEPS_PKGCONFIG base-logging eigen3 + DEPS_CMAKE ${BASE-TYPES_EXTRA_DEPS_CMAKE} ) if(SISL_FOUND) - target_link_libraries(base-types ${SISL_LIBRARIES}) install(FILES ${CMAKE_SOURCE_DIR}/src/Spline.hpp DESTINATION include/base/geometry) configure_file(base-types-sisl.pc.in ${CMAKE_BINARY_DIR}/base-types-sisl.pc @ONLY) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index bc32845..65522a4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,3 +1,8 @@ + +rock_find_qt4(OPTIONAL) +rock_find_qt5(OPTIONAL) +include(RockQt) + if(SISL_FOUND) list(APPEND OPTIONAL_TESTS test_Spline.cpp) @@ -21,9 +26,14 @@ rock_executable(benchmark benchmark.cpp bench_func.cpp DEPS base-types DEPS_PKGCONFIG base-logging NOINSTALL) -rock_executable(test_DepthMapVisualization test_DepthMapVisualization.cpp - DEPS base-types base-viz - DEPS_PKGCONFIG vizkit3d + +rock_qt_executable( + TARGETPREFIX test_DepthMapVisualization + QT4_SUFFIX "" + SOURCES test_DepthMapVisualization.cpp + DEPS base-types + DEPS_QT base-viz + DEPS_PKGCONFIG_QT vizkit3d LIBS ${Boost_SYSTEM_LIBRARY} NOINSTALL) diff --git a/viz/CMakeLists.txt b/viz/CMakeLists.txt index 98c9c12..5c0c90e 100644 --- a/viz/CMakeLists.txt +++ b/viz/CMakeLists.txt @@ -1,4 +1,7 @@ -rock_find_qt4() +rock_find_qt4(OPTIONAL) +rock_find_qt5(OPTIONAL) + +include(RockQt) unset(OPTIONAL_HPP) unset(OPTIONAL_MOC) @@ -15,7 +18,11 @@ if(SISL_FOUND) ) endif() -rock_vizkit_plugin(base-viz +rock_qt_vizkit_plugin( + TARGETPREFIX base-viz + QT4_SUFFIX "" + MISSINGQTDEPS_NOBUILD + SOURCES PluginLoader.cpp Uncertainty.cpp Vizkit3DHelper.cpp DistanceImageVisualization.cpp LaserScanVisualization.cpp @@ -28,8 +35,10 @@ rock_vizkit_plugin(base-viz SonarVisualization.cpp PointcloudVisualization.cpp DepthMapVisualization.cpp + OrientedBoundingBoxVisualization.cpp ${OPTIONAL_CPP} MOC + PluginLoader.hpp DistanceImageVisualization.hpp LaserScanVisualization.hpp MotionCommandVisualization.hpp @@ -41,6 +50,7 @@ rock_vizkit_plugin(base-viz SonarVisualization.hpp PointcloudVisualization.hpp DepthMapVisualization.hpp + OrientedBoundingBoxVisualization.hpp ${OPTIONAL_MOC} HEADERS Uncertainty.hpp @@ -56,8 +66,17 @@ rock_vizkit_plugin(base-viz SonarVisualization.hpp PointcloudVisualization.hpp DepthMapVisualization.hpp + OrientedBoundingBoxVisualization.hpp ${OPTIONAL_HPP} DEPS base-types LIBS ${Boost_SYSTEM_LIBRARY} - DEPS_PKGCONFIG base-logging + DEPS_PKGCONFIG base-logging PrimitivesFactory ) +if(SISL_FOUND) + if(TARGET base-viz) + target_compile_definitions(base-viz PRIVATE SISL_FOUND) + endif() + if(TARGET base-viz-qt5) + target_compile_definitions(base-viz-qt5 PRIVATE SISL_FOUND) + endif() +endif(SISL_FOUND) diff --git a/viz/OrientedBoundingBoxVisualization.cpp b/viz/OrientedBoundingBoxVisualization.cpp new file mode 100644 index 0000000..c9b434b --- /dev/null +++ b/viz/OrientedBoundingBoxVisualization.cpp @@ -0,0 +1,69 @@ +#include "OrientedBoundingBoxVisualization.hpp" + +#include +#include +#include +#include + +#include + +using namespace vizkit3d; + +struct OrientedBoundingBoxVisualization::Data { + // Copy of the value given to updateDataIntern. + // Making a copy is required because of how OSG works + std::vector data; +}; + + +OrientedBoundingBoxVisualization::OrientedBoundingBoxVisualization() + : p(new Data), color(1.0f, 1.0f, 1.0f, 1.0f) { +} + +OrientedBoundingBoxVisualization::~OrientedBoundingBoxVisualization() { + delete p; +} + +void OrientedBoundingBoxVisualization::setColor(QColor q_color) { + color = osg::Vec4(q_color.redF(), q_color.greenF(), + q_color.blueF(), q_color.alphaF()); + setDirty(); + emit propertyChanged("Color"); +} + +QColor OrientedBoundingBoxVisualization::getColor() const { + QColor q_color; + q_color.setRgbF(color[0], color[1], color[2], color[3]); + return q_color; +} + +osg::ref_ptr OrientedBoundingBoxVisualization::createMainNode() { + osg::ref_ptr boxes = new osg::Group(); + + addBoxes(boxes); + + return boxes; +} + +void OrientedBoundingBoxVisualization::updateMainNode(osg::Node* node) { + node->asGroup()->removeChildren(0, node->asGroup()->getNumChildren()); + addBoxes(node->asGroup()); +} + +void OrientedBoundingBoxVisualization::updateDataIntern(std::vector const& data) { + p->data = data; +} + +void OrientedBoundingBoxVisualization::updateDataIntern(base::samples::OrientedBoundingBox const& data) { + p->data.clear(); + p->data.push_back(data); +} + +void OrientedBoundingBoxVisualization::addBoxes(osg::Group* group) { + for (const auto & box : p->data) { + osg::ref_ptr wireframe = primitives.createWireframeBox(box.dimension.x(), box.dimension.y(), box.dimension.z(), color); + wireframe->setPosition(box.position.x(), box.position.y(), box.position.z()); + wireframe->setOrientation(box.orientation.x(), box.orientation.y(), box.orientation.z(), box.orientation.w()); + group->addChild(wireframe); + } +} diff --git a/viz/OrientedBoundingBoxVisualization.hpp b/viz/OrientedBoundingBoxVisualization.hpp new file mode 100644 index 0000000..e97f4d5 --- /dev/null +++ b/viz/OrientedBoundingBoxVisualization.hpp @@ -0,0 +1,88 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace osg { +class Group; +} + +namespace vizkit3d { + + +class OrientedBoundingBoxVisualization + : public vizkit3d::Vizkit3DPlugin< std::vector > + , public vizkit3d::VizPluginAddType + , boost::noncopyable +{ +Q_OBJECT +Q_PROPERTY(QColor Color READ getColor WRITE setColor) + + public: + OrientedBoundingBoxVisualization(); + ~OrientedBoundingBoxVisualization(); + + /** + * Thread-safe call of + * 'updateDataIntern ( std::vector const& data )'. + */ + Q_INVOKABLE void updateData(std::vector const &sample) { + vizkit3d::Vizkit3DPlugin< std::vector >::updateData(sample); + } + + /** + * Thread-safe call of 'updateDataIntern ( const base::samples::OrientedBoundingBox& data )'. + */ + Q_INVOKABLE void updateData(base::samples::OrientedBoundingBox const &sample) { + vizkit3d::Vizkit3DPlugin< std::vector >::updateData(sample); + } + + public slots: + /** + * Sets the color of all boxes. + */ + void setColor(QColor q_color); + + /** + * Returns the current color of the boxes. + */ + QColor getColor() const; + + protected: + /** + * OSG tree: Group <- Transformation <- Geode <- Sphere + * <- Triangle + */ + osg::ref_ptr createMainNode(); + + /** + * Clears the group and redraws all boxes. + */ + void updateMainNode(osg::Node* node); + + /** + * Replaces the current list of boxes with the passed one. + */ + void updateDataIntern(std::vector const& data); + + /** + * Clears the current list of boxes and adds the new waypoint. + */ + void updateDataIntern(base::samples::OrientedBoundingBox const& data); + + private: + osg::ref_ptr group; + struct Data; + Data* p; + osg::Vec4 color; + osgviz::PrimitivesFactory primitives; + /** + * Inserts all boxes into the tree using the tree structure shown + * in \a createMainNode() and the currently set color. + */ + void addBoxes(osg::Group* group); +}; +} // namespace vizkit3d diff --git a/viz/PluginLoader.cpp b/viz/PluginLoader.cpp index 9f4688b..b0cecb2 100644 --- a/viz/PluginLoader.cpp +++ b/viz/PluginLoader.cpp @@ -1,8 +1,12 @@ -#include + +#include "PluginLoader.hpp" + #include "LaserScanVisualization.hpp" #include "WaypointVisualization.hpp" #include "MotionCommandVisualization.hpp" +#ifdef SISL_FOUND #include "TrajectoryVisualization.hpp" +#endif #include "RigidBodyStateVisualization.hpp" #include "BodyStateVisualization.hpp" #include "SonarGroundDistanceVisualization.hpp" @@ -11,95 +15,102 @@ #include "SonarVisualization.hpp" #include "DepthMapVisualization.hpp" #include "DistanceImageVisualization.hpp" +#include "OrientedBoundingBoxVisualization.hpp" namespace vizkit3d { - class QtPluginVizkitBase : public vizkit3d::VizkitPluginFactory { - private: - public: - - QtPluginVizkitBase() { - } - + + /** * Returns a list of all available visualization plugins. * @return list of plugin names */ - virtual QStringList* getAvailablePlugins() const + QStringList* QtPluginVizkitBase::getAvailablePlugins() const { - QStringList *pluginNames = new QStringList(); - pluginNames->push_back("WaypointVisualization"); - pluginNames->push_back("TrajectoryVisualization"); - pluginNames->push_back("MotionCommandVisualization"); - pluginNames->push_back("RigidBodyStateVisualization"); - pluginNames->push_back("BodyStateVisualization"); - pluginNames->push_back("LaserScanVisualization"); - pluginNames->push_back("SonarGroundDistanceVisualization"); - pluginNames->push_back("PointcloudVisualization"); - pluginNames->push_back("SonarBeamVisualization"); - pluginNames->push_back("SonarVisualization"); - pluginNames->push_back("DepthMapVisualization"); - pluginNames->push_back("DistanceImageVisualization"); - return pluginNames; + QStringList *pluginNames = new QStringList(); + pluginNames->push_back("WaypointVisualization"); + #ifdef SISL_FOUND + pluginNames->push_back("TrajectoryVisualization"); + #endif + pluginNames->push_back("MotionCommandVisualization"); + pluginNames->push_back("RigidBodyStateVisualization"); + pluginNames->push_back("BodyStateVisualization"); + pluginNames->push_back("LaserScanVisualization"); + pluginNames->push_back("SonarGroundDistanceVisualization"); + pluginNames->push_back("PointcloudVisualization"); + pluginNames->push_back("SonarBeamVisualization"); + pluginNames->push_back("SonarVisualization"); + pluginNames->push_back("DepthMapVisualization"); + pluginNames->push_back("DistanceImageVisualization"); + pluginNames->push_back("OrientedBoundingBoxVisualization"); + return pluginNames; } - virtual QObject* createPlugin(QString const& pluginName) - { - vizkit3d::VizPluginBase* plugin = 0; - if (pluginName == "WaypointVisualization") - { - plugin = new vizkit3d::WaypointVisualization(); - } - else if (pluginName == "MotionCommandVisualization") - { - plugin = new vizkit3d::MotionCommandVisualization(); - } - else if (pluginName == "TrajectoryVisualization") - { - plugin = new vizkit3d::TrajectoryVisualization(); - } - else if (pluginName == "RigidBodyStateVisualization") - { - plugin = new vizkit3d::RigidBodyStateVisualization(); - } - else if (pluginName == "BodyStateVisualization") - { - plugin = new vizkit3d::BodyStateVisualization(); - } - else if (pluginName == "LaserScanVisualization") - { - plugin = new vizkit3d::LaserScanVisualization(); - } - else if (pluginName == "SonarGroundDistanceVisualization") - { - plugin = new vizkit3d::SonarGroundDistanceVisualization(); - } - else if (pluginName == "PointcloudVisualization") - { - plugin = new vizkit3d::PointcloudVisualization(); - } - else if (pluginName == "SonarBeamVisualization") - { - plugin = new vizkit3d::SonarBeamVisualization(); - } - else if (pluginName == "SonarVisualization") - { - plugin = new vizkit3d::SonarVisualization(); - } - else if (pluginName == "DepthMapVisualization") - { - plugin = new vizkit3d::DepthMapVisualization(); - } - else if (pluginName == "DistanceImageVisualization") - { + QObject* QtPluginVizkitBase::createPlugin(QString const& pluginName) + { + vizkit3d::VizPluginBase* plugin = 0; + if (pluginName == "WaypointVisualization") + { + plugin = new vizkit3d::WaypointVisualization(); + } + else if (pluginName == "MotionCommandVisualization") + { + plugin = new vizkit3d::MotionCommandVisualization(); + } + #ifdef SISL_FOUND + else if (pluginName == "TrajectoryVisualization") + { + plugin = new vizkit3d::TrajectoryVisualization(); + } + #endif + else if (pluginName == "RigidBodyStateVisualization") + { + plugin = new vizkit3d::RigidBodyStateVisualization(); + } + else if (pluginName == "BodyStateVisualization") + { + plugin = new vizkit3d::BodyStateVisualization(); + } + else if (pluginName == "LaserScanVisualization") + { + plugin = new vizkit3d::LaserScanVisualization(); + } + else if (pluginName == "SonarGroundDistanceVisualization") + { + plugin = new vizkit3d::SonarGroundDistanceVisualization(); + } + else if (pluginName == "PointcloudVisualization") + { + plugin = new vizkit3d::PointcloudVisualization(); + } + else if (pluginName == "SonarBeamVisualization") + { + plugin = new vizkit3d::SonarBeamVisualization(); + } + else if (pluginName == "SonarVisualization") + { + plugin = new vizkit3d::SonarVisualization(); + } + else if (pluginName == "DepthMapVisualization") + { + plugin = new vizkit3d::DepthMapVisualization(); + } + else if (pluginName == "DistanceImageVisualization") + { plugin = new vizkit3d::DistanceImageVisualization(); - } + } + else if (pluginName == "OrientedBoundingBoxVisualization") + { + plugin = new vizkit3d::OrientedBoundingBoxVisualization(); + } + + if (plugin) + { + return plugin; + } + return NULL; + } - if (plugin) - { - return plugin; - } - return NULL; - }; - }; - Q_EXPORT_PLUGIN2(QtPluginVizkitBase, QtPluginVizkitBase) +#if QT_VERSION < 0x050000 + Q_EXPORT_PLUGIN2(QtPluginVizkitBase, QtPluginVizkitBase) +#endif } diff --git a/viz/PluginLoader.hpp b/viz/PluginLoader.hpp new file mode 100644 index 0000000..04744ef --- /dev/null +++ b/viz/PluginLoader.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include + +namespace vizkit3d { + +class QtPluginVizkitBase : public vizkit3d::VizkitPluginFactory { + Q_OBJECT +#if QT_VERSION >= 0x050000 + Q_PLUGIN_METADATA(IID "rock.vizkit3d.VizkitPluginFactory") +#endif + //Q_INTERFACES(vizkit3d::VizkitPluginFactory) + + private: + public: + + QtPluginVizkitBase() { + } + + /** + * Returns a list of all available visualization plugins. + * @return list of plugin names + */ + virtual QStringList* getAvailablePlugins() const; + virtual QObject* createPlugin(QString const& pluginName); +}; + +} // namespace vizkit3d diff --git a/viz/base-viz-qt5.pc.in b/viz/base-viz-qt5.pc.in new file mode 100644 index 0000000..24800b6 --- /dev/null +++ b/viz/base-viz-qt5.pc.in @@ -0,0 +1,12 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: @PROJECT_NAME@-viz-qt5 +Description: base types Vizkit3D plugins +Version: @PROJECT_VERSION@ +Requires: vizkit3d-qt5 +Libs: -L${libdir} -l@PROJECT_NAME@-viz-qt5 +Cflags: -I${includedir} + diff --git a/viz/vizkit_plugin.rb b/viz/vizkit_plugin.rb index dde2711..b5dece9 100644 --- a/viz/vizkit_plugin.rb +++ b/viz/vizkit_plugin.rb @@ -29,3 +29,6 @@ Vizkit::UiLoader.register_3d_plugin_for('DepthMapVisualization', "/base/samples/DepthMap", :updateDepthMap) Vizkit::UiLoader.register_3d_plugin('DistanceImageVisualization', "base", 'DistanceImageVisualization') Vizkit::UiLoader.register_3d_plugin_for('DistanceImageVisualization', "/base/samples/DistanceImage", :updateDistanceImage) +Vizkit::UiLoader.register_3d_plugin('OrientedBoundingBoxVisualization',"base", 'OrientedBoundingBoxVisualization') +Vizkit::UiLoader.register_3d_plugin_for('OrientedBoundingBoxVisualization', "/std/vector", :updateData ) +Vizkit::UiLoader.register_3d_plugin_for('OrientedBoundingBoxVisualization', "/base/samples/OrientedBoundingBox", :updateData )