diff --git a/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp b/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp index 4d2be3924a99696bb013dc9cab0ed2c8201b1923..b6e606ae9a7d2b3a8c60337ea067daf33faddbea 100644 --- a/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp +++ b/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp @@ -500,6 +500,18 @@ namespace armarx } + void fillInteractionLayer(viz::Layer& layer) + { + // TODO: Add interaction to client code + // 1. Make box selectable + viz::Box box = viz::Box("box") + .position(Eigen::Vector3f(2000.0f, 0.0f, 2000.0f)) + .size(Eigen::Vector3f(200.0f, 200.0f, 200.0f)) + .color(viz::Color::fromRGBA(0, 165, 255)); + + layer.add(box); + } + void ArVizExample::run() { @@ -524,6 +536,7 @@ namespace armarx viz::Layer objectsLayer = arviz.layer("Objects"); viz::Layer disAppearingLayer = arviz.layer("DisAppearing"); viz::Layer robotHandsLayer = arviz.layer("RobotHands"); + viz::Layer interactionLayer = arviz.layer("Interaction"); // These layers are not updated in the loop. @@ -545,6 +558,9 @@ namespace armarx arviz.commit(colorMapsLayer); } + fillInteractionLayer(interactionLayer); + arviz.commit(interactionLayer); + CycleUtil c(20); while (!task->isStopped()) diff --git a/source/RobotAPI/interface/ArViz/Elements.ice b/source/RobotAPI/interface/ArViz/Elements.ice index bebbb3f414be2184f51fdb8518cdcd368da33ebc..72bca216206a1ef3b90c918dc940f28e1903fac5 100644 --- a/source/RobotAPI/interface/ArViz/Elements.ice +++ b/source/RobotAPI/interface/ArViz/Elements.ice @@ -2,7 +2,6 @@ #include <ArmarXCore/interface/core/BasicTypes.ice> #include <ArmarXCore/interface/core/BasicVectorTypes.ice> -#include <RobotAPI/interface/core/PoseBase.ice> module armarx @@ -30,6 +29,75 @@ module data byte b = 100; }; + module InteractionEnableFlags + { + const int NONE = 0; + + const int SELECT = 1; + const int CONTEXT_MENU = 2; + + const int TRANSLATION_X = 4; + const int TRANSLATION_Y = 8; + const int TRANSLATION_Z = 16; + + const int ROTATION_X = 32; + const int ROTATION_Y = 64; + const int ROTATION_Z = 128; + }; + + struct InteractionDescription + { + int enableFlags = 0; + Ice::StringSeq contextMenuOptions; + }; + + module InteractionFeedbackType + { + const int NONE = 0; + + const int SELCECT = 1; + const int DESELECT = 2; + + const int CONTEXT_MENU_OPEN = 3; + const int CONTEXT_MENU_CHOSEN = 4; + + const int TRANSFORM = 5; + + // Flag to indicate the kind of transformation + const int TRANSLATION_FLAG = 16; + const int ROTATION_FLAG = 32; + + // Flag to indicate the axis used for transformation + const int AXIS_X_FLAG = 64; + const int AXIS_Y_FLAG = 128; + const int AXIS_Z_FLAG = 256; + + // Flag to indicate state of the transformation + const int TRANSFORM_BEGIN_FLAG = 512; + const int TRANSFORM_DURING_FLAG = 1024; + const int TRANSFORM_END_FLAG = 2048; + }; + + struct InteractionFeedback + { + // The type of interaction that happened (in the lower 4 bits) + // The higher bits are used for flags specifying more details of the interaction + int type = 0; + + // The element with which the interaction took place + string layer; + string element; + // The revision in which the interaction took place + long revision = 0; + + // Chosen context menu entry is only relevant for type == CONTEXT_MENU_CHOSEN + string chosenContextMenuEntry; + + // Original and chosen poase are only relevant for type == TRANSFORM + GlobalPose originalPose; + GlobalPose chosenPose; + }; + module ElementFlags { const int NONE = 0; @@ -40,6 +108,8 @@ module data class Element { string id; + InteractionDescription interaction; + GlobalPose pose; float scale = 1.0f; Color color;