Files
streaming_world/tests/regions.cpp

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;
}