189 lines
6.3 KiB
C++
189 lines
6.3 KiB
C++
#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 <SDL.h>
|
|
#include <SDL_opengl.h>
|
|
|
|
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<String, Color> colors;
|
|
make_random r(172);
|
|
|
|
flecs::world ecs;
|
|
ecs.component<WorldEditor::components::buildings_layout_grid_floor>();
|
|
ecs.component<WorldEditor::components::buildings_layout_grid_cell>();
|
|
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<WorldEditor::components::buildings_layout_grid_floor>({.grid_size = grid_size, .size_left = grid_size * grid_size});
|
|
List<struct region> 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<const WorldEditor::components::buildings_layout_grid_cell>()
|
|
.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;
|
|
}
|
|
|