bool CameraFrameHandler::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
{
    if ( !_enable )
        return false;

    if ( ea.getEventType() == osgGA::GUIEventAdapter::FRAME )
    {
        // update camera matrix if needed
        if ( getUserObject()->_needUpdate )
        {
            // setup the view matrix basing on position and transformation        
            osg::Matrixf trans;
            trans.makeTranslate( _p_userObject->_curPosition.x(), _p_userObject->_curPosition.y(), _p_userObject->_curPosition.z() );
            osg::Matrix rot;        
            rot.makeRotate( _p_userObject->_curRotation );

            // add rotation offset (note: we do not rotate about world coord system)
            rot = _p_userObject->_offsetMatrixRotation * rot;
            
            osg::Matrixf mat;
            mat = rot * trans;

            // add position offset here
            mat = _p_userObject->_offsetMatrixPosition * mat;

            //  inverse the matrix
            osg::Matrixf inv = osg::Matrixf::inverse( mat );

            // adjust Z-UP
            static osg::Matrixf adjustZ_Up ( osg::Matrixf::rotate( -osg::PI / 2.0f, 1.0f, 0.0f, 0.0f ) );

            // set view matrix
            yaf3d::Application::get()->getSceneView()->setViewMatrix( osg::Matrixf( inv.ptr() ) * adjustZ_Up  );

            // reset update flag
            getUserObject()->_needUpdate = false;
         }
    }
    return false;
}
Beispiel #2
0
void SkillNormalBombStep::update(float dt)
{
	if (!_start || !_stepData || _targetRoles.size()==0) return;

	if (_step == 0)
	{
		for(int i=0; i<_targetRoles.size(); i++)
		{
			auto role = _targetRoles.at(i);
			auto player = AnimiPlayer::create(_frames, _stepData->frameDt);
			player->setTag(1000+i);
			player->start(1);
			player->setUserObject(role);
			player->setStopEvent([&](AnimiPlayer* player)
			{
				auto effect = DamageEffect::create(_stepData->_hurtHP);
				effect->setPosition(Point(CCRANDOM_MINUS1_1()*10, CCRANDOM_MINUS1_1()*10+60));

				auto role = static_cast<BattleRole*>(player->getUserObject());
				role->getNode()->addChild(effect, 10);

				int hp = role->getHP() + _stepData->_hurtHP;
				role->setHP(hp);

				player->removeFromParent();
			});
			player->setPosition(GRID_CONVER_TO_PIXEL(role->getGridIndex().x, role->getGridIndex().y));
			BattleController::getInstance()->addChild(player, ZORDER_BATTLE_EFFECT);
		}
		_step ++;
	}
	else if (_step == 1)
	{
		bool over = true;
		for(int i=0; i<_targetRoles.size(); i++)
		{
			auto node = BattleController::getInstance()->getChildByTag(1000+i);
			if (node)
			{
				over = false;
			}
		}
		if (over)
		{
			setOver(over);
			_step++;
		}
	}
}
void HelloWorld::OnBtnPay( CCObject* pObj )
{
	if (NULL == pObj) {
		return;
	}

	auto pNode = dynamic_cast<CCNode*>(pObj);
	if (NULL == pNode) {
		return;
	}

	auto pUserObject = pNode->getUserObject();
	if (NULL == pUserObject) {
		return;
	}

	auto pStrTypeId = dynamic_cast<CCString*>(pUserObject);
	if (NULL == pStrTypeId) {
		return;
	}

	PaymentMgr::GetInstance()->PayStart(pStrTypeId->getCString());
}
void bimWorld::MaterialCallback::update(osg::Node* node)
{
	if (!m_host->_MaterialSetting()->isModified())
	{
		return;
	}

	auto state = getTopStateSet(node);
	if (state)
	{
		std::mutex _mutex;
		_mutex.lock();
		//node->getOrCreateUserDataContainer()->setUserObject(NODE_CURRENT_STATESET, node->getStateSet());
		node->getOrCreateUserDataContainer()->setUserObject(NODE_TEMP_STATESET, state);
		//node->setUserValue("now_material", state);
		node->setStateSet(state);
		_mutex.unlock();
	}
	else
	{
		auto container = node->getOrCreateUserDataContainer();
		if (container->getNumUserObjects() <= 0)
		{
			return;
		}

		auto state = static_cast<osg::StateSet*>(container->getUserObject(NODE_CURRENT_STATESET));

		std::mutex _mutex;
		_mutex.lock();
		container->setUserObject(NODE_TEMP_STATESET, NULL);
		node->setStateSet(NULL);
		node->setStateSet(state);
		_mutex.unlock();
	}
}
Beispiel #5
0
const Object* UserDataContainer::getUserObject(const std::string& name, unsigned int startPos) const
{
     return getUserObject(getUserObjectIndex(name, startPos));
}
Beispiel #6
0
	T* getUserObject()
	{
		return (T*)getUserObject();
	}
void CCGestureRecognizer::gestureRecognized(CCGesture * gesture)
{
	gesture->userObject = getUserObject();
	gesture->userData = getUserData();
    if (target && selector) (target->*selector)(gesture); //call selector
}
bool InspectorIH::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& /*aa*/ )
{
    const osgSDL::SDLEventAdapter* p_eventAdapter = dynamic_cast< const osgSDL::SDLEventAdapter* >( &ea );
    assert( p_eventAdapter && "invalid event adapter received" );

    unsigned int     eventType    = p_eventAdapter->getEventType();
    int              key          = p_eventAdapter->getSDLKey();
    const SDL_Event& sdlevent     = p_eventAdapter->getSDLEvent();

    if ( eventType == osgGA::GUIEventAdapter::FRAME )
        return false;

    // terminate application on Escape
    if ( key == SDLK_ESCAPE )
        yaf3d::Application::get()->stop();

    // toggle info dialog rendering
    if ( ( key == SDLK_SPACE ) && ( eventType == osgGA::GUIEventAdapter::KEYDOWN ) )
    {
        _infoEnabled = !_infoEnabled;
        getUserObject()->enableInfoWindow( _infoEnabled );
    }

    // enable / disable picking mode
    if ( ( key == SDLK_RCTRL ) || ( key == SDLK_LCTRL ) )
    {
        if ( eventType == osgGA::GUIEventAdapter::KEYDOWN )
            _pickingEnabled = true;
        else if ( eventType == osgGA::GUIEventAdapter::KEYUP )
            _pickingEnabled = false;
    }

    // pick an object
    if ( _pickingEnabled )
    {
        if ( sdlevent.button.button == SDL_BUTTON_LEFT && eventType == osgGA::GUIEventAdapter::PUSH )
        {
            float x = sdlevent.motion.x, y = sdlevent.motion.y;
            x = 2.0f * ( x * _iscreenWidth ) - 1.0f;
            y = 2.0f * ( y * _iscreenHeight ) - 1.0f;

            // picked something?
            if ( pick( x, -y ) )
            {

                InspectorIH::PickResults* res = getPickResults();

                osgUtil::Hit*   p_hit      = res->_p_hit;
                osg::Drawable*  p_drawable = res->_p_drawable;

                // evaluate the node path of picked drawable and extract drawable's node name and location ( in world space )
                osg::NodePath& nodepath = p_hit->getNodePath();
                std::string nodename;
                if ( nodepath.size() )
                {
                    osg::MatrixTransform* p_mtNode = NULL;
                    osg::NodePath::iterator p_nbeg = nodepath.end(), p_nend = nodepath.begin();
                    p_nbeg--;
                    for ( ; p_nbeg != p_nend; --p_nbeg )
                    {
                        osg::MatrixTransform* p_mt  = dynamic_cast< osg::MatrixTransform* >( *p_nbeg );
                        osg::Group*           p_grp = dynamic_cast< osg::Group* >( *p_nbeg );

                        if ( !nodename.length() )
                        {
                            if ( p_mt )
                            {
                                nodename = p_mt->getName();
                                if ( !p_mtNode ) // we need only the first embedding transform node
                                    p_mtNode = p_mt;
                            }
                            else if ( p_grp )
                            {
                                nodename = p_grp->getName();
                            }
                        }
                        else
                            break;
                    }

                    // update the bbox and get its dimensions
                    const osg::Matrix* p_mat = p_hit->getMatrix();
                    osg::Vec3f pos = p_mat->getTrans();
                    osg::Vec3f dims( updateBBox( p_drawable, *p_mat, p_mtNode ? true : false ) );

                    // get primitive count of selected drawable
                    const osg::Geometry*    p_geom = p_drawable->asGeometry();
                    unsigned int            prims  = p_geom->getNumPrimitiveSets();

                    // format and set the output text
                    std::ostringstream str;
                    str << "name       " << nodename << std::endl;
                    str << "position   " << pos.x() << " " << pos.y() << " " << pos.z() << std::endl;
                    str << "primitives " << prims << std::endl;
                    str << "dimensions " << dims.x() << " " << dims.y() << " " << dims.z() << std::endl;
                    CEGUI::String text( str.str() );
                    getUserObject()->setPickerOutputText( text );
                }
            }
        }
    }

    // don't check for movement keys when locked
    if ( _lockMovement )
        return false;

    EnCamera*   p_camera = getUserObject()->_p_cameraEntity;
    float&      speed    = getUserObject()->_speed;
    float&      dt       = getUserObject()->_deltaTime;
    osg::Vec3f  pos;

    if ( eventType == osgGA::GUIEventAdapter::KEYDOWN )
    {
        if ( key == SDLK_w )
            _moveForward = true;
        else if ( key == SDLK_s )
            _moveBackward = true;
        else if ( key == SDLK_a )
            _moveLeft = true;
        else if ( key == SDLK_d )
            _moveRight = true;
    }
    else if ( eventType == osgGA::GUIEventAdapter::KEYUP )
    {
        if ( key == SDLK_w )
            _moveForward = false;
        else if ( key == SDLK_s )
            _moveBackward = false;
        else if ( key == SDLK_a )
            _moveLeft = false;
        else if ( key == SDLK_d )
            _moveRight = false;
    }

    if ( _moveForward )
        pos._v[ 1 ] += speed * dt;
    else if ( _moveBackward )
        pos._v[ 1 ] -= speed * dt;

    if ( _moveLeft )
        pos._v[ 0 ] -= speed * dt;
    else if ( _moveRight )
        pos._v[ 0 ] += speed * dt;

    // enable the camera rotation on dragging right mouse button
    if ( sdlevent.button.button == SDL_BUTTON_RIGHT )
    {
        if ( eventType == osgGA::GUIEventAdapter::PUSH )
            _rotationEnabled = true;
        else if ( eventType == osgGA::GUIEventAdapter::RELEASE )
            _rotationEnabled = false;
    }

    // adjust pitch and yaw
    if ( ( eventType == osgGA::GUIEventAdapter::DRAG ) && _rotationEnabled )
    {
        // skip events which come in when we warp the mouse pointer to middle of app window ( see below )
        if ( (  sdlevent.motion.x == _screenMiddleX ) && ( sdlevent.motion.y == _screenMiddleY ) )
            return false;

        static float lastxrel = 0;
        static float lastyrel = 0;
        float xrel = float( sdlevent.motion.xrel ) * dt;
        float yrel = float( sdlevent.motion.yrel ) * dt;

        // smooth the view change avoiding hart camera rotations
        _yaw   += ( xrel + lastxrel ) * 0.1f;
        _pitch += ( yrel + lastyrel ) * 0.1f;
        lastxrel = xrel;
        lastyrel = yrel;

        // set new camera orientation
        p_camera->setLocalPitchYaw( -_pitch, -_yaw );

        // reset mouse position in order to avoid leaving the app window
        yaf3d::Application::get()->getViewer()->requestWarpPointer( _screenMiddleX, _screenMiddleY );
    }

    // update camera position
    if ( _moveForward || _moveBackward || _moveLeft || _moveRight )
    {
        pos = p_camera->getLocalRotation() * pos;
        p_camera->setCameraPosition( pos + p_camera->getCameraPosition() );
    }

    return false;
}