From e8e93db51f235fa797c84511396704a34ebc74f0 Mon Sep 17 00:00:00 2001 From: OusmBlueNinja <89956790+OusmBlueNinja@users.noreply.github.com> Date: Wed, 23 Apr 2025 20:56:42 -0500 Subject: [PATCH] Made tilemap inspector lok good --- imgui.ini | 39 ++++---- remake/build.log | 4 +- src/assets/scenes/TilemapTest.cene | 30 +++--- src/src/Components/TilemapComponent.cpp | 4 +- src/src/Engine.cpp | 1 + src/src/Entitys/Object.cpp | 46 +++++---- src/src/editor/windows/Inspector.cpp | 119 +++++++++++++++++++++--- 7 files changed, 173 insertions(+), 70 deletions(-) diff --git a/imgui.ini b/imgui.ini index c006b8d..d65bcf3 100644 --- a/imgui.ini +++ b/imgui.ini @@ -10,41 +10,40 @@ Collapsed=1 [Window][WindowOverViewport_11111111] Pos=0,19 -Size=1280,701 +Size=1920,1158 Collapsed=0 [Window][Inspector] -Pos=900,19 -Size=380,701 +Pos=1573,19 +Size=347,1158 Collapsed=0 DockId=0x00000006,0 [Window][Scene Tree] Pos=0,19 -Size=342,348 +Size=342,575 Collapsed=0 DockId=0x00000003,0 [Window][Viewport] Pos=344,19 -Size=554,390 +Size=1227,847 Collapsed=0 DockId=0x00000007,0 [Window][##MainMenuBar] -Pos=0,0 Size=1280,19 Collapsed=0 [Window][Performance Info] -Pos=344,411 -Size=554,309 +Pos=344,868 +Size=1227,309 Collapsed=0 DockId=0x00000008,3 [Window][Console] -Pos=344,411 -Size=554,309 +Pos=344,868 +Size=1227,309 Collapsed=0 DockId=0x00000008,0 @@ -55,8 +54,8 @@ Collapsed=0 DockId=0x00000007,1 [Window][Profiler] -Pos=344,411 -Size=554,309 +Pos=344,868 +Size=1227,309 Collapsed=0 DockId=0x00000008,2 @@ -79,25 +78,25 @@ Collapsed=0 DockId=0x00000008,1 [Window][Color Correction] -Pos=344,411 -Size=554,309 +Pos=344,868 +Size=1227,309 Collapsed=0 DockId=0x00000008,1 [Window][Asset Browser] -Pos=0,369 -Size=342,351 +Pos=0,596 +Size=342,581 Collapsed=0 DockId=0x00000004,0 [Docking][Data] -DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1280,701 Split=X - DockNode ID=0x00000005 Parent=0x11111111 SizeRef=1538,1158 Split=X +DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1920,1158 Split=X + DockNode ID=0x00000005 Parent=0x11111111 SizeRef=1571,1158 Split=X DockNode ID=0x00000001 Parent=0x00000005 SizeRef=342,701 Split=Y Selected=0x12EF0F59 DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,575 HiddenTabBar=1 Selected=0x12EF0F59 DockNode ID=0x00000004 Parent=0x00000001 SizeRef=342,581 HiddenTabBar=1 Selected=0x36AF052B - DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1194,701 Split=Y Selected=0xC450F867 + DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1227,701 Split=Y Selected=0xC450F867 DockNode ID=0x00000007 Parent=0x00000002 SizeRef=606,847 CentralNode=1 HiddenTabBar=1 Selected=0xC450F867 DockNode ID=0x00000008 Parent=0x00000002 SizeRef=606,309 Selected=0x9B5D3198 - DockNode ID=0x00000006 Parent=0x11111111 SizeRef=380,1158 HiddenTabBar=1 Selected=0x36DC96AB + DockNode ID=0x00000006 Parent=0x11111111 SizeRef=347,1158 HiddenTabBar=1 Selected=0x36DC96AB diff --git a/remake/build.log b/remake/build.log index 0394e77..9833942 100644 --- a/remake/build.log +++ b/remake/build.log @@ -1,3 +1,3 @@ +[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\editor\windows\Inspector.cpp -o src\build\editor\windows\Inspector.o [LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\Inspector.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -[ERROR] Runtime crash -Command 'src\build\app.exe' returned non-zero exit status 1. +[RUN] Executed app.exe successfully. diff --git a/src/assets/scenes/TilemapTest.cene b/src/assets/scenes/TilemapTest.cene index f992dff..eb98e0a 100644 --- a/src/assets/scenes/TilemapTest.cene +++ b/src/assets/scenes/TilemapTest.cene @@ -1,27 +1,33 @@ engine_version: 0.1.0 -scene_name: New Text Document -scene_hash: ab18a816340bea7fd8b460cde813cb5277bc2a67ca413862f648cf030c93a85f +scene_name: TilemapTest +scene_hash: da1e2dee8a989a2dc8390342cf9c900f4de6ad42a54b5f9250189f01645bbf27 format_version: 1 objects: - - name: TilemapTest - uid: 4afa4d0c474b4fb9b9b80eb1bb31195a + - name: Hello, Create + uid: ef684c7c34b34d81a41d052066bc806c id: 0 position: [0, 0] rotation: 0 layer: 0 visable: true components: - - Type: TilemapComponent + - type: TilemapComponent TextureUAID: 1 - TexelWidth: 1 - TexelHeight: 1 + TexelWidth: 16 + TexelHeight: 16 TileSize: x: 32 y: 32 Tiles: + - [6, 1, 15] + - [6, 2, 14] - [0, 0, 1] + - [6, 0, 16] + - [4, 3, 11] - [1, 0, 2] + - [5, 3, 12] - [2, 0, 3] + - [6, 3, 13] - [0, 1, 4] - [1, 1, 5] - [2, 1, 6] @@ -29,19 +35,13 @@ objects: - [1, 2, 8] - [2, 2, 9] - [3, 3, 10] - - [4, 3, 11] - - [5, 3, 12] - - [6, 3, 13] - - [6, 2, 14] - - [6, 1, 15] - - [6, 0, 16] children: [] color_correction: brightness: 1 saturation: 1 gamma: 1 bloom: true - intensity: 1.2 + intensity: 1.20000005 threshold: 1 Assets: - uaid: 1 @@ -49,4 +49,4 @@ Assets: filename: 6656e7221e49a1774d2fb280357e56f8d25d9d95.png filetype: png type: 0 - size: [1024, 1024] + size: [1024, 1024] \ No newline at end of file diff --git a/src/src/Components/TilemapComponent.cpp b/src/src/Components/TilemapComponent.cpp index 70d57cf..dc337b1 100644 --- a/src/src/Components/TilemapComponent.cpp +++ b/src/src/Components/TilemapComponent.cpp @@ -1,6 +1,6 @@ #include "TilemapComponent.h" #include "../Renderer.h" - +#include TilemapComponent::TilemapComponent(Object* owner) : Component(owner) @@ -75,7 +75,7 @@ const std::unordered_map& TilemapComponent::GetTileData() const { void TilemapComponent::Save(YAML::Emitter& out) const { out << YAML::BeginMap; - out << YAML::Key << "Type" << YAML::Value << GetName(); + out << YAML::Key << "type" << YAML::Value << GetName(); out << YAML::Key << "TextureUAID" << YAML::Value << textureUAID; out << YAML::Key << "TexelWidth" << YAML::Value << atlas.GetTexelSize().x; out << YAML::Key << "TexelHeight" << YAML::Value << atlas.GetTexelSize().y; diff --git a/src/src/Engine.cpp b/src/src/Engine.cpp index 17840ec..2e8c398 100644 --- a/src/src/Engine.cpp +++ b/src/src/Engine.cpp @@ -1204,6 +1204,7 @@ void Engine::LoadScene(const std::string &path) loadingUI.Update(currentStep, currentDetail, 0.05f); Logger::LogVerbose("[LoadScene] Loading Assets"); + AssetManager::ClearAllAssets(); AssetManager::Load(root["Assets"]); } diff --git a/src/src/Entitys/Object.cpp b/src/src/Entitys/Object.cpp index c7a0bf8..d707ce0 100644 --- a/src/src/Entitys/Object.cpp +++ b/src/src/Entitys/Object.cpp @@ -9,8 +9,6 @@ #include "../Components/ParticleComponent.h" #include "../Components/AnimationComponent.h" - - #include "../core/utils/Logging.h" #include "../utils/UID.h" @@ -54,7 +52,6 @@ void Object::SetLocalPosition(glm::vec2 pos) localPosition = pos; } - glm::vec2 Object::GetWorldPosition() const { if (parent) @@ -66,7 +63,6 @@ glm::vec2 Object::GetWorldPosition() const return localPosition; } - float Object::GetLocalRotation() const { return localRotationDeg; @@ -142,26 +138,42 @@ void Object::Load(const YAML::Node &node) layer = node["layer"] ? node["layer"].as() : 0; visable = node["visable"] ? node["visable"].as() : true; - Logger::LogVerbose("[LoadScene] Loading Object: [%s, %d]", name.c_str(), uid.id); + Logger::LogVerbose("[LoadScene] Loading Object: ['%s', %d]", name.c_str(), uid.id); components.clear(); if (node["components"]) { for (const auto &compNode : node["components"]) { - std::string type = compNode["type"].as(); - - if (type == "SpriteComponent") AddComponent()->Load(compNode); - else if (type == "CameraComponent") AddComponent()->Load(compNode); - else if (type == "LightComponent") AddComponent()->Load(compNode); - else if (type == "TilemapComponent") AddComponent()->Load(compNode); - else if (type == "TextComponent") AddComponent()->Load(compNode); - else if (type == "ScriptComponent") AddComponent()->Load(compNode); - else if (type == "ParticleComponent") AddComponent()->Load(compNode); - else if (type == "AnimationComponent") AddComponent()->Load(compNode); - - + try + { + std::string type = compNode["type"].as(); + if (type == "SpriteComponent") + AddComponent()->Load(compNode); + else if (type == "CameraComponent") + AddComponent()->Load(compNode); + else if (type == "LightComponent") + AddComponent()->Load(compNode); + else if (type == "TilemapComponent") + AddComponent()->Load(compNode); + else if (type == "TextComponent") + AddComponent()->Load(compNode); + else if (type == "ScriptComponent") + AddComponent()->Load(compNode); + else if (type == "ParticleComponent") + AddComponent()->Load(compNode); + else if (type == "AnimationComponent") + AddComponent()->Load(compNode); + else + { + Logger::LogError("Invalid Componenet type '%s' found in component '%s'(%d)", type.c_str(), name.c_str(), uid.id); + } + } + catch (const std::exception &e) + { + Logger::LogError("Failed to load '%s' (ID: %d). %s", name.c_str(), uid.id, e.what()); + } } } diff --git a/src/src/editor/windows/Inspector.cpp b/src/src/editor/windows/Inspector.cpp index 4626e02..644017a 100644 --- a/src/src/editor/windows/Inspector.cpp +++ b/src/src/editor/windows/Inspector.cpp @@ -147,7 +147,7 @@ void DrawInspectorUI(std::shared_ptr selected) { auto path = OpenFileDialog(FileDialogType::Images); if (!path.empty()) - sprite->SetTexture(path); // Auto-registers and sets UAID + sprite->SetTexture(path); } } @@ -424,20 +424,19 @@ void DrawInspectorUI(std::shared_ptr selected) { ImGui::SeparatorText("Tilemap Component"); - static int texelWidth = (int)tilemap->GetAtlas().GetTexelSize().x; - static int texelHeight = (int)tilemap->GetAtlas().GetTexelSize().y; - static core::types::Vec2 tileSize = tilemap->GetTileSize(); + int texelWidth = (int)tilemap->GetTileSize().x; + int texelHeight = (int)tilemap->GetTileSize().y; + core::types::Vec2 tileSize = tilemap->GetTileSize(); uint64_t uaid = tilemap->GetTextureUAID(); const auto *asset = AssetManager::GetAssetByID(uaid); ImGui::SeparatorText("Texture Atlas"); - // --- Atlas file name or (None) --- std::string texFile = asset ? GetFilenameFromPath(asset->path) : "(None)"; ImGui::Text("%s", texFile.c_str()); - // --- Drag and Drop Target --- + // Drag and drop texture if (ImGui::BeginDragDropTarget()) { if (const ImGuiPayload *payload = ImGui::AcceptDragDropPayload("ASSET_TEXTURE")) @@ -451,7 +450,7 @@ void DrawInspectorUI(std::shared_ptr selected) ImGui::EndDragDropTarget(); } - // --- Load via file dialog --- + // Load from dialog if (ImGui::SmallButton("Load##TilemapTex")) { std::string path = OpenFileDialog(FileDialogType::Images); @@ -459,24 +458,116 @@ void DrawInspectorUI(std::shared_ptr selected) tilemap->SetTextureAtlas(loaded->uaid, texelWidth, texelHeight); } - - // --- Tile Size --- if (ImGui::DragFloat2("Tile Size", &tileSize.x, 1.0f, 1.0f, 512.0f)) tilemap->SetTileSize(tileSize); - // --- Apply changes to atlas --- + // Re-apply if (ImGui::Button("Apply")) { if (const auto *texAsset = AssetManager::GetAssetByID(tilemap->GetTextureUAID())) tilemap->SetTextureAtlas(texAsset->uaid, texelWidth, texelHeight); } - // --- Atlas Preview --- - if (tilemap->GetTexture() && tilemap->GetTexture()) + // Atlas preview and grid + if (tilemap->GetTexture()) { - float previewSize = ImGui::GetContentRegionAvail().x; ImGui::SeparatorText("Atlas Preview"); - ImGui::Image((ImTextureID)(uintptr_t)tilemap->GetTexture()->GetID(), ImVec2(previewSize, previewSize)); + + auto texture = tilemap->GetTexture(); + ImTextureID texID = (ImTextureID)(uintptr_t)texture->GetID(); + + int texWidth = (int)texture->GetSize().x; + int texHeight = (int)texture->GetSize().y; + + // Validate texel size + if (texelWidth <= 0 || texelHeight <= 0) + { + ImGui::TextColored(ImVec4(1, 0.4f, 0.4f, 1), "Invalid texel size (must be >= 1)"); + ImGui::Separator(); + } + + int numCols = texWidth / texelWidth; + int numRows = texHeight / texelHeight; + + if (numCols == 0 || numRows == 0) + { + ImGui::TextColored(ImVec4(1, 0.4f, 0.4f, 1), "Texel size too large for atlas resolution."); + ImGui::Separator(); + } + + // Maintain aspect ratio + float previewSize = ImGui::GetContentRegionAvail().x; + float aspect = texHeight / (float)texWidth; + ImVec2 imageSize = ImVec2(previewSize, previewSize * aspect); + ImVec2 imagePos = ImGui::GetCursorScreenPos(); + + ImGui::Image(texID, imageSize); + + // Grid scale (tile-to-preview size) + float scaleX = imageSize.x / (float)texWidth; + float scaleY = imageSize.y / (float)texHeight; + float cellW = texelWidth * scaleX; + float cellH = texelHeight * scaleY; + + ImDrawList *drawList = ImGui::GetWindowDrawList(); + const ImU32 gridColor = IM_COL32(255, 255, 255, 48); + int linesDrawn = 0; + + // Vertical lines + for (int col = 0; col <= numCols; ++col) + { + float x = imagePos.x + col * cellW; + if (x > imagePos.x + imageSize.x) + break; + drawList->AddLine(ImVec2(x, imagePos.y), ImVec2(x, imagePos.y + imageSize.y), gridColor); + linesDrawn++; + } + + // Horizontal lines + for (int row = 0; row <= numRows; ++row) + { + float y = imagePos.y + row * cellH; + if (y > imagePos.y + imageSize.y) + break; + drawList->AddLine(ImVec2(imagePos.x, y), ImVec2(imagePos.x + imageSize.x, y), gridColor); + linesDrawn++; + } + + // --- Highlight tile under mouse --- + ImVec2 mousePos = ImGui::GetMousePos(); + bool mouseOver = ImGui::IsItemHovered(); + + if (mouseOver) + { + // Convert mouse position to tile coordinates + float localX = mousePos.x - imagePos.x; + float localY = mousePos.y - imagePos.y; + + int tileX = (int)(localX / cellW); + int tileY = (int)(localY / cellH); + + if (tileX >= 0 && tileX < numCols && tileY >= 0 && tileY < numRows) + { + float highlightX = imagePos.x + tileX * cellW; + float highlightY = imagePos.y + tileY * cellH; + + ImVec2 min = ImVec2(highlightX, highlightY); + ImVec2 max = ImVec2(highlightX + cellW, highlightY + cellH); + + const ImU32 glowColor = IM_COL32(255, 255, 0, 64); // translucent yellow + drawList->AddRectFilled(min, max, glowColor, 2.0f); + + // Optional: Outline + drawList->AddRect(min, max, IM_COL32(255, 255, 0, 128), 2.0f); + + ImGui::Text("Hovered Tile: (%d, %d)", tileX, tileY); + } + } + + // Debug + ImGui::Text("Atlas Resolution: %d x %d", texWidth, texHeight); + ImGui::Text("Tile Grid: %d x %d", numCols, numRows); + ImGui::Text("Grid Lines: %d", linesDrawn); } ImGui::Separator();