| 98 | | |
| 99 | | osg::Node* addDraggerToScene(osg::Node* scene, const std::string& name) |
| | 98 | // The DraggerContainer node is used to fix the dragger's size on the screen |
| | 99 | class DraggerContainer : public osg::Group |
| | 100 | { |
| | 101 | public: |
| | 102 | DraggerContainer() : _draggerSize(240.0f), _active(true) {} |
| | 103 | |
| | 104 | DraggerContainer( const DraggerContainer& copy, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY ) |
| | 105 | : osg::Group(copy, copyop), |
| | 106 | _dragger(copy._dragger), _draggerSize(copy._draggerSize), _active(copy._active) |
| | 107 | {} |
| | 108 | |
| | 109 | META_Node( osgManipulator, DraggerContainer ); |
| | 110 | |
| | 111 | void setDragger( osgManipulator::Dragger* dragger ) |
| | 112 | { |
| | 113 | _dragger = dragger; |
| | 114 | if ( !containsNode(dragger) ) addChild( dragger ); |
| | 115 | } |
| | 116 | |
| | 117 | osgManipulator::Dragger* getDragger() { return _dragger.get(); } |
| | 118 | const osgManipulator::Dragger* getDragger() const { return _dragger.get(); } |
| | 119 | |
| | 120 | void setDraggerSize( float size ) { _draggerSize = size; } |
| | 121 | float getDraggerSize() const { return _draggerSize; } |
| | 122 | |
| | 123 | void setActive( bool b ) { _active = b; } |
| | 124 | bool getActive() const { return _active; } |
| | 125 | |
| | 126 | void traverse( osg::NodeVisitor& nv ) |
| | 127 | { |
| | 128 | if ( _dragger.valid() ) |
| | 129 | { |
| | 130 | if ( _active && nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR ) |
| | 131 | { |
| | 132 | osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(&nv); |
| | 133 | |
| | 134 | float pixelSize = cv->pixelSize(_dragger->getBound().center(), 0.48f); |
| | 135 | if ( pixelSize!=_draggerSize ) |
| | 136 | { |
| | 137 | float pixelScale = pixelSize>0.0f ? _draggerSize/pixelSize : 1.0f; |
| | 138 | osg::Vec3d scaleFactor(pixelScale, pixelScale, pixelScale); |
| | 139 | |
| | 140 | osg::Vec3 trans = _dragger->getMatrix().getTrans(); |
| | 141 | _dragger->setMatrix( osg::Matrix::scale(scaleFactor) * osg::Matrix::translate(trans) ); |
| | 142 | } |
| | 143 | } |
| | 144 | } |
| | 145 | osg::Group::traverse(nv); |
| | 146 | } |
| | 147 | |
| | 148 | protected: |
| | 149 | osg::ref_ptr<osgManipulator::Dragger> _dragger; |
| | 150 | float _draggerSize; |
| | 151 | bool _active; |
| | 152 | }; |
| | 153 | |
| | 154 | osg::Node* addDraggerToScene(osg::Node* scene, const std::string& name, bool fixedSizeInScreen) |
| 209 | | transform_1.get()->addChild(addDraggerToScene(geode_1.get(),"TabBoxDragger")); |
| 210 | | transform_2.get()->addChild(addDraggerToScene(geode_2.get(),"TabPlaneDragger")); |
| 211 | | transform_3.get()->addChild(addDraggerToScene(geode_3.get(),"TabBoxTrackballDragger")); |
| 212 | | transform_4.get()->addChild(addDraggerToScene(geode_4.get(),"TrackballDragger")); |
| 213 | | transform_5.get()->addChild(addDraggerToScene(geode_5.get(),"Translate1DDragger")); |
| 214 | | transform_6.get()->addChild(addDraggerToScene(geode_6.get(),"Translate2DDragger")); |
| 215 | | transform_7.get()->addChild(addDraggerToScene(geode_7.get(),"TranslateAxisDragger")); |
| | 271 | transform_1.get()->addChild(addDraggerToScene(geode_1.get(),"TabBoxDragger",fixedSizeInScreen)); |
| | 272 | transform_2.get()->addChild(addDraggerToScene(geode_2.get(),"TabPlaneDragger",fixedSizeInScreen)); |
| | 273 | transform_3.get()->addChild(addDraggerToScene(geode_3.get(),"TabBoxTrackballDragger",fixedSizeInScreen)); |
| | 274 | transform_4.get()->addChild(addDraggerToScene(geode_4.get(),"TrackballDragger",fixedSizeInScreen)); |
| | 275 | transform_5.get()->addChild(addDraggerToScene(geode_5.get(),"Translate1DDragger",fixedSizeInScreen)); |
| | 276 | transform_6.get()->addChild(addDraggerToScene(geode_6.get(),"Translate2DDragger",fixedSizeInScreen)); |
| | 277 | transform_7.get()->addChild(addDraggerToScene(geode_7.get(),"TranslateAxisDragger",fixedSizeInScreen)); |