Ogre::String ObjectControl::mousePressed(QPoint lastPos,float w,float h)
{
	using namespace Ogre;

	float RatioX = float(lastPos.x())/w;
	float RatioY = float(lastPos.y())/h;

	MovableObject* nodeM = getNode(RatioX,RatioY); 

	if( nodeM != NULL )
	{
		String name = nodeM->getParentSceneNode()->getName();

		if ( name == "move_widget_x" )
		{
			Vector3 objPos = Vector3(node->_getWorldAABB().getCenter());
			planeXNode->setPosition(objPos);
			planeYNode->setPosition(objPos);
			planeZNode->setPosition(objPos);
			currntOperation=MoveX;                
		}
		else if ( name == "move_widget_y" )
		{
			Vector3 objPos = Vector3(node->_getWorldAABB().getCenter());			
			planeXNode->setPosition(objPos);
			planeYNode->setPosition(objPos);
			planeZNode->setPosition(objPos);
			currntOperation=MoveY; 
		}
		else if ( name == "move_widget_z" )
		{
			Vector3 objPos = Vector3(node->_getWorldAABB().getCenter());						
			planeXNode->setPosition(objPos);
			planeYNode->setPosition(objPos);
			planeZNode->setPosition(objPos);
			currntOperation=MoveZ;                 
		}
		else if ( name == "rotate_widget_x"  ) currntOperation = RotateX;     
		else if ( name == "rotate_widget_y"  ) currntOperation = RotateY;
		else if ( name == "rotate_widget_z"  ) currntOperation = RotateZ;
		else if ( name == "scale_widget_x"   ) currntOperation = ScaleX;
		else if ( name == "scale_widget_y"   ) currntOperation = ScaleY;
		else if ( name == "scale_widget_z"   ) currntOperation = ScaleZ;
		else if ( name == "scale_widget_xyz" ) currntOperation = ScaleXYZ;
		else 
		{
			if		(currentMode==Move_Mode  ) selectObjectForEdit(name.c_str(),"move_widget"  );
			else if	(currentMode==Rotate_Mode) selectObjectForEdit(name.c_str(),"rotate_widget");
			else if	(currentMode==Scale_Mode ) selectObjectForEdit(name.c_str(),"scale_widget" );
		}

		return name;
	}
	else
	{
		reset();
		return "";
	}
}
コード例 #2
0
ファイル: OgrePCZSceneQuery.cpp プロジェクト: terakuran/ogre
    //---------------------------------------------------------------------
    void PCZIntersectionSceneQuery::execute(IntersectionSceneQueryListener* listener)
    {
        typedef std::pair<MovableObject *, MovableObject *> MovablePair;
        typedef std::set
            < std::pair<MovableObject *, MovableObject *> > MovableSet;

        MovableSet set;

        // Iterate over all movable types
        Root::MovableObjectFactoryIterator factIt = 
            Root::getSingleton().getMovableObjectFactoryIterator();
        while(factIt.hasMoreElements())
        {
            SceneManager::MovableObjectIterator it = 
                mParentSceneMgr->getMovableObjectIterator(
                factIt.getNext()->getType());
            while( it.hasMoreElements() )
            {

                MovableObject * e = it.getNext();
                PCZone * zone = ((PCZSceneNode*)(e->getParentSceneNode()))->getHomeZone();
                PCZSceneNodeList list;
                //find the nodes that intersect the AAB
                static_cast<PCZSceneManager*>( mParentSceneMgr ) -> findNodesIn( e->getWorldBoundingBox(), list, zone, 0 );
                //grab all moveables from the node that intersect...
                PCZSceneNodeList::iterator nit = list.begin();
                while( nit != list.end() )
                {
                    SceneNode::ObjectIterator oit = (*nit) -> getAttachedObjectIterator();
                    while( oit.hasMoreElements() )
                    {
                        MovableObject * m = oit.getNext();

                        if( m != e &&
                            set.find( MovablePair(e,m)) == set.end() &&
                            set.find( MovablePair(m,e)) == set.end() &&
                            (m->getQueryFlags() & mQueryMask) &&
                            (m->getTypeFlags() & mQueryTypeMask) &&
                            m->isInScene() && 
                            e->getWorldBoundingBox().intersects( m->getWorldBoundingBox() ) )
                        {
                            listener -> queryResult( e, m );
                            // deal with attached objects, since they are not directly attached to nodes
                            if (m->getMovableType() == "Entity")
                            {
                                Entity* e2 = static_cast<Entity*>(m);
                                Entity::ChildObjectListIterator childIt = e2->getAttachedObjectIterator();
                                while(childIt.hasMoreElements())
                                {
                                    MovableObject* c = childIt.getNext();
                                    if (c->getQueryFlags() & mQueryMask && 
                                        e->getWorldBoundingBox().intersects( c->getWorldBoundingBox() ))
                                    {
                                        listener->queryResult(e, c);
                                    }
                                }
                            }
                        }
                        set.insert( MovablePair(e,m) );

                    }
                    ++nit;
                }

            }
        }
    }