// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "stdpch.h" #include "main_loop_debug.h" #include #include #include "global.h" #include "client_cfg.h" #include "user_entity.h" #include "debug_client.h" #include "entities.h" #include "motion/user_controls.h" #include "pacs_client.h" #include "sound_manager.h" #include "view.h" #include "prim_file.h" #include "weather.h" #include "light_cycle_manager.h" #include "net_manager.h" #include "ping.h" #include "world_database_manager.h" #include "continent_manager.h" #include "client_sheets/weather_function_params_sheet.h" #include "weather_manager_client.h" #include "fog_map.h" #include "misc.h" #include "interface_v3/interface_manager.h" #include "actions_client.h" #include "user_agent.h" using namespace NLMISC; using namespace NL3D; using namespace NLGUI; // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** extern std::set LodCharactersNotFound; extern uint32 NbDatabaseChanges; extern CFogState MainFogState; extern CPing Ping; extern bool Filter3D[RYZOM_MAX_FILTER_3D]; //namespace /* anonymous */ { NLMISC::CValueSmoother smoothFPS; NLMISC::CValueSmoother moreSmoothFPS(64); //} /* anonymous namespace */ //--------------------------------------------------- // displayDebug : // Display some debug infos. //--------------------------------------------------- void displayDebug() { float lineStep = ClientCfg.DebugLineStep; float line; // Initialize Pen // //----------------// // Create a shadow when displaying a text. TextContext->setShaded(true); TextContext->setShadeOutline(false); // Set the font size. TextContext->setFontSize(ClientCfg.DebugFontSize); // Set the text color TextContext->setColor(ClientCfg.DebugFontColor); // TOP LEFT // //----------// TextContext->setHotSpot(UTextContext::TopLeft); line = 0.9f; // FPS and Ms per frame { // smooth across frames. double deltaTime = smoothFPS.getSmoothValue (); // FPS and Ms per frame if(deltaTime != 0.f) TextContext->printfAt(0.f, line,"%.1f fps", 1.f/deltaTime); else TextContext->printfAt(0.f, line,"%.1f fps", 0.f); TextContext->printfAt(0.1f, line, "%d ms", (uint)(deltaTime*1000)); } line -= lineStep; line -= lineStep; // USER // Front TextContext->printfAt(0.0f, line, " %f (%f,%f,%f) front", atan2(UserEntity->front().y, UserEntity->front().x), UserEntity->front().x, UserEntity->front().y, UserEntity->front().z); line -= lineStep; // Dir TextContext->printfAt(0.0f, line, " %f (%f,%f,%f) dir", atan2(UserEntity->dir().y, UserEntity->dir().x), UserEntity->dir().x, UserEntity->dir().y, UserEntity->dir().z); line -= lineStep; // NB Stage TextContext->printfAt(0.0f, line, " NB Stage: %d", UserEntity->nbStage()); line -= lineStep; // NB Animation FXs still remaining in the remove list. TextContext->printfAt(0.0f, line, " NB FXs to remove: %d", UserEntity->nbAnimFXToRemove()); line -= lineStep; // Mode. TextContext->printfAt(0.0f, line, " Mode: %d (%s)", (sint)UserEntity->mode(), MBEHAV::modeToString(UserEntity->mode()).c_str()); line -= lineStep; // Behaviour. TextContext->printfAt(0.0f, line, " Behaviour: %d (%s)", (sint)UserEntity->behaviour(), MBEHAV::behaviourToString(UserEntity->behaviour()).c_str()); line -= lineStep; // Display the target mount. TextContext->printfAt(0.0f, line, " Mount: %d", UserEntity->mount()); line -= lineStep; // Display the target rider. TextContext->printfAt(0.0f, line, " Rider: %d", UserEntity->rider()); line -= lineStep; // Display the current animation name. TextContext->printfAt(0.0f, line, " Current Animation Name: %s", UserEntity->currentAnimationName().c_str()); line -= lineStep; // Display the current move animation set name. TextContext->printfAt(0.0f, line, " Current AnimationSet Name (MOVE): %s", UserEntity->currentAnimationSetName(MOVE).c_str()); line -= lineStep; // Display Missing Animations if(::CAnimation::MissingAnim.empty() == false) { TextContext->printfAt(0.0f, line, " '%u' Missing Animations, 1st: '%s'", ::CAnimation::MissingAnim.size(), (*(::CAnimation::MissingAnim.begin())).c_str()); line -= lineStep; } // Display Missing LoD if(LodCharactersNotFound.empty() == false) { TextContext->printfAt(0.0f, line, " '%u' Missing LoD, 1st: '%s'", LodCharactersNotFound.size(), (*(LodCharactersNotFound.begin())).c_str()); line -= lineStep; } // Watched Entity line -= lineStep; // Now Displaying the selection. TextContext->printfAt(0.0f, line, "--*** Watched entity ***--"); line -= lineStep; // Display information about the debug entity slot. if(WatchedEntitySlot != CLFECOMMON::INVALID_SLOT) { // Get a pointer on the target. CEntityCL *watchedEntity = EntitiesMngr.entity(WatchedEntitySlot); if(watchedEntity) { // Display Debug Information about the Selection. watchedEntity->displayDebug(0.0f, line, -lineStep); // Distance of the target CVectorD diffvector = UserEntity->pos() - watchedEntity->pos(); TextContext->printfAt(0.0f, line, " Distance: %10.2f (Manhattan: %.2f)", diffvector.norm(), fabs(diffvector.x) + fabs(diffvector.y) ); line -= lineStep; } // Target not allocated else { TextContext->printfAt(0.0f, line, "Not allocated (%d)", WatchedEntitySlot); line -= lineStep; } } // No Target else { TextContext->printfAt(0.0f, line, "None"); line -= lineStep; } /* Ca rame grave ! uint nMem = NLMEMORY::GetAllocatedMemory(); line -= lineStep; TextContext->printfAt(0.0f, line, "Mem Used: %d",nMem);*/ // 3D Filters information: #ifdef _PROFILE_ON_ line-= lineStep; TextContext->printfAt(0.0f, line, "3D Filters:"); line-= lineStep; TextContext->printfAt(0.0f, line, "MeshNoVP: %s", Filter3D[FilterMeshNoVP]?"Ok":"NOT RENDERED!"); line-= lineStep; TextContext->printfAt(0.0f, line, "MeshVP: %s", Filter3D[FilterMeshVP]?"Ok":"NOT RENDERED!"); line-= lineStep; TextContext->printfAt(0.0f, line, "FXs: %s", Filter3D[FilterFXs]?"Ok":"NOT RENDERED!"); line-= lineStep; if (Landscape) { TextContext->printfAt(0.0f, line, "Landscape: %s", Filter3D[FilterLandscape]?"Ok":"NOT RENDERED!"); line-= lineStep; } else { TextContext->printfAt(0.0f, line, "Landscape not enabled"); } TextContext->printfAt(0.0f, line, "Vegetable: %s", Filter3D[FilterVegetable]?"Ok":"NOT RENDERED!"); line-= lineStep; TextContext->printfAt(0.0f, line, "Skeleton: %s", Filter3D[FilterSkeleton]?"Ok":"NOT RENDERED!"); line-= lineStep; TextContext->printfAt(0.0f, line, "Water: %s", Filter3D[FilterWater]?"Ok":"NOT RENDERED!"); line-= lineStep; TextContext->printfAt(0.0f, line, "Cloud: %s", Filter3D[FilterCloud]?"Ok":"NOT RENDERED!"); line-= lineStep; TextContext->printfAt(0.0f, line, "CoarseMesh: %s", Filter3D[FilterCoarseMesh]?"Ok":"NOT RENDERED!"); line-= lineStep; TextContext->printfAt(0.0f, line, "Sky: %s", Filter3D[FilterSky]?"Ok":"NOT RENDERED!"); line-= lineStep; // Materials Infos TextContext->printfAt(0.0f, line, "SetupedMatrix: %d", Driver->profileSetupedModelMatrix() ); line-= lineStep; TextContext->printfAt(0.0f, line, "SetupedMaterials: %d", Driver->profileSetupedMaterials() ); line-= lineStep; // Display camera cluster system TextContext->printfAt(0.0f, line, "ClusterSystem: %p", MainCam.getClusterSystem() ); line-= 2 * lineStep; // Lua stuffs CInterfaceManager *pIM = CInterfaceManager::getInstance(); TextContext->printfAt(0.0f, line, "Lua mem (kb) : %d / %d", CLuaManager::getInstance().getLuaState()->getGCCount(), CLuaManager::getInstance().getLuaState()->getGCThreshold()); line-= lineStep; TextContext->printfAt(0.0f, line, "Lua stack size = %d", CLuaManager::getInstance().getLuaState()->getTop()); line-= lineStep; #endif // TOP LEFT // //-----------// TextContext->setHotSpot(UTextContext::TopLeft); line = 1.f; string str = getDisplayVersion(); TextContext->printfAt(0.f, line, "Version %s", str.c_str()); // TOP MIDDLE // //------------// TextContext->setHotSpot(UTextContext::MiddleTop); line = 1.f; // Motion Mode TextContext->printfAt(0.5f, line, "%s", UserControls.modeStr().c_str()); line -= lineStep; // TOP RIGHT // //-----------// TextContext->setHotSpot(UTextContext::TopRight); line = 1.f; //// 3D Infos // Video mem allocated. TextContext->printfAt(1.f, line, "Video mem. : %f", Driver->profileAllocatedTextureMemory()/(1024.f*1024.f)); line -= lineStep; // Video mem used since last swapBuffers(). TextContext->printfAt(1.f, line, "Video mem. since last swap buffer: %f", Driver->getUsedTextureMemory()/(1024.f*1024.f)); line -= lineStep; // Get the last face count asked from the main scene before reduction. TextContext->printfAt(1.f, line, "Nb Skin Face Asked: %f", Scene->getGroupNbFaceAsked("Skin")); line -= lineStep; TextContext->printfAt(1.f, line, "Nb Fx Face Asked: %f", Scene->getGroupNbFaceAsked("Fx")); line -= lineStep; // All Triangles In CPrimitiveProfile pIn; CPrimitiveProfile pOut; Driver->profileRenderedPrimitives(pIn, pOut); TextContext->printfAt(1.f, line, "Tri In : %d", pIn.NTriangles+2*pIn.NQuads); line -= lineStep; // All Triangles Out TextContext->printfAt(1.f, line, "Tri Out : %d", pOut.NTriangles+2*pIn.NQuads); line -= lineStep; // Current Cluster string strPos; // Check there is a PACS Primitive before using it. if(UserEntity->getPrimitive() && GR) { UGlobalPosition gPos; UserEntity->getPrimitive()->getGlobalPosition(gPos, dynamicWI); string strPos = GR->getIdentifier(gPos); } else strPos = "No Primitive"; TextContext->printfAt(1.f, line, "Cluster : %s", strPos.c_str()); line -= lineStep; //// SOUND Infos line -= lineStep; if(SoundMngr) { TextContext->printfAt(1.f, line, "Sound source instance: %u", SoundMngr->getSourcesInstanceCount()); line -= lineStep; TextContext->printfAt(1.f, line, "Logical playing SoundSource: %u", SoundMngr->getMixer()->getPlayingSourcesCount ()); line -= lineStep; TextContext->printfAt(1.f, line, "Audio tracks: %u/%u", SoundMngr->getMixer()->getUsedTracksCount(), SoundMngr->getMixer()->getPolyphony()); line -= lineStep; if (SoundMngr->getMixer()->getMutedPlayingSourcesCount() > 0) { TextContext->printfAt(1.f, line, "Source muted: %u !", SoundMngr->getMixer()->getMutedPlayingSourcesCount()); line -= lineStep; } TextContext->printfAt(1.f, line, "Samples in memory: %g MB", SoundMngr->getLoadingSamplesSize() / (1024.0f*1024.0f)); line -= lineStep; } // BOTTOM RIGHT // //--------------// TextContext->setHotSpot(UTextContext::BottomRight); line = 0.f; //// POSITION CVector postmp = View.viewPos(); // Pos TextContext->printfAt(1.f, line, "Position : %d %d %d",(int)postmp.x,(int)postmp.y,(int)postmp.z); line += lineStep; // Body Heading TextContext->printfAt(1.f, line, "Front : %.2f %.2f %.2f", UserEntity->front().x, UserEntity->front().y, UserEntity->front().z); line += lineStep; // Speed TextContext->printfAt(1.f, line, "Speed : %.2f", (float) UserEntity->speed()); line += lineStep; // Zone if (!ClientCfg.Light) { if (Landscape) { TextContext->printfAt(1.f, line, "Zone: %s", Landscape->getZoneName(postmp).c_str()); line += lineStep; } } // Prim File string primFile = PrimFiles.getCurrentPrimitive (); if (!primFile.empty ()) { TextContext->printfAt(1.f, line, "Prim File: %s", primFile.c_str ()); line += lineStep; } //// CONNECTION line += lineStep; // Ryzom Day. TextContext->printfAt(1.f, line, "Ryzom Day : %d", RT.getRyzomDay()); line += lineStep; // hour in the game float dayNightCycleHour = (float)RT.getRyzomTime(); TextContext->printfAt(1.f, line, "Ryzom Time : %2u:%02u", int(dayNightCycleHour), int((dayNightCycleHour-int(dayNightCycleHour))*60.0f)); line += lineStep; // light hour in the game, used to display te day/night TextContext->printfAt(1.f, line, "Ryzom Light Time : %2u:%02u (%s)", int(DayNightCycleHour), int((DayNightCycleHour-int(DayNightCycleHour))*60.0f), LightCycleManager.getStateString().c_str()); line += lineStep; // Server GameCycle TextContext->printfAt(1.f, line, "Server GameCycle : %u", (uint)NetMngr.getCurrentServerTick()); line += lineStep; // Current GameCycle TextContext->printfAt(1.f, line, "Current GameCycle : %u", (uint)NetMngr.getCurrentClientTick()); line += lineStep; // Current GameCycle TextContext->printfAt(1.f, line, "Ms per Cycle : %d", NetMngr.getMsPerTick()); line += lineStep; // Smoothed Client Date TextContext->printfAt(1.f, line, "Smoothed Client Date : %u %f", SmoothedClientDate.Day, SmoothedClientDate.Hour); line += lineStep; // Packet Loss TextContext->printfAt(1.f, line, "Packet Loss : %.1f %%", NetMngr.getMeanPacketLoss()*100.0f); line += lineStep; // Packet Loss TextContext->printfAt(1.f, line, "Packets Lost : %u", NetMngr.getTotalLostPackets()); line += lineStep; // Mean Upload TextContext->printfAt(1.f, line, "Mean Upld : %.3f kbps", NetMngr.getMeanUpload()); line += lineStep; // Mean Download TextContext->printfAt(1.f, line, "Mean Dnld : %.3f kbps", NetMngr.getMeanDownload()); line += lineStep; // Mean Download TextContext->printfAt(1.f, line, "Nb in Vision : %d(%d,%d,%d)", EntitiesMngr.nbEntitiesAllocated(), EntitiesMngr.nbUser(), EntitiesMngr.nbPlayer(), EntitiesMngr.nbChar()); line += lineStep; // Number of database changes TextContext->printfAt(1.f, line, "DB Changes : %u", NbDatabaseChanges ); line += lineStep; // Ping TextContext->printfAt(1.f, line, "DB Ping : %u ms", Ping.getValue()); line += lineStep; // Manual weather setup { if(ContinentMngr.cur()) // Only usable if there is a continent loaded. { if (!ForceTrueWeatherValue) { const CWeatherFunction &wf = ContinentMngr.cur()->WeatherFunction[CurrSeason]; float wv; if (ClientCfg.ManualWeatherSetup) { wv = std::max(wf.getNumWeatherSetups() - 1, 0u) * ManualWeatherValue; } else { wv = std::max(wf.getNumWeatherSetups() - 1, 0u) * ::getBlendedWeather(RT.getRyzomDay(), RT.getRyzomTime(), *WeatherFunctionParams, ContinentMngr.cur()->WeatherFunction); } const CWeatherSetup *ws = wf.getWeatherSetup((uint) floorf(wv)); std::string name0 = ws ? NLMISC::CStringMapper::unmap(ws->SetupName) : "???"; ws = wf.getWeatherSetup(std::min((uint) (floorf(wv) + 1), wf.getNumWeatherSetups() - 1)); std::string name1 = ws ? NLMISC::CStringMapper::unmap(ws->SetupName) : "???"; TextContext->printfAt(1.f, line, "Weather value : %.02f : %s -> %s", ws ? wv : 0.f, name0.c_str(), name1.c_str()); line += lineStep; } else { TextContext->printfAt(1.f, line, "Weather value : %.02f", WeatherManager.getWeatherValue() * std::max(ContinentMngr.cur()->WeatherFunction[CurrSeason].getNumWeatherSetups() - 1, 0u)); line += lineStep; TextContext->printfAt(1.f, line, "TEST WEATHER FUNCTION"); line += lineStep; } // season TextContext->printfAt(1.f, line, "Season : %s", EGSPD::CSeason::toString(CurrSeason).c_str()); line += lineStep; } } // fog dist if (ContinentMngr.cur()) { TextContext->printfAt(1.f, line, "Continent fog min near = %.1f, max far = %.1f", ContinentMngr.cur()->FogStart, ContinentMngr.cur()->FogEnd); line += lineStep; CFogState tmpFog; ContinentMngr.getFogState(MainFog, LightCycleManager.getLightLevel(), LightCycleManager.getLightDesc().DuskRatio, LightCycleManager.getState(), View.viewPos(), tmpFog); TextContext->printfAt(1.f, line, "Continent fog curr near = %.1f, curr far = %.1f", tmpFog.FogStartDist, tmpFog.FogEndDist); line += lineStep; } const CWeatherState &ws = WeatherManager.getCurrWeatherState(); TextContext->printfAt(1.f, line, "Weather fog near = %.1f, far = %.1f", ws.FogNear[MainFog], ws.FogFar[MainFog]); line += lineStep; TextContext->printfAt(1.f, line, "Final fog near = %.1f, far = %.1f", MainFogState.FogStartDist, MainFogState.FogEndDist); line += lineStep; float left, right, bottom, top, znear, zfar; Scene->getCam().getFrustum(left, right, bottom, top, znear, zfar); TextContext->printfAt(1.f, line, "Clip near = %.1f, far = %.1f", znear, zfar); line += lineStep; // Connection states TextContext->printfAt(1.f, line, "State : %s", NetMngr.getConnectionStateCStr() ); line += lineStep; // UGlobalPosition globalPos; // UserEntity->getPrimitive()->getGlobalPosition(globalPos, dynamicWI); // uint32 material = GR->getMaterial( globalPos ); // TextContext->printfAt(0.5f,0.5f,"Material : %d Gpos=(inst=%d,surf=%d,x=%.2f,y=%.2f",material, globalPos.InstanceId, globalPos.LocalPosition.Surface, globalPos.LocalPosition.Estimation.x, globalPos.LocalPosition.Estimation.y); // No more shadow when displaying a text. TextContext->setShaded(false); TextContext->setShadeOutline(false); }// displayDebug // // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** //--------------------------------------------------- // displayDebug : // Display some debug infos. //--------------------------------------------------- void displayDebugFps() { float lineStep = ClientCfg.DebugLineStep; float line; // Initialize Pen // //----------------// // Create a shadow when displaying a text. TextContext->setShaded(true); TextContext->setShadeOutline(false); // Set the font size. TextContext->setFontSize(ClientCfg.DebugFontSize); // Set the text color TextContext->setColor(ClientCfg.DebugFontColor); // TOP LEFT // //----------// TextContext->setHotSpot(UTextContext::TopLeft); line = 0.9f; // Ms per frame { float spf = smoothFPS.getSmoothValue (); // Ms per frame TextContext->printfAt(0.1f, line, "FPS %.1f ms - %.1f fps", spf*1000, 1.f/spf); line-= lineStep; // More Smoothed Ms per frame spf = moreSmoothFPS.getSmoothValue (); TextContext->printfAt(0.1f, line, "Smoothed FPS %.1f ms - %.1f fps", spf*1000, 1.f/spf); line-= lineStep; } } // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** static NLMISC::CRefPtr HighlightedDebugUI; // displayDebug : // Display information about ui elements that are under the mouse //--------------------------------------------------- void displayDebugUIUnderMouse() { float lineStep = ClientCfg.DebugLineStep; float line; // Initialize Pen // //----------------// // Create a shadow when displaying a text. TextContext->setShaded(true); TextContext->setShadeOutline(false); // Set the font size. TextContext->setFontSize(ClientCfg.DebugFontSize); // TOP LEFT // //----------// TextContext->setHotSpot(UTextContext::TopLeft); line = 0.9f; CInterfaceManager *pIM = CInterfaceManager::getInstance(); // for now only accessible with R2ED if (ClientCfg.R2EDEnabled) { TextContext->setColor(CRGBA::Cyan); TextContext->printfAt(0.1f, line, "Press default key (ctrl+shift+A) to cycle prev"); line-= lineStep; TextContext->printfAt(0.1f, line, "Press default key (ctrl+shift+Q) to cycle next"); line-= lineStep; TextContext->printfAt(0.1f, line, "Press default key (ctrl+shift+W) to inspect element"); line-= 2 * lineStep; } // const std::vector &rICL = CWidgetManager::getInstance()->getCtrlsUnderPointer (); const std::vector &rIGL = CWidgetManager::getInstance()->getGroupsUnderPointer (); // If previous highlighted element is found in the list, then keep it, else reset to first element if (std::find(rICL.begin(), rICL.end(), HighlightedDebugUI) == rICL.end() && std::find(rIGL.begin(), rIGL.end(), HighlightedDebugUI) == rIGL.end()) { if (!rICL.empty()) { HighlightedDebugUI = rICL[0]; } else if (!rIGL.empty()) { HighlightedDebugUI = rIGL[0]; } else { HighlightedDebugUI = NULL; } } // TextContext->setColor(CRGBA::Green); TextContext->printfAt(0.1f, line, "Controls under cursor "); line -= lineStep * 1.4f; TextContext->printfAt(0.1f, line, "----------------------"); line -= lineStep; for(uint k = 0; k < rICL.size(); ++k) { if (rICL[k]) { TextContext->setColor(rICL[k] != HighlightedDebugUI ? ClientCfg.DebugFontColor : CRGBA::Red); TextContext->printfAt(0.1f, line, "id = %s, address = 0x%p, parent = 0x%p", rICL[k]->getId().c_str(), rICL[k], rICL[k]->getParent()); } else { TextContext->setColor(CRGBA::Blue); TextContext->printfAt(0.1f, line, " control found !!!"); } line-= lineStep; } // TextContext->setColor(CRGBA::Green); TextContext->printfAt(0.1f, line, "Groups under cursor "); line -= lineStep * 1.4f; TextContext->printfAt(0.1f, line, "----------------------"); line-= lineStep; for(uint k = 0; k < rIGL.size(); ++k) { if (rIGL[k]) { TextContext->setColor(rIGL[k] != HighlightedDebugUI ? ClientCfg.DebugFontColor : CRGBA::Red); TextContext->printfAt(0.1f, line, "id = %s, address = 0x%p, parent = 0x%p", rIGL[k]->getId().c_str(), rIGL[k], rIGL[k]->getParent()); } else { TextContext->setColor(CRGBA::Blue); TextContext->printfAt(0.1f, line, " group found !!!"); } line-= lineStep; } } // get all element under the mouse in a single vector static void getElementsUnderMouse(std::vector &ielem) { CInterfaceManager *pIM = CInterfaceManager::getInstance(); const std::vector &rICL = CWidgetManager::getInstance()->getCtrlsUnderPointer(); const std::vector &rIGL = CWidgetManager::getInstance()->getGroupsUnderPointer(); ielem.clear(); ielem.insert(ielem.end(), rICL.begin(), rICL.end()); ielem.insert(ielem.end(), rIGL.begin(), rIGL.end()); } class CHandlerDebugUiPrevElementUnderMouse : public IActionHandler { virtual void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) { std::vector ielem; getElementsUnderMouse(ielem); for(uint k = 0; k < ielem.size(); ++k) { if (HighlightedDebugUI == ielem[k]) { HighlightedDebugUI = ielem[k == 0 ? ielem.size() - 1 : k - 1]; return; } } } }; REGISTER_ACTION_HANDLER( CHandlerDebugUiPrevElementUnderMouse, "debug_ui_prev_element_under_mouse"); class CHandlerDebugUiNextElementUnderMouse : public IActionHandler { virtual void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) { std::vector ielem; getElementsUnderMouse(ielem); for(uint k = 0; k < ielem.size(); ++k) { if (HighlightedDebugUI == ielem[k]) { HighlightedDebugUI = ielem[(k + 1) % ielem.size()]; return; } } } }; REGISTER_ACTION_HANDLER( CHandlerDebugUiNextElementUnderMouse, "debug_ui_next_element_under_mouse"); class CHandlerDebugUiDumpElementUnderMouse : public IActionHandler { virtual void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) { if (HighlightedDebugUI == NULL) return; CLuaState *lua = CLuaManager::getInstance().getLuaState(); if (!lua) return; CLuaStackRestorer lsr(lua, 0); CLuaIHM::pushUIOnStack(*lua, HighlightedDebugUI); lua->pushGlobalTable(); CLuaObject env(*lua); env["inspect"].callNoThrow(1, 0); } }; REGISTER_ACTION_HANDLER( CHandlerDebugUiDumpElementUnderMouse, "debug_ui_inspect_element_under_mouse"); // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** //----------------------------------------------- // Macro to Display a Text //----------------------------------------------- #define DISP_TEXT(x, text) \ /* Display the text at the right place */ \ TextContext->printfAt(x, line, std::string(text).c_str()); \ /* Change the line */ \ line += lineStep; \ //--------------------------------------------------- // getActionKey : // Return action key binding as string. static std::string getActionKey(const char* name, const char* param = "") { std::string category; CActionsManager *pAM = &Actions; const CActionsManager::TActionComboMap &acmap = pAM->getActionComboMap(); CActionsManager::TActionComboMap::const_iterator ite = acmap.find(CAction::CName(name, param)); if (ite != acmap.end()) return ite->second.toUCString().toString(); return CI18N::get("uiNotAssigned").toString(); } //--------------------------------------------------- // displayHelp : // Display an Help. //--------------------------------------------------- void displayHelp() { float line = 1.f; float lineStep = -ClientCfg.HelpLineStep; // Create a shadow when displaying a text. TextContext->setShaded(true); TextContext->setShadeOutline(false); // Set the font size. TextContext->setFontSize(ClientCfg.HelpFontSize); // Set the text color TextContext->setColor(ClientCfg.HelpFontColor); line = 1.f; TextContext->setHotSpot(UTextContext::TopLeft); DISP_TEXT(0.0f, getActionKey("toggle_help") + " : This Menu"); DISP_TEXT(0.0f, getActionKey("display_infos") + " : Display Debug Infos"); DISP_TEXT(0.0f, getActionKey("render_mode") + " : Wire mode"); DISP_TEXT(0.0f, getActionKey("toggle_render") + " : Do not Render the Scene"); DISP_TEXT(0.0f, getActionKey("toggle_chat") + " : Toggle Display OSD interfaces"); // DISP_TEXT(0.0f, "SHIFT + F6 : Not used"); DISP_TEXT(0.0f, getActionKey("change_compass_mode") + " : Compass Mode (User/Camera)"); DISP_TEXT(0.0f, getActionKey("toggle_fly") + " : Camera Mode (" + getActionKey("debug", "set_pos") + " to change your position)"); DISP_TEXT(0.0f, getActionKey("free_mouse") + " : Free Mouse"); DISP_TEXT(0.0f, getActionKey("screen_shot") + " : Take a Screen Shot (TGA), " + getActionKey("screen_shot_jpg") + " for jpg, " + getActionKey("screen_shot_png") + " for png"); // DISP_TEXT(0.0f, "SHIFT + F11 : Test"); DISP_TEXT(0.0f, getActionKey("enter_modal", "group=ui:interface:quit_dialog") + " : Quit"); DISP_TEXT(0.0f, getActionKey("toggle_camera") + " : First/Third Person View"); line = 1.f; TextContext->setHotSpot(UTextContext::TopRight); DISP_TEXT(1.0f, getActionKey("forward") + " : FORWARD"); DISP_TEXT(1.0f, getActionKey("backward") + " : BACKWARD"); DISP_TEXT(1.0f, getActionKey("turn_left") + " : ROTATE LEFT"); DISP_TEXT(1.0f, getActionKey("turn_right") + " : ROTATE RIGHT"); DISP_TEXT(1.0f, getActionKey("strafe_left") + " : STRAFE LEFT"); DISP_TEXT(1.0f, getActionKey("strafe_right") + " : STRAFE RIGHT"); DISP_TEXT(1.0f, getActionKey("toggle_auto_walk") + " : Auto Walk"); DISP_TEXT(1.0f, getActionKey("toggle_run_walk") + " : Walk/Run"); DISP_TEXT(1.0f, getActionKey("look_up") + " : Look Up"); DISP_TEXT(1.0f, getActionKey("look_down") + " : Look Down"); // DISP_TEXT(1.0f, getActionKey("show_hide", "inventory") + " : Inventory"); // DISP_TEXT(1.0f, getActionKey("show_hide", "phrase_book") + " : Spells composition interface"); // DISP_TEXT(1.0f, getActionKey("show_hide", "gestionsets") + " : Memorized Spells interface"); DISP_TEXT(1.0f, getActionKey("pacs_borders") + " : Show/Hide PACS Borders"); DISP_TEXT(1.0f, getActionKey("self_target") + " : Player target himself"); DISP_TEXT(1.0f, getActionKey("no_target") + " : Unselect target"); // DISP_TEXT(1.0f, "CTRL + TAB : Next Chat Mode (say/shout"); // DISP_TEXT(1.0f, "CTRL + R : Reload Client.cfg File"); // DISP_TEXT(1.0f, "CTRL + N : Toggle Night / Day lighting"); DISP_TEXT(1.0f, getActionKey("profile") + " : Profile on / off"); DISP_TEXT(1.0f, getActionKey("toggle_movie_recorder") + " : Movie Shooter record / stop"); DISP_TEXT(1.0f, getActionKey("replay_movie") + " : Movie Shooter replay"); DISP_TEXT(1.0f, getActionKey("save_movie") + " : Movie Shooter save"); #ifndef NL_USE_DEFAULT_MEMORY_MANAGER DISP_TEXT(1.0f, getActionKey("memory_report") + " : Save memory stat report"); #endif // NL_USE_DEFAULT_MEMORY_MANAGER DISP_TEXT(1.0f, getActionKey("toggle_primitive") + " : Show / hide prim file"); DISP_TEXT(1.0f, getActionKey("primitive_up") + " : Change prim file UP"); DISP_TEXT(1.0f, getActionKey("primitive_down") + " : Change prim file DOWN"); // No more shadow when displaying a text. TextContext->setShaded(false); TextContext->setShadeOutline(false); }// displayHelp // // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** // ******************************************************************** /* end of file */