bool TranslatePlaneDragger::handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pointer.contains(this)) return false; if ((ea.getButtonMask() & osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON) && ea.getEventType() == osgGA::GUIEventAdapter::PUSH) _usingTranslate1DDragger = true; bool handled = false; if (_usingTranslate1DDragger) { if (_translate1DDragger->handle(pointer, ea, aa)) handled = true; } else { if (_translate2DDragger->handle(pointer, ea, aa)) handled = true; } if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE) _usingTranslate1DDragger = false; return handled; }
bool TabPlaneDragger::handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pointer.contains(this)) return false; // Since the translate plane and the handleNode lie on the same plane the hit could've been on either one. But we // need to handle the scaling draggers before the translation. Check if the node path has the scaling nodes else // check for the scaling nodes in next hit. if (_cornerScaleDragger->handle(pointer, ea, aa)) return true; if (_horzEdgeScaleDragger->handle(pointer, ea, aa)) return true; if (_vertEdgeScaleDragger->handle(pointer, ea, aa)) return true; PointerInfo nextPointer(pointer); nextPointer.next(); while (!nextPointer.completed()) { if (_cornerScaleDragger->handle(nextPointer, ea, aa)) return true; if (_horzEdgeScaleDragger->handle(nextPointer, ea, aa)) return true; if (_vertEdgeScaleDragger->handle(nextPointer, ea, aa)) return true; nextPointer.next(); } if (_translateDragger->handle(pointer, ea, aa)) return true; return false; }
bool CompositeDragger::handle(const PointerInfo& pi, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pi.contains(this)) return false; for (DraggerList::iterator itr=_draggerList.begin(); itr!=_draggerList.end(); ++itr) { if ((*itr)->handle(pi, ea, aa)) return true; } return false; }
bool RotateCylinderDragger::handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pointer.contains(this)) return false; switch (ea.getEventType()) { // Pick start. case (osgGA::GUIEventAdapter::PUSH): { // Get the LocalToWorld matrix for this node and set it for the projector. osg::NodePath nodePathToRoot; computeNodePathToRoot(*this,nodePathToRoot); osg::Matrix localToWorld = osg::computeLocalToWorld(nodePathToRoot); _projector->setLocalToWorld(localToWorld); _startLocalToWorld = _projector->getLocalToWorld(); _startWorldToLocal = _projector->getWorldToLocal(); if (_projector->isPointInFront(pointer, _startLocalToWorld)) _projector->setFront(true); else _projector->setFront(false); osg::Vec3d projectedPoint; if (_projector->project(pointer, projectedPoint)) { // Generate the motion command. osg::ref_ptr<Rotate3DCommand> cmd = new Rotate3DCommand(); cmd->setStage(MotionCommand::START); cmd->setLocalToWorldAndWorldToLocal(_startLocalToWorld,_startWorldToLocal); // Dispatch command. dispatch(*cmd); // Set color to pick color. setMaterialColor(_pickColor,*this); _prevWorldProjPt = projectedPoint * _projector->getLocalToWorld(); _prevRotation = osg::Quat(); aa.requestRedraw(); } return true; } // Pick move. case (osgGA::GUIEventAdapter::DRAG): { // Get the LocalToWorld matrix for this node and set it for the projector. osg::Matrix localToWorld = osg::Matrix(_prevRotation) * _startLocalToWorld; _projector->setLocalToWorld(localToWorld); osg::Vec3d projectedPoint; if (_projector->project(pointer, projectedPoint)) { osg::Vec3d prevProjectedPoint = _prevWorldProjPt * _projector->getWorldToLocal(); osg::Quat deltaRotation = _projector->getRotation(prevProjectedPoint, projectedPoint); osg::Quat rotation = deltaRotation * _prevRotation; // Generate the motion command. osg::ref_ptr<Rotate3DCommand> cmd = new Rotate3DCommand(); cmd->setStage(MotionCommand::MOVE); cmd->setLocalToWorldAndWorldToLocal(_startLocalToWorld,_startWorldToLocal); cmd->setRotation(rotation); // Dispatch command. dispatch(*cmd); _prevWorldProjPt = projectedPoint * _projector->getLocalToWorld(); _prevRotation = rotation; aa.requestRedraw(); } return true; } // Pick finish. case (osgGA::GUIEventAdapter::RELEASE): { osg::ref_ptr<Rotate3DCommand> cmd = new Rotate3DCommand(); cmd->setStage(MotionCommand::FINISH); cmd->setLocalToWorldAndWorldToLocal(_startLocalToWorld,_startWorldToLocal); // Dispatch command. dispatch(*cmd); // Reset color. setMaterialColor(_color,*this); aa.requestRedraw(); return true; } default: return false; } }
virtual bool handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pointer.contains(this)) return false; switch (ea.getEventType()) { // Pick start. case (osgGA::GUIEventAdapter::PUSH): { // Get the LocalToWorld matrix for this node and set it for the projector. osg::NodePath nodePathToRoot; computeNodePathToRoot(*this,nodePathToRoot); osg::Matrix localToWorld = osg::computeLocalToWorld(nodePathToRoot); _projector->setLocalToWorld(localToWorld); //设置点移动平面,点即鼠标与物体交点(世界坐标系),法线为//视线方向 //osg::Plane::Plane ( const Vec3_type & norm, const Vec3_type & point) norm:法线;point:交点 osg::Plane* pplnPTPush= new osg::Plane( pointer.getEyeDir(), pointer.getLocalIntersectPoint()/** _projector->getLocalToWorld()*/); _projector->setPlane( *pplnPTPush); if (_projector->project(pointer, _startProjectedPoint)) { // Generate the motion command. osg::ref_ptr<TranslateInPlaneCommand> cmd = new TranslateInPlaneCommand(_projector->getPlane()); cmd->setStage(MotionCommand::START); cmd->setReferencePoint(_startProjectedPoint); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } //在该点处添加一个球 osg::ref_ptr< osg::Shape> sphere = new osg::Sphere( _startProjectedPoint* _projector->getLocalToWorld(), 0.08f); osg::ref_ptr<osg::ShapeDrawable> sphereDrawable = new osg::ShapeDrawable(sphere); osg::ref_ptr<osg::Geode> sphereGeode = new osg::Geode(); sphereGeode->addDrawable(sphereDrawable); g_pRoot->addChild( sphereGeode); // Set color to pick color. setMaterialColor(_pickColor,*this); getOrCreateStateSet()->setAttributeAndModes(_polygonOffset.get(), osg::StateAttribute::ON); aa.requestRedraw(); } return true; } // Pick move. case (osgGA::GUIEventAdapter::DRAG): { osg::Vec3d projectedPoint; if (_projector->project(pointer, projectedPoint)) { // Generate the motion command. osg::ref_ptr<TranslateInPlaneCommand> cmd = new TranslateInPlaneCommand(_projector->getPlane()); cmd->setStage(MotionCommand::MOVE); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); cmd->setTranslation(projectedPoint - _startProjectedPoint); cmd->setReferencePoint(_startProjectedPoint); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } osg::ref_ptr< osg::Shape> sphere = new osg::Sphere( projectedPoint* _projector->getLocalToWorld(), 0.08f); osg::ref_ptr<osg::ShapeDrawable> sphereDrawable = new osg::ShapeDrawable(sphere); osg::ref_ptr<osg::Geode> sphereGeode = new osg::Geode(); sphereGeode->addDrawable(sphereDrawable); g_pRoot->addChild( sphereGeode); aa.requestRedraw(); } return true; } // Pick finish. case (osgGA::GUIEventAdapter::RELEASE): { osg::ref_ptr<TranslateInPlaneCommand> cmd = new TranslateInPlaneCommand(_projector->getPlane()); cmd->setStage(MotionCommand::FINISH); cmd->setReferencePoint(_startProjectedPoint); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } // Reset color. setMaterialColor(_color,*this); getOrCreateStateSet()->removeAttribute(_polygonOffset.get()); aa.requestRedraw(); return true; } default: return false; } }
bool Translate1DDragger::handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (_checkForNodeInNodePath) { if (!pointer.contains(this)) return false; } switch (ea.getEventType()) { // Pick start. case (osgGA::GUIEventAdapter::PUSH): { // Get the LocalToWorld matrix for this node and set it for the projector. osg::NodePath nodePathToRoot; computeNodePathToRoot(*this,nodePathToRoot); osg::Matrix localToWorld = osg::computeLocalToWorld(nodePathToRoot); _projector->setLocalToWorld(localToWorld); if (_projector->project(pointer, _startProjectedPoint)) { // Generate the motion command. osg::ref_ptr<TranslateInLineCommand> cmd = new TranslateInLineCommand(_projector->getLineStart(), _projector->getLineEnd()); cmd->setStage(MotionCommand::START); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. dispatch(*cmd); // Set color to pick color. setMaterialColor(_pickColor,*this); aa.requestRedraw(); } return true; } // Pick move. case (osgGA::GUIEventAdapter::DRAG): { osg::Vec3d projectedPoint; if (_projector->project(pointer, projectedPoint)) { // Generate the motion command. osg::ref_ptr<TranslateInLineCommand> cmd = new TranslateInLineCommand(_projector->getLineStart(), _projector->getLineEnd()); cmd->setStage(MotionCommand::MOVE); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); cmd->setTranslation(projectedPoint - _startProjectedPoint); // Dispatch command. dispatch(*cmd); aa.requestRedraw(); } return true; } // Pick finish. case (osgGA::GUIEventAdapter::RELEASE): { osg::Vec3d projectedPoint; if (_projector->project(pointer, projectedPoint)) { osg::ref_ptr<TranslateInLineCommand> cmd = new TranslateInLineCommand(_projector->getLineStart(), _projector->getLineEnd()); cmd->setStage(MotionCommand::FINISH); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. dispatch(*cmd); // Reset color. setMaterialColor(_color,*this); aa.requestRedraw(); } return true; } default: return false; } }
bool Scale1DDragger::handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pointer.contains(this)) return false; switch (ea.getEventType()) { // Pick start. case (osgGA::GUIEventAdapter::PUSH): { // Get the LocalToWorld matrix for this node and set it for the projector. osg::NodePath nodePathToRoot; computeNodePathToRoot(*this,nodePathToRoot); osg::Matrix localToWorld = osg::computeLocalToWorld(nodePathToRoot); _projector->setLocalToWorld(localToWorld); if (_projector->project(pointer, _startProjectedPoint)) { _scaleCenter = 0.0; if (_scaleMode == SCALE_WITH_OPPOSITE_HANDLE_AS_PIVOT) { if ( pointer.contains(_leftHandleNode.get()) ) _scaleCenter = _projector->getLineEnd()[0]; else if ( pointer.contains( _rightHandleNode.get()) ) _scaleCenter = _projector->getLineStart()[0]; } // Generate the motion command. osg::ref_ptr<Scale1DCommand> cmd = new Scale1DCommand(); cmd->setStage(MotionCommand::START); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. dispatch(*cmd); // Set color to pick color. setMaterialColor(_pickColor,*this); aa.requestRedraw(); } return true; } // Pick move. case (osgGA::GUIEventAdapter::DRAG): { osg::Vec3d projectedPoint; if (_projector->project(pointer, projectedPoint)) { // Generate the motion command. osg::ref_ptr<Scale1DCommand> cmd = new Scale1DCommand(); // Compute scale. double scale = computeScale(_startProjectedPoint,projectedPoint,_scaleCenter); if (scale < getMinScale()) scale = getMinScale(); // Snap the referencePoint to the line start or line end depending on which is closer. double referencePoint = _startProjectedPoint[0]; if (fabs(_projector->getLineStart()[0] - referencePoint) < fabs(_projector->getLineEnd()[0] - referencePoint)) referencePoint = _projector->getLineStart()[0]; else referencePoint = _projector->getLineEnd()[0]; cmd->setStage(MotionCommand::MOVE); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); cmd->setScale(scale); cmd->setScaleCenter(_scaleCenter); cmd->setReferencePoint(referencePoint); cmd->setMinScale(getMinScale()); // Dispatch command. dispatch(*cmd); aa.requestRedraw(); } return true; } // Pick finish. case (osgGA::GUIEventAdapter::RELEASE): { osg::ref_ptr<Scale1DCommand> cmd = new Scale1DCommand(); cmd->setStage(MotionCommand::FINISH); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. dispatch(*cmd); // Reset color. setMaterialColor(_color,*this); aa.requestRedraw(); return true; } default: return false; } }
bool Translate2DDragger::handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pointer.contains(this)) return false; switch (ea.getEventType()) { // Pick start. case (osgGA::GUIEventAdapter::PUSH): { // Get the LocalToWorld matrix for this node and set it for the projector. osg::NodePath nodePathToRoot; computeNodePathToRoot(*this,nodePathToRoot); osg::Matrix localToWorld = osg::computeLocalToWorld(nodePathToRoot); _projector->setLocalToWorld(localToWorld); if (_projector->project(pointer, _startProjectedPoint)) { // Generate the motion command. osg::ref_ptr<TranslateInPlaneCommand> cmd = new TranslateInPlaneCommand(_projector->getPlane()); cmd->setStage(MotionCommand::START); cmd->setReferencePoint(_startProjectedPoint); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } // Set color to pick color. setMaterialColor(_pickColor,*this); getOrCreateStateSet()->setAttributeAndModes(_polygonOffset.get(), osg::StateAttribute::ON); aa.requestRedraw(); } return true; } // Pick move. case (osgGA::GUIEventAdapter::DRAG): { osg::Vec3d projectedPoint; if (_projector->project(pointer, projectedPoint)) { // Generate the motion command. osg::ref_ptr<TranslateInPlaneCommand> cmd = new TranslateInPlaneCommand(_projector->getPlane()); cmd->setStage(MotionCommand::MOVE); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); cmd->setTranslation(projectedPoint - _startProjectedPoint); cmd->setReferencePoint(_startProjectedPoint); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } aa.requestRedraw(); } return true; } // Pick finish. case (osgGA::GUIEventAdapter::RELEASE): { osg::ref_ptr<TranslateInPlaneCommand> cmd = new TranslateInPlaneCommand(_projector->getPlane()); cmd->setStage(MotionCommand::FINISH); cmd->setReferencePoint(_startProjectedPoint); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } // Reset color. setMaterialColor(_color,*this); getOrCreateStateSet()->removeAttribute(_polygonOffset.get()); aa.requestRedraw(); return true; } default: return false; } }
bool Scale2DDragger::handle(const PointerInfo& pointer, const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) { // Check if the dragger node is in the nodepath. if (!pointer.contains(this)) return false; switch (ea.getEventType()) { // Pick start. case (osgGA::GUIEventAdapter::PUSH): { // Get the LocalToWorld matrix for this node and set it for the projector. osg::NodePath nodePathToRoot; computeNodePathToRoot(*this,nodePathToRoot); osg::Matrix localToWorld = osg::computeLocalToWorld(nodePathToRoot); _projector->setLocalToWorld(localToWorld); if (_projector->project(pointer, _startProjectedPoint)) { _scaleCenter.set(0.0,0.0); if (pointer.contains(_topLeftHandleNode.get())) { _referencePoint = _topLeftHandlePosition; if (_scaleMode == SCALE_WITH_OPPOSITE_HANDLE_AS_PIVOT) _scaleCenter = _bottomRightHandlePosition; } else if (pointer.contains(_bottomLeftHandleNode.get())) { _referencePoint = _bottomLeftHandlePosition; if (_scaleMode == SCALE_WITH_OPPOSITE_HANDLE_AS_PIVOT) _scaleCenter = _topRightHandlePosition; } else if (pointer.contains(_bottomRightHandleNode.get())) { _referencePoint = _bottomRightHandlePosition; if (_scaleMode == SCALE_WITH_OPPOSITE_HANDLE_AS_PIVOT) _scaleCenter = _topLeftHandlePosition; } else if (pointer.contains(_topRightHandleNode.get())) { _referencePoint = _topRightHandlePosition; if (_scaleMode == SCALE_WITH_OPPOSITE_HANDLE_AS_PIVOT) _scaleCenter = _bottomLeftHandlePosition; } // Generate the motion command. osg::ref_ptr<Scale2DCommand> cmd = new Scale2DCommand(); cmd->setStage(MotionCommand::START); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); cmd->setReferencePoint(_referencePoint); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } // Set color to pick color. setMaterialColor(_pickColor,*this); aa.requestRedraw(); } return true; } // Pick move. case (osgGA::GUIEventAdapter::DRAG): { osg::Vec3 projectedPoint; if (_projector->project(pointer, projectedPoint)) { // Compute scale. osg::Vec2 scale = computeScale(_startProjectedPoint,projectedPoint,_scaleCenter); if (scale[0] < getMinScale()[0]) scale[0] = getMinScale()[0]; if (scale[1] < getMinScale()[1]) scale[1] = getMinScale()[1]; // Generate the motion command. osg::ref_ptr<Scale2DCommand> cmd = new Scale2DCommand(); cmd->setStage(MotionCommand::MOVE); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); cmd->setScale(scale); cmd->setScaleCenter(_scaleCenter); cmd->setReferencePoint(_referencePoint); cmd->setMinScale(getMinScale()); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } aa.requestRedraw(); } return true; } // Pick finish. case (osgGA::GUIEventAdapter::RELEASE): { osg::ref_ptr<Scale2DCommand> cmd = new Scale2DCommand(); cmd->setStage(MotionCommand::FINISH); cmd->setReferencePoint(_referencePoint); cmd->setLocalToWorldAndWorldToLocal(_projector->getLocalToWorld(),_projector->getWorldToLocal()); // Dispatch command. if (_commandManager) { _commandManager->addSelectionsToCommand(*cmd, *getParentDragger()); _commandManager->dispatch(*cmd); } // Reset color. setMaterialColor(_color,*this); aa.requestRedraw(); return true; } default: return false; } return false; }