From a3719201d0195da2213c7a4677c7983360adc2ac Mon Sep 17 00:00:00 2001 From: scawful Date: Sat, 4 Oct 2025 14:46:50 -0400 Subject: [PATCH] feat: Update dungeon coordinate conversion to use 8x8 pixel tiles and replace DungeonEditor with DungeonEditorV2 --- src/app/editor/dungeon/dungeon_canvas_viewer.cc | 10 ++++++---- src/app/editor/dungeon/dungeon_object_interaction.cc | 6 ++++-- src/app/editor/dungeon/dungeon_renderer.cc | 6 ++++-- src/app/editor/editor_manager.h | 4 ++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/app/editor/dungeon/dungeon_canvas_viewer.cc b/src/app/editor/dungeon/dungeon_canvas_viewer.cc index d4f83f76..91e23ead 100644 --- a/src/app/editor/dungeon/dungeon_canvas_viewer.cc +++ b/src/app/editor/dungeon/dungeon_canvas_viewer.cc @@ -480,18 +480,20 @@ void DungeonCanvasViewer::RenderPotObjects(const zelda3::Room& room) { std::pair DungeonCanvasViewer::RoomToCanvasCoordinates(int room_x, int room_y) const { // Convert room coordinates (tile units) to canvas coordinates (pixels) + // Dungeon tiles are 8x8 pixels (not 16x16!) // Account for canvas scaling and offset float scale = canvas_.global_scale(); int offset_x = static_cast(canvas_.drawn_tile_position().x); int offset_y = static_cast(canvas_.drawn_tile_position().y); - return {static_cast((room_x * 16 + offset_x) * scale), - static_cast((room_y * 16 + offset_y) * scale)}; + return {static_cast((room_x * 8 + offset_x) * scale), + static_cast((room_y * 8 + offset_y) * scale)}; } std::pair DungeonCanvasViewer::CanvasToRoomCoordinates(int canvas_x, int canvas_y) const { // Convert canvas coordinates (pixels) to room coordinates (tile units) + // Dungeon tiles are 8x8 pixels (not 16x16!) // Account for canvas scaling and offset float scale = canvas_.global_scale(); int offset_x = static_cast(canvas_.drawn_tile_position().x); @@ -499,8 +501,8 @@ std::pair DungeonCanvasViewer::CanvasToRoomCoordinates(int canvas_x, if (scale <= 0.0f) scale = 1.0f; // Prevent division by zero - return {static_cast((canvas_x / scale - offset_x) / 16), - static_cast((canvas_y / scale - offset_y) / 16)}; + return {static_cast((canvas_x / scale - offset_x) / 8), + static_cast((canvas_y / scale - offset_y) / 8)}; } bool DungeonCanvasViewer::IsWithinCanvasBounds(int canvas_x, int canvas_y, diff --git a/src/app/editor/dungeon/dungeon_object_interaction.cc b/src/app/editor/dungeon/dungeon_object_interaction.cc index 31c2f0ae..5b6aedc8 100644 --- a/src/app/editor/dungeon/dungeon_object_interaction.cc +++ b/src/app/editor/dungeon/dungeon_object_interaction.cc @@ -270,11 +270,13 @@ bool DungeonObjectInteraction::IsObjectInSelectBox( } std::pair DungeonObjectInteraction::RoomToCanvasCoordinates(int room_x, int room_y) const { - return {room_x * 16, room_y * 16}; + // Dungeon tiles are 8x8 pixels, convert room coordinates (tiles) to pixels + return {room_x * 8, room_y * 8}; } std::pair DungeonObjectInteraction::CanvasToRoomCoordinates(int canvas_x, int canvas_y) const { - return {canvas_x / 16, canvas_y / 16}; + // Convert canvas pixels back to room coordinates (tiles) + return {canvas_x / 8, canvas_y / 8}; } bool DungeonObjectInteraction::IsWithinCanvasBounds(int canvas_x, int canvas_y, int margin) const { diff --git a/src/app/editor/dungeon/dungeon_renderer.cc b/src/app/editor/dungeon/dungeon_renderer.cc index 7405bed3..9a008469 100644 --- a/src/app/editor/dungeon/dungeon_renderer.cc +++ b/src/app/editor/dungeon/dungeon_renderer.cc @@ -187,11 +187,13 @@ absl::Status DungeonRenderer::RefreshGraphics(int room_id, uint64_t palette_id, } std::pair DungeonRenderer::RoomToCanvasCoordinates(int room_x, int room_y) const { - return {room_x * 16, room_y * 16}; + // Dungeon tiles are 8x8 pixels, convert room coordinates (tiles) to pixels + return {room_x * 8, room_y * 8}; } std::pair DungeonRenderer::CanvasToRoomCoordinates(int canvas_x, int canvas_y) const { - return {canvas_x / 16, canvas_y / 16}; + // Convert canvas pixels back to room coordinates (tiles) + return {canvas_x / 8, canvas_y / 8}; } bool DungeonRenderer::IsWithinCanvasBounds(int canvas_x, int canvas_y, int margin) const { diff --git a/src/app/editor/editor_manager.h b/src/app/editor/editor_manager.h index c4addb44..d4c0ab48 100644 --- a/src/app/editor/editor_manager.h +++ b/src/app/editor/editor_manager.h @@ -11,7 +11,7 @@ #include "app/core/project.h" #include "app/editor/code/assembly_editor.h" #include "app/editor/code/memory_editor.h" -#include "app/editor/dungeon/dungeon_editor.h" +#include "app/editor/dungeon/dungeon_editor_v2.h" #include "app/editor/graphics/graphics_editor.h" #include "app/editor/graphics/palette_editor.h" #include "app/editor/graphics/screen_editor.h" @@ -59,7 +59,7 @@ class EditorSet { } AssemblyEditor assembly_editor_; - DungeonEditor dungeon_editor_; + DungeonEditorV2 dungeon_editor_; GraphicsEditor graphics_editor_; MusicEditor music_editor_; OverworldEditor overworld_editor_;