#include "../src/modules/stream/ui/region_tree.h" #include "../src/modules/stream/ui/grid_misc.h" #include "../src/modules/stream/world_editor.h" #include "../src/modules/stream/ui/queries.h" #include "../src/modules/stream/ui/building_layout_graph.h" #include "imgui.h" #include "imgui_impl_sdl2.h" #include "imgui_impl_sdlrenderer2.h" #include #include using graph_module = BuildingLayoutGraph::graph_module; int main() { int i; SDL_Window *window = NULL; SDL_Surface *screenSurface = NULL; SDL_Renderer *renderer; SDL_WindowFlags window_flags; ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); HashMap colors; make_random r(172); flecs::world ecs; ecs.component(); ecs.component(); flecs::log::set_level(1); flecs::entity graph_base_e = ecs.entity("graph"); flecs::entity graph_e = ecs.entity("v1").child_of(graph_base_e); flecs::entity grid_base_e = ecs.entity("grid"); flecs::entity grid_e = ecs.entity("v1").child_of(grid_base_e); flecs::entity grid_floor_e = ecs.entity("floor_0").child_of(grid_e); int grid_size = 27; grid_floor_e.set({.grid_size = grid_size, .size_left = grid_size * grid_size}); List region_list; struct region region; region.region_et = graph_e.id(); region.rect = RegionRect2i(1, 1, grid_size - 2, grid_size - 2); region.complete = true; region.can_grow = false; region.can_grow_square = false; struct region_tree regions; regions.region = region; regions.dump(grid_floor_e); flecs::entity zone1_e = ecs.entity("zone1").child_of(graph_e), zone2_e = ecs.entity("zone2").child_of(graph_e), zone3_e = ecs.entity("zone3").child_of(graph_e); struct region region_data[] = { { .parent = graph_e.id(), .region_et = zone1_e.id(), .rect = {4, 4, 1, 1}, .remains_area = 140, .can_grow_square = true, .can_grow = true, .complete = false }, { .parent = graph_e.id(), .region_et = zone2_e.id(), .rect = {4, 9, 1, 1}, .remains_area = 80, .can_grow_square = true, .can_grow = true, .complete = false}, { .parent = graph_e.id(), .region_et = zone3_e.id(), .rect = {20, 15, 1 ,1}, .remains_area = 50, .can_grow_square = true, .can_grow = true, .complete = false } }; for (i = 0; i < sizeof(region_data) / sizeof(region_data[0]); i++) region_list.push_back(region_data[i]); regions.split(region_list); regions.dump(grid_floor_e); regions.grow(); regions.dump(grid_floor_e); regions.place(grid_floor_e); if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) < 0) goto out; #ifdef SDL_HINT_IME_SHOW_UI SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); #endif window_flags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); window = SDL_CreateWindow("RegionTest", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 1024, window_flags); if (window == NULL) goto out; renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); if (!renderer) goto out; // screenSurface = SDL_GetWindowSurface(window); // if (!screenSurface) // goto out; IMGUI_CHECKVERSION(); ImGui::CreateContext(); { ImGuiIO& io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls } // Setup Dear ImGui style ImGui::StyleColorsDark(); //ImGui::StyleColorsLight(); // Setup Platform/Renderer backends ImGui_ImplSDL2_InitForSDLRenderer(window, renderer); ImGui_ImplSDLRenderer2_Init(renderer); // SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF)); // SDL_UpdateWindowSurface(window); SDL_Event event; while(1) { SDL_PollEvent(&event); ImGui_ImplSDL2_ProcessEvent(&event); switch(event.type) { case SDL_QUIT: goto shutdown; break; case SDL_WINDOWEVENT: if (event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) goto shutdown; break; default: break; } ecs.progress(); if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) { SDL_Delay(10); continue; } ImGui_ImplSDLRenderer2_NewFrame(); ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); { ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) ImGui::End(); } ImGui::Render(); { ImGuiIO& io = ImGui::GetIO(); (void)io; SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); } SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255)); SDL_RenderClear(renderer); ecs.query_builder() .build().each([grid_size, renderer, &colors, &r](flecs::entity e, const WorldEditor::components::buildings_layout_grid_cell &cell) { // flecs::log::warn("cell: %s: %s: %d", e.path().c_str(), cell.type.ascii().ptr(), cell.index); int x = cell.index % grid_size; int y = cell.index / grid_size; int px = 1280 * x / grid_size; int py = 1024 * y / grid_size; int w = 1280 / grid_size; int h = 1024 / grid_size; // flecs::log::warn("position: %d %d", x, y); if (!colors.has(cell.type)) colors[cell.type] = Color((float)(r.get() % 256) / 256.0f, (float)(r.get() % 256) / 256.0f, (float)(r.get() % 256) / 256.0f, 1.0f); const Color &c = colors[cell.type]; SDL_SetRenderDrawColor(renderer, (uint8_t)(c.r * 255), (uint8_t)(c.g * 255), (uint8_t)(c.b * 255), 255); SDL_Rect rect = {px, py, w, h}; SDL_RenderFillRect(renderer, &rect); SDL_SetRenderDrawColor(renderer, 255, 15, 15, 255); SDL_RenderDrawRect(renderer, &rect); }); ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(), renderer); SDL_RenderPresent(renderer); } shutdown: ImGui_ImplSDLRenderer2_Shutdown(); ImGui_ImplSDL2_Shutdown(); ImGui::DestroyContext(); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); out: return 0; }