void Object3D::addDragger(osgManipulator::Dragger *dragger) { if(_isPickable) { removeDragger(); this->getOrCreateStateSet()->setMode(GL_NORMALIZE, osg::StateAttribute::ON); dragger->setupDefaultGeometry(); ref_ptr<osgManipulator::Selection> selection = _selNode; #if 0 int mask = dragger->getNodeMask(); mask = mask & ~SHADOW_CASTER_MASK; mask = mask & ~SHADOW_RECEIVER_MASK; dragger->setNodeMask(mask); SceneGraph* sg = *(_sgList.begin()); sg->getSceneGraph()->addChild(dragger); #else ref_ptr<Group> parent = new Group; // the dragger is added to the scenegraph of the viewer in which the add is made, and only this one Group* group = this->getParent(0)->getParent(0)->getParent(0) #if USE_SHADOWS ->getParent(0) #endif ; parent->addChild(dragger); group->addChild(parent); #endif float scale = this->getOriginalNode()->getBound().radius() * 1.6; dragger->setMatrix(this->getFrameMatrix() * Matrix::inverse(Matrix::translate(this->getFrameMatrix().getTrans())) * Matrix::inverse(Matrix::rotate(this->getTransformationMatrix().getRotate())) * Matrix::scale(scale, scale, scale) * Matrix::translate(this->getOriginalNode()->getBound().center())); dragger->postMult(selection->getMatrix()); ref_ptr<osgManipulator::CommandManager> commandManager = new osgManipulator::CommandManager(); commandManager->connect(*dragger, *selection); _dragger = dragger; int mask = _dragger->getNodeMask(); mask = mask & ~SHADOW_CASTER_MASK; mask = mask & ~SHADOW_RECEIVER_MASK; _dragger->setNodeMask(mask); } else printNonPickable(); }
void Object3D::removeDragger() { if(_dragger.valid()) { #if 0 SceneGraph* sg = *(_sgList.begin()); sg->getSceneGraph()->removeChild(_dragger.get()); #else osg::Group* group = this->getParent(0)->getParent(0)->getParent(0) #if USE_SHADOWS ->getParent(0) #endif ; group->removeChild(_dragger->getParent(0)); #endif _dragger = NULL; } }