void CNrpLaborMarket::CreateNewFreeUsers() { USERS coders, designer, composer, tester; core::map< NrpText, USERS* > group; group[ NrpCoder::ClassName() ] = &coders; group[ NrpDesigner::ClassName() ] = &designer; group[ NrpComposer::ClassName() ] = &composer; group[ NrpTester::ClassName() ] = &tester; for( u32 i=0; i < _users.size(); i++ ) { CNrpUser* user = _users[ i ]; NrpText typeName = user->ObjectTypeName(); if( (*user)[ PARENTCOMPANY ].As<PNrpCompany>() != NULL ) continue; if( core::map< NrpText, USERS* >::Node* node = group.find( typeName ) ) node->getValue()->push_back( user ); } size_t USER_GROUP_COUNT = 6; core::map< NrpText, USERS* >::Iterator gIter = group.getIterator(); for( ; !gIter.atEnd(); gIter++ ) { USERS& tmpList = *(gIter->getValue()); for( u32 k=0; k < tmpList.size(); k++ ) RemoveUser( tmpList[ k ] ); tmpList.clear(); for( size_t cnt=tmpList.size(); cnt < USER_GROUP_COUNT; cnt++ ) tmpList.push_back( CreateRandomUser( gIter->getKey() ) ); } gIter = group.getIterator(); for( ; !gIter.atEnd(); gIter++ ) for( u32 cnt=0; cnt < gIter->getValue()->size(); cnt++ ) _users.push_back( (*gIter->getValue())[ cnt ] ); if( _self[ USERNUMBER ] != static_cast< int >( _users.size() ) ) PCall( APP_USER_MARKETUPDATE, NULL ); _self[ USERNUMBER ] = static_cast< int >( _users.size() ); }
bool CNrpMainScene::OnEvent( const irr::SEvent& event ) //обработка событий { switch( event.EventType ) { //события от гуи case EET_GUI_EVENT: { s32 id = event.GUIEvent.Caller->getID(); //если было вызвано не перехваченное нажатие кнопки switch( event.GUIEvent.EventType ) { //а может это дернули скролбар case gui::EGET_SCROLL_BAR_CHANGED: { gui::CNrpScrollBar* scr = (gui::CNrpScrollBar*)event.GUIEvent.Caller; //и к этому скроллбару повесили функцию луа if( scr->getAction().size() ) { //попытаемся её выполнить nrp::CNrpScript::Instance().CallFunction( scr->getAction(), scr ); return true; } } break; } } break; //если произошло неперехваченное событие от клавы case EET_KEY_INPUT_EVENT: { //отдадим его на обработку PCall( SCENE_KEY_INPUT_EVENT, this, (void*)&event ); } break; //последними обрабатываем события мышки case EET_MOUSE_INPUT_EVENT: { switch( event.MouseInput.Event ) { //нажатие пкм произошло вне гуи case EMIE_RMOUSE_LEFT_UP: PCall( SCENE_RMOUSE_LEFT_UP, this ); break; //вне гуи произошло нажатие лкм case EMIE_LMOUSE_LEFT_UP: { //попробуем найти объект сцены к которому попытались обратиться gui::IGUIEnvironment* guienv = _nrpEngine.GetGuiEnvironment(); if( guienv->isHovered( guienv->getRootGUIElement() ) ) //проверяем на пересечение если курсор не находится над гуи { core::vector3df pnt; GetNodeAndIntersectionFromCursor_( selectedNode_, pnt, twinLeftMouseClick_); } //вызываем событие луа mouseSceneBLeftEvent_ = true; } break; case EMIE_MOUSE_MOVED: { //обрабатываем событие перемещения мышки PCall( SCENE_MOUSE_MOVED, this ); } break; } return false; } break; case EET_USER_EVENT: { //DoLuaFunctionsByType( SCENE_USER_EVENT, (void*)&event ); } break; } return false; }
//один кадр сцены void CNrpMainScene::OnUpdate() { try { video::IVideoDriver* driver = _nrpEngine.GetVideoDriver(); //вызываем событие луа до начала сцены PCall( SCENE_BEFORE_BEGIN, this ); driver->beginScene( true, true, video::SColor(150,50,50,50) ); try { //вызываем событие луа до рендера сцены PCall( SCENE_BEFORE_RENDER, this ); //рендерим сцену RenderScene_(); //вызываем событие луа после рендера сцены PCall( SCENE_AFTER_RENDER, this ); //отладочная вещь для просмотра выделенных объектов try { if( selectedNode_ != NULL && IsObjectChildOfScene_( selectedNode_ ) ) { video::SMaterial mat; mat.Thickness = 2; driver->setMaterial( mat ); driver->setTransform(video::ETS_WORLD, core::IdentityMatrix ); core::aabbox3df bbox = selectedNode_->getBoundingBox(); selectedNode_->setDebugDataVisible( true ); selectedNode_->getAbsoluteTransformation().transformBoxEx( bbox ); driver->draw3DBox( bbox, video::SColor( 0xff, 0xff, 0, 0 ) ); mat.Thickness = 1; driver->setMaterial( mat ); } else selectedNode_ = NULL; } catch(...) { selectedNode_ = NULL; } } catch(...) { //ErrLog( gfx ) << all << "Ошибка RenderScene" << term; } driver->endScene(); //вызываем событие луа после завершения рендера сцены PCall( SCENE_AFTER_END, this ); if( mouseSceneBLeftEvent_ && ( GetTickCount() - lastTimeNodeSelect_ > 200) ) { PCall( twinLeftMouseClick_ ? SCENE_LMOUSE_DOUBLE_CLICK : SCENE_LMOUSE_LEFT_UP, selectedNode_ ); mouseSceneBLeftEvent_ = false; twinLeftMouseClick_ = false; } _nrpEngine.GetDevice()->yield(); } catch(...) { //ErrLog(gfx) << all << "Ошибка основной сцены" << term; } }