diff --git a/r5dev/naveditor/Sample_TileMesh.cpp b/r5dev/naveditor/Sample_TileMesh.cpp index b1a6d8e0..52ba70f7 100644 --- a/r5dev/naveditor/Sample_TileMesh.cpp +++ b/r5dev/naveditor/Sample_TileMesh.cpp @@ -260,13 +260,13 @@ void Sample_TileMesh::handleSettings() if (imguiButton("Save")) { - Sample::saveAll(m_model_name.c_str(), m_navMesh); + Sample::saveAll(m_modelName.c_str(), m_navMesh); } if (imguiButton("Load")) { dtFreeNavMesh(m_navMesh); - m_navMesh = Sample::loadAll(m_model_name.c_str()); + m_navMesh = Sample::loadAll(m_modelName.c_str()); m_navQuery->init(m_navMesh, 2048); } @@ -750,31 +750,6 @@ void Sample_TileMesh::buildAllTiles() } -//CLEANUP: copied from sample -extern hulldef hulls[5];/* = { - {"small",8,72 * 0.5,18,512.0f}, - {"med_short",20,72 * 0.5,18,512.0f}, - {"medium",48,150 * 0.5,32,512.0f}, - {"large",60,235 * 0.5,80,960.0f}, -};*/ -void Sample_TileMesh::build_n_SaveAllHulls() -{ - bool is_human = true; - for (auto& h : hulls) - { - m_agentRadius = h.radius; - m_agentMaxClimb = h.climb_height; - m_agentHeight = h.height; - if (is_human) - m_count_reachability_tables = 4; - m_navmesh_name = h.name; - is_human = false; - - handleSettings(); - handleBuild(); - Sample::saveAll(m_model_name.c_str(), m_navMesh); - } -} void Sample_TileMesh::removeAllTiles() { if (!m_geom || !m_navMesh) @@ -793,6 +768,24 @@ void Sample_TileMesh::removeAllTiles() m_navMesh->removeTile(m_navMesh->getTileRefAt(x,y,0),0,0); } +void Sample_TileMesh::buildAllHulls() +{ + bool is_human = true; + for (auto& h : hulls) + { + m_agentRadius = h.radius; + m_agentMaxClimb = h.climb_height; + m_agentHeight = h.height; + if (is_human) + m_count_reachability_tables = 4; + m_navmesh_name = h.name; + is_human = false; + + handleSettings(); + handleBuild(); + Sample::saveAll(m_modelName.c_str(), m_navMesh); + } +} unsigned char* Sample_TileMesh::buildTileMesh(const int tx, const int ty, const float* bmin, const float* bmax, int& dataSize) { diff --git a/r5dev/naveditor/include/Sample.h b/r5dev/naveditor/include/Sample.h index 6e9427da..9e027271 100644 --- a/r5dev/naveditor/include/Sample.h +++ b/r5dev/naveditor/include/Sample.h @@ -32,6 +32,8 @@ struct hulldef float tile_size; //TODO: voxel size, tile size }; +extern hulldef hulls[5]; + /// Tool types. enum SampleToolType { @@ -147,7 +149,7 @@ protected: void saveAll(std::string path,dtNavMesh* mesh); public: - std::string m_model_name; + std::string m_modelName; Sample(); virtual ~Sample(); @@ -194,7 +196,7 @@ public: void handleCommonSettings(); //don't do this kids, this is bad cpp - bool* is_tf2=nullptr; + bool* is_tf2 = nullptr; private: // Explicitly disabled copy constructor and copy assignment operator. Sample(const Sample&); diff --git a/r5dev/naveditor/include/Sample_TileMesh.h b/r5dev/naveditor/include/Sample_TileMesh.h index 98eb65e2..1e470c5f 100644 --- a/r5dev/naveditor/include/Sample_TileMesh.h +++ b/r5dev/naveditor/include/Sample_TileMesh.h @@ -103,7 +103,7 @@ public: void buildAllTiles(); void removeAllTiles(); - void build_n_SaveAllHulls(); + void buildAllHulls(); private: // Explicitly disabled copy constructor and copy assignment operator. Sample_TileMesh(const Sample_TileMesh&); diff --git a/r5dev/naveditor/main.cpp b/r5dev/naveditor/main.cpp index 2062f7d9..af1a61b2 100644 --- a/r5dev/naveditor/main.cpp +++ b/r5dev/naveditor/main.cpp @@ -128,7 +128,7 @@ void generate_points(float* pts, int count, float dx, float dy, float dz) } } -void do_auto_load(const char* path, BuildContext& ctx,Sample* sample,InputGeom*& geom, string& meshName,bool& tf2_transforms) +void auto_load(const char* path, BuildContext& ctx, Sample*& sample,InputGeom*& geom, string& meshName,bool& tf2_transforms) { string geom_path = std::string(path); meshName = geom_path.substr(geom_path.rfind("\\") + 1); @@ -149,7 +149,7 @@ void do_auto_load(const char* path, BuildContext& ctx,Sample* sample,InputGeom*& if (sample && geom) { sample->handleMeshChanged(geom); - sample->m_model_name = meshName.substr(0, meshName.size() - 4); + sample->m_modelName = meshName.substr(0, meshName.size() - 4); } } @@ -171,6 +171,69 @@ void update_camera(const float* bmin, const float* bmax,float* cameraPos,float* glFogf(GL_FOG_START, camr * 0.1f); glFogf(GL_FOG_END, camr * 1.25f); } + +bool sdl_init(SDL_Window*& window, SDL_Renderer*& renderer, int &width, int &height, bool presentationMode) +{ + // Init SDL + if (SDL_Init(SDL_INIT_EVERYTHING) != 0) + { + printf("Could not initialise SDL.\n"); + printf("Error: %s\n", SDL_GetError()); + return false; + } + + // Enable depth buffer. + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + + // Set color channel depth. + 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); + + // 4x MSAA. + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); + + SDL_DisplayMode displayMode; + SDL_GetCurrentDisplayMode(0, &displayMode); + + Uint32 flags = SDL_WINDOW_OPENGL | SDL_RENDERER_PRESENTVSYNC; + if (presentationMode) + { + // Create a fullscreen window at the native resolution. + width = displayMode.w; + height = displayMode.h; + flags |= SDL_WINDOW_FULLSCREEN; + } + else + { + float aspect = 16.0f / 9.0f; + width = rcMin(displayMode.w, static_cast((displayMode.h * aspect))) - 80; + height = displayMode.h - 80; + } + + int errorCode = SDL_CreateWindowAndRenderer(width, height, flags, &window, &renderer); + + if (errorCode != 0 || !window || !renderer) + { + printf("Could not initialise SDL OpenGL.\n"); + printf("Error: %s\n", SDL_GetError()); + return false; + } + + SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); + SDL_GL_CreateContext(window); + + if (!imguiRenderGLInit(droidsans_data)) + { + printf("Could not initialise GUI renderer.\n"); + SDL_Quit(); + return false; + } +} + #if 1 int main(int argc, char** argv) #else @@ -289,82 +352,29 @@ int main(int argc, char** argv) int not_main(int argc, char** argv) #endif { - // Init SDL - if (SDL_Init(SDL_INIT_EVERYTHING) != 0) - { - printf("Could not initialise SDL.\nError: %s\n", SDL_GetError()); - return -1; - } - - // Enable depth buffer. - SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); - SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); - - // Set color channel depth. - 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); - - // 4x MSAA. - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); - SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); - - SDL_DisplayMode displayMode; - SDL_GetCurrentDisplayMode(0, &displayMode); - + const char* autoLoad = nullptr; + bool commandLine = false; bool presentationMode = false; - Uint32 flags = SDL_WINDOW_OPENGL | SDL_RENDERER_PRESENTVSYNC; - int width; - int height; - if (presentationMode) - { - // Create a fullscreen window at the native resolution. - width = displayMode.w; - height = displayMode.h; - flags |= SDL_WINDOW_FULLSCREEN; - } - else - { - float aspect = 16.0f / 9.0f; - width = rcMin(displayMode.w, (int)(displayMode.h * aspect)) - 80; - height = displayMode.h - 80; - } - - SDL_Window* window; - SDL_Renderer* renderer; - int errorCode = SDL_CreateWindowAndRenderer(width, height, flags, &window, &renderer); + int width = 0; + int height = 0; + SDL_Window* window = nullptr; + SDL_Renderer* renderer = nullptr; - if (errorCode != 0 || !window || !renderer) - { - printf("Could not initialise SDL OpenGL\nError: %s\n", SDL_GetError()); - return -1; - } - - SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); - SDL_GL_CreateContext(window); - - if (!imguiRenderGLInit(droidsans_data)) - { - printf("Could not initialise GUI renderer.\n"); - SDL_Quit(); - return -1; - } - - const char* auto_load = nullptr; if (argc > 1) { if (strcmp(argv[1], "-console") == 0) { if (argc > 2) { - auto_load = argv[2]; + autoLoad = argv[2]; + commandLine = true; } } else { FreeConsole(); - auto_load = argv[1]; + autoLoad = argv[1]; + commandLine = true; } } else @@ -372,54 +382,32 @@ int not_main(int argc, char** argv) FreeConsole(); } - float t = 0.0f; - float timeAcc = 0.0f; - Uint32 prevFrameTime = SDL_GetTicks(); - int mousePos[2] = {0, 0}; - int origMousePos[2] = {0, 0}; // Used to compute mouse movement totals across frames. - + if (!commandLine) + { + if (!sdl_init(window, renderer, width, height, presentationMode)) + { + return EXIT_FAILURE; + } + } + float cameraEulers[] = {45, 45}; float cameraPos[] = {0, 0, 0}; float camr = 1000; float origCameraEulers[] = {0, 0}; // Used to compute rotational changes across frames. - float moveFront = 0.0f, moveBack = 0.0f, moveLeft = 0.0f, moveRight = 0.0f, moveUp = 0.0f, moveDown = 0.0f; - - float scrollZoom = 0; - bool rotate = false; - bool movedDuringRotate = false; - float rayStart[3]; - float rayEnd[3]; - bool mouseOverMenu = false; - - bool showMenu = !presentationMode; - bool showLog = false; - bool showTools = true; - bool showLevels = false; - bool showSample = false; - bool showTestCases = false; - - // Window scroll positions. - int propScroll = 0; - int logScroll = 0; - int toolsScroll = 0; - string sampleName = "Choose Sample..."; - vector files; const string meshesFolder = "Levels"; string meshName = "Choose Level..."; + const string testCasesFolder = "TestCases"; float markerPosition[3] = {0, 0, 0}; bool markerPositionSet = false; - InputGeom* geom = 0; - Sample* sample = 0; bool tf2_transforms = false; - - const string testCasesFolder = "TestCases"; - TestCase* test = 0; - + InputGeom* geom = nullptr; + Sample* sample = nullptr; + TestCase* test = nullptr; BuildContext ctx; //Load tiled sample @@ -432,9 +420,9 @@ int not_main(int argc, char** argv) { sample->handleMeshChanged(geom); } - if (auto_load) + if (autoLoad) { - do_auto_load(auto_load, ctx, sample, geom, meshName, tf2_transforms); + auto_load(autoLoad, ctx, sample, geom, meshName, tf2_transforms); if (geom || sample) { const float* bmin = 0; @@ -444,13 +432,16 @@ int not_main(int argc, char** argv) bmin = geom->getNavMeshBoundsMin(); bmax = geom->getNavMeshBoundsMax(); } - update_camera(bmin, bmax, cameraPos, cameraEulers, camr); + if (!commandLine) + { + update_camera(bmin, bmax, cameraPos, cameraEulers, camr); + } } if (argc > 2) { auto ts = dynamic_cast(sample); - ts->build_n_SaveAllHulls(); - return 0; + ts->buildAllHulls(); + return EXIT_SUCCESS; } } // Fog. @@ -460,10 +451,37 @@ int not_main(int argc, char** argv) glFogf(GL_FOG_START, camr * 0.1f); glFogf(GL_FOG_END, camr * 1.25f); glFogfv(GL_FOG_COLOR, fogColor); - + glEnable(GL_CULL_FACE); glDepthFunc(GL_LEQUAL); + float moveFront = 0.0f, moveBack = 0.0f, moveLeft = 0.0f, moveRight = 0.0f, moveUp = 0.0f, moveDown = 0.0f; + + float rayStart[3] = { 0.0f }; + float rayEnd[3] = { 0.0f }; + float scrollZoom = 0; + bool rotate = false; + bool movedDuringRotate = false; + bool mouseOverMenu = false; + + bool showMenu = !presentationMode; + bool showLog = false; + bool showTools = true; + bool showLevels = false; + bool showSample = false; + bool showTestCases = false; + + // Window scroll positions. + int propScroll = 0; + int logScroll = 0; + int toolsScroll = 0; + + float t = 0.0f; + float timeAcc = 0.0f; + Uint32 prevFrameTime = SDL_GetTicks(); + int mousePos[2] = { 0, 0 }; + int origMousePos[2] = { 0, 0 }; // Used to compute mouse movement totals across frames. + bool done = false; while(!done) { @@ -753,13 +771,13 @@ int not_main(int argc, char** argv) float movey = (moveBack - moveFront) * keybSpeed * dt + scrollZoom * 2.0f; scrollZoom = 0; - cameraPos[0] += movex * (float)modelviewMatrix[0]; - cameraPos[1] += movex * (float)modelviewMatrix[4]; - cameraPos[2] += movex * (float)modelviewMatrix[8]; - - cameraPos[0] += movey * (float)modelviewMatrix[2]; - cameraPos[1] += movey * (float)modelviewMatrix[6]; - cameraPos[2] += movey * (float)modelviewMatrix[10]; + cameraPos[0] += movex * static_cast(modelviewMatrix[0]); + cameraPos[1] += movex * static_cast(modelviewMatrix[4]); + cameraPos[2] += movex * static_cast(modelviewMatrix[8]); + + cameraPos[0] += movey * static_cast(modelviewMatrix[2]); + cameraPos[1] += movey * static_cast(modelviewMatrix[6]); + cameraPos[2] += movey * static_cast(modelviewMatrix[10]); cameraPos[1] += (moveUp - moveDown) * keybSpeed * dt; @@ -786,11 +804,12 @@ int not_main(int argc, char** argv) if (sample) { - sample->handleRenderOverlay((double*)projectionMatrix, (double*)modelviewMatrix, (int*)viewport); + sample->handleRenderOverlay(reinterpret_cast(projectionMatrix), + reinterpret_cast(modelviewMatrix), reinterpret_cast(viewport)); } if (test) { - if (test->handleRenderOverlay((double*)projectionMatrix, (double*)modelviewMatrix, (int*)viewport)) + if (test->handleRenderOverlay(reinterpret_cast(projectionMatrix), reinterpret_cast(modelviewMatrix), reinterpret_cast(viewport))) mouseOverMenu = true; } @@ -1022,7 +1041,7 @@ int not_main(int argc, char** argv) if (sample && geom) { sample->handleMeshChanged(geom); - sample->m_model_name = meshName.substr(0, meshName.size() - 4); + sample->m_modelName = meshName.substr(0, meshName.size() - 4); } if (geom || sample) @@ -1114,7 +1133,7 @@ int not_main(int argc, char** argv) if (sample && geom) { sample->handleMeshChanged(geom); - sample->m_model_name = meshName.substr(0, meshName.size() - 4); + sample->m_modelName = meshName.substr(0, meshName.size() - 4); } // This will ensure that tile & poly bits are updated in tiled sample. @@ -1173,7 +1192,8 @@ int not_main(int argc, char** argv) } // Marker - if (markerPositionSet && gluProject((GLdouble)markerPosition[0], (GLdouble)markerPosition[1], (GLdouble)markerPosition[2], + if (markerPositionSet && gluProject(static_cast(markerPosition[0]), + static_cast(markerPosition[1]), static_cast(markerPosition[2]), modelviewMatrix, projectionMatrix, viewport, &x, &y, &z)) { // Draw marker circle @@ -1207,5 +1227,5 @@ int not_main(int argc, char** argv) delete sample; delete geom; - return 0; + return EXIT_SUCCESS; }