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))
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())