18 #ifndef IGNITION_RENDERING_BASE_BASEGIZMOVISUAL_HH_ 19 #define IGNITION_RENDERING_BASE_BASEGIZMOVISUAL_HH_ 36 inline namespace IGNITION_RENDERING_VERSION_NAMESPACE {
54 public:
virtual void Init()
override;
57 public:
virtual void PreRender()
override;
60 public:
virtual void SetTransformMode(
TransformMode _mode)
override;
66 public:
virtual void SetActiveAxis(
const math::Vector3d &_axis)
override;
72 public:
virtual TransformAxis AxisById(
unsigned int _id)
const override;
75 public:
virtual VisualPtr ChildByAxis(
unsigned int _axis)
const override;
78 public:
virtual void Reset();
81 protected:
void CreateMaterials();
84 protected:
void CreateTranslationVisual();
87 protected:
void CreateRotationVisual();
90 protected:
void CreateScaleVisual();
106 protected:
bool modeDirty =
false;
154 this->CreateMaterials();
155 this->CreateTranslationVisual();
156 this->CreateRotationVisual();
157 this->CreateScaleVisual();
159 for (
auto v : this->visuals)
160 v.second->SetVisible(
false);
168 this->materials[AM_X],
false);
170 this->materials[AM_Y],
false);
172 this->materials[AM_Z],
false);
174 this->materials[AM_X],
false);
176 this->materials[AM_Y],
false);
178 this->materials[AM_Z],
false);
180 this->materials[AM_X],
false);
182 this->materials[AM_Y],
false);
184 this->materials[AM_Z],
false);
187 this->materials[AM_HANDLE],
false);
189 this->materials[AM_HANDLE],
false);
191 this->materials[AM_HANDLE],
false);
194 this->materials[AM_HANDLE],
false);
196 this->materials[AM_HANDLE],
false);
198 this->materials[AM_HANDLE],
false);
201 this->materials[AM_HANDLE],
false);
203 this->materials[AM_HANDLE],
false);
205 this->materials[AM_HANDLE],
false);
207 for (
auto v : this->visuals)
208 v.second->SetVisible(
false);
215 if (!this->modeDirty)
222 this->modeDirty =
false;
232 if (this->axis.X() > 0)
235 this->materials[AM_ACTIVE],
false);
237 this->materials[AM_HANDLE],
false);
239 if (this->axis.Y() > 0)
242 this->materials[AM_ACTIVE],
false);
244 this->materials[AM_HANDLE],
false);
246 if (this->axis.Z() > 0)
249 this->materials[AM_ACTIVE],
false);
251 this->materials[AM_HANDLE],
false);
260 if (this->axis.X() > 0)
263 this->materials[AM_ACTIVE],
false);
265 this->materials[AM_HANDLE],
false);
267 if (this->axis.Y() > 0)
270 this->materials[AM_ACTIVE],
false);
272 this->materials[AM_HANDLE],
false);
274 if (this->axis.Z() > 0)
277 this->materials[AM_ACTIVE],
false);
279 this->materials[AM_HANDLE],
false);
287 if (this->axis.X() > 0)
290 this->materials[AM_ACTIVE],
false);
292 this->materials[AM_HANDLE],
false);
294 if (this->axis.Y() > 0)
297 this->materials[AM_ACTIVE],
false);
299 this->materials[AM_HANDLE],
false);
301 if (this->axis.Z() > 0)
304 this->materials[AM_ACTIVE],
false);
306 this->materials[AM_HANDLE],
false);
310 this->modeDirty =
false;
317 if (this->mode == _mode)
323 this->modeDirty =
true;
337 if (this->axis == _axis)
341 this->modeDirty =
true;
355 for (
auto v : this->visuals)
359 if (v.second->Id() == _id || v.second->ChildById(_id))
360 return static_cast<TransformAxis>(v.first);
377 xMat->SetDepthWriteEnabled(
false);
378 xMat->SetDepthCheckEnabled(
false);
379 yMat->SetDepthWriteEnabled(
false);
380 yMat->SetDepthCheckEnabled(
false);
381 zMat->SetDepthWriteEnabled(
false);
382 zMat->SetDepthCheckEnabled(
false);
383 activeMat->SetDepthWriteEnabled(
false);
384 activeMat->SetDepthCheckEnabled(
false);
390 oMat->SetAmbient(0.5, 0.5, 0.5);
391 oMat->SetDiffuse(0.5, 0.5, 0.5);
392 oMat->SetEmissive(0.5, 0.5, 0.5);
393 oMat->SetTransparency(0.5);
394 oMat->SetCastShadows(
false);
395 oMat->SetReceiveShadows(
false);
396 oMat->SetLightingEnabled(
false);
397 oMat->SetDepthWriteEnabled(
false);
398 oMat->SetDepthCheckEnabled(
false);
405 handleMat->SetAmbient(0.0, 0.0, 0.0);
406 handleMat->SetDiffuse(0.0, 0.0, 0.0);
407 handleMat->SetEmissive(0.0, 0.0, 0.0);
408 handleMat->SetTransparency(1.0);
409 handleMat->SetCastShadows(
false);
410 handleMat->SetReceiveShadows(
false);
411 handleMat->SetLightingEnabled(
false);
412 handleMat->SetDepthWriteEnabled(
false);
413 handleMat->SetDepthCheckEnabled(
false);
416 this->materials[AM_X] = xMat;
417 this->materials[AM_Y] = yMat;
418 this->materials[AM_Z] = zMat;
419 this->materials[AM_ACTIVE] = activeMat;
420 this->materials[AM_O] = oMat;
421 this->materials[AM_HANDLE] = handleMat;
432 transShaftXVis->AddGeometry(this->
Scene()->CreateCylinder());
433 transShaftXVis->SetOrigin(0, 0, 0.5);
434 transShaftXVis->SetLocalPosition(0, 0, 0.5);
435 transShaftXVis->SetLocalScale(0.02, 0.02, 0.45);
436 transXVis->AddChild(transShaftXVis);
439 transHeadXVis->AddGeometry(this->
Scene()->CreateCone());
440 transHeadXVis->SetOrigin(0, 0, -0.5);
441 transHeadXVis->SetLocalPosition(0, 0, 0.5);
442 transHeadXVis->SetLocalScale(0.07, 0.07, 0.2);
443 transXVis->AddChild(transHeadXVis);
445 transXVis->SetMaterial(this->materials[AM_X],
false);
446 transXVis->SetLocalRotation(0,
IGN_PI * 0.5, 0);
447 transVis->AddChild(transXVis);
452 transShaftYVis->AddGeometry(this->
Scene()->CreateCylinder());
453 transShaftYVis->SetOrigin(0, 0, 0.5);
454 transShaftYVis->SetLocalPosition(0, 0, 0.5);
455 transShaftYVis->SetLocalScale(0.02, 0.02, 0.45);
456 transYVis->AddChild(transShaftYVis);
459 transHeadYVis->AddGeometry(this->
Scene()->CreateCone());
460 transHeadYVis->SetOrigin(0, 0, -0.5);
461 transHeadYVis->SetLocalPosition(0, 0, 0.5);
462 transHeadYVis->SetLocalScale(0.07, 0.07, 0.2);
463 transYVis->AddChild(transHeadYVis);
465 transYVis->SetMaterial(this->materials[AM_Y],
false);
466 transYVis->SetLocalRotation(-
IGN_PI * 0.5, 0, 0);
467 transVis->AddChild(transYVis);
472 transShaftZVis->AddGeometry(this->
Scene()->CreateCylinder());
473 transShaftZVis->SetOrigin(0, 0, 0.5);
474 transShaftZVis->SetLocalPosition(0, 0, 0.5);
475 transShaftZVis->SetLocalScale(0.02, 0.02, 0.45);
476 transZVis->AddChild(transShaftZVis);
479 transHeadZVis->AddGeometry(this->
Scene()->CreateCone());
480 transHeadZVis->SetOrigin(0, 0, -0.5);
481 transHeadZVis->SetLocalPosition(0, 0, 0.5);
482 transHeadZVis->SetLocalScale(0.07, 0.07, 0.2);
483 transZVis->AddChild(transHeadZVis);
485 transZVis->SetMaterial(this->materials[AM_Z],
false);
486 transVis->AddChild(transZVis);
490 transOrigin->AddGeometry(this->
Scene()->CreateSphere());
491 transOrigin->SetLocalScale(0.05, 0.05, 0.05);
492 transOrigin->SetMaterial(this->materials[AM_O],
false);
493 transVis->AddChild(transOrigin);
502 transHandleXVis->AddGeometry(this->
Scene()->CreateCylinder());
503 transHandleXVis->SetLocalPosition(0, 0, 0.35);
504 transHandleXVis->SetLocalScale(0.11, 0.11, 0.7);
505 transHandleXVis->SetMaterial(this->materials[AM_HANDLE],
false);
506 transXVis->AddChild(transHandleXVis);
509 transHandleYVis->AddGeometry(this->
Scene()->CreateCylinder());
510 transHandleYVis->SetLocalPosition(0, 0, 0.35);
511 transHandleYVis->SetLocalScale(0.11, 0.11, 0.7);
512 transHandleYVis->SetMaterial(this->materials[AM_HANDLE],
false);
513 transYVis->AddChild(transHandleYVis);
516 transHandleZVis->AddGeometry(this->
Scene()->CreateCylinder());
517 transHandleZVis->SetLocalPosition(0, 0, 0.35);
518 transHandleZVis->SetLocalScale(0.11, 0.11, 0.7);
519 transHandleZVis->SetMaterial(this->materials[AM_HANDLE],
false);
520 transZVis->AddChild(transHandleZVis);
526 this->AddChild(transVis);
535 if (!meshMgr->
HasMesh(rotMeshName))
539 if (!meshMgr->
HasMesh(rotFullMeshName))
541 meshMgr->
CreateTube(rotFullMeshName, 1.0f, 1.02f, 0.02f, 1, 64,
545 std::string rotHandleMeshName =
"gizmo_rotate_handle";
546 if (!meshMgr->
HasMesh(rotHandleMeshName))
548 meshMgr->
CreateTube(rotHandleMeshName, 0.95f, 1.07f, 0.1f, 1, 64,
556 rotXVis->AddGeometry(this->
Scene()->CreateMesh(rotMeshName));
557 rotXVis->SetLocalRotation(0,
IGN_PI * 0.5, 0);
558 rotXVis->SetLocalScale(0.5, 0.5, 0.5);
559 rotXVis->SetMaterial(this->materials[AM_X],
false);
560 rotVis->AddChild(rotXVis);
564 rotYVis->AddGeometry(this->
Scene()->CreateMesh(rotMeshName));
565 rotYVis->SetLocalRotation(
IGN_PI * 0.5, 0, 0);
566 rotYVis->SetLocalScale(0.5, 0.5, 0.5);
567 rotYVis->SetMaterial(this->materials[AM_Y],
false);
568 rotVis->AddChild(rotYVis);
572 rotZVis->AddGeometry(this->
Scene()->CreateMesh(rotMeshName));
573 rotZVis->SetLocalScale(0.5, 0.5, 0.5);
574 rotZVis->SetMaterial(this->materials[AM_Z],
false);
575 rotVis->AddChild(rotZVis);
579 rotFullVis->AddGeometry(this->
Scene()->CreateMesh(rotFullMeshName));
580 rotFullVis->SetLocalScale(0.5, 0.5, 0.5);
581 rotFullVis->SetMaterial(this->materials[AM_O],
false);
582 rotVis->AddChild(rotFullVis);
591 rotHandleXVis->AddGeometry(this->
Scene()->CreateMesh(rotHandleMeshName));
592 rotHandleXVis->SetMaterial(this->materials[AM_HANDLE],
false);
593 rotXVis->AddChild(rotHandleXVis);
596 rotHandleYVis->AddGeometry(this->
Scene()->CreateMesh(rotHandleMeshName));
597 rotHandleYVis->SetMaterial(this->materials[AM_HANDLE],
false);
598 rotYVis->AddChild(rotHandleYVis);
601 rotHandleZVis->AddGeometry(this->
Scene()->CreateMesh(rotHandleMeshName));
602 rotHandleZVis->SetMaterial(this->materials[AM_HANDLE],
false);
603 rotZVis->AddChild(rotHandleZVis);
609 this->AddChild(rotVis);
621 scaleShaftXVis->AddGeometry(this->
Scene()->CreateCylinder());
622 scaleShaftXVis->SetOrigin(0, 0, 0.5);
623 scaleShaftXVis->SetLocalPosition(0, 0, 0.5);
624 scaleShaftXVis->SetLocalScale(0.02, 0.02, 0.5);
625 scaleXVis->AddChild(scaleShaftXVis);
628 scaleHeadXVis->AddGeometry(this->
Scene()->CreateBox());
629 scaleHeadXVis->SetOrigin(0, 0, -0.5);
630 scaleHeadXVis->SetLocalPosition(0, 0, 0.5);
631 scaleHeadXVis->SetLocalScale(0.07, 0.07, 0.07);
632 scaleXVis->AddChild(scaleHeadXVis);
634 scaleXVis->SetMaterial(this->materials[AM_X],
false);
635 scaleXVis->SetLocalRotation(0,
IGN_PI * 0.5, 0);
636 scaleVis->AddChild(scaleXVis);
641 scaleShaftYVis->AddGeometry(this->
Scene()->CreateCylinder());
642 scaleShaftYVis->SetOrigin(0, 0, 0.5);
643 scaleShaftYVis->SetLocalPosition(0, 0, 0.5);
644 scaleShaftYVis->SetLocalScale(0.02, 0.02, 0.5);
645 scaleYVis->AddChild(scaleShaftYVis);
648 scaleHeadYVis->AddGeometry(this->
Scene()->CreateBox());
649 scaleHeadYVis->SetOrigin(0, 0, -0.5);
650 scaleHeadYVis->SetLocalPosition(0, 0, 0.5);
651 scaleHeadYVis->SetLocalScale(0.07, 0.07, 0.07);
652 scaleYVis->AddChild(scaleHeadYVis);
654 scaleYVis->SetMaterial(this->materials[AM_Y],
false);
655 scaleYVis->SetLocalRotation(-
IGN_PI * 0.5, 0, 0);
656 scaleVis->AddChild(scaleYVis);
661 scaleShaftZVis->AddGeometry(this->
Scene()->CreateCylinder());
662 scaleShaftZVis->SetOrigin(0, 0, 0.5);
663 scaleShaftZVis->SetLocalPosition(0, 0, 0.5);
664 scaleShaftZVis->SetLocalScale(0.02, 0.02, 0.5);
665 scaleZVis->AddChild(scaleShaftZVis);
668 scaleHeadZVis->AddGeometry(this->
Scene()->CreateBox());
669 scaleHeadZVis->SetOrigin(0, 0, -0.5);
670 scaleHeadZVis->SetLocalPosition(0, 0, 0.5);
671 scaleHeadZVis->SetLocalScale(0.07, 0.07, 0.07);
672 scaleZVis->AddChild(scaleHeadZVis);
674 scaleZVis->SetMaterial(this->materials[AM_Z],
false);
675 scaleVis->AddChild(scaleZVis);
683 scaleHandleXVis->AddGeometry(this->
Scene()->CreateCylinder());
684 scaleHandleXVis->SetLocalPosition(0, 0, 0.285);
685 scaleHandleXVis->SetLocalScale(0.11, 0.11, 0.57);
686 scaleHandleXVis->SetMaterial(this->materials[AM_HANDLE],
false);
687 scaleXVis->AddChild(scaleHandleXVis);
690 scaleHandleYVis->AddGeometry(this->
Scene()->CreateCylinder());
691 scaleHandleYVis->SetLocalPosition(0, 0, 0.285);
692 scaleHandleYVis->SetLocalScale(0.11, 0.11, 0.57);
693 scaleHandleYVis->SetMaterial(this->materials[AM_HANDLE],
false);
694 scaleYVis->AddChild(scaleHandleYVis);
697 scaleHandleZVis->AddGeometry(this->
Scene()->CreateCylinder());
698 scaleHandleZVis->SetLocalPosition(0, 0, 0.285);
699 scaleHandleZVis->SetLocalScale(0.11, 0.11, 0.57);
700 scaleHandleZVis->SetMaterial(this->materials[AM_HANDLE],
false);
701 scaleZVis->AddChild(scaleHandleZVis);
707 this->AddChild(scaleVis);
714 auto it = this->visuals.find(_axis);
715 if (it != this->visuals.end())
std::map< unsigned int, MaterialPtr > materials
A map of axis enums to materials.
Definition: BaseGizmoVisual.hh:112
TransformAxis
Unique identifiers for transformation axes.
Definition: TransformType.hh:34
Rotation in x.
Definition: TransformType.hh:45
virtual void Init() override
Definition: BaseGizmoVisual.hh:150
Translation mode.
Definition: TransformType.hh:65
virtual TransformMode Mode() const override
Get the current transform mode.
Definition: BaseGizmoVisual.hh:328
Rotation in y.
Definition: TransformType.hh:47
Scale in x.
Definition: TransformType.hh:51
void CreateRotationVisual()
Create gizmo visual for rotation.
Definition: BaseGizmoVisual.hh:531
Scale in y.
Definition: TransformType.hh:53
Origin.
Definition: BaseGizmoVisual.hh:127
Rotation mode.
Definition: TransformType.hh:67
Translation in x.
Definition: TransformType.hh:39
Rotation in z.
Definition: TransformType.hh:49
std::map< unsigned int, VisualPtr > visuals
A map of gizmo axis and their visuals.
Definition: BaseGizmoVisual.hh:97
Translation in z.
Definition: TransformType.hh:43
Z axis.
Definition: BaseGizmoVisual.hh:123
virtual TransformAxis AxisById(unsigned int _id) const override
Get the Transform axis associated with the given id.
Definition: BaseGizmoVisual.hh:353
#define IGN_COMMON_WARN_RESUME__DLL_INTERFACE_MISSING
virtual ~BaseGizmoVisual()
Destructor.
Definition: BaseGizmoVisual.hh:144
bool HasMesh(const std::string &_name) const
Translation in y.
Definition: TransformType.hh:41
virtual VisualPtr ChildByAxis(unsigned int _axis) const override
Get the child visual by axis.
Definition: BaseGizmoVisual.hh:712
X axis.
Definition: BaseGizmoVisual.hh:119
Scale mode.
Definition: TransformType.hh:69
void CreateMaterials()
Create materials used by the gizmo visual.
Definition: BaseGizmoVisual.hh:368
virtual void PreRender() override
Prepare this object and any of its children for rendering. This should be called for each object in a...
Definition: BaseGizmoVisual.hh:213
Manages a single scene-graph. This class updates scene-wide properties and holds the root scene node...
Definition: Scene.hh:49
virtual void SetActiveAxis(const math::Vector3d &_axis) override
Set the active axis in the gizmo visual.
Definition: BaseGizmoVisual.hh:335
static MeshManager * Instance()
Active axis.
Definition: BaseGizmoVisual.hh:125
Definition: BaseScene.hh:37
BaseGizmoVisual()
Constructor.
Definition: BaseGizmoVisual.hh:138
TransformMode
Unique identifiers for transformation modes.
Definition: TransformType.hh:60
virtual MaterialPtr CreateMaterial(const std::string &_name="")=0
Create new material with the given name. Created material will have default properties.
Y axis.
Definition: BaseGizmoVisual.hh:121
AxisMaterial
Material used by axes.
Definition: BaseGizmoVisual.hh:116
void CreateTube(const std::string &_name, const float _innerRadius, const float _outterRadius, const float _height, const int _rings, const int _segments, const double _arc=2.0 *IGN_PI)
std::map< unsigned int, VisualPtr > handles
A map of gizmo axis and their handle visuals.
Definition: BaseGizmoVisual.hh:100
virtual void Reset()
Reset the gizmo visual state.
Definition: BaseGizmoVisual.hh:165
Inactive state.
Definition: TransformType.hh:63
virtual void SetTransformMode(TransformMode _mode) override
Set the transform mode of the gizmo. This controls the visual appearance of the gizmo. Only the visuals in the specified mode will be visible, e.g. if set to TM_TRANSLATION mode, then only the translation axis visuals will be visible.
Definition: BaseGizmoVisual.hh:315
void CreateTranslationVisual()
Create gizmo visual for translation.
Definition: BaseGizmoVisual.hh:425
No axis.
Definition: TransformType.hh:37
void CreateScaleVisual()
Create gizmo visual for scale.
Definition: BaseGizmoVisual.hh:614
A base implementation of the GizmoVisual class.
Definition: BaseGizmoVisual.hh:43
VisualPtr activeVis
Currently active visual.
Definition: BaseGizmoVisual.hh:103
virtual math::Vector3d ActiveAxis() const override
Get the current active axis.
Definition: BaseGizmoVisual.hh:346
static const Vector3 Zero
virtual VisualPtr CreateVisual()=0
Create new visual. A unique ID and name will automatically be assigned to the visual.
A gizmo that contains rotate, translate, and scale visuals.
Definition: GizmoVisual.hh:34
Scale in z.
Definition: TransformType.hh:55
#define IGN_COMMON_WARN_IGNORE__DLL_INTERFACE_MISSING
virtual MaterialPtr Material(const std::string &_name) const =0
Get material registered under the given name. If no material is registered under the given name...