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; }
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(); } }
const Object* UserDataContainer::getUserObject(const std::string& name, unsigned int startPos) const { return getUserObject(getUserObjectIndex(name, startPos)); }
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; }