#include "game.hpp" GameSettings pkeSettings{}; const uint64_t consoleBufferCount = 30; const uint64_t consoleLineLength = 128; const char *levelName = "demo-level"; char consoleBuffer[consoleBufferCount][consoleLineLength]; long consoleBufferIndex = 0; void SerializeEntityType(void *TODO, const EntityType &et) { char handleStr[19] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }; snprintf(handleStr, 19, "0x%016lX",static_cast(et.entityHandle)); // TODO } void ParseEntityType(void *TODO, EntityType *et) { } void SaveSceneFile(const char *sceneFilePath) { // TODO init file for (long i = 0; i < GlobalEntityTypes.Count(); ++i) { const auto &et = GlobalEntityTypes[i]; const CompGrBinds *grBinds = ECS_GetGrBinds(et.entityHandle); // TODO ignore if no instances if (grBinds == nullptr) { continue; } SerializeEntityType(nullptr, et); // TODO } std::ofstream f(sceneFilePath, std::ios::out); // TODO write to file f.flush(); f.close(); } void LoadSceneFile(const char *sceneFilePath) { AssetHandle sceneAH = AM_Register(sceneFilePath); const Asset *sceneAsset = AM_Get(sceneAH); // EntityTypes { long entityTypeCount = 0; // TODO for (int64_t i = 0; i < entityTypeCount; ++i) { EntityType et{}; ParseEntityType(nullptr, &et); // TODO int64_t existingEntityTypeIndex = EntityType_FindByTypeCode(et.entityTypeCode); if (existingEntityTypeIndex != -1) { continue; } et.entityHandle = ECS_CreateEntity(); EntityType_Load(et); } } AM_Destroy(sceneAH); } void Game_Tick(double delta) { /* * ECS_Tick() gets called first because it updates the public * `EntitiesToBeRemoved` for all other ticks to use. */ ECS_Tick(delta); } void RecordImGuiEditorWrapper() { ImGui::DockSpaceOverViewport(nullptr, ImGuiDockNodeFlags_PassthruCentralNode); ImGui::BeginMainMenuBar(); if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("Exit")) { glfwSetWindowShouldClose(window, true); } ImGui::EndMenu(); } ImGui::EndMainMenuBar(); } void RecordImGuiConsole() { static bool scrollToBottom = true; if (!ImGui::Begin("Console", &pkeSettings.editorSettings.isShowingConsole)) { ImGui::End(); return; } ImVec2 region = ImGui::GetContentRegionAvail(); region.y -= 27; if (ImGui::BeginListBox("##ConsoleHistory", region)) { for (long i = consoleBufferIndex + 1; i < consoleBufferCount; ++i) { ImGui::Text("%s", consoleBuffer[i]); } for (long i = 0; i < consoleBufferIndex; ++i) { ImGui::Text("%s", consoleBuffer[i]); } if (scrollToBottom) ImGui::SetScrollHereY(1); scrollToBottom = false; ImGui::EndListBox(); } ImGui::Separator(); if (ImGui::InputText("##ConsoleInput", consoleBuffer[consoleBufferIndex], consoleLineLength, ImGuiInputTextFlags_EnterReturnsTrue)) { // TODO parse and execute. scrollToBottom = true; consoleBufferIndex = (consoleBufferIndex + 1) % consoleBufferCount; memset(consoleBuffer[consoleBufferIndex], '\0', consoleLineLength); } auto focusedFlags = (ImGuiFocusedFlags_ChildWindows); if (ImGui::IsWindowFocused(focusedFlags) && !ImGui::IsAnyItemFocused() && !ImGui::IsAnyItemHovered() && !ImGui::IsMouseClicked(ImGuiMouseButton_Left) && !ImGui::IsMouseClicked(ImGuiMouseButton_Left, true)) { ImGui::SetKeyboardFocusHere(-1); } ImGui::End(); } void RecordImGuiEntityList() { if (!ImGui::Begin("EntityList", &pkeSettings.editorSettings.isShowingEntityList)) { ImGui::End(); return; } static ImGuiTableFlags tableFlags{ ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg }; if (ImGui::BeginTable("Entities", 5, tableFlags)) { ImGui::TableSetupColumn("EntityHandle"); ImGui::TableSetupColumn("ParentEntityHandle"); ImGui::TableSetupColumn("GrBindsHandle"); ImGui::TableSetupColumn("InstanceHandle"); ImGui::TableSetupColumn("IsMarkedForRemoval"); ImGui::TableHeadersRow(); uint64_t bucketCount = ECS_GetEntities_BucketCount(); for (long bucket = 0; bucket <= bucketCount; ++bucket) { uint64_t itemCount = 0; auto *entities = ECS_GetEntities(bucket, itemCount); for (long row = 0; row < itemCount; row++) { auto *entity = &entities[row]; ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); ImGui::Text("%lx", static_cast(entity->handle)); ImGui::TableSetColumnIndex(1); ImGui::Text("%lx", static_cast(entity->parentHandle)); ImGui::TableSetColumnIndex(2); ImGui::Text("%lx", static_cast(entity->grBindsHandle)); ImGui::TableSetColumnIndex(3); ImGui::Text("%lx", static_cast(entity->instanceHandle)); ImGui::TableSetColumnIndex(4); ImGui::Text("%u", entity->isMarkedForRemoval); } } ImGui::EndTable(); } ImGui::End(); } void RecordImGuiSceneEditor() { { if (!ImGui::Begin("SceneEditorEntityTypes", &pkeSettings.editorSettings.isShowingSceneEditor)) { ImGui::End(); return; } if (ImGui::Button("Save")) { SaveSceneFile("test.yaml"); } if (ImGui::Button("Load")) { LoadSceneFile("test.yaml"); } ImGui::End(); } } void RecordImGuiEditor() { if (pkeSettings.isShowingEditor) { RecordImGuiEditorWrapper(); RecordImGuiConsole(); RecordImGuiEntityList(); RecordImGuiSceneEditor(); } } void Game_Init() { for (long i = 0; i < consoleBufferCount; ++i) { memset(consoleBuffer[i], '\0', consoleLineLength); } Event_RegisterCallback("RenderImGui", RecordImGuiEditor); }