1#ifndef YAZE_APP_ZELDA3_DUNGEON_DUNGEON_OBJECT_EDITOR_H
2#define YAZE_APP_ZELDA3_DUNGEON_DUNGEON_OBJECT_EDITOR_H
7#include <unordered_map>
10#include "absl/status/status.h"
11#include "absl/status/statusor.h"
107 absl::Status
InsertObject(
int x,
int y,
int object_type,
int size = 0x12,
111 absl::Status
MoveObject(
size_t object_index,
int new_x,
int new_y);
112 absl::Status
ResizeObject(
size_t object_index,
int new_size);
125 bool right_button,
bool shift_pressed);
185 std::function<void(
size_t object_index,
const RoomObject&
object)>;
217 std::optional<size_t>
FindObjectAt(
int room_x,
int room_y);
275namespace ObjectCategories {
292 const std::string& category_name);
The Rom class is used to load, save, and modify Rom data.
Represents a bitmap image optimized for SNES ROM hacking.
Interactive dungeon object editor with scroll wheel support.
static constexpr int kDefaultObjectSize
std::function< void(size_t object_index, const RoomObject &object)> ObjectChangedCallback
size_t GetObjectCount() const
std::function< void(const SelectionState &)> SelectionChangedCallback
absl::Status HandleMouseDrag(int start_x, int start_y, int current_x, int current_y)
absl::Status HandleScrollWheel(int delta, int x, int y, bool ctrl_pressed)
~DungeonObjectEditor()=default
std::pair< int, int > ScreenToRoomCoordinates(int screen_x, int screen_y)
absl::Status ValidateRoom()
void SetSnapToGrid(bool enabled)
absl::Status ValidateObjectType(int object_type)
int GetNextSize(int current_size, int delta)
void SetRoomChangedCallback(RoomChangedCallback callback)
absl::Status ValidatePreviewPosition(int x, int y)
std::pair< int, int > RoomToScreenCoordinates(int room_x, int room_y)
absl::Status HandleKeyPress(int key_code, bool ctrl_pressed, bool shift_pressed)
absl::Status InsertObject(int x, int y, int object_type, int size=0x12, int layer=0)
EditingState editing_state_
static constexpr int kMaxLayer
absl::Status ChangeObjectLayer(size_t object_index, int new_layer)
absl::Status DeleteObject(size_t object_index)
SelectionState selection_state_
absl::Status InitializeEditor()
void SetSelectionChangedCallback(SelectionChangedCallback callback)
absl::Status SelectObject(int screen_x, int screen_y)
int GetCurrentObjectType() const
void RenderObjectPropertyPanel()
absl::StatusOr< gfx::Bitmap > RenderPreview(int x, int y)
absl::Status MoveObjectToLayer(size_t object_index, int layer)
void SetGridSize(int size)
absl::Status CreateUndoPoint()
std::vector< UndoPoint > undo_history_
static constexpr size_t kMaxUndoHistory
void SetPreviewPosition(int x, int y)
bool IsValidSize(int size)
std::optional< size_t > FindObjectAt(int room_x, int room_y)
const EditingState & GetEditingState() const
static constexpr int kMaxObjectSize
absl::Status AddToSelection(size_t object_index)
std::function< void()> RoomChangedCallback
const std::vector< RoomObject > & GetObjects() const
static constexpr int kMinLayer
ObjectChangedCallback object_changed_callback_
std::unique_ptr< Room > current_room_
void RenderLayerVisualization(gfx::Bitmap &canvas)
std::vector< std::string > GetValidationErrors()
const SelectionState & GetSelection() const
absl::Status LoadRoom(int room_id)
int GetCurrentLayer() const
void SetConfig(const EditorConfig &config)
absl::StatusOr< gfx::Bitmap > RenderObjectPreview(int object_type, int x, int y, int size)
absl::StatusOr< std::vector< int > > GetAvailableObjectTypes()
std::vector< UndoPoint > redo_history_
absl::Status ValidateObject(const RoomObject &object)
absl::Status HandleDragOperation(int current_x, int current_y)
absl::Status HandleSizeEdit(int delta, int x, int y)
const Room & GetRoom() const
bool ObjectsCollide(const RoomObject &obj1, const RoomObject &obj2)
absl::Status SelectObjects(int start_x, int start_y, int end_x, int end_y)
absl::Status ClearSelection()
bool IsObjectAtPosition(const RoomObject &object, int x, int y)
void SetCurrentLayer(int layer)
void SetObjectChangedCallback(ObjectChangedCallback callback)
absl::Status HandleMouseRelease(int x, int y)
absl::Status RemoveFromSelection(size_t object_index)
void UpdatePreviewObject()
absl::Status MoveObject(size_t object_index, int new_x, int new_y)
void SetShowGrid(bool enabled)
absl::Status ResizeObject(size_t object_index, int new_size)
std::optional< RoomObject > preview_object_
static constexpr int kMinObjectSize
absl::Status ChangeObjectType(size_t object_index, int new_type)
std::vector< RoomObject > empty_objects_
std::vector< size_t > FindObjectsInArea(int start_x, int start_y, int end_x, int end_y)
EditorConfig GetConfig() const
void SetCurrentObjectType(int object_type)
absl::Status DeleteSelectedObjects()
SelectionChangedCallback selection_changed_callback_
int SnapToGrid(int coordinate)
absl::Status ApplyUndoPoint(const UndoPoint &undo_point)
absl::Status HandleMouseClick(int x, int y, bool left_button, bool right_button, bool shift_pressed)
int GetPreviousSize(int current_size, int delta)
void RenderSelectionHighlight(gfx::Bitmap &canvas)
absl::StatusOr< std::vector< RoomObject > > GetObjectsByLayer(int layer)
RoomChangedCallback room_changed_callback_
void RenderLayerControls()
std::vector< ObjectCategory > GetObjectCategories()
Get all available object categories.
absl::StatusOr< ObjectInfo > GetObjectInfo(int object_id)
absl::StatusOr< std::string > GetObjectCategory(int object_id)
Get category for a specific object.
absl::StatusOr< std::vector< int > > GetObjectsInCategory(const std::string &category_name)
Get objects in a specific category.
std::unique_ptr< DungeonObjectEditor > CreateDungeonObjectEditor(Rom *rom)
Factory function to create dungeon object editor.
Main namespace for the application.
bool show_collision_bounds
bool show_selection_highlight
std::vector< size_t > selected_objects
std::vector< RoomObject > objects
std::chrono::steady_clock::time_point timestamp
Mouse interaction configuration.
int double_click_threshold
std::vector< int > object_ids
std::vector< std::pair< int, int > > valid_sizes
std::vector< int > valid_layers