5#include "absl/status/status.h"
6#include "absl/strings/str_format.h"
15#include "imgui/imgui.h"
32 if (Button(
"Clear")) {
45 ImVec4(0.4f, 1.0f, 0.4f, 1.0f),
47 " Overworld selection active! Click in scratch space to stamp.");
49 Text(
"Left-click to paint with current tile.");
50 Text(
"Right-click to select tiles.");
57 std::vector<uint8_t> empty_data(bitmap_width * bitmap_height, 0);
87 scratch_content_size);
101 if (canvas_rt.hovered) {
104 if (ImGui::IsMouseClicked(ImGuiMouseButton_Left)) {
108 ImGui::IsMouseDown(ImGuiMouseButton_Left)) {
117 return absl::OkStatus();
124 int tile_x =
static_cast<int>(mouse_position.x) / grid_size;
125 int tile_y =
static_cast<int>(mouse_position.y) / grid_size;
130 if (tile_x >= 0 && tile_x < max_width && tile_y >= 0 && tile_y < max_height) {
131 if (tile_x < 32 && tile_y < 32) {
147 int start_tile_x =
static_cast<int>(mouse_position.x) / 32;
148 int start_tile_y =
static_cast<int>(mouse_position.y) / 32;
159 if (tile_ids.empty())
return;
165 for (
int py = 0; py < pattern_height && (start_tile_y + py) < max_height;
167 for (
int px = 0; px < pattern_width && (start_tile_x + px) < max_width;
169 if (idx <
static_cast<int>(tile_ids.size())) {
170 int tile_id = tile_ids[idx];
171 int scratch_x = start_tile_x + px;
172 int scratch_y = start_tile_y + py;
174 if (scratch_x >= 0 && scratch_x < 32 && scratch_y >= 0 &&
187 absl::StrFormat(
"Pattern %dx%d", pattern_width, pattern_height);
196 if (tile_data.empty())
return;
198 const int grid_size = 32;
202 for (
int y = 0; y < 16; ++y) {
203 for (
int x = 0; x < 16; ++x) {
204 int src_index = y * 16 + x;
206 int dst_x = tile_x * grid_size + x + x;
207 int dst_y = tile_y * grid_size + y + y;
209 if (dst_x >= 0 && dst_x < scratch_bitmap_width && dst_y >= 0 &&
210 dst_y < scratch_bitmap_height &&
211 src_index <
static_cast<int>(tile_data.size())) {
212 for (
int py = 0; py < 2 && (dst_y + py) < scratch_bitmap_height; ++py) {
213 for (
int px = 0; px < 2 && (dst_x + px) < scratch_bitmap_width;
215 int dst_index = (dst_y + py) * scratch_bitmap_width + (dst_x + px);
217 tile_data[src_index]);
236 if (selected_points.size() >= 2) {
238 const auto start = selected_points[0];
239 const auto end = selected_points[1];
241 int selection_width =
242 std::abs(
static_cast<int>((end.x - start.x) / 16)) + 1;
243 int selection_height =
244 std::abs(
static_cast<int>((end.y - start.y) / 16)) + 1;
255 std::vector<uint8_t> empty_data(bitmap_width * bitmap_height, 0);
281 if (x < 32 && y < 32) {
297 return absl::OkStatus();
302 return absl::FailedPreconditionError(
"Scratch space is empty");
307 return absl::OkStatus();
322 std::fill(data.begin(), data.end(), 0);
328 return absl::OkStatus();
EditorDependencies dependencies_
bool map_blockset_loaded_
absl::Status DrawScratchSpace()
absl::Status LoadScratchToSelection()
gfx::Tilemap tile16_blockset_
absl::Status ClearScratchSpace()
gui::Canvas ow_map_canvas_
ScratchSpace scratch_space_
void UpdateScratchBitmapTile(int tile_x, int tile_y, int tile_id)
void DrawScratchSpacePattern()
gui::Canvas scratch_canvas_
void DrawScratchSpaceEdits()
absl::Status SaveCurrentSelectionToScratch()
zelda3::Overworld overworld_
gfx::SnesPalette palette_
void QueueTextureCommand(TextureCommandType type, Bitmap *bitmap)
void WriteToPixel(int position, uint8_t value)
Write a value to a pixel at the given position.
void Create(int width, int height, int depth, std::span< uint8_t > data)
Create a bitmap with the given dimensions and data.
void set_modified(bool modified)
void SetPalette(const SnesPalette &palette)
Set the palette for the bitmap using SNES palette format.
std::vector< uint8_t > & mutable_data()
RAII timer for automatic timing management.
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
auto select_rect_active() const
auto selected_tiles() const
auto drawn_tile_position() const
bool DrawTileSelector(int size, int size_y=0)
auto selected_points() const
auto current_area_palette() const
void set_current_world(int world)
int GetTileFromPosition(ImVec2 position) const
void set_current_map(int i)
#define ICON_MD_CONTENT_PASTE
#define HOVER_HINT(string)
Editors are the view controllers for the application.
std::vector< uint8_t > GetTilemapData(Tilemap &tilemap, int tile_id)
void EndCanvas(Canvas &canvas)
void BeginCanvas(Canvas &canvas, ImVec2 child_size)
void BeginChildWithScrollbar(const char *str_id)
void logf(const absl::FormatSpec< Args... > &format, Args &&... args)
#define RETURN_IF_ERROR(expr)
bool has_overworld_tile16
std::vector< int > overworld_tile16_ids
SharedClipboard * shared_clipboard
gfx::Bitmap scratch_bitmap
std::array< std::array< int, 32 >, 32 > tile_data
std::optional< float > grid_step