bool CMaNGOS_Map::ShowNeighborTiles(int height, int width) { bool mouseOverMenu = false; static int levelScroll = 0; unsigned int winHSize = 25 * m_NeighborTiles.size() + 30; const unsigned int winWSize = 180; if (imguiBeginScrollArea("Choose neighbor tile", width - 10 - 250 - 10 - winWSize, height -10 - winHSize, winWSize, winHSize, &levelScroll)) mouseOverMenu = true; std::set<uint32>::iterator itr = m_NeighborTiles.begin(); while (itr != m_NeighborTiles.end()) { char buff[10]; memset(buff, 0, sizeof(buff)); itoa(*itr, buff, 10); unsigned int x, y; VMAP::StaticMapTree::unpackTileID(*itr, x, y); snprintf(buff, sizeof(buff), "%dx%d", x, y); if (imguiItem(buff)) { if (LoadTileData(x, y)) { m_showLevel = SHOW_LEVEL_NONE; itr = m_NeighborTiles.erase(itr); continue; } } ++itr; } imguiEndScrollArea(); return mouseOverMenu; }
bool CMaNGOS_Map::ShowMapLevel(int height, int width) { bool mouseOverMenu = false; static int levelScroll = 0; if (imguiBeginScrollArea("Choose Map", width - 10 - 250 - 10 - 200, height - 10 - 450, 200, 450, &levelScroll)) mouseOverMenu = true; for (std::set<uint32>::const_iterator itr = m_MapsFound.begin(); itr != m_MapsFound.end(); ++itr) { char buff[5]; memset(buff, 0, sizeof(buff)); itoa((*itr), buff, 10); if (imguiItem(buff)) { if (!m_MapInfos->IsEmpty()) ClearAllGeoms(); m_TileButtonStr = "Click to choose a tile"; m_showLevel = SHOW_LEVEL_NONE; m_mapID = (*itr); scanFoldersForTiles(); m_MapInfos = new MapInfos(); m_MapInfos->Init(m_mapID, m_ctx); m_navMesh = m_MapInfos->GetNavMesh(); m_navQuery = m_MapInfos->GetNavMeshQuery(); } } imguiEndScrollArea(); return mouseOverMenu; }
void sInterface() { int menuWidth = 200; ui.mouseOverMenu = false; if (ui.showMenu) { bool over = imguiBeginScrollArea("Testbed Controls", g_camera.m_width - menuWidth - 10, 10, menuWidth, g_camera.m_height - 20, &ui.scrollarea1); if (over) ui.mouseOverMenu = true; imguiSeparatorLine(); imguiLabel("Script"); if (imguiButton(entry->name, true)) { ui.chooseTest = !ui.chooseTest; } imguiSeparatorLine(); imguiSlider("Vel Iters", &settings.velocityIterations, 0, 50, 1, true); imguiSlider("Pos Iters", &settings.positionIterations, 0, 50, 1, true); imguiSlider("Hertz", &settings.hz, 5.0f, 120.0f, 5.0f, true); if (imguiCheck("Sleep", settings.enableSleep, true)) settings.enableSleep = !settings.enableSleep; if (imguiCheck("Warm Starting", settings.enableWarmStarting, true)) settings.enableWarmStarting = !settings.enableWarmStarting; if (imguiCheck("Time of Impact", settings.enableContinuous, true)) settings.enableContinuous = !settings.enableContinuous; if (imguiCheck("Sub-Stepping", settings.enableSubStepping, true)) settings.enableSubStepping = !settings.enableSubStepping; imguiSeparatorLine(); if (imguiCheck("Shapes", settings.drawShapes, true)) settings.drawShapes = !settings.drawShapes; if (imguiCheck("Joints", settings.drawJoints, true)) settings.drawJoints = !settings.drawJoints; if (imguiCheck("AABBs", settings.drawAABBs, true)) settings.drawAABBs = !settings.drawAABBs; if (imguiCheck("Contact Points", settings.drawContactPoints, true)) settings.drawContactPoints = !settings.drawContactPoints; if (imguiCheck("Contact Normals", settings.drawContactNormals, true)) settings.drawContactNormals = !settings.drawContactNormals; if (imguiCheck("Contact Impulses", settings.drawContactImpulse, true)) settings.drawContactImpulse = !settings.drawContactImpulse; if (imguiCheck("Friction Impulses", settings.drawFrictionImpulse, true)) settings.drawFrictionImpulse = !settings.drawFrictionImpulse; if (imguiCheck("Center of Masses", settings.drawCOMs, true)) settings.drawCOMs = !settings.drawCOMs; if (imguiCheck("Statistics", settings.drawStats, true)) settings.drawStats = !settings.drawStats; if (imguiCheck("Profile", settings.drawProfile, true)) settings.drawProfile = !settings.drawProfile; if (imguiButton("Pause", true)) settings.pause = !settings.pause; if (imguiButton("Single Step", true)) settings.singleStep = !settings.singleStep; if (imguiButton("Restart", true)) sRestart(); if (imguiButton("Quit", true)) glfwSetWindowShouldClose(mainWindow, GL_TRUE); imguiEndScrollArea(); } int testMenuWidth = 200; if (ui.chooseTest) { static int testScroll = 0; bool over = imguiBeginScrollArea("Choose Script", g_camera.m_width - menuWidth - testMenuWidth - 20, 10, testMenuWidth, g_camera.m_height - 20, &testScroll); if (over) ui.mouseOverMenu = true; // for (int i = 0; i < testCount; ++i) size_t i = 0; for(auto const& s : b2d_scripts) { if (imguiItem(s.name.c_str(), true)) { script_index = i; delete test; //entry = g_testEntries + i; test = entry->createFcn(b2d_scripts[script_index].filepath); ui.chooseTest = false; } ++i; } imguiEndScrollArea(); } imguiEndFrame(); }
int main(int /*argc*/, char** /*argv*/) { // Init SDL if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { printf("Could not initialise SDL\n"); return -1; } // Center window char env[] = "SDL_VIDEO_CENTERED=1"; putenv(env); // Init OpenGL SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); //#ifndef WIN32 SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); //#endif const SDL_VideoInfo* vi = SDL_GetVideoInfo(); bool presentationMode = false; int width, height; SDL_Surface* screen = 0; if (presentationMode) { width = 1700; height = 1000; screen = SDL_SetVideoMode(width, height, 0, SDL_OPENGL|SDL_FULLSCREEN); } else { width = 1700; height = 1000; screen = SDL_SetVideoMode(width, height, 0, SDL_OPENGL); } if (!screen) { printf("Could not initialise SDL opengl\n"); return -1; } glEnable(GL_MULTISAMPLE); SDL_WM_SetCaption("Recast Demo", 0); if (!imguiRenderGLInit("DroidSans.ttf")) { printf("Could not init GUI renderer.\n"); SDL_Quit(); return -1; } float t = 0.0f; float timeAcc = 0.0f; Uint32 lastTime = SDL_GetTicks(); int mx = 0, my = 0; float rx = 45; float ry = -45; float moveW = 0, moveS = 0, moveA = 0, moveD = 0; float camx = 0, camy = 0, camz = 0, camr = 1000; float origrx = 0, origry = 0; int origx = 0, origy = 0; float scrollZoom = 0; bool rotate = false; bool movedDuringRotate = false; float rays[3], raye[3]; bool mouseOverMenu = false; bool showMenu = !presentationMode; bool showLog = false; bool showTools = true; bool showLevels = false; bool showSample = false; bool showTestCases = false; int propScroll = 0; int logScroll = 0; int toolsScroll = 0; char sampleName[64] = "Choose Sample..."; FileList files; char meshName[128] = "Choose Mesh..."; float mpos[3] = {0,0,0}; bool mposSet = false; SlideShow slideShow; slideShow.init("slides/"); InputGeom* geom = 0; Sample* sample = 0; TestCase* test = 0; BuildContext ctx; glEnable(GL_CULL_FACE); float fogCol[4] = { 0.32f, 0.31f, 0.30f, 1.0f }; glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_LINEAR); glFogf(GL_FOG_START, camr*0.1f); glFogf(GL_FOG_END, camr*1.25f); glFogfv(GL_FOG_COLOR, fogCol); glDepthFunc(GL_LEQUAL); bool done = false; while(!done) { // Handle input events. int mscroll = 0; bool processHitTest = false; bool processHitTestShift = false; SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: // Handle any key presses here. if (event.key.keysym.sym == SDLK_ESCAPE) { done = true; } else if (event.key.keysym.sym == SDLK_t) { showLevels = false; showSample = false; showTestCases = true; scanDirectory("Tests", ".txt", files); } else if (event.key.keysym.sym == SDLK_TAB) { showMenu = !showMenu; } else if (event.key.keysym.sym == SDLK_SPACE) { if (sample) sample->handleToggle(); } else if (event.key.keysym.sym == SDLK_1) { if (sample) sample->handleStep(); } else if (event.key.keysym.sym == SDLK_9) { if (geom) geom->save("geomset.txt"); } else if (event.key.keysym.sym == SDLK_0) { delete geom; geom = new InputGeom; if (!geom || !geom->load(&ctx, "geomset.txt")) { delete geom; geom = 0; showLog = true; logScroll = 0; ctx.dumpLog("Geom load log %s:", meshName); } if (sample && geom) { sample->handleMeshChanged(geom); } if (geom || sample) { const float* bmin = 0; const float* bmax = 0; if (sample) { bmin = sample->getBoundsMin(); bmax = sample->getBoundsMax(); } else if (geom) { bmin = geom->getMeshBoundsMin(); bmax = geom->getMeshBoundsMax(); } // Reset camera and fog to match the mesh bounds. if (bmin && bmax) { camr = sqrtf(rcSqr(bmax[0]-bmin[0]) + rcSqr(bmax[1]-bmin[1]) + rcSqr(bmax[2]-bmin[2])) / 2; camx = (bmax[0] + bmin[0]) / 2 + camr; camy = (bmax[1] + bmin[1]) / 2 + camr; camz = (bmax[2] + bmin[2]) / 2 + camr; camr *= 3; } rx = 45; ry = -45; glFogf(GL_FOG_START, camr*0.2f); glFogf(GL_FOG_END, camr*1.25f); } } else if (event.key.keysym.sym == SDLK_RIGHT) { slideShow.nextSlide(); } else if (event.key.keysym.sym == SDLK_LEFT) { slideShow.prevSlide(); } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_RIGHT) { if (!mouseOverMenu) { // Rotate view rotate = true; movedDuringRotate = false; origx = mx; origy = my; origrx = rx; origry = ry; } } else if (event.button.button == SDL_BUTTON_WHEELUP) { if (mouseOverMenu) mscroll--; else scrollZoom -= 1.0f; } else if (event.button.button == SDL_BUTTON_WHEELDOWN) { if (mouseOverMenu) mscroll++; else scrollZoom += 1.0f; } break; case SDL_MOUSEBUTTONUP: // Handle mouse clicks here. if (event.button.button == SDL_BUTTON_RIGHT) { rotate = false; if (!mouseOverMenu) { if (!movedDuringRotate) { processHitTest = true; processHitTestShift = true; } } } else if (event.button.button == SDL_BUTTON_LEFT) { if (!mouseOverMenu) { processHitTest = true; processHitTestShift = (SDL_GetModState() & KMOD_SHIFT) ? true : false; } } break; case SDL_MOUSEMOTION: mx = event.motion.x; my = height-1 - event.motion.y; if (rotate) { int dx = mx - origx; int dy = my - origy; rx = origrx - dy*0.25f; ry = origry + dx*0.25f; if (dx*dx+dy*dy > 3*3) movedDuringRotate = true; } break; case SDL_QUIT: done = true; break; default: break; } } unsigned char mbut = 0; if (SDL_GetMouseState(0,0) & SDL_BUTTON_LMASK) mbut |= IMGUI_MBUT_LEFT; if (SDL_GetMouseState(0,0) & SDL_BUTTON_RMASK) mbut |= IMGUI_MBUT_RIGHT; Uint32 time = SDL_GetTicks(); float dt = (time - lastTime) / 1000.0f; lastTime = time; t += dt; // Hit test mesh. if (processHitTest && geom && sample) { float hitt; bool hit = geom->raycastMesh(rays, raye, hitt); if (hit) { if (SDL_GetModState() & KMOD_CTRL) { // Marker mposSet = true; mpos[0] = rays[0] + (raye[0] - rays[0])*hitt; mpos[1] = rays[1] + (raye[1] - rays[1])*hitt; mpos[2] = rays[2] + (raye[2] - rays[2])*hitt; } else { float pos[3]; pos[0] = rays[0] + (raye[0] - rays[0])*hitt; pos[1] = rays[1] + (raye[1] - rays[1])*hitt; pos[2] = rays[2] + (raye[2] - rays[2])*hitt; sample->handleClick(rays, pos, processHitTestShift); } } else { if (SDL_GetModState() & KMOD_CTRL) { // Marker mposSet = false; } } } // Update sample simulation. const float SIM_RATE = 20; const float DELTA_TIME = 1.0f/SIM_RATE; timeAcc = rcClamp(timeAcc+dt, -1.0f, 1.0f); int simIter = 0; while (timeAcc > DELTA_TIME) { timeAcc -= DELTA_TIME; if (simIter < 5) { if (sample) sample->handleUpdate(DELTA_TIME); } simIter++; } // Clamp the framerate so that we do not hog all the CPU. const float MIN_FRAME_TIME = 1.0f/40.0f; if (dt < MIN_FRAME_TIME) { int ms = (int)((MIN_FRAME_TIME - dt)*1000.0f); if (ms > 10) ms = 10; if (ms >= 0) SDL_Delay(ms); } // Update and render glViewport(0, 0, width, height); glClearColor(0.3f, 0.3f, 0.32f, 1.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_TEXTURE_2D); // Render 3d glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(50.0f, (float)width/(float)height, 1.0f, camr); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(rx,1,0,0); glRotatef(ry,0,1,0); glTranslatef(-camx, -camy, -camz); // Get hit ray position and direction. GLdouble proj[16]; GLdouble model[16]; GLint view[4]; glGetDoublev(GL_PROJECTION_MATRIX, proj); glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetIntegerv(GL_VIEWPORT, view); GLdouble x, y, z; gluUnProject(mx, my, 0.0f, model, proj, view, &x, &y, &z); rays[0] = (float)x; rays[1] = (float)y; rays[2] = (float)z; gluUnProject(mx, my, 1.0f, model, proj, view, &x, &y, &z); raye[0] = (float)x; raye[1] = (float)y; raye[2] = (float)z; // Handle keyboard movement. Uint8* keystate = SDL_GetKeyState(NULL); moveW = rcClamp(moveW + dt * 4 * (keystate[SDLK_w] ? 1 : -1), 0.0f, 1.0f); moveS = rcClamp(moveS + dt * 4 * (keystate[SDLK_s] ? 1 : -1), 0.0f, 1.0f); moveA = rcClamp(moveA + dt * 4 * (keystate[SDLK_a] ? 1 : -1), 0.0f, 1.0f); moveD = rcClamp(moveD + dt * 4 * (keystate[SDLK_d] ? 1 : -1), 0.0f, 1.0f); float keybSpeed = 22.0f; if (SDL_GetModState() & KMOD_SHIFT) keybSpeed *= 4.0f; float movex = (moveD - moveA) * keybSpeed * dt; float movey = (moveS - moveW) * keybSpeed * dt; movey += scrollZoom * 2.0f; scrollZoom = 0; camx += movex * (float)model[0]; camy += movex * (float)model[4]; camz += movex * (float)model[8]; camx += movey * (float)model[2]; camy += movey * (float)model[6]; camz += movey * (float)model[10]; glEnable(GL_FOG); if (sample) sample->handleRender(); if (test) test->handleRender(); glDisable(GL_FOG); // Render GUI glDisable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, width, 0, height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); mouseOverMenu = false; imguiBeginFrame(mx,my,mbut,mscroll); if (sample) { sample->handleRenderOverlay((double*)proj, (double*)model, (int*)view); } if (test) { if (test->handleRenderOverlay((double*)proj, (double*)model, (int*)view)) mouseOverMenu = true; } // Help text. if (showMenu) { const char msg[] = "W/S/A/D: Move RMB: Rotate"; imguiDrawText(280, height-20, IMGUI_ALIGN_LEFT, msg, imguiRGBA(255,255,255,128)); } if (showMenu) { if (imguiBeginScrollArea("Properties", width-250-10, 10, 250, height-20, &propScroll)) mouseOverMenu = true; if (imguiCheck("Show Log", showLog)) showLog = !showLog; if (imguiCheck("Show Tools", showTools)) showTools = !showTools; imguiSeparator(); imguiLabel("Sample"); if (imguiButton(sampleName)) { if (showSample) { showSample = false; } else { showSample = true; showLevels = false; showTestCases = false; } } imguiSeparator(); imguiLabel("Input Mesh"); if (imguiButton(meshName)) { if (showLevels) { showLevels = false; } else { showSample = false; showTestCases = false; showLevels = true; scanDirectory("Meshes", ".obj", files); } } if (geom) { char text[64]; snprintf(text, 64, "Verts: %.1fk Tris: %.1fk", geom->getMesh()->getVertCount()/1000.0f, geom->getMesh()->getTriCount()/1000.0f); imguiValue(text); } imguiSeparator(); if (geom && sample) { imguiSeparatorLine(); sample->handleSettings(); if (imguiButton("Build")) { ctx.resetLog(); if (!sample->handleBuild()) { showLog = true; logScroll = 0; } ctx.dumpLog("Build log %s:", meshName); // Clear test. delete test; test = 0; } imguiSeparator(); } if (sample) { imguiSeparatorLine(); sample->handleDebugMode(); } imguiEndScrollArea(); } // Sample selection dialog. if (showSample) { static int levelScroll = 0; if (imguiBeginScrollArea("Choose Sample", width-10-250-10-200, height-10-250, 200, 250, &levelScroll)) mouseOverMenu = true; Sample* newSample = 0; for (int i = 0; i < g_nsamples; ++i) { if (imguiItem(g_samples[i].name)) { newSample = g_samples[i].create(); if (newSample) strcpy(sampleName, g_samples[i].name); } } if (newSample) { delete sample; sample = newSample; sample->setContext(&ctx); if (geom && sample) { sample->handleMeshChanged(geom); } showSample = false; } if (geom || sample) { const float* bmin = 0; const float* bmax = 0; if (sample) { bmin = sample->getBoundsMin(); bmax = sample->getBoundsMax(); } else if (geom) { bmin = geom->getMeshBoundsMin(); bmax = geom->getMeshBoundsMax(); } // Reset camera and fog to match the mesh bounds. if (bmin && bmax) { camr = sqrtf(rcSqr(bmax[0]-bmin[0]) + rcSqr(bmax[1]-bmin[1]) + rcSqr(bmax[2]-bmin[2])) / 2; camx = (bmax[0] + bmin[0]) / 2 + camr; camy = (bmax[1] + bmin[1]) / 2 + camr; camz = (bmax[2] + bmin[2]) / 2 + camr; camr *= 3; } rx = 45; ry = -45; glFogf(GL_FOG_START, camr*0.1f); glFogf(GL_FOG_END, camr*1.25f); } imguiEndScrollArea(); } // Level selection dialog. if (showLevels) { static int levelScroll = 0; if (imguiBeginScrollArea("Choose Level", width-10-250-10-200, height-10-450, 200, 450, &levelScroll)) mouseOverMenu = true; int levelToLoad = -1; for (int i = 0; i < files.size; ++i) { if (imguiItem(files.files[i])) levelToLoad = i; } if (levelToLoad != -1) { strncpy(meshName, files.files[levelToLoad], sizeof(meshName)); meshName[sizeof(meshName)-1] = '\0'; showLevels = false; delete geom; geom = 0; char path[256]; strcpy(path, "Meshes/"); strcat(path, meshName); geom = new InputGeom; if (!geom || !geom->loadMesh(&ctx, path)) { delete geom; geom = 0; showLog = true; logScroll = 0; ctx.dumpLog("Geom load log %s:", meshName); } if (sample && geom) { sample->handleMeshChanged(geom); } if (geom || sample) { const float* bmin = 0; const float* bmax = 0; if (sample) { bmin = sample->getBoundsMin(); bmax = sample->getBoundsMax(); } else if (geom) { bmin = geom->getMeshBoundsMin(); bmax = geom->getMeshBoundsMax(); } // Reset camera and fog to match the mesh bounds. if (bmin && bmax) { camr = sqrtf(rcSqr(bmax[0]-bmin[0]) + rcSqr(bmax[1]-bmin[1]) + rcSqr(bmax[2]-bmin[2])) / 2; camx = (bmax[0] + bmin[0]) / 2 + camr; camy = (bmax[1] + bmin[1]) / 2 + camr; camz = (bmax[2] + bmin[2]) / 2 + camr; camr *= 3; } rx = 45; ry = -45; glFogf(GL_FOG_START, camr*0.1f); glFogf(GL_FOG_END, camr*1.25f); } } imguiEndScrollArea(); } // Test cases if (showTestCases) { static int testScroll = 0; if (imguiBeginScrollArea("Choose Test To Run", width-10-250-10-200, height-10-450, 200, 450, &testScroll)) mouseOverMenu = true; int testToLoad = -1; for (int i = 0; i < files.size; ++i) { if (imguiItem(files.files[i])) testToLoad = i; } if (testToLoad != -1) { char path[256]; strcpy(path, "Tests/"); strcat(path, files.files[testToLoad]); test = new TestCase; if (test) { // Load the test. if (!test->load(path)) { delete test; test = 0; } // Create sample Sample* newSample = 0; for (int i = 0; i < g_nsamples; ++i) { if (strcmp(g_samples[i].name, test->getSampleName()) == 0) { newSample = g_samples[i].create(); if (newSample) strcpy(sampleName, g_samples[i].name); } } if (newSample) { delete sample; sample = newSample; sample->setContext(&ctx); showSample = false; } // Load geom. strcpy(meshName, test->getGeomFileName()); meshName[sizeof(meshName)-1] = '\0'; delete geom; geom = 0; strcpy(path, "Meshes/"); strcat(path, meshName); geom = new InputGeom; if (!geom || !geom->loadMesh(&ctx, path)) { delete geom; geom = 0; showLog = true; logScroll = 0; ctx.dumpLog("Geom load log %s:", meshName); } if (sample && geom) { sample->handleMeshChanged(geom); } // This will ensure that tile & poly bits are updated in tiled sample. if (sample) sample->handleSettings(); ctx.resetLog(); if (sample && !sample->handleBuild()) { ctx.dumpLog("Build log %s:", meshName); } if (geom || sample) { const float* bmin = 0; const float* bmax = 0; if (sample) { bmin = sample->getBoundsMin(); bmax = sample->getBoundsMax(); } else if (geom) { bmin = geom->getMeshBoundsMin(); bmax = geom->getMeshBoundsMax(); } // Reset camera and fog to match the mesh bounds. if (bmin && bmax) { camr = sqrtf(rcSqr(bmax[0]-bmin[0]) + rcSqr(bmax[1]-bmin[1]) + rcSqr(bmax[2]-bmin[2])) / 2; camx = (bmax[0] + bmin[0]) / 2 + camr; camy = (bmax[1] + bmin[1]) / 2 + camr; camz = (bmax[2] + bmin[2]) / 2 + camr; camr *= 3; } rx = 45; ry = -45; glFogf(GL_FOG_START, camr*0.2f); glFogf(GL_FOG_END, camr*1.25f); } // Do the tests. if (sample) test->doTests(sample->getNavMesh(), sample->getNavMeshQuery()); } } imguiEndScrollArea(); } // Log if (showLog && showMenu) { if (imguiBeginScrollArea("Log", 250+20, 10, width - 300 - 250, 200, &logScroll)) mouseOverMenu = true; for (int i = 0; i < ctx.getLogCount(); ++i) imguiLabel(ctx.getLogText(i)); imguiEndScrollArea(); } // Tools if (!showTestCases && showTools && showMenu) // && geom && sample) { if (imguiBeginScrollArea("Tools", 10, 10, 250, height-20, &toolsScroll)) mouseOverMenu = true; if (sample) sample->handleTools(); imguiEndScrollArea(); } slideShow.updateAndDraw(dt, (float)width, (float)height); // Marker if (mposSet && gluProject((GLdouble)mpos[0], (GLdouble)mpos[1], (GLdouble)mpos[2], model, proj, view, &x, &y, &z)) { // Draw marker circle glLineWidth(5.0f); glColor4ub(240,220,0,196); glBegin(GL_LINE_LOOP); const float r = 25.0f; for (int i = 0; i < 20; ++i) { const float a = (float)i / 20.0f * RC_PI*2; const float fx = (float)x + cosf(a)*r; const float fy = (float)y + sinf(a)*r; glVertex2f(fx,fy); } glEnd(); glLineWidth(1.0f); } imguiEndFrame(); imguiRenderGLDraw(); glEnable(GL_DEPTH_TEST); SDL_GL_SwapBuffers(); } imguiRenderGLDestroy(); SDL_Quit(); delete sample; delete geom; return 0; }
int main( int argc, char **argv ) { int width = 1024, height=768; // Initialise GLFW if( !glfwInit() ) { fprintf( stderr, "Failed to initialize GLFW\n" ); exit( EXIT_FAILURE ); } // Open a window and create its OpenGL context if( !glfwOpenWindow( width, height, 0,0,0,0, 24,0, GLFW_WINDOW ) ) { fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); exit( EXIT_FAILURE ); } glfwSetWindowTitle( "imgui sample imguiRenderGL2" ); GLenum err = glewInit(); if (GLEW_OK != err) { /* Problem: glewInit failed, something is seriously wrong. */ fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); exit( EXIT_FAILURE ); } // Ensure we can capture the escape key being pressed below glfwEnable( GLFW_STICKY_KEYS ); // Enable vertical sync (on cards that support it) glfwSwapInterval( 1 ); // Init UI if (!imguiRenderGLInit("DroidSans.ttf")) { fprintf(stderr, "Could not init GUI renderer.\n"); exit(EXIT_FAILURE); } glClearColor(0.8f, 0.8f, 0.8f, 1.f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_DEPTH_TEST); // imgui states bool checked1 = false; bool checked2 = false; bool checked3 = true; bool checked4 = false; float value1 = 50.f; float value2 = 30.f; int scrollarea1 = 0; int scrollarea2 = 0; // glfw scrolling int glfwscroll = 0; do { glfwGetWindowSize(&width, &height); glViewport(0, 0, width, height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Mouse states unsigned char mousebutton = 0; int currentglfwscroll = glfwGetMouseWheel(); int mscroll = 0; if (currentglfwscroll < glfwscroll) mscroll = 2; if (currentglfwscroll > glfwscroll) mscroll = -2; glfwscroll = currentglfwscroll; int mousex; int mousey; glfwGetMousePos(&mousex, &mousey); mousey = height - mousey; int leftButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_LEFT ); int rightButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_RIGHT ); int middleButton = glfwGetMouseButton( GLFW_MOUSE_BUTTON_MIDDLE ); int toggle = 0; if( leftButton == GLFW_PRESS ) mousebutton |= IMGUI_MBUT_LEFT; // Draw UI glMatrixMode(GL_PROJECTION); glLoadIdentity(); float projection[16] = { 2.f/width, 0.f, 0.f, 0.f, 0.f, 2.f/height, 0.f, 0.f, 0.f, 0.f, -2.f, 0.f, -1.f, -1.f, -1.f, 1.f }; glLoadMatrixf(projection); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glUseProgram(0); imguiBeginFrame(mousex, mousey, mousebutton, mscroll); imguiBeginScrollArea("Scroll area", 10, 10, width / 5, height - 20, &scrollarea1); imguiSeparatorLine(); imguiSeparator(); imguiButton("Button"); imguiButton("Disabled button", false); imguiItem("Item"); imguiItem("Disabled item", false); toggle = imguiCheck("Checkbox", checked1); if (toggle) checked1 = !checked1; toggle = imguiCheck("Disabled checkbox", checked2, false); if (toggle) checked2 = !checked2; toggle = imguiCollapse("Collapse", "subtext", checked3); if (checked3) { imguiIndent(); imguiLabel("Collapsible element"); imguiUnindent(); } if (toggle) checked3 = !checked3; toggle = imguiCollapse("Disabled collapse", "subtext", checked4, false); if (toggle) checked4 = !checked4; imguiLabel("Label"); imguiValue("Value"); imguiSlider("Slider", &value1, 0.f, 100.f, 1.f); imguiSlider("Disabled slider", &value2, 0.f, 100.f, 1.f, false); imguiIndent(); imguiLabel("Indented"); imguiUnindent(); imguiLabel("Unindented"); imguiEndScrollArea(); imguiBeginScrollArea("Scroll area", 20 + width / 5, 500, width / 5, height - 510, &scrollarea2); imguiSeparatorLine(); imguiSeparator(); for (int i = 0; i < 100; ++i) imguiLabel("A wall of text"); imguiEndScrollArea(); imguiEndFrame(); imguiDrawText(30 + width / 5 * 2, height - 20, IMGUI_ALIGN_LEFT, "Free text", imguiRGBA(32,192, 32,192)); imguiDrawText(30 + width / 5 * 2 + 100, height - 40, IMGUI_ALIGN_RIGHT, "Free text", imguiRGBA(32, 32, 192, 192)); imguiDrawText(30 + width / 5 * 2 + 50, height - 60, IMGUI_ALIGN_CENTER, "Free text", imguiRGBA(192, 32, 32,192)); imguiDrawLine(30 + width / 5 * 2, height - 80, 30 + width / 5 * 2 + 100, height - 60, 1.f, imguiRGBA(32,192, 32,192)); imguiDrawLine(30 + width / 5 * 2, height - 100, 30 + width / 5 * 2 + 100, height - 80, 2.f, imguiRGBA(32, 32, 192, 192)); imguiDrawLine(30 + width / 5 * 2, height - 120, 30 + width / 5 * 2 + 100, height - 100, 3.f, imguiRGBA(192, 32, 32,192)); imguiDrawRoundedRect(30 + width / 5 * 2, height - 240, 100, 100, 5.f, imguiRGBA(32,192, 32,192)); imguiDrawRoundedRect(30 + width / 5 * 2, height - 350, 100, 100, 10.f, imguiRGBA(32, 32, 192, 192)); imguiDrawRoundedRect(30 + width / 5 * 2, height - 470, 100, 100, 20.f, imguiRGBA(192, 32, 32,192)); imguiDrawRect(30 + width / 5 * 2, height - 590, 100, 100, imguiRGBA(32, 192, 32, 192)); imguiDrawRect(30 + width / 5 * 2, height - 710, 100, 100, imguiRGBA(32, 32, 192, 192)); imguiDrawRect(30 + width / 5 * 2, height - 830, 100, 100, imguiRGBA(192, 32, 32,192)); imguiRenderGLDraw(width, height); // Check for errors GLenum err = glGetError(); if(err != GL_NO_ERROR) { fprintf(stderr, "OpenGL Error : %s\n", gluErrorString(err)); } // Swap buffers glfwSwapBuffers(); } // Check if the ESC key was pressed or the window was closed while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS && glfwGetWindowParam( GLFW_OPENED ) ); // Clean UI imguiRenderGLDestroy(); // Close OpenGL window and terminate GLFW glfwTerminate(); exit( EXIT_SUCCESS ); }
void CMaNGOS_Map::handleExtraSettings() { imguiLabel("Map Id"); char buff[4]; memset(buff, 0, sizeof(buff)); itoa(m_mapID, buff, 10); if (imguiButton(buff)) { if (m_showLevel == SHOW_LEVEL_MAP) { m_showLevel = SHOW_LEVEL_NONE; } else { m_showLevel = SHOW_LEVEL_MAP; } } imguiLabel("Tile"); if (imguiButton(m_TileButtonStr.c_str())) { if (m_showLevel == SHOW_LEVEL_TILES || m_showLevel == SHOW_LEVEL_NEIGHBOR_TILES) { m_showLevel = SHOW_LEVEL_NONE; } else { if (m_MapInfos->IsEmpty()) m_showLevel = SHOW_LEVEL_TILES; else if (!m_NeighborTiles.empty()) m_showLevel = SHOW_LEVEL_NEIGHBOR_TILES; } } if (!m_MapInfos->IsEmpty()) { imguiSeparatorLine(); MeshObjectsMap::const_iterator itr = m_MapInfos->GetGeomsMap()->begin(); imguiLabel("Loaded tile"); while (itr != m_MapInfos->GetGeomsMap()->end()) { MeshObjects* mo = (*itr).second; string map = mo->GetMap() ? "MAP " : ""; string vmap = mo->GetVMap() ? "VMAP " : ""; string mmap = m_MapInfos->GetTileRef(mo->GetTileX(), mo->GetTileY()) ? "MMAP" : ""; char buff[40]; snprintf(buff, sizeof(buff), "%dx%d > Found %s%s%s", mo->GetTileX(), mo->GetTileY(), map.c_str(), vmap.c_str(), mmap.c_str()); if (imguiItem(buff)) { RemoveTileData(mo->GetTileX(), mo->GetTileY()); unsigned int pxy = VMAP::StaticMapTree::packTileID(mo->GetTileX(), mo->GetTileY()); m_NeighborTiles.insert(pxy); if (m_MapInfos->IsEmpty()) { m_TileButtonStr = "Click to choose a tile"; } break; } else ++itr; } } }
bool CMaNGOS_Map::ShowTilesLevel(int height, int width) { bool mouseOverMenu = false; static int levelScroll = 0; unsigned int winHSize = height - 20; const unsigned int winWSize = 180; if (imguiBeginScrollArea("Choose tile", width - 10 - 250 - 10 - winWSize, height - 10 - winHSize, winWSize, winHSize, &levelScroll)) mouseOverMenu = true; for (std::set<uint32>::const_iterator itr = m_TilesFound.begin(); itr != m_TilesFound.end(); ++itr) { char buff[10]; memset(buff, 0, sizeof(buff)); itoa(*itr, buff, 10); unsigned int x, y; VMAP::StaticMapTree::unpackTileID(*itr, x, y); if (x == y && x == 64) snprintf(buff, sizeof(buff), "Full Map"); else snprintf(buff, sizeof(buff), "%dx%d", x, y); if (imguiItem(buff)) { // if first chosen tile, add neighbor if (m_MapInfos->IsEmpty()) { m_NeighborTiles.clear(); if (x != y || x != 64) { for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { uint32 tx = x - 1 + i; uint32 ty = y - 1 + j; // skip current already loaded tile if (tx == x && ty == y) continue; // add only available tile uint32 pxy = VMAP::StaticMapTree::packTileID(tx, ty); if (m_TilesFound.find(pxy) != m_TilesFound.end()) m_NeighborTiles.insert(pxy); } } } } if (LoadTileData(x, y)) m_showLevel = SHOW_LEVEL_NONE; if (m_MapInfos->IsEmpty()) m_TileButtonStr = "Click to choose a tile"; else if (!m_NeighborTiles.empty()) m_TileButtonStr = "Add neighbor tile"; else m_TileButtonStr = "No neighbor tile to add"; } } imguiEndScrollArea(); return mouseOverMenu; }
// This function's code is from the RecastDemo project's main.cpp file by Mikko Mononen void MyRecastDemo::guiRender() { GLdouble proj[16]; GLdouble model[16]; GLint view[4]; glGetDoublev(GL_PROJECTION_MATRIX, proj); glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetIntegerv(GL_VIEWPORT, view); GLdouble x, y, z; gluUnProject(m_mouseX, m_mouseY, 0.0f, model, proj, view, &x, &y, &z); m_rays[0] = (float)x; m_rays[1] = (float)y; m_rays[2] = (float)z; gluUnProject(m_mouseX, m_mouseY, 1.0f, model, proj, view, &x, &y, &z); m_raye[0] = (float)x; m_raye[1] = (float)y; m_raye[2] = (float)z; glDisable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, m_width, 0, m_height); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor4ub(255,255,255,255); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); m_mouseOverMenu = false; imguiBeginFrame( m_mouseX,m_mouseY,m_mouseBut,m_mouseScroll ); const char msg[] = "W/S/A/D: move (+ shift) | F1: toggle recast gui | F2: toggle node names | F12: invert mouse"; imguiDrawText(280, m_height-20, IMGUI_ALIGN_LEFT, msg, imguiRGBA(255,255,255,200)); if (m_showMenu) { if (m_sample) { m_sample->handleRenderOverlay((double*)proj, (double*)model, (int*)view); } if (imguiBeginScrollArea("Properties", m_width-250-10, 10, 250, m_height-20, &m_propScroll)) m_mouseOverMenu = true; if (imguiCheck("Show Log", m_showLog)) m_showLog = !m_showLog; if (imguiCheck("Show Tools", m_showTools)) m_showTools = !m_showTools; imguiSeparator(); imguiLabel("Sample"); if (imguiButton(m_sampleName)) { if (m_showSample) { m_showSample = false; } else { m_showSample = true; m_showConfig = false; } } imguiSeparator(); imguiLabel("Config File"); if (imguiButton(m_configName)) { if (m_showConfig) { m_showConfig = false; } else { m_showSample = false; m_showConfig = true; scanDirectory("Content", ".xml", m_files); } } if (m_geom) { char text[64]; snprintf(text, 64, "Verts: %.1fk Tris: %.1fk", m_geom->getMesh()->getVertCount()/1000.0f, m_geom->getMesh()->getTriCount()/1000.0f); imguiValue(text); } imguiSeparator(); if (m_geom && m_sample) { imguiSeparatorLine(); m_sample->handleSettings(); if (imguiButton("Build")) { m_ctx.resetLog(); if (!m_sample->handleBuild()) { m_showLog = true; m_logScroll = 0; } m_ctx.dumpLog("Build log %s:", m_configName); } imguiSeparator(); } if (m_sample) { imguiSeparatorLine(); m_sample->handleDebugMode(); } imguiEndScrollArea(); } // Sample selection dialog. if (m_showSample) { static int levelScroll = 0; if (imguiBeginScrollArea("Choose Sample", m_width-10-250-10-200, m_height-10-250, 200, 250, &levelScroll)) m_mouseOverMenu = true; Sample* newSample = 0; for (int i = 0; i < g_nsamples; ++i) { if (imguiItem(g_samples[i].name)) { newSample = g_samples[i].create(); if (newSample) strcpy(m_sampleName, g_samples[i].name); } } if (newSample) { delete m_geom; m_geom = 0; delete m_sample; m_sample = newSample; m_sample->setContext(&m_ctx); if (m_geom && m_sample) { m_sample->handleMeshChanged(m_geom); } else if(!m_geom) { m_geom = new InputGeom(); m_geom->loadMesh( &m_ctx, m_configXmlFile.c_str() ); } if( m_geom && m_sample ) { m_sample->handleMeshChanged(m_geom); m_sample->handleSettings(); } m_showSample = false; } imguiEndScrollArea(); } // Config selection dialog. if (m_showConfig) { static int levelScroll = 0; if (imguiBeginScrollArea("Choose Config File", m_width-10-250-10-200, m_height-10-450, 200, 450, &levelScroll)) m_mouseOverMenu = true; int levelToLoad = -1; for (int i = 0; i < m_files.size; ++i) { if (imguiItem(m_files.files[i])) levelToLoad = i; } if (levelToLoad != -1) { strncpy(m_configName, m_files.files[levelToLoad], sizeof(m_configName)); m_configName[sizeof(m_configName)-1] = '\0'; m_showConfig = false; delete m_geom; m_geom = 0; char path[256]; strcpy(path, "Content/"); strcat(path, m_configName); m_configXmlFile = path; m_geom = new InputGeom(); if( m_loadedSceneGraphRes ) { // Remove previously loaded scene . // Every scene.xml file loaded should group its children in a GroupNode. int nrFoundNodes = h3dFindNodes( H3DRootNode, "", H3DNodeTypes::Group); for( int i = 0; i<2; ++i ) { int node = h3dGetNodeFindResult(i); const char* name = h3dGetNodeParamStr( node, H3DNodeParams::NameStr); std::string camName(name); // Do not delete nodes directly under the root node (e.g. the demo's camera) if( camName.compare("RootNode") != 0) { h3dRemoveNode( h3dGetNodeFindResult(i) ); } } int a = h3dRemoveResource( m_loadedSceneGraphRes ); h3dReleaseUnusedResources(); } if( !loadSceneFileFromConfig( path) ) { m_showLog = true; m_logScroll = 0; m_ctx.log(RC_LOG_ERROR, "Error loading resources from specified scene file."); } if (!m_geom || !m_geom->loadMesh(&m_ctx, m_configXmlFile.c_str()) ) { delete m_geom; m_geom = 0; m_showLog = true; m_logScroll = 0; m_ctx.log(RC_LOG_ERROR, "Error loading nav mesh geometry from: \"%s\"", m_configName); m_ctx.dumpLog("Config: Geom load log %s:", m_configName); } if (m_sample && m_geom) { m_sample->handleMeshChanged(m_geom); } } imguiEndScrollArea(); } // Log if (m_showLog && m_showMenu) { if (imguiBeginScrollArea("Log", 250+20, 10, m_width - 300 - 250, 200, &m_logScroll)) m_mouseOverMenu = true; for (int i = 0; i < m_ctx.getLogCount(); ++i) imguiLabel(m_ctx.getLogText(i)); imguiEndScrollArea(); } // Tools if (!m_showTestCases && m_showTools && m_showMenu) // && m_geom && m_sample) { if (imguiBeginScrollArea("Tools", 10, 10, 250, m_height-20, &m_toolsScroll)) m_mouseOverMenu = true; if (m_sample) m_sample->handleTools(); imguiEndScrollArea(); } m_wasMouseOverMenu = m_mouseOverMenu; if(!m_wasMouseOverMenu) { // In case we move a GUI slider and leave the menu area m_mouseBut = 0; } m_mouseScroll = 0; imguiEndFrame(); imguiRenderGLDraw(); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); }