pxmlw6n2f/Gazebo_Distributed_MPI/gazebo/rendering/SelectionObj.cc

765 lines
26 KiB
C++

/*
* Copyright (C) 2012 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifdef _WIN32
// Ensure that Winsock2.h is included before Windows.h, which can get
// pulled in by anybody (e.g., Boost).
#include <Winsock2.h>
#endif
#include "gazebo/common/MeshManager.hh"
#include "gazebo/rendering/UserCamera.hh"
#include "gazebo/rendering/Visual.hh"
#include "gazebo/rendering/ogre_gazebo.h"
#include "gazebo/rendering/Scene.hh"
#include "gazebo/rendering/SelectionObjPrivate.hh"
#include "gazebo/rendering/SelectionObj.hh"
using namespace gazebo;
using namespace rendering;
/////////////////////////////////////////////////
SelectionObj::SelectionObj(const std::string &_name, VisualPtr _vis)
: Visual(*new SelectionObjPrivate, _name, _vis, false)
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
dPtr->type = VT_GUI;
dPtr->state = SELECTION_NONE;
dPtr->mode = SELECTION_NONE;
dPtr->maxScale = 2.5;
dPtr->minScale = 0.5;
dPtr->xAxisMatOverlay = "Gazebo/RedTransparentOverlay";
dPtr->yAxisMatOverlay = "Gazebo/GreenTransparentOverlay";
dPtr->zAxisMatOverlay = "Gazebo/BlueTransparentOverlay";
dPtr->xAxisMat = "Gazebo/RedTransparent";
dPtr->yAxisMat = "Gazebo/GreenTransparent";
dPtr->zAxisMat = "Gazebo/BlueTransparent";
}
/////////////////////////////////////////////////
SelectionObj::~SelectionObj()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
dPtr->parent.reset();
}
/////////////////////////////////////////////////
void SelectionObj::Load()
{
Visual::Load();
this->CreateRotateVisual();
this->CreateTranslateVisual();
this->CreateScaleVisual();
this->SetVisibilityFlags(GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
this->SetHandleVisible(TRANS, false);
this->SetHandleVisible(ROT, false);
this->SetHandleVisible(SCALE, false);
this->GetSceneNode()->setInheritScale(false);
}
/////////////////////////////////////////////////
void SelectionObj::Fini()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
// Destroy objects and nodes created by this visual
if (!dPtr->scene)
return;
Ogre::SceneManager *manager = dPtr->scene->OgreSceneManager();
if (!manager)
return;
// transVisual / rotVisual / scaleVisual
for (unsigned int i = 0; i < this->GetChildCount(); ++i)
{
if (!this->GetChild(i))
continue;
// transXVisual / transYVisual / transZVisual
for (unsigned int j = 0; j < this->GetChild(i)->GetChildCount(); ++j)
{
if (!this->GetChild(i)->GetChild(j) ||
!this->GetChild(i)->GetChild(j)->GetSceneNode())
{
continue;
}
// transShaftXNode / transHeadXNode
for (auto k = this->GetChild(i)->GetChild(j)->GetSceneNode()->
numChildren()-1; k >= 0; --k)
{
Ogre::SceneNode *toDestroy =
reinterpret_cast<Ogre::SceneNode *>(
this->GetChild(i)->
GetChild(j)->
GetSceneNode()->
getChild(k));
manager->destroyMovableObject(toDestroy->getAttachedObject(0));
manager->destroySceneNode(toDestroy);
}
}
}
Visual::Fini();
}
/////////////////////////////////////////////////
void SelectionObj::Attach(rendering::VisualPtr _vis)
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
if (dPtr->parent)
{
if (dPtr->parent == _vis)
return;
dPtr->parent->DetachVisual(shared_from_this());
}
dPtr->parent = _vis;
dPtr->parent->AttachVisual(shared_from_this());
this->SetPosition(math::Vector3(0, 0, 0));
this->UpdateSize();
}
/////////////////////////////////////////////////
void SelectionObj::UpdateSize()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
VisualPtr vis = dPtr->parent;
// don't include the selection obj itself when calculating the size.
this->Detach();
math::Vector3 bboxSize = vis->GetBoundingBox().GetSize()
* vis->GetScale();
dPtr->parent = vis;
dPtr->parent->AttachVisual(shared_from_this());
double max = std::max(std::max(bboxSize.x, bboxSize.y), bboxSize.z);
max = std::min(std::max(dPtr->minScale, max), dPtr->maxScale);
// Handle special case for rotation visuals. Only set the visuals to be
// overlays for big objects.
if (math::equal(max, dPtr->maxScale))
{
this->SetHandleMaterial(ROT_X, dPtr->xAxisMatOverlay, false);
this->SetHandleMaterial(ROT_Y, dPtr->yAxisMatOverlay, false);
this->SetHandleMaterial(ROT_Z, dPtr->zAxisMatOverlay, false);
}
else
{
this->SetHandleMaterial(ROT_X, dPtr->xAxisMat, false);
this->SetHandleMaterial(ROT_Y, dPtr->yAxisMat, false);
this->SetHandleMaterial(ROT_Z, dPtr->zAxisMat, false);
}
this->SetScale(math::Vector3(max, max, max));
}
/////////////////////////////////////////////////
void SelectionObj::Detach()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
if (dPtr->parent)
dPtr->parent->DetachVisual(shared_from_this());
dPtr->parent.reset();
}
/////////////////////////////////////////////////
void SelectionObj::SetMode(const std::string &_mode)
{
SelectionMode tmpMode = SELECTION_NONE;
if (_mode == "translate")
tmpMode = TRANS;
else if (_mode == "rotate")
tmpMode = ROT;
else if (_mode == "scale")
tmpMode = SCALE;
this->SetMode(tmpMode);
}
/////////////////////////////////////////////////
void SelectionObj::SetMode(SelectionMode _mode)
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
if (_mode == dPtr->mode)
return;
dPtr->mode = _mode;
this->SetHandleVisible(TRANS, false);
this->SetHandleVisible(ROT, false);
this->SetHandleVisible(SCALE, false);
this->SetHandleVisible(dPtr->mode, true);
}
/////////////////////////////////////////////////
SelectionObj::SelectionMode SelectionObj::GetMode()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
return dPtr->mode;
}
/////////////////////////////////////////////////
void SelectionObj::SetState(const std::string &_state)
{
SelectionMode tmpState = SELECTION_NONE;
if (_state == "trans_x")
{
tmpState = TRANS_X;
}
else if (_state == "trans_y")
{
tmpState = TRANS_Y;
}
else if (_state == "trans_z")
{
tmpState = TRANS_Z;
}
else if (_state == "rot_x")
{
tmpState = ROT_X;
}
else if (_state == "rot_y")
{
tmpState = ROT_Y;
}
else if (_state == "rot_z")
{
tmpState = ROT_Z;
}
else if (_state == "scale_x")
{
tmpState = SCALE_X;
}
else if (_state == "scale_y")
{
tmpState = SCALE_Y;
}
else if (_state == "scale_z")
{
tmpState = SCALE_Z;
}
this->SetState(tmpState);
}
/////////////////////////////////////////////////
void SelectionObj::SetState(SelectionMode _state)
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
if (dPtr->state == _state)
return;
dPtr->state = _state;
if (dPtr->selectedVis)
{
Ogre::MaterialPtr mat =
Ogre::MaterialManager::getSingleton().getByName(
dPtr->selectedVis->GetMaterialName());
mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(
Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, 0.5);
dPtr->selectedVis.reset();
}
if (dPtr->state == TRANS_X)
dPtr->selectedVis = dPtr->transXVisual;
else if (dPtr->state == TRANS_Y)
dPtr->selectedVis = dPtr->transYVisual;
else if (dPtr->state == TRANS_Z)
dPtr->selectedVis = dPtr->transZVisual;
else if (dPtr->state == ROT_X)
dPtr->selectedVis = dPtr->rotXVisual;
else if (dPtr->state == ROT_Y)
dPtr->selectedVis = dPtr->rotYVisual;
else if (dPtr->state == ROT_Z)
dPtr->selectedVis = dPtr->rotZVisual;
else if (dPtr->state == SCALE_X)
dPtr->selectedVis = dPtr->scaleXVisual;
else if (dPtr->state == SCALE_Y)
dPtr->selectedVis = dPtr->scaleYVisual;
else if (dPtr->state == SCALE_Z)
dPtr->selectedVis = dPtr->scaleZVisual;
if (dPtr->selectedVis)
{
Ogre::MaterialPtr mat =
Ogre::MaterialManager::getSingleton().getByName(
dPtr->selectedVis->GetMaterialName());
mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setAlphaOperation(
Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, 0.7);
}
}
/////////////////////////////////////////////////
void SelectionObj::SetGlobal(bool _global)
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
dPtr->transVisual->GetSceneNode()->setInheritOrientation(!_global);
dPtr->rotVisual->GetSceneNode()->setInheritOrientation(!_global);
}
/////////////////////////////////////////////////
SelectionObj::SelectionMode SelectionObj::GetState()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
return dPtr->state;
}
/////////////////////////////////////////////////
void SelectionObj::CreateTranslateVisual()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
// Translation mainipulation tool
dPtr->transVisual.reset(new rendering::Visual(
this->GetName() + "__SELECTION_OBJ_TRANS__",
shared_from_this()));
dPtr->transVisual->Load();
dPtr->transXVisual.reset(
new rendering::Visual(
"__SELECTION_OBJ_TRANS_X__" + this->GetName(), dPtr->transVisual));
dPtr->transYVisual.reset(
new rendering::Visual(
"__SELECTION_OBJ_TRANS_Y__" + this->GetName(), dPtr->transVisual));
dPtr->transZVisual.reset(
new rendering::Visual(
"__SELECTION_OBJ_TRANS_Z__" + this->GetName(), dPtr->transVisual));
dPtr->transXVisual->Load();
dPtr->transYVisual->Load();
dPtr->transZVisual->Load();
this->InsertMesh("axis_shaft");
this->InsertMesh("axis_head");
Ogre::MovableObject *shaftXObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_TRANS_SHAFT_X__" + this->GetName(), "axis_shaft"));
Ogre::MovableObject *headXObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_TRANS_HEAD_X__" + this->GetName(), "axis_head"));
Ogre::SceneNode *transShaftXNode =
dPtr->transXVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ__TRANS_SHAFT_NODE_X__" + this->GetName());
Ogre::SceneNode *transHeadXNode =
dPtr->transXVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ__TRANS_HEAD_NODE_X__" + this->GetName());
transShaftXNode->attachObject(shaftXObj);
transShaftXNode->setScale(0.5, 0.5, 1.0);
transShaftXNode->setPosition(0, 0, 0.1);
transHeadXNode->attachObject(headXObj);
transHeadXNode->setScale(0.5, 0.5, 0.5);
transHeadXNode->setPosition(0, 0, 0.22);
shaftXObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("trans_x")));
headXObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("trans_x")));
shaftXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
headXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
Ogre::MovableObject *shaftYObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_TRANS_SHAFT_Y__" + this->GetName(), "axis_shaft"));
Ogre::MovableObject *headYObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_TRANS_HEAD_Y__" + this->GetName(), "axis_head"));
Ogre::SceneNode *transShaftYNode =
dPtr->transYVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_TRANS_SHAFT_NODE_Y__" + this->GetName());
Ogre::SceneNode *transHeadYNode =
dPtr->transYVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_TRANS_HEAD_NODE_Y__" + this->GetName());
transShaftYNode->attachObject(shaftYObj);
transShaftYNode->setScale(0.5, 0.5, 1.0);
transShaftYNode->setPosition(0, 0, 0.1);
transHeadYNode->attachObject(headYObj);
transHeadYNode->setScale(0.5, 0.5, 0.5);
transHeadYNode->setPosition(0, 0, 0.22);
shaftYObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("trans_y")));
headYObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("trans_y")));
shaftYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
headYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
Ogre::MovableObject *shaftZObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_TRANS_SHAFT_Z__" + this->GetName(), "axis_shaft"));
Ogre::MovableObject *headZObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_TRANS_HEAD_Z__" + this->GetName(), "axis_head"));
Ogre::SceneNode *transShaftZNode =
dPtr->transZVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_TRANS_SHAFT_NODE_Z__" + this->GetName());
Ogre::SceneNode *transHeadZNode =
dPtr->transZVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_TRANS_HEAD_NODE_Z__" + this->GetName());
transShaftZNode->attachObject(shaftZObj);
transShaftZNode->setScale(0.5, 0.5, 1.0);
transShaftZNode->setPosition(0, 0, 0.1);
transHeadZNode->attachObject(headZObj);
transHeadZNode->setScale(0.5, 0.5, 0.5);
transHeadZNode->setPosition(0, 0, 0.22);
shaftZObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("trans_z")));
headZObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("trans_z")));
shaftZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
headZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
dPtr->transXVisual->SetRotation(
math::Quaternion(math::Vector3(0, 1, 0), GZ_DTOR(90)));
dPtr->transYVisual->SetRotation(
math::Quaternion(math::Vector3(1, 0, 0), GZ_DTOR(-90)));
this->SetHandleMaterial(TRANS_X, dPtr->xAxisMatOverlay);
this->SetHandleMaterial(TRANS_Y, dPtr->yAxisMatOverlay);
this->SetHandleMaterial(TRANS_Z, dPtr->zAxisMatOverlay);
dPtr->transVisual->SetScale(math::Vector3(5.0, 5.0, 5.0));
dPtr->transXVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
dPtr->transYVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
dPtr->transZVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
}
/////////////////////////////////////////////////
void SelectionObj::CreateRotateVisual()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
// Rotation mainipulation tool
dPtr->rotVisual.reset(new rendering::Visual(
this->GetName() + "__SELECTION_OBJ_ROT__",
shared_from_this()));
dPtr->rotVisual->Load();
dPtr->rotXVisual.reset(
new rendering::Visual(
this->GetName() + "__SELECTION_OBJ_ROT_X__", dPtr->rotVisual));
dPtr->rotYVisual.reset(
new rendering::Visual(
this->GetName() + "__SELECTION_OBJ_ROT_Y__", dPtr->rotVisual));
dPtr->rotZVisual.reset(
new rendering::Visual(
this->GetName() + "__SELECTION_OBJ_ROT_Z__", dPtr->rotVisual));
dPtr->rotVisual->InsertMesh("selection_tube");
Ogre::MovableObject *rotXObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_ROT_X__" + this->GetName(), "selection_tube"));
Ogre::SceneNode *xNode =
dPtr->rotXVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ__ROT_NODE_X__" + this->GetName());
xNode->attachObject(rotXObj);
rotXObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("rot_x")));
rotXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
Ogre::MovableObject *rotYObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_ROT_Y__" + this->GetName(), "selection_tube"));
Ogre::SceneNode *yNode =
dPtr->rotYVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ__ROT_NODE_Y__" + this->GetName());
yNode->attachObject(rotYObj);
rotYObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("rot_y")));
rotYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
Ogre::MovableObject *rotZObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_ROT_Z__" + this->GetName(), "selection_tube"));
Ogre::SceneNode *zNode =
dPtr->rotZVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ__ROT_NODE_Z__" + this->GetName());
zNode->attachObject(rotZObj);
rotZObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("rot_z")));
rotZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
dPtr->rotXVisual->Load();
dPtr->rotYVisual->Load();
dPtr->rotZVisual->Load();
dPtr->rotXVisual->SetRotation(
math::Quaternion(math::Vector3(0, 1, 0), GZ_DTOR(90)));
dPtr->rotYVisual->SetRotation(
math::Quaternion(math::Vector3(1, 0, 0), GZ_DTOR(-90)));
// By default the visuals are not overlays like translation or scale visuals.
// This is so that the rings does not block the object it's attached too,
// and also gives with better depth perception.
this->SetHandleMaterial(ROT_X, dPtr->xAxisMat);
this->SetHandleMaterial(ROT_Y, dPtr->yAxisMat);
this->SetHandleMaterial(ROT_Z, dPtr->zAxisMat);
dPtr->rotVisual->SetScale(math::Vector3(1.0, 1.0, 1.0));
dPtr->rotXVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
dPtr->rotYVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
dPtr->rotZVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
}
/////////////////////////////////////////////////
void SelectionObj::CreateScaleVisual()
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
// Scale mainipulation tool
dPtr->scaleVisual.reset(new rendering::Visual(
this->GetName() + "__SELECTION_OBJ_SCALE__",
shared_from_this()));
dPtr->scaleVisual->Load();
dPtr->scaleXVisual.reset(
new rendering::Visual(
"__SELECTION_OBJ_SCALE_X__" + this->GetName(), dPtr->scaleVisual));
dPtr->scaleYVisual.reset(
new rendering::Visual(
"__SELECTION_OBJ_SCALE_Y__" + this->GetName(), dPtr->scaleVisual));
dPtr->scaleZVisual.reset(
new rendering::Visual(
"__SELECTION_OBJ_SCALE_Z__" + this->GetName(), dPtr->scaleVisual));
dPtr->scaleXVisual->Load();
dPtr->scaleYVisual->Load();
dPtr->scaleZVisual->Load();
this->InsertMesh("axis_box");
Ogre::MovableObject *scaleShaftXObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_SCALE_SHAFT_X__" + this->GetName(), "axis_shaft"));
Ogre::MovableObject *scaleHeadXObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_SCALE_HEAD_X__" + this->GetName(), "axis_box"));
Ogre::SceneNode *scaleShaftXNode =
dPtr->scaleXVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ__SCALE_SHAFT_NODE_X__" + this->GetName());
Ogre::SceneNode *scaleHeadXNode =
dPtr->scaleXVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ__SCALE_HEAD_NODE_X__" + this->GetName());
scaleShaftXNode->attachObject(scaleShaftXObj);
scaleShaftXNode->setScale(0.5, 0.5, 1.0);
scaleShaftXNode->setPosition(0, 0, 0.1);
scaleHeadXNode->attachObject(scaleHeadXObj);
scaleHeadXNode->setScale(0.02, 0.02, 0.02);
scaleHeadXNode->setPosition(0, 0, 0.21);
scaleShaftXObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("scale_x")));
scaleHeadXObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("scale_x")));
scaleShaftXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
scaleHeadXObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
Ogre::MovableObject *scaleShaftYObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_SCALE_SHAFT_Y__" + this->GetName(), "axis_shaft"));
Ogre::MovableObject *scaleHeadYObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_SCALE_HEAD_Y__" + this->GetName(), "axis_box"));
Ogre::SceneNode *scaleShaftYNode =
dPtr->scaleYVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_SCALE_SHAFT_NODE_Y__" + this->GetName());
Ogre::SceneNode *scaleHeadYNode =
dPtr->scaleYVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_SCALE_HEAD_NODE_Y__" + this->GetName());
scaleShaftYNode->attachObject(scaleShaftYObj);
scaleShaftYNode->setScale(0.5, 0.5, 1.0);
scaleShaftYNode->setPosition(0, 0, 0.1);
scaleHeadYNode->attachObject(scaleHeadYObj);
scaleHeadYNode->setScale(0.02, 0.02, 0.02);
scaleHeadYNode->setPosition(0, 0, 0.21);
scaleShaftYObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("scale_y")));
scaleHeadYObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("scale_y")));
scaleShaftYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
scaleHeadYObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
Ogre::MovableObject *scaleShaftZObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_SCALE_SHAFT_Z__" + this->GetName(), "axis_shaft"));
Ogre::MovableObject *scaleHeadZObj =
(Ogre::MovableObject*)(dPtr->scene->OgreSceneManager()->createEntity(
"__SELECTION_OBJ_SCALE_HEAD_Z__" + this->GetName(), "axis_box"));
Ogre::SceneNode *scaleShaftZNode =
dPtr->scaleZVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_SCALE_SHAFT_NODE_Z__" + this->GetName());
Ogre::SceneNode *scaleHeadZNode =
dPtr->scaleZVisual->GetSceneNode()->createChildSceneNode(
"__SELECTION_OBJ_SCALE_HEAD_NODE_Z__" + this->GetName());
scaleShaftZNode->attachObject(scaleShaftZObj);
scaleShaftZNode->setScale(0.5, 0.5, 1.0);
scaleShaftZNode->setPosition(0, 0, 0.1);
scaleHeadZNode->attachObject(scaleHeadZObj);
scaleHeadZNode->setScale(0.02, 0.02, 0.02);
scaleHeadZNode->setPosition(0, 0, 0.21);
scaleShaftZObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("scale_z")));
scaleHeadZObj->getUserObjectBindings().setUserAny(
Ogre::Any(std::string("scale_z")));
scaleShaftZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
scaleHeadZObj->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY);
dPtr->scaleXVisual->SetRotation(
math::Quaternion(math::Vector3(0, 1, 0), GZ_DTOR(90)));
dPtr->scaleYVisual->SetRotation(
math::Quaternion(math::Vector3(1, 0, 0), GZ_DTOR(-90)));
this->SetHandleMaterial(SCALE_X, dPtr->xAxisMatOverlay);
this->SetHandleMaterial(SCALE_Y, dPtr->yAxisMatOverlay);
this->SetHandleMaterial(SCALE_Z, dPtr->zAxisMatOverlay);
dPtr->scaleVisual->SetScale(math::Vector3(5.0, 5.0, 5.0));
dPtr->scaleXVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
dPtr->scaleYVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
dPtr->scaleZVisual->SetVisibilityFlags(
GZ_VISIBILITY_GUI | GZ_VISIBILITY_SELECTABLE);
}
/////////////////////////////////////////////////
void SelectionObj::SetHandleVisible(SelectionMode _mode, bool _visible)
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
if (_mode == TRANS || _mode == TRANS_X)
dPtr->transXVisual->SetVisible(_visible);
if (_mode == TRANS || _mode == TRANS_Y)
dPtr->transYVisual->SetVisible(_visible);
if (_mode == TRANS || _mode == TRANS_Z)
dPtr->transZVisual->SetVisible(_visible);
if (_mode == ROT || _mode == ROT_X)
dPtr->rotXVisual->SetVisible(_visible);
if (_mode == ROT || _mode == ROT_Y)
dPtr->rotYVisual->SetVisible(_visible);
if (_mode == ROT || _mode == ROT_Z)
dPtr->rotZVisual->SetVisible(_visible);
if (_mode == SCALE || _mode == SCALE_X)
dPtr->scaleXVisual->SetVisible(_visible);
if (_mode == SCALE || _mode == SCALE_Y)
dPtr->scaleYVisual->SetVisible(_visible);
if (_mode == SCALE || _mode == SCALE_Z)
dPtr->scaleZVisual->SetVisible(_visible);
}
/////////////////////////////////////////////////
bool SelectionObj::GetHandleVisible(SelectionMode _mode) const
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
if (_mode == TRANS || _mode == TRANS_X)
return dPtr->transXVisual->GetVisible();
if (_mode == TRANS_Y)
return dPtr->transYVisual->GetVisible();
if (_mode == TRANS_Z)
return dPtr->transZVisual->GetVisible();
if (_mode == ROT || _mode == ROT_X)
return dPtr->rotXVisual->GetVisible();
if (_mode == ROT_Y)
return dPtr->rotYVisual->GetVisible();
if (_mode == ROT_Z)
return dPtr->rotZVisual->GetVisible();
if (_mode == SCALE || _mode == SCALE_X)
return dPtr->scaleXVisual->GetVisible();
if (_mode == SCALE_Y)
return dPtr->scaleYVisual->GetVisible();
if (_mode == SCALE_Z)
return dPtr->scaleZVisual->GetVisible();
return false;
}
/////////////////////////////////////////////////
void SelectionObj::SetHandleMaterial(SelectionMode _mode, const std::string
&_material, bool _unique)
{
SelectionObjPrivate *dPtr =
reinterpret_cast<SelectionObjPrivate *>(this->dataPtr);
if (_mode == TRANS || _mode == TRANS_X)
dPtr->transXVisual->SetMaterial(_material, _unique);
if (_mode == TRANS || _mode == TRANS_Y)
dPtr->transYVisual->SetMaterial(_material, _unique);
if (_mode == TRANS || _mode == TRANS_Z)
dPtr->transZVisual->SetMaterial(_material, _unique);
if (_mode == ROT || _mode == ROT_X)
dPtr->rotXVisual->SetMaterial(_material, _unique);
if (_mode == ROT || _mode == ROT_Y)
dPtr->rotYVisual->SetMaterial(_material, _unique);
if (_mode == ROT || _mode == ROT_Z)
dPtr->rotZVisual->SetMaterial(_material, _unique);
if (_mode == SCALE || _mode == SCALE_X)
dPtr->scaleXVisual->SetMaterial(_material, _unique);
if (_mode == SCALE || _mode == SCALE_Y)
dPtr->scaleYVisual->SetMaterial(_material, _unique);
if (_mode == SCALE || _mode == SCALE_Z)
dPtr->scaleZVisual->SetMaterial(_material, _unique);
}