bool MicrobeBarGraphObject::processEvent(InteractionEvent * ie)
{
    if(ie->asTrackedButtonEvent() && ie->asTrackedButtonEvent()->getButton() == 0 && (ie->getInteraction() == BUTTON_DOWN || ie->getInteraction() == BUTTON_DOUBLE_CLICK))
    {
        TrackedButtonInteractionEvent * tie = (TrackedButtonInteractionEvent*)ie;

        GraphLayoutObject * layout = dynamic_cast<GraphLayoutObject*>(_parent);
        if(!layout)
        {
            return false;
        }

        std::string selectedGroup;
        std::vector<std::string> selectedKeys;

        osg::Vec3 start, end(0,1000,0);
        start = start * tie->getTransform() * getWorldToObjectMatrix();
        end = end * tie->getTransform() * getWorldToObjectMatrix();

        osg::Vec3 planePoint;
        osg::Vec3 planeNormal(0,-1,0);
        osg::Vec3 intersect;
        float w;

        bool clickUsed = false;
        bool selectValid = false;

        if(linePlaneIntersectionRef(start,end,planePoint,planeNormal,intersect,w))
        {
            if(_graph->processClick(intersect,selectedKeys,selectValid))
            {
                clickUsed = true;
            }
        }

        if(selectValid && _microbeCount)
        {
            if(selectedKeys.size())
            {
                for(int i = 0; i < _microbeCount; ++i)
                {
                    if(!strcmp(selectedKeys[0].c_str(),_microbeList[i].species))
                    {
                        selectedGroup = _microbeList[i].phylum;
                        break;
                    }
                }
            }
            layout->selectMicrobes(selectedGroup,selectedKeys);
        }
        if(clickUsed)
        {
            return true;
        }
    }

    return TiledWallSceneObject::processEvent(ie);
}
Exemple #2
0
bool OsgEarth::processEvent(InteractionEvent * event)
{
    MouseInteractionEvent * mie = event->asMouseEvent();
    if(mie)
    {
        return mouseButtonEvent(mie->getInteraction(),mie->getButton(),mie->getX(),mie->getY(),mie->getTransform());
    }

    TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();
    if(tie)
    {
        return buttonEvent(tie->getInteraction(),tie->getButton(),tie->getHand(),tie->getTransform());
    }

    return false;
}
Exemple #3
0
bool MicrobePointLineObject::processEvent(cvr::InteractionEvent * ie)
{
    if(ie->asTrackedButtonEvent() && ie->asTrackedButtonEvent()->getButton() == 0 && (ie->getInteraction() == BUTTON_DOWN || ie->getInteraction() == BUTTON_DOUBLE_CLICK))
    {
	TrackedButtonInteractionEvent * tie = (TrackedButtonInteractionEvent*)ie;

	GraphLayoutObject * layout = dynamic_cast<GraphLayoutObject*>(_parent);
	if(!layout)
	{
	    return false;
	}

	std::string selectedGroup;
	std::vector<std::string> selectedKeys;

	osg::Vec3 start, end(0,1000,0);
	start = start * tie->getTransform() * getWorldToObjectMatrix();
	end = end * tie->getTransform() * getWorldToObjectMatrix();

	osg::Vec3 planePoint;
	osg::Vec3 planeNormal(0,-1,0);
	osg::Vec3 intersect;
	float w;

	bool clickUsed = false;

	if(linePlaneIntersectionRef(start,end,planePoint,planeNormal,intersect,w))
	{
	    if(_graph->processClick(intersect,selectedGroup,selectedKeys))
	    {
		clickUsed = true;
	    }
	}

	layout->selectPatients(selectedGroup,selectedKeys);
	if(clickUsed)
	{
	    return true;
	}
    }

    return FPTiledWallSceneObject::processEvent(ie);
}
bool GraphKeyObject::eventCallback(InteractionEvent * ie)
{
    TrackedButtonInteractionEvent * tie = ie->asTrackedButtonEvent();
    if(tie)
    {
	if(tie->getButton() == 0 && (tie->getInteraction() == BUTTON_DOWN || tie->getInteraction() == BUTTON_DOUBLE_CLICK))
	{
	    osg::Vec3 point1, point2(0,1000.0,0);
	    point1 = point1 * tie->getTransform() * getWorldToObjectMatrix();
	    point2 = point2 * tie->getTransform() * getWorldToObjectMatrix();

	    osg::Vec3 planePoint, planeNormal(0,-1,0), intersect;
	    float w;

	    if(linePlaneIntersectionRef(point1,point2,planePoint,planeNormal,intersect,w))
	    {
		for(int i = 0; i < _rangeList.size(); ++i)
		{
		    if(intersect.x() >= _rangeList[i].first && intersect.x() <= _rangeList[i].second)
		    {
			std::string group = _labels[i];
			std::vector<std::string> emptyList;

			GraphLayoutObject * layout = dynamic_cast<GraphLayoutObject*>(_parent);
			if(layout)
			{
			    layout->selectPatients(group,emptyList);
			}

			return true;
		    }
		}
	    }
	}
    }

    return false;
}
Exemple #5
0
bool WaterMaze::processEvent(InteractionEvent * event)
{
    KeyboardInteractionEvent * kie = event->asKeyboardEvent();
    if (kie)
    {
		if (kie->getInteraction() == KEY_UP)
		{
			switch(kie->getKey())
			{
				case 'n':
					//next paradigm
					changeParadigm(1);
					break;
				case 'b':
					changeParadigm(-1);
					break;
				case 'f':
					//next trial
					changeTrial(1);
					break;
				case 'a':
					//override trial limit add trial
					addTrial();
					break;
				case 's':
					// start/abort trail and reset position
					startStop();
					break;
				case 'l':
					//load geometry
					load();
					break;
				case 'i':
					/* info */
					cout << endl << endl;
					//running state of application
					cout << "Current Running State: " << _state << endl;
					//Paradigm ID
					cout << "Current Paradigm: " << _paradigms[_currentParadigm]->getID() << endl;
					//trials ran
					cout << "Trial: " << _paradigms[_currentParadigm]->getTrialNumber() << endl;
					//android controller data
					 if(ComController::instance()->isMaster())
						cout << "# of Connected Devices: " << _controller->getNumControllers() << endl;
					//volume
					cout << "Master Volume: " << _masterVolume << endl;
					break;
				case 'h':
					//help menu
					 std::cout << "Welcome to WaterMaze!\n" <<
								  "l - load geometry\n" <<
								  "n - proceed to next paradigm\n" <<
								  "s - start/stop trial\n" << 
								  "f - proceed to next trial\n" <<	
								  "a - override trial limit/add trial\n" <<
								  "i - info\n" <<
								  "h - help menu" << std::endl;
					break;
				case osgGA::GUIEventAdapter::KeySymbol::KEY_Up:
					//raise master volume
					cout << "Raising Volume" << endl;
					_masterVolume = min(1.0, _masterVolume + 0.1);
					for(int i = 0; i < _paradigms.size(); ++i)
					{
						_paradigms[i]->setVolume(_masterVolume);
					}
					break;
				case osgGA::GUIEventAdapter::KeySymbol::KEY_Down:
					//lower master volume
					cout << "Lowering Volume" << endl;
					_masterVolume = max(0.0, _masterVolume - 0.1);
					for(int i = 0; i < _paradigms.size(); ++i)
					{
						_paradigms[i]->setVolume(_masterVolume);
					}
					break;
			}
		}
    }
    
    TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();
    if (tie)
    {
        if(tie->getHand() == 0 && tie->getButton() == 0)
        {
            if (tie->getInteraction() == BUTTON_DOWN && !_runningTrial)
            {
                return true;
            }
            else if (tie->getInteraction() == BUTTON_DRAG && !_runningTrial)
            {
                return true;
            }
            else if (tie->getInteraction() == BUTTON_UP)
            {
                return false;
            }
            return false;
        }
    }
    return false;
}
Exemple #6
0
bool BubbleMenu::processEvent(InteractionEvent * event)
{
    if(!_myMenu || !event->asTrackedButtonEvent())
    {
        return false;
    }

    TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();

    if(!_menuActive && !_showFavMenu)
    {
        if(_trigger == DOUBLECLICK)
        {
            if(event->getInteraction() == BUTTON_DOUBLE_CLICK)
            {
                if(tie->getButton() == _secondaryButton)
                {
                    SceneManager::instance()->getMenuRoot()->addChild(_menuRoot);

                    if (!_showFavMenu)
                    {
                        SceneManager::instance()->getMenuRoot()->addChild(_favMenuRoot);
                    }

                    osg::Vec3 menuPoint = osg::Vec3(0, _distance, 0);
                    osg::Vec3 menuStartPos = osg::Vec3(0, _distance, _height);
                    menuPoint = menuStartPos;

                    if(event->asMouseEvent())
                    {
                        osg::Vec3 menuOffset = osg::Vec3(
                                _widthMap[_myMenu] / 2.0,0,0);
                        osg::Matrix m;
                        m.makeTranslate(menuPoint);

                        m.makeTranslate(menuStartPos);
                        _menuRoot->setMatrix(m);
                    }
                    else
                    {
                        osg::Vec3 viewerPoint =
                                TrackingManager::instance()->getHeadMat(0).getTrans();

                        osg::Vec3 viewerDir = viewerPoint - menuPoint;
                        viewerDir.z() = 0.0;

                        osg::Vec3 menuOffset = osg::Vec3(
                                _widthMap[_myMenu] * _scale / 2.0,0,0);
                        _menuRoot->setMatrix(osg::Matrix::translate(menuPoint));
                    }

                    _menuActive = true;
                    SceneManager::instance()->closeOpenObjectMenu();
                    return true;
                }
            }
        }
        else if(_trigger == UPCLICK)
        {
            return false;
        }
    }

    else if (!_menuActive && _showFavMenu)
    {
        if(_trigger == DOUBLECLICK)
        {
            if(event->getInteraction() == BUTTON_DOUBLE_CLICK)
            {
                if(tie->getButton() == _secondaryButton)
                {
                    SceneManager::instance()->getMenuRoot()->addChild(_menuRoot);

                    if (!_showFavMenu)
                    {
                        SceneManager::instance()->getMenuRoot()->addChild(_favMenuRoot);
                    }

                    osg::Vec3 menuPoint = osg::Vec3(0, _distance, 0);
                    osg::Vec3 menuStartPos = osg::Vec3(0, _distance, _height);
                    menuPoint = menuStartPos;

                    if(event->asMouseEvent())
                    {
                        osg::Vec3 menuOffset = osg::Vec3(
                                _widthMap[_myMenu] / 2.0,0,0);
                        osg::Matrix m;
                        m.makeTranslate(menuPoint);

                        m.makeTranslate(menuStartPos);
                        _menuRoot->setMatrix(m);
                    }
                    else
                    {
                        osg::Vec3 viewerPoint =
                                TrackingManager::instance()->getHeadMat(0).getTrans();

                        osg::Vec3 viewerDir = viewerPoint - menuPoint;
                        viewerDir.z() = 0.0;

                        osg::Vec3 menuOffset = osg::Vec3(
                                _widthMap[_myMenu] * _scale / 2.0,0,0);
                        _menuRoot->setMatrix(osg::Matrix::translate(menuPoint));
                    }

                    _menuActive = true;
                    SceneManager::instance()->closeOpenObjectMenu();
                    return true;
                }
            }
        }

        if(tie->getButton() == _primaryButton
                    && (tie->getInteraction() == BUTTON_UP))
        {
            _timeLastButtonUp = PluginHelper::getProgramDuration();
            _clickActive = false;
        }

        if(0)//_clickActive)
        {
            if(tie->getHand() == _activeHand)
            {
                if(tie->getButton() == _primaryButton)
                {
                    _activeItem->processEvent(event);
                    if(tie->getInteraction() == BUTTON_UP)
                    {
                        _clickActive = false;
                    }
                    return true;
                }
            }
            return false;
        }
        else if(tie->getHand() == _activeHand)
        {
            if (tie->getButton() == _primaryButton
                    && (tie->getInteraction() == BUTTON_DOWN))
            {
                _timeLastButtonUp = PluginHelper::getProgramDuration();
                _prevEvent = new InteractionEvent();
                _prevEvent->setInteraction(event->getInteraction());
                _prevActiveItem = _activeItem;
                _clickActive = true;
                return true;
            }

            if(tie->getButton() == _primaryButton
                    && tie->getInteraction() == BUTTON_DOUBLE_CLICK)
            {
                // do click
                //std::cout << "Double click" << std::endl;
                _prevEvent = NULL;
                
                MenuItem * item = _activeItem->getMenuItem();

                if (_favMenu->getItemPosition(item) < 0)
                {
                    _favMenu->addItem(item);
                }
                else
                {
                    _favMenu->removeItem(item);
                    
                    osg::MatrixTransform * mat = _favMaskMap[_favGeometryMap[item]];
            
                    osg::Matrix m = _favMenuRoot->getMatrix();

                    _lerpMap[mat] = new Lerp(mat->getMatrix().getTrans(), 
                        - m.getTrans() - osg::Vec3(0, -m.getTrans()[1], 0) 
                        + osg::Vec3(0, 0, _height) 
                        + _rootPositionMap[_favGeometryMap[item]],
                        _speed, 0, true, true);
                }

                return true;
            }
            return false;
        }


        if(tie->getButton() == _secondaryButton
                && tie->getInteraction() == BUTTON_DOWN)
        {
            if(_activeItem)
            {
                selectItem(NULL);
            }
            SceneManager::instance()->getMenuRoot()->removeChild(_menuRoot);
            
            if (!_showFavMenu)
            {
                SceneManager::instance()->getMenuRoot()->removeChild(_favMenuRoot);
            }
           
            _menuActive = false;
            return true;
        }
    }
    
    else
    {
        if(tie->getButton() == _primaryButton
                    && (tie->getInteraction() == BUTTON_UP))
        {
            _timeLastButtonUp = PluginHelper::getProgramDuration();
            _clickActive = false;
        }

        if(0)//_clickActive)
        {
            if(tie->getHand() == _activeHand)
            {
                if(tie->getButton() == _primaryButton)
                {
                    _activeItem->processEvent(event);
                    if(tie->getInteraction() == BUTTON_UP)
                    {
                        _clickActive = false;
                    }
                    return true;
                }
            }
            return false;
        }
        else if(tie->getHand() == _activeHand)
        {
            if (tie->getButton() == _primaryButton
                    && (tie->getInteraction() == BUTTON_DOWN))
            {
                _timeLastButtonUp = PluginHelper::getProgramDuration();
                _prevEvent = new InteractionEvent();
                _prevEvent->setInteraction(event->getInteraction());
                _prevActiveItem = _activeItem;
                _clickActive = true;
                
                if (_soundEnabled)
                {
//                    click->play();
                }

                return true;
            }

            if(tie->getButton() == _primaryButton
                    && tie->getInteraction() == BUTTON_DOUBLE_CLICK)
            {
                // do click
                //std::cout << "Double click" << std::endl;
                _prevEvent = NULL;
                
                MenuItem * item = _activeItem->getMenuItem();

                if (_favMenu->getItemPosition(item) < 0)
                {
                    _favMenu->addItem(item);
                }
                else
                {
                    _favMenu->removeItem(item);

                    osg::MatrixTransform * mat = _favMaskMap[_favGeometryMap[item]];
            
                    /*
                    _lerpMap[mat] = new Lerp(mat->getMatrix().getTrans(), 
                        -_favMenuRoot->getMatrix().getTrans() + 
                        _rootPositionMap[_favGeometryMap[item]] + osg::Vec3(0,0,_radius),
                        _speed, 0, true, true);
                     */
                     
                    if (mat)
                    {
                     osg::Matrix m = _favMenuRoot->getMatrix();

                     _lerpMap[mat] = new Lerp(mat->getMatrix().getTrans(), 
                        - m.getTrans() - osg::Vec3(0, -m.getTrans()[1], 0) 
                        + osg::Vec3(0, 0, _height) 
                        + _rootPositionMap[_favGeometryMap[item]],
                        _speed, 0, true, true);
                    }
                    
                }

                /*
                if(_activeItem)
                {
                    BubbleMenuSubMenuGeometry * smg =
                            dynamic_cast<BubbleMenuSubMenuGeometry *>(_activeItem);
                    if(smg && !smg->isMenuHead())
                    {
                        if(smg->isMenuOpen())
                        {
                            closeMenu((SubMenu*)smg->getMenuItem());
                        }
                        else
                        {
                            openMenu(smg);
                        }
                    }
                    _activeItem->processEvent(event);
                    _clickActive = true;
                    return true;
                }*/
                return true;
            }
            return false;
        }


        if(tie->getButton() == _secondaryButton
                && tie->getInteraction() == BUTTON_DOWN)
        {
            if(_activeItem)
            {
                selectItem(NULL);
            }
            SceneManager::instance()->getMenuRoot()->removeChild(_menuRoot);
            
            if (!_showFavMenu)
            {
                SceneManager::instance()->getMenuRoot()->removeChild(_favMenuRoot);
            }
           
            _menuActive = false;
            return true;
        }
    }
    return false;
}
Exemple #7
0
bool Sketch::processEvent(InteractionEvent * event)
{
    TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();
    if(!tie)
    {
        return false;
    }

    if(tie->getHand() == 0 && tie->getButton() == 0)
    {
        if(_csCB->getValue())
        {
            if(_colorSelector->buttonEvent(tie->getInteraction(), 
                                           tie->getTransform()))
            {
                _color = _colorSelector->getColor();
                if(_activeObject)
                {
                    _activeObject->setColor(_color);
                }
                return true;
            }
        }

        osg::Vec3 point(0,Sketch::instance()->getPointerDistance(),0);
        point = point * TrackingManager::instance()->getHandMat(0);

        osg::Vec3 distance;

        if (!_freezeCB->getValue())
        {
            point = point * PluginHelper::getWorldToObjectTransform();
        }
        else
        {

        }
        if (_snapToGridCB->getValue()) 
        {
            for (int i = 0; i < 3; ++i)
            {
                int diff = (int)floor(point[i]) % _gridSize;     
                point[i] -= diff;
            }

            distance = point - _lastPoint;

            distance[0] = (int)distance[0];
            distance[1] = (int)distance[1];
            distance[2] = (int)distance[2];
        }
        else
        {
            distance = point - _lastPoint;
        }
        _lastPoint = point;


        if (_mode == MOVE)
        {
            if (tie->getInteraction() == BUTTON_DOWN)
            {
                bool inSphere = false;
                
                for (int i = 0; i < _shapeList.size(); ++i)
                {
                    if (_shapeList[i]->containsPoint(_lastPoint))
                    {
                        _movingList.push_back(_shapeList[i]->getPat());

                        _movingLayout = false;
                        inSphere = true;
                    }
                }
                
                for (int i = 0; i < _layoutList.size(); ++i)
                {
                    if (_layoutList[i]->shape->containsPoint(_lastPoint))
                    {
                        if (!inSphere)
                        {
                            _movingLayout = true;
                            _movingList.push_back(_layoutList[i]->getPat());

                            for (int j = 0; j < _layoutList[i]->children.size(); ++j)
                            {
                                _movingList.push_back(_layoutList[i]->children[j]);
                            }
                        }
                    }
                }
                return !_movingList.empty();
            }
            else if (tie->getInteraction() == BUTTON_DRAG)
            {
                for (int i = 0; i < _movingList.size(); ++i)
                {
                    // remove child shapes that are dragged out of layouts
                    if (!_movingLayout)
                    {
                        for (int j = 0; j < _layoutList.size(); ++j)
                        {
                            _layoutList[j]->removeChild(_movingList[i]);
                             
                            if (_layoutList[j]->shape->containsPoint(_lastPoint))
                            {
                                _layoutList[j]->shape->highlight();
                                _layoutList[j]->addChild(_movingList[i]);
                            }
                        }
                    }

                    _movingList[i]->setPosition(
                        _movingList[i]->getPosition() + distance);
                    _movingList[i]->dirtyBound();                   
                }
                return !_movingList.empty();
            }
            else if (tie->getInteraction() == BUTTON_UP)
            {
                _movingList.clear();
                return false;
            }

            return true;
        }

        else if (_mode == DRAW && !_activeObject)
        {
            return false;
        }

        else if (_mode == DRAW && _activeObject)
        {
            bool ret = _activeObject->buttonEvent(tie->getInteraction(),
                                                  tie->getTransform());
            
            if (tie->getInteraction() == BUTTON_DOWN)
            {
                if (_drawMode == SHAPE)
                {
                    SketchShape * shape = dynamic_cast<SketchShape*>(_activeObject);
                    if (shape)
                    {
                        _sketchRoot->addChild(_pat);
                        _shapeList.push_back((SketchShape*)_activeObject);
                        shape->setSize(_sizeRV->getValue() * _sizeScale);
                    }

                    // add shape as child of layout if point in layout
                    for (int i = 0; i < _layoutList.size(); ++i)
                    {
                        if (_layoutList[i]->shape->containsPoint(point))
                        {
                            point = _layoutList[i]->addChild(_pat);
                            _lastPoint = point;
                            break;
                        }
                    }

                    _pat->setPosition(_lastPoint);

                    if (_modelCB->getValue())
                    {
                        _pat->addChild(getNextModel());
                    }
                    return true;
                }
            
                else if (_drawMode == LAYOUT)
                 {
                    SketchShape * shape = dynamic_cast<SketchShape*>(_activeObject);
                    if (shape)
                    {
                        Layout * lo;

                        switch (_st)
                        {
                            case 4:
                                lo = new Layout(_lot,
                                _layoutSizeRV->getValue() * _sizeScale * 1.5,
                                _layoutSizeRV->getValue() * _sizeScale * 0.5);
                                break;
                            
                            case 5:
                                lo = new Layout(_lot,
                                _layoutSizeRV->getValue() * _sizeScale * 0.5, 
                                _layoutSizeRV->getValue() * 1.5 * _sizeScale * 4);
                                break;
                           
                            case 6:
                                lo = new Layout(_lot,
                                _layoutSizeRV->getValue() * _sizeScale * 0.5, 
                                _layoutSizeRV->getValue() * 1.5 * _sizeScale * 4);
                            break;
                        }

                        lo->setPat(_layoutPat);
                        lo->setCenter(_lastPoint);
                        lo->setShape(shape);

                        _layoutList.push_back(lo);

                        _sketchRoot->addChild(_layoutPat);
                        _layoutPat->setPosition(_lastPoint);
                    }
                    return true;
                 }
                 
                if(_activeObject->isDone())
                {
                    finishGeometry();
                    createGeometry();
                }
            }
            else if (tie->getInteraction() == BUTTON_DRAG)
            {
                if(_drawMode == SHAPE)
                {
                    bool inLayout = false;

                    for (int i = 0; i < _layoutList.size(); ++i)
                    {
                        if (_layoutList[i]->shape->containsPoint(point))
                        {
                            inLayout = true;
                         //  point = _layoutList[i]->addChild(_pat);
                            break;
                        }
                        else
                        {
                            _layoutList[i]->removeChild(_pat);
                        }
                    }
                    if (!inLayout)
                    {
                        _pat->setPosition(_pat->getPosition() + distance);
                        _modelpat->setPosition(_modelpat->getPosition() + distance);
                    }
                }

                if (_drawMode == LAYOUT)
                {
                    _layoutPat->setPosition(_layoutPat->getPosition() + distance);

                    _layoutList[_layoutList.size() - 1]->setCenter(
                        _layoutPat->getPosition() + distance);
                }
            }
            else if (tie->getInteraction() == BUTTON_UP)
            {
                finishGeometry();
                createGeometry();
            }

            return ret;
        }

        else if (_mode == SELECT || _mode == OPTIONS)
        {
            if (tie->getInteraction() == BUTTON_DOWN)
            {
                bool inNone = true;
                bool alreadyIn = false; 
                bool inSphere = false;

                for (int i = 0; i < _shapeList.size(); ++i)
                {
                    if (_shapeList[i]->containsPoint(_lastPoint))
                    {
                        vector<osg::PositionAttitudeTransform*>::iterator it;
                        for (it = _movingList.begin(); it != _movingList.end(); ++it)
                        {
                            if (*it == _shapeList[i]->getPat())
                            {
                                _movingList.erase(it);
                                alreadyIn = true;
                                break;
                            }
                        }
                        if (!alreadyIn)
                        {
                            inSphere = true;
                            _movingList.push_back(_shapeList[i]->getPat());
                        }
                        inNone = false;
                    }
                }
                
                for (int i = 0; i < _layoutList.size(); ++i)
                {
                    if (_layoutList[i]->shape->containsPoint(_lastPoint))
                    {
                        if (!inSphere)
                        {
                            inNone = false;
                            _movingList.push_back(_layoutList[i]->getPat());
                        }
                    }
                }
                if (inNone)
                {
                    _movingList.clear();
                    return false;
                }
            }
            else if (tie->getInteraction() == BUTTON_DRAG)
            {
                return false;
            }
            else if (tie->getInteraction() == BUTTON_UP)
            {
                return false;
            }
        }

        return true;
    } 

    return false;
}
Exemple #8
0
bool SceneObject::processEvent(InteractionEvent * ie)
{
    TrackedButtonInteractionEvent * tie = ie->asTrackedButtonEvent();

    if(tie)
    {
        if(_eventActive && _activeHand != tie->getHand())
        {
            return false;
        }

        if(_movable && tie->getButton() == _moveButton)
        {
            if(tie->getInteraction() == BUTTON_DOWN)
            {
                _lastHandInv = osg::Matrix::inverse(tie->getTransform());
                _lastHandMat = tie->getTransform();
                _lastobj2world = getObjectToWorldMatrix();
                _eventActive = true;
                _moving = true;
                _activeHand = tie->getHand();
                return true;
            }
            else if(_moving
                    && (tie->getInteraction() == BUTTON_DRAG
                            || tie->getInteraction() == BUTTON_UP))
            {
                processMove(tie->getTransform());
                if(tie->getInteraction() == BUTTON_UP)
                {
                    _eventActive = false;
                    _moving = false;
                    _activeHand = -2;
                }
                return true;
            }
        }

        if(_contextMenu && tie->getButton() == _menuButton)
        {
            if(tie->getInteraction() == BUTTON_DOWN)
            {
                if(!_myMenu->isVisible())
                {
                    _myMenu->setVisible(true);
                    osg::Vec3 start(0,0,0), end(0,1000,0);
                    start = start * tie->getTransform();
                    end = end * tie->getTransform();

                    osg::Vec3 p1, p2;
                    bool n1, n2;
                    float dist = 0;

                    if(intersects(start,end,p1,n1,p2,n2))
                    {
                        float d1 = (p1 - start).length();
                        if(n1)
                        {
                            d1 = -d1;
                        }

                        float d2 = (p2 - start).length();
                        if(n2)
                        {
                            d2 = -d2;
                        }

                        if(n1)
                        {
                            dist = d2;
                        }
                        else if(n2)
                        {
                            dist = d1;
                        }
                        else
                        {
                            if(d1 < d2)
                            {
                                dist = d1;
                            }
                            else
                            {
                                dist = d2;
                            }
                        }
                    }

                    dist = std::min(dist,
                            SceneManager::instance()->_menuMaxDistance);
                    dist = std::max(dist,
                            SceneManager::instance()->_menuMinDistance);

                    osg::Vec3 menuPoint(0,dist,0);
                    menuPoint = menuPoint * tie->getTransform();

                    osg::Vec3 viewerPoint =
                            TrackingManager::instance()->getHeadMat(0).getTrans();
                    osg::Vec3 viewerDir = viewerPoint - menuPoint;
                    viewerDir.z() = 0.0;

                    osg::Matrix menuRot;

		    // point towards viewer if not on tiled wall
		    if(!ie->asPointerEvent())
		    {
			menuRot.makeRotate(osg::Vec3(0,-1,0),viewerDir);
		    }

                    osg::Matrix m;
                    m.makeTranslate(menuPoint);
                    _myMenu->setTransform(menuRot * m);

                    _myMenu->setScale(SceneManager::instance()->_menuScale);

                    SceneManager::instance()->setMenuOpenObject(this);
                }
                else
                {
                    SceneManager::instance()->closeOpenObjectMenu();
                }
                return true;
            }
        }

        //TODO: replace button down/up active check with mask of buttons to
        // handle multiple buttons down
        //bool retValue;
        //retValue = eventCallback(tie->getIntera, tie->hand, tie->button, transform);
        /*if(retValue && tie->type == BUTTON_DOWN)
         {
         _activeButton = tie->button;
         _eventActive = true;
         _activeHand = tie->hand;
         }
         else if(tie->type == BUTTON_UP && tie->button == _activeButton)
         {
         _eventActive = false;
         _activeHand = -2;
         }*/
        //return retValue;
    }

    bool ret = eventCallback(ie);
    if(ret)
    {
        return true;
    }
    else
    {
        if(_parent)
        {
            return _parent->processEvent(ie);
        }
        else
        {
            return false;
        }
    }
}
bool Sketch::processEvent(InteractionEvent * event)
{
    TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();
    if(!tie)
    {
        return false;
    }

    if(tie->getHand() == 0 && tie->getButton() == 0)
    {
        if(_csCB->getValue())
        {
            if(_colorSelector->buttonEvent(tie->getInteraction(), tie->getTransform()))
            {
                _color = _colorSelector->getColor();
                if(_activeObject)
                {
                    _activeObject->setColor(_color);
                }
                return true;
            }
        }

        if(_activeObject)
        {
            bool ret = _activeObject->buttonEvent(tie->getInteraction(), tie->getTransform());
            if(_activeObject->isDone())
            {
                finishGeometry();
                createGeometry();
            }
            return ret;
        }
    }
    /*if(hand == 0 && button == 0 && type == BUTTON_DOWN && _mode >= 0)
    {
    //std::cerr << "Start drawing." << std::endl;

    if(_mode == RIBBON)
    {
        _verts = new Vec3Array(0);
        _colors = new Vec4Array(1);
        _normals = new Vec3Array(0);
        _primitive = new DrawArrays(PrimitiveSet::TRIANGLE_STRIP, 0, 0);
        _currentGeometry = new osg::Geometry();

        (*_colors)[0] = _color;

        _currentGeometry->setVertexArray(_verts);
        _currentGeometry->setColorArray(_colors);
        _currentGeometry->setNormalArray(_normals);
        _currentGeometry->setNormalBinding(Geometry::BIND_PER_VERTEX);
        _currentGeometry->setColorBinding(Geometry::BIND_OVERALL);
        _currentGeometry->setUseDisplayList(false);
        //_currentGeometry->setUseVertexBufferObjects(true);
        _currentGeometry->addPrimitiveSet(_primitive);

        _sketchGeode->addDrawable(_currentGeometry);

        MyComputeBounds * mcb = new MyComputeBounds();
        _currentBound = &mcb->_bound;
        _currentGeometry->setComputeBoundingBoxCallback(mcb);

        osg::Vec3 point(-50.0 * _sizeRV->getValue(), _pointerDistance, 0);
        point = point * mat * PluginHelper::getWorldToObjectTransform();

        _verts->push_back(point);
        _normals->push_back(osg::Vec3(0,0,1));
        _currentBound->expandBy(point);

        point = osg::Vec3(50.0 * _sizeRV->getValue(), _pointerDistance, 0);
        point = point * mat * PluginHelper::getWorldToObjectTransform();

        _verts->push_back(point);
        _normals->push_back(osg::Vec3(0,0,1));
        _currentBound->expandBy(point);

        _lastTransform = mat * PluginHelper::getWorldToObjectTransform();

        _count = 2;

        _primitive->setCount(_count);
        _currentGeometry->dirtyBound();

        _drawing = true;
    }
    else if(_mode == LINE)
    {
        if(_lt == LINE_NONE)
        {
    	//std::cerr << "LINE_NONE" << std::endl;
    	return false;
        }

        if(!_drawing)
        {
    	//std::cerr << "Starting Line." << std::endl;
    	_verts = new Vec3Array(0);
    	_colors = new Vec4Array(1);
    	_primitive = new DrawArrays(PrimitiveSet::LINE_STRIP, 0, 0);
    	_currentGeometry = new osg::Geometry();

    	(*_colors)[0] = _color;

    	_currentGeometry->setVertexArray(_verts);
    	_currentGeometry->setColorArray(_colors);
    	_currentGeometry->setColorBinding(Geometry::BIND_OVERALL);
    	_currentGeometry->setUseDisplayList(false);
    	//_currentGeometry->setUseVertexBufferObjects(true);
    	_currentGeometry->addPrimitiveSet(_primitive);

    	_sketchGeode->addDrawable(_currentGeometry);

    	MyComputeBounds * mcb = new MyComputeBounds();
    	_currentBound = &mcb->_bound;
    	_currentGeometry->setComputeBoundingBoxCallback(mcb);

    	osg::Vec3 point;
    	if(_lineSnap->getValue())
    	{
    	    point = _brushRoot->getMatrix().getTrans();
    	}
    	else
    	{
    	    point = osg::Vec3(0, _pointerDistance, 0);
    	    point = point * mat;
    	}

    	point = point * PluginHelper::getWorldToObjectTransform();

    	_verts->push_back(point);
    	_currentBound->expandBy(point);

    	_count = 1;

    	if(_lt == SEGMENT || _lt == MULTI_SEGMENT)
    	{
    	    _verts->push_back(point);
    	    _count = 2;
    	    _updateLastPoint = true;
    	}

    	_primitive->setCount(_count);
    	_currentGeometry->dirtyBound();

    	osg::StateSet * stateset = _currentGeometry->getOrCreateStateSet();
    	stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
    	osg::LineWidth * lw = new osg::LineWidth();
    	lw->setWidth(_sizeRV->getValue());
    	stateset->setAttributeAndModes(lw,osg::StateAttribute::ON);
    	//TODO: tube shader?

    	_drawing = true;
        }
        else if(_lt == MULTI_SEGMENT)
        {
    	osg::Vec3 point;
    	if(_lineSnap->getValue())
    	{
    	    point = _brushRoot->getMatrix().getTrans();
    	}
    	else
    	{
    	    point = osg::Vec3(0, _pointerDistance, 0);
    	    point = point * mat;
    	}

    	point = point * PluginHelper::getWorldToObjectTransform();

    	_verts->push_back(point);
    	_currentBound->expandBy(point);

    	_count++;

    	_primitive->setCount(_count);
    	_currentGeometry->dirtyBound();
    	_updateLastPoint = true;
        }
    }

    return true;
    }
    else if(hand == 0 && button == 0 && type == BUTTON_UP && _drawing)
    {
    //std::cerr << "Stop drawing." << std::endl;

    if(_mode == RIBBON || (_mode == LINE && (_lt == SEGMENT || _lt == FREEHAND)))
    {
        //std::cerr << "Finish geometry" << std::endl;
        finishGeometry();
    }
    if(_mode == LINE && (_lt == SEGMENT || _lt == MULTI_SEGMENT))
    {
        _updateLastPoint = false;
    }

    return true;
    }
    else if(hand == 0 && button == 0 && type == BUTTON_DRAG && _drawing)
    {
    if(_mode == RIBBON)
    {
        osg::Vec3 lastpoint1(-50.0 * _sizeRV->getValue(), _pointerDistance, 0), lastpoint2(50.0 * _sizeRV->getValue(), _pointerDistance, 0), newpoint1(-50.0 * _sizeRV->getValue(), _pointerDistance, 0), newpoint2(50.0 * _sizeRV->getValue(), _pointerDistance, 0);

        lastpoint1 = lastpoint1 * _lastTransform;
        lastpoint2 = lastpoint2 * _lastTransform;

        newpoint1 = newpoint1 * mat * PluginHelper::getWorldToObjectTransform();
        newpoint2 = newpoint2 * mat * PluginHelper::getWorldToObjectTransform();

        if((newpoint1 - lastpoint1).length2() > 10.0 || (newpoint2 - lastpoint2).length2() > 10.0)
        {
    	_verts->push_back(newpoint1);
    	_verts->push_back(newpoint2);


    	osg::Vec3 v1, v2, normal1, normal2, normala;
    	v1 = newpoint1 - (*_verts)[_count-2];
    	v1.normalize();
    	v2 = (*_verts)[_count-1] - (*_verts)[_count-2];
    	v2.normalize();

    	normal1 = v1 ^ v2;
    	normal1.normalize();

    	v1 = (*_verts)[_count-1] - newpoint2;
    	v1.normalize();
    	v2 = newpoint1 - newpoint2;
    	v2.normalize();

    	normal2 = v1 ^ v2;
    	normal2.normalize();

    	//normal1 = osg::Vec3(normal1.x(),-normal1.z(),normal1.y());
    	//normal2 = osg::Vec3(normal2.x(),-normal2.z(),normal2.y());

    	normala = (normal1 + normal2) / 2.0;
    	normala.normalize();

    	//_normals->push_back(osg::Vec3(0,0,1));
    	//_normals->push_back(osg::Vec3(0,0,1));

    	_normals->push_back(normala);
    	_normals->push_back(normal2);

    	if(_count == 2)
    	{
    	    (*_normals)[0] = normal1;
    	    (*_normals)[1] = normala;
    	}
    	else
    	{
    	    (*_normals)[_count-2] = ((*_normals)[_count-2] + normal1) / 2.0;
    	    (*_normals)[_count-2].normalize();

    	    (*_normals)[_count-1] = ((*_normals)[_count-1] + normala) / 2.0;
    	    (*_normals)[_count-1].normalize();
    	}

    	_count += 2;
    	_lastTransform = mat * PluginHelper::getWorldToObjectTransform();

    	_primitive->setCount(_count);

    	_currentBound->expandBy(newpoint1);
    	_currentBound->expandBy(newpoint2);

    	_currentGeometry->dirtyBound();

    	//std::cerr << "Count: " << _count << std::endl;
        }
    }
    if(_mode == LINE)
    {
        //std::cerr << "Line update" << std::endl;
        osg::Vec3 point;
        if(_lineSnap->getValue())
        {
    	point = _brushRoot->getMatrix().getTrans();
        }
        else
        {
    	point = osg::Vec3(0, _pointerDistance, 0);
    	point = point * mat;
        }

        point = point * PluginHelper::getWorldToObjectTransform();

        if(_lt == FREEHAND)
        {
    	_verts->push_back(point);
    	_count++;
    	_primitive->setCount(_count);
        }
        else if(_updateLastPoint)
        {
    	//std::cerr << "Changing last point" << std::endl;
    	//std::cerr << "Point x: " << point.x() << " y: " << point.y() << " z: " << point.z() << std::endl;
    	(*_verts)[_count-1] = point;
        }

        _currentBound->expandBy(point);
        _currentGeometry->dirtyBound();

        //std::cerr << "Count: " << _count << std::endl;
    }
    return true;
    }*/

    return false;
}
bool FPTiledWallSceneObject::processEvent(InteractionEvent * ie)
{
    if(!_tiledWallMovement)
    {
	return SceneObject::processEvent(ie);
    }
    TrackedButtonInteractionEvent * tie = ie->asTrackedButtonEvent();

    if(tie)
    {
        if(_eventActive && _activeHand != tie->getHand())
        {
            return false;
        }

        if(_movable && tie->getButton() == _moveButton)
        {
	    //sort of a hack, need to find a better way to disable navigation for this object type
	    if(getNavigationOn())
	    {
		setNavigationOn(false);
	    }

	    if(tie->getInteraction() == BUTTON_DOWN || (_moving
                    && (tie->getInteraction() == BUTTON_DRAG
                            || tie->getInteraction() == BUTTON_UP)))
	    {
		if(tie->getInteraction() == BUTTON_DOWN)
		{
		    osg::Vec3 lineP1,lineP2(0,1000.0,0),planePoint,planeNormal(0,-1,0);
		    float w;

		    lineP1 = lineP1 * tie->getTransform() * getWorldToObjectMatrix();
		    lineP2 = lineP2 * tie->getTransform() * getWorldToObjectMatrix();

		    linePlaneIntersectionRef(lineP1,lineP2,planePoint,planeNormal,_movePoint,w);

		    _eventActive = true;
		    _moving = true;
		    _activeHand = tie->getHand();
		    return true;
		}
		if(!_moving)
		{
		    return false;
		}
		// top level
		if(!_parent)
		{
		    osg::Vec3 wallPoint;
		    if(SceneManager::instance()->getPointOnTiledWall(tie->getTransform(),wallPoint))
		    {
			osg::Vec3 soPoint = _movePoint * getObjectToWorldMatrix();
			osg::Matrix m;
			m.makeTranslate(wallPoint - soPoint);
			setTransform(getTransform() * m);
		    }
		}
		else
		{
		    osg::Vec3 lineP1,lineP2(0,1000.0,0),planePoint,planeNormal(0,-1,0),intersect;
		    float w;

		    lineP1 = lineP1 * tie->getTransform() * _parent->getWorldToObjectMatrix();
		    lineP2 = lineP2 * tie->getTransform() * _parent->getWorldToObjectMatrix();

		    if(linePlaneIntersectionRef(lineP1,lineP2,planePoint,planeNormal,intersect,w))
		    {
			osg::Vec3 soPoint = _movePoint * getTransform();
			osg::Matrix m;
			m.makeTranslate(intersect - soPoint);
			setTransform(getTransform() * m);
		    }
		}

		if(tie->getInteraction() == BUTTON_UP)
                {
                    _eventActive = false;
                    _moving = false;
                    _activeHand = -2;
                }
                return true;
	    }
        }
    }
    return SceneObject::processEvent(ie);
}
void TrackingManager::generateButtonEvents()
{
    int numEvents;
    TrackedButtonInteractionEvent * events = NULL;
    if(ComController::instance()->isMaster())
    {
        std::vector<TrackedButtonInteractionEvent*> eventList;
        for(int j = 0; j < _numHands; j++)
        {
            unsigned int bit = 1;
            unsigned int newMask = getHandButtonMask(j);
            //std::cerr << "ButtonMask: " << newMask << std::endl;
            for(int i = 0; i < _genHandDefaultButtonEvents[j].size(); i++)
            {
                if(!_genHandDefaultButtonEvents[j][i])
                {
                    bit = bit << 1;
                    continue;
                }
                //std::cerr << "last mask " << _lastButtonMask << " new mask " << newMask << " bit: " << bit << " " << (newMask & bit) << " " << (_lastButtonMask & bit) << std::endl;
                if(((_lastHandButtonMask[j] & bit) != (newMask & bit))
                        || ((_lastHandButtonMask[j] & bit) && (newMask & bit)))
                {
                    //std::cerr << "last mask " << _lastButtonMask << " new mask " << newMask << std::endl;

                    TrackedButtonInteractionEvent * buttonEvent =
                            new TrackedButtonInteractionEvent();

                    if((_lastHandButtonMask[j] & bit) && (newMask & bit))
                    {
                        buttonEvent->setInteraction(BUTTON_DRAG);
                    }
                    else if(_lastHandButtonMask[j] & bit)
                    {
                        buttonEvent->setInteraction(BUTTON_UP);
                    }
                    else
                    {
                        buttonEvent->setInteraction(BUTTON_DOWN);
                    }
                    buttonEvent->setButton(i);
                    // set current pointer info
                    buttonEvent->setTransform(_handMatList[j]);
                    buttonEvent->setHand(j);
                    eventList.push_back(buttonEvent);
                }
                bit = bit << 1;
            }
            _lastHandButtonMask[j] = newMask;
        }
        numEvents = eventList.size();
        ComController::instance()->sendSlaves(&numEvents,sizeof(int));
        if(numEvents)
        {
            events = new TrackedButtonInteractionEvent[numEvents];
            for(int i = 0; i < numEvents; i++)
            {
                events[i] = *eventList[i];
                delete eventList[i];
            }
            ComController::instance()->sendSlaves(events,
                    numEvents * sizeof(TrackedButtonInteractionEvent));
        }
    }
    else
    {
        ComController::instance()->readMaster(&numEvents,sizeof(int));
        if(numEvents)
        {
            events = new TrackedButtonInteractionEvent[numEvents];
            ComController::instance()->readMaster(events,
                    numEvents * sizeof(TrackedButtonInteractionEvent));
        }
    }

    TrackedButtonInteractionEvent * ie;
    for(int i = 0; i < numEvents; i++)
    {
        ie = new TrackedButtonInteractionEvent();
        *ie = events[i];
        InteractionManager::instance()->addEvent(ie);
    }

    if(events)
    {
        delete[] events;
    }
}
Exemple #12
0
bool WaterMaze::processEvent(InteractionEvent * event)
{
    KeyboardInteractionEvent * kie = event->asKeyboardEvent();
    if (kie)
    {
        if (kie->getInteraction() == KEY_UP && kie->getKey() == 'n')
        {
            // next trial
            if (_runningTrial)
            {
                return true;
            }

            if (_currentTrial == _trials.size() - 1)
            {
                std::cout << "No more trials." << std::endl;
                return true;
            }

            _currentTrial++;
            
            std::cout << "Loading next trial." << std::endl;
            std::cout << _trials[_currentTrial].width << " x " << 
                _trials[_currentTrial].height << ", " << _trials[_currentTrial].timeSec
                << " seconds." << std::endl;

            clear();
            load(_trials[_currentTrial].width, _trials[_currentTrial].height); 

            return true;
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == 'r')
        {
            // repeat last trial
            if (_runningTrial)
            {
                return true;
            }

            std::cout << "Repeating last trial." << std::endl;
            std::cout << _trials[_currentTrial].width << " x " << 
                _trials[_currentTrial].height << ", " << _trials[_currentTrial].timeSec
                << " seconds." << std::endl;

            return true;
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == 'b')
        {
            // back to previous trial
            if (_runningTrial)
            {
                return true;
            }

            if (_currentTrial - 1 < 0)
            {
                std::cout << "No previous trials." << std::endl;
                return true;
            }

            _currentTrial--;
            
            std::cout << "Back to previous trial." << std::endl;
            std::cout << _trials[_currentTrial].width << " x " << 
                _trials[_currentTrial].height << ", " << _trials[_currentTrial].timeSec
                << " seconds." << std::endl;

            clear();
            load(_trials[_currentTrial].width, _trials[_currentTrial].height); 
            
            return true;
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == 'p')
        {
            // pause/play
            if (_runningTrial)
            {
                std::cout << "Paused." << std::endl; 
                _runningTrial = false;
            }
            else
            {
                std::cout << "Play." << std::endl; 
                _runningTrial = true;

                if (_resetTime)
                {
                    _startTime = PluginHelper::getProgramDuration();
                    _resetTime = false;
                    _lastTimeLeft = _trials[_currentTrial].timeSec;


                    // Setup write to data file
                    time_t timet;
                    time(&timet);
                    char buf[100];

                    sprintf(buf, "/Logs/%dx%d-%dsec-%ld.txt", _trials[_currentTrial].width, 
                        _trials[_currentTrial].height, _trials[_currentTrial].timeSec, timet);
                    _dataFile = _dataDir + buf;
                    std::cout << "Recording trial to" << _dataFile << std::endl;

                    _fileTimer = PluginHelper::getProgramDuration();
                }
            }
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == 's')
        {
            // start/stop
            if (_runningTrial)
            {
                std::cout << "Stopping trial." << std::endl; 
                _runningTrial = false;
                _resetTime = true;
            }
            else
            {
                std::cout << "Starting trial." << std::endl; 
                _runningTrial = true;
            }
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == 'l')
        {
            std::cout << "Loading geometry." << std::endl;
            load(_trials[_currentTrial].width, _trials[_currentTrial].height);
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == 'h')
        {
            std::cout << "Welcome to WaterMaze!\n" <<
            "l - load geometry\n" <<
            "n - next trial\n" <<
            "r - repeat trial\n" <<
            "b - back to previous trial\n" <<
            "p - play/pause\n" << 
            "h - help\n" << 
            "1-9 - reset position" << std::endl;
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == '1')
        {
            if (_runningTrial)
            {
                return true;
            }
            osg::Matrixd mat;
            mat = _tilePositions[0]->getMatrix();
            PluginHelper::setObjectMatrix(mat);
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == '2')
        {
            if (_runningTrial)
            {
                return true;
            }
            osg::Matrixd mat;
            mat = _tilePositions[1]->getMatrix();
            PluginHelper::setObjectMatrix(mat);
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == '3')
        {
            if (_runningTrial)
            {
                return true;
            }
            osg::Matrixd mat;
            mat = _tilePositions[2]->getMatrix();
            PluginHelper::setObjectMatrix(mat);
        }

        else if (kie->getInteraction() == KEY_UP && kie->getKey() == '4')
        {
            if (_runningTrial)
            {
                return true;
            }
            osg::Matrixd mat;
            mat = _tilePositions[3]->getMatrix();
            PluginHelper::setObjectMatrix(mat);
        }
    }


    TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();
    if (tie)
    {
        return false;
        if(tie->getHand() == 0 && tie->getButton() == 0)
        {
            if (tie->getInteraction() == BUTTON_DOWN)
            {
                return true;
            }
            else if (tie->getInteraction() == BUTTON_DRAG)
            {
                return true;
            }
            else if (tie->getInteraction() == BUTTON_UP)
            {
                return true;
            }
            return true;
        }
    }
    return true;
}
void BoardMenuListGeometry::processEvent(InteractionEvent * event)
{
    if(event->getInteraction() == BUTTON_UP)
    {
        _geodeSelected->removeDrawables(0,_geodeSelected->getNumDrawables());
        _geodeSelected->addDrawable(_valuesSelected[_listItem->getFocus()]);
        _clicked = false;
        _listItem->setDirty(true);
    }

    if(event->asMouseEvent())
    {
        MouseInteractionEvent * mie = event->asMouseEvent();
        if(event->getInteraction() == BUTTON_DOWN
                || event->getInteraction() == BUTTON_DOUBLE_CLICK)
        {
            int y = mie->getY();

            _lastMouseY = y;

            _clicked = true;
            _listItem->setDirty(true);
            return;
        }

        if(event->getInteraction() == BUTTON_DRAG
                || event->getInteraction() == BUTTON_UP)
        {
            int y = mie->getY();
            float pixelRange = 400;

            bool valueUpdated = false;
            int valueMax = _listItem->getListSize();
            int index = _listItem->getIndex();
            if(y != _lastMouseY)
            {
                int change = (int)((y - _lastMouseY)
                        * _listItem->getSensitivity() / pixelRange);
                if(change)
                {
                    index -= change;
                    if(index > valueMax)
                        index = valueMax;
                    else if(index < 0)
                        index = 0;

                    _listItem->setIndex(index);
                    valueUpdated = true;
                }
            }

            if(valueUpdated)
            {
                if(_listItem->getCallback())
                {
                    _listItem->getCallback()->menuCallback(_item);
                }

                _lastMouseY = y;
            }

            return;
        }
    }
    else if(event->asTrackedButtonEvent())
    {
        TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();
        if(event->getInteraction() == BUTTON_DOWN
                || event->getInteraction() == BUTTON_DOUBLE_CLICK)
        {
            _point = tie->getTransform().getTrans();
            _lastDistance = 0.0;

            _clicked = true;
            _listItem->setDirty(true);
            return;
        }

        if(event->getInteraction() == BUTTON_DRAG
                || event->getInteraction() == BUTTON_UP)
        {
            MenuList * _listItem = (MenuList*)_item;
            osg::Vec3 vec = tie->getTransform().getTrans();
            ;
            vec = vec - _point;
            float newDistance = vec.z();

            float range = 400;

            bool valueUpdated = false;
            int valueMax = _listItem->getListSize();
            int index = _listItem->getIndex();
            if(newDistance != _lastDistance)
            {
                int change = (int)((newDistance - _lastDistance)
                        * _listItem->getSensitivity() / range);
                if(change)
                {
                    index -= change;
                    if(index > valueMax)
                        index = valueMax;
                    else if(index < 0)
                        index = 0;

                    _listItem->setIndex(index);
                    valueUpdated = true;
                }
            }

            if(valueUpdated)
            {
                if(_listItem->getCallback())
                {
                    _listItem->getCallback()->menuCallback(_item);
                }

                _lastDistance = newDistance;
            }

            return;
        }
    }
}
bool BoardPopupMenu::processEvent(InteractionEvent * event)
{
    if(!_menuActive || !_myMenu || !event->asTrackedButtonEvent())
    {
        return false;
    }

    TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();

    if(_clickActive)
    {
        if(tie->getHand() == _activeHand)
        {
            if(tie->getInteraction() == BUTTON_DRAG
                    || tie->getInteraction() == BUTTON_UP)
            {
                if(tie->getButton() == _primaryButton)
                {
                    BoardMenuSubMenuGeometry * smg =
                            dynamic_cast<BoardMenuSubMenuGeometry *>(_activeItem);
                    if(smg && smg->isMenuHead())
                    {
                        updateMovement(tie);
                    }

                    _activeItem->processEvent(event);
                    if(tie->getInteraction() == BUTTON_UP)
                    {
                        _clickActive = false;
                    }
                    return true;
                }
            }
        }
        return false;
    }
    else if(tie->getHand() == _activeHand && tie->getButton() == _primaryButton)
    {
        if(tie->getInteraction() == BUTTON_DOWN
                || tie->getInteraction() == BUTTON_DOUBLE_CLICK)
        {
            if(_activeItem)
            {
                BoardMenuSubMenuGeometry * smg =
                        dynamic_cast<BoardMenuSubMenuGeometry *>(_activeItem);
                if(smg && smg->isMenuHead())
                {
                    osg::Vec3 ray;
                    ray = _currentPoint[tie->getHand()]
                            - tie->getTransform().getTrans();

		    if(!tie->asPointerEvent())
		    {
			_moveDistance = ray.length();
		    }
		    else
		    {
			_moveDistance = ray.y();
		    }
                    _menuPoint = _currentPoint[tie->getHand()]
                            * osg::Matrix::inverse(_menuRoot->getMatrix());
                    updateMovement(tie);
                }
                else if(smg && !smg->isMenuHead())
                {
                    if(smg->isMenuOpen())
                    {
                        closeMenu((SubMenu*)smg->getMenuItem());
                    }
                    else
                    {
                        openMenu(smg);
                    }
                }
		_clickActive = true;
                _activeItem->processEvent(event);
                return true;
            }

            return false;
        }
    }

    return false;
}
Exemple #15
0
void TrackerMouse::update(
        std::map<int,std::list<InteractionEvent*> > & eventMap)
{
    if(!_handListInit)
    {
	if(_debug)
	{
	    std::cerr << "TrackerMouse: hand list init:" << std::endl;
	}

	int mySystem = -1;
	for(int i = 0; i < TrackingManager::instance()->getNumTrackingSystems(); i++)
	{
	    if(TrackingManager::instance()->getTrackingSystem(i) == this)
	    {
		mySystem = i;
		break;
	    }
	}
	if(mySystem < 0)
	{
	    std::cerr << "TrackerMouse: Error: Unable to find own system in list" << std::endl;
	}
	else
	{
	    if(_debug)
	    {
		std::cerr << "Mouse system: " << mySystem << std::endl;
		for(int i = 0; i < TrackingManager::instance()->getNumHands(); i++)
		{
		    std::cerr << "Hand: " << i << " buttonFilter: " << TrackingManager::instance()->getButtonFilter(i,mySystem) << std::endl;
		}
	    }

	    int bhand, bbutton;
	    for(int i = 0; i < CVR_NUM_MOUSE_BUTTONS; i++)
	    {
		TrackingManager::instance()->getHandButtonFromSystemButton(mySystem,i,bhand,bbutton);
		_handButtonList.push_back(std::pair<int,int>(bhand,bbutton));
	    }

	    for(int i = 0; i < _handButtonList.size(); i++)
	    {
		if(_handButtonList[i].first < 0)
		{
		    _handValidList.push_back(false);
		    continue;
		}
		int hsystem, hindex;
		TrackingManager::instance()->getHandAddress(_handButtonList[i].first,hsystem,hindex);
		if(hsystem < 0 || hindex < 0)
		{
		    _handValidList.push_back(false);
		    continue;
		}

		if(hsystem >= 0 && hsystem < TrackingManager::instance()->getNumTrackingSystems() && TrackingManager::instance()->getTrackingSystem(hsystem) && hindex >= 0 && hindex < TrackingManager::instance()->getNumBodies(hsystem))
		{
		    _handValidList.push_back(true);
		}
		else
		{
		    _handValidList.push_back(false);
		}
	    }

	    if(_debug)
	    {
		for(int i = 0; i < _handButtonList.size(); i++)
		{
		    std::cerr << "Button: " << i << " hand: " << _handButtonList[i].first << " handButton: " << _handButtonList[i].second << " valid: " << _handValidList[i] << std::endl;
		}
	    }
	}
	_handListInit = true;
    }

    osg::Matrix m = InteractionManager::instance()->getMouseMat();

    osg::Vec3 pos = m.getTrans();
    osg::Quat rot = m.getRotate();
    _mouseBody.x = pos.x();
    _mouseBody.y = pos.y();
    _mouseBody.z = pos.z();
    _mouseBody.qx = rot.x();
    _mouseBody.qy = rot.y();
    _mouseBody.qz = rot.z();
    _mouseBody.qw = rot.w();

    _mouseButtonMask = InteractionManager::instance()->getMouseButtonMask();

    int mouseWheel = InteractionManager::instance()->getMouseWheel();
    if(mouseWheel > 0)
    {
	_mouseValuator = 1.0;
    }
    else if(mouseWheel < 0)
    {
	_mouseValuator = -1.0;
    }
    else
    {
	_mouseValuator = 0.0;
    }

    if(!_handButtonList.size())
    {
	return;
    }

    std::queue<InteractionEvent *,std::list<InteractionEvent *> > tempQueue;

    //std::cerr << "Mouse queue size: " << InteractionManager::instance()->_mouseQueue.size() << std::endl;
    while(InteractionManager::instance()->_mouseQueue.size())
    {
	MouseInteractionEvent * mie = dynamic_cast<MouseInteractionEvent*>(InteractionManager::instance()->_mouseQueue.front());
	if(!mie)
	{
	    tempQueue.push(InteractionManager::instance()->_mouseQueue.front());
	    InteractionManager::instance()->_mouseQueue.pop();
	    continue;
	}

	InteractionManager::instance()->_mouseQueue.pop();

	if(mie->getButton() < 0 || mie->getButton() >= _handButtonList.size() || !_handValidList[mie->getButton()])
	{
	    tempQueue.push(mie);
	    continue;
	}

	InteractionEvent * event;

	if(TrackingManager::instance()->getHandTrackerType(_handButtonList[mie->getButton()].first) == TrackerBase::MOUSE)
	{
	    mie->setHand(_handButtonList[mie->getButton()].first);
	    mie->setButton(_handButtonList[mie->getButton()].second);
	    event = mie;
	}
	else
	{
	    TrackedButtonInteractionEvent * tie = new TrackedButtonInteractionEvent;
	    tie->setInteraction(mie->getInteraction());
	    tie->setHand(_handButtonList[mie->getButton()].first);
	    tie->setButton(_handButtonList[mie->getButton()].second);

	    int hsystem, hindex;
	    TrackingManager::instance()->getHandAddress(_handButtonList[mie->getButton()].first,hsystem,hindex);
	    if(TrackingManager::instance()->getTrackingSystem(hsystem))
	    {
		TrackerBase::TrackedBody * body = TrackingManager::instance()->getTrackingSystem(hsystem)->getBody(hindex);
		tie->setTransform(TrackingManager::instance()->getHandTransformFromTrackedBody(_handButtonList[mie->getButton()].first,body));
	    }

	    delete mie;
	    event = tie;
	}

        eventMap[event->getEventType()].push_back(event);
    }

    // put unusable events back in the mouse interaction queue so they will be cleaned up later
    while(tempQueue.size())
    {
	InteractionManager::instance()->_mouseQueue.push(tempQueue.front());
	tempQueue.pop();
    }
}
void BubbleMenuRangeValueCompactGeometry::processEvent(InteractionEvent * event)
{
    if(event->asMouseEvent())
    {
        MouseInteractionEvent * mie = event->asMouseEvent();
        if(event->getInteraction() == BUTTON_DOWN
                || event->getInteraction() == BUTTON_DOUBLE_CLICK)
        {
            int x, y;

            x = mie->getX();
            y = mie->getY();

            _lastMouseX = x;
            _lastMouseY = y;
            return;
        }
        if(event->getInteraction() == BUTTON_DRAG
                || event->getInteraction() == BUTTON_UP)
        {
            int x, y;
            x = mie->getX();
            y = mie->getY();

            MenuRangeValueCompact * mrv = (MenuRangeValueCompact*)_item;

            float min, max, current;

            if(mrv->getIsLog())
            {
                min = log(mrv->getMin()) / log(mrv->getLogBase());
                max = log(mrv->getMax()) / log(mrv->getLogBase());
                current = log(mrv->getValue()) / log(mrv->getLogBase());
            }
            else
            {
                min = mrv->getMin();
                max = mrv->getMax();
                current = mrv->getValue();
            }

            float pixelRange = 800;

            bool valueUpdated = false;
            if(x > _lastMouseX)
            {
                if(mrv->getValue() != mrv->getMax())
                {
                    float change = (x - _lastMouseX) * (max - min) / pixelRange;

                    float newValue;

                    if(mrv->getIsLog())
                    {
                        newValue = pow(mrv->getLogBase(),current + change);
                        newValue = std::max(newValue,mrv->getMin());
                    }
                    else
                    {
                        newValue = std::max(mrv->getValue() + change,
                                mrv->getMin());
                    }
                    mrv->setValue(newValue);
                    valueUpdated = true;
                }
            }
            else if(x < _lastMouseX)
            {
                if(mrv->getValue() != mrv->getMin())
                {
                    float change = (x - _lastMouseX) * (max - min) / pixelRange;
                    float newValue;

                    if(mrv->getIsLog())
                    {
                        newValue = pow(mrv->getLogBase(),current + change);
                        newValue = std::min(newValue,mrv->getMax());
                    }
                    else
                    {
                        newValue = std::min(mrv->getValue() + change,
                                mrv->getMax());
                    }
                    mrv->setValue(newValue);
                    valueUpdated = true;
                }
            }

            if(valueUpdated)
            {
                if(mrv->getCallback())
                {
                    mrv->getCallback()->menuCallback(_item);
                }
            }

            _lastMouseY = y;
            _lastMouseX = x;
            return;
        }
    }
    else if(event->asTrackedButtonEvent())
    {
        TrackedButtonInteractionEvent * tie = event->asTrackedButtonEvent();
        if(event->getInteraction() == BUTTON_DOWN
                || event->getInteraction() == BUTTON_DOUBLE_CLICK)
        {
            _point = tie->getTransform().getTrans();
            osg::Vec3 forward = osg::Vec3(0,1.0,0) * tie->getTransform();
            forward = forward - _point;
            _normal = forward ^ osg::Vec3(0,0,1.0);
            _normal.normalize();
            _lastDistance = 0.0;
            return;
        }
        if(event->getInteraction() == BUTTON_DRAG
                || event->getInteraction() == BUTTON_UP)
        {
            MenuRangeValueCompact * mrv = (MenuRangeValueCompact*)_item;

            float min, max, current;

            if(mrv->getIsLog())
            {
                min = log(mrv->getMin()) / log(mrv->getLogBase());
                max = log(mrv->getMax()) / log(mrv->getLogBase());
                current = log(mrv->getValue()) / log(mrv->getLogBase());
            }
            else
            {
                min = mrv->getMin();
                max = mrv->getMax();
                current = mrv->getValue();
            }

            osg::Vec3 vec = tie->getTransform().getTrans();
            vec = vec - _point;
            float newDistance = vec * _normal;

            float range = 1000;

            bool valueUpdated = false;
            if(newDistance < _lastDistance)
            {
                if(mrv->getValue() != mrv->getMin())
                {
                    float change = (newDistance - _lastDistance) * (max - min)
                            / range;
                    float newValue;

                    if(mrv->getIsLog())
                    {
                        newValue = pow(mrv->getLogBase(),current + change);
                        newValue = std::max(newValue,mrv->getMin());
                    }
                    else
                    {
                        newValue = std::max(mrv->getValue() + change,
                                mrv->getMin());
                    }
                    mrv->setValue(newValue);
                    valueUpdated = true;
                }
            }
            else if(newDistance > _lastDistance)
            {
                if(mrv->getValue() != mrv->getMax())
                {
                    float change = (newDistance - _lastDistance) * (max - min)
                            / range;
                    float newValue;

                    if(mrv->getIsLog())
                    {
                        newValue = pow(mrv->getLogBase(),current + change);
                        newValue = std::min(newValue,mrv->getMax());
                    }
                    else
                    {
                        newValue = std::min(mrv->getValue() + change,
                                mrv->getMax());
                    }
                    mrv->setValue(newValue);
                    valueUpdated = true;
                }
            }

            if(valueUpdated)
            {
                if(mrv->getCallback())
                {
                    mrv->getCallback()->menuCallback(_item);
                }
            }

            _lastDistance = newDistance;

            return;
        }
    }
}
void TrackingManager::generateThreadButtonEvents()
{
    TrackedButtonInteractionEvent * buttonEvent;
    for(int j = 0; j < _numHands; j++)
    {
        unsigned int bit = 1;
        unsigned int newMask = _threadHandButtonMasks[j];
        //std::cerr << "ButtonMask: " << newMask << std::endl;
        for(int i = 0; i < _genHandDefaultButtonEvents[j].size(); i++)
        {
            if(!_genHandDefaultButtonEvents[j][i])
            {
                bit = bit << 1;
                continue;
            }
            //std::cerr << "last mask " << _lastButtonMask << " new mask " << newMask << " bit: " << bit << " " << (newMask & bit) << " " << (_lastButtonMask & bit) << std::endl;
            if((_threadLastHandButtonMask[j] & bit) != (newMask & bit))
            {
                buttonEvent = new TrackedButtonInteractionEvent();
                //std::cerr << "last mask " << _lastButtonMask << " new mask " << newMask << std::endl;
                if(_threadLastHandButtonMask[j] & bit)
                {
                    buttonEvent->setInteraction(BUTTON_UP);
                }
                else
                {
                    buttonEvent->setInteraction(BUTTON_DOWN);
                }
                buttonEvent->setButton(i);
                // set current pointer info
                if(getIsHandThreaded(j))
                {
                    buttonEvent->setTransform(_threadHandMatList[j]);
                }
                else
                {
                    buttonEvent->setTransform(_handMatList[j]);
                }
                buttonEvent->setHand(j);
                //_threadEvents.push((InteractionEvent*)buttonEvent);
                genComTrackEvents->processEvent(buttonEvent);
            }
            else if((_threadLastHandButtonMask[j] & bit) && (newMask & bit))
            {
                buttonEvent = new TrackedButtonInteractionEvent();
                buttonEvent->setInteraction(BUTTON_DRAG);
                buttonEvent->setButton(i);
                // set current pointer info
                if(getIsHandThreaded(j))
                {
                    buttonEvent->setTransform(_threadHandMatList[j]);
                }
                else
                {
                    buttonEvent->setTransform(_handMatList[j]);
                }
                buttonEvent->setHand(j);
                //_threadEvents.push((InteractionEvent*)buttonEvent);
                genComTrackEvents->processEvent(buttonEvent);
            }
            bit = bit << 1;
        }
        _threadLastHandButtonMask[j] = newMask;
    }
}