62 ImDrawList* draw_list,
63 ImGuiMouseButton mouse_button) {
74 constexpr int kSmallMapSize = 0x200;
79 if (current_map < 0x40) {
81 super_y = current_map / 8;
82 super_x = current_map % 8;
83 }
else if (current_map < 0x80) {
85 super_y = (current_map - 0x40) / 8;
86 super_x = (current_map - 0x40) % 8;
89 super_y = (current_map - 0x80) / 8;
90 super_x = (current_map - 0x80) % 8;
94 if (ImGui::IsMouseClicked(mouse_button)) {
99 ImVec2 painter_pos =
AlignToGrid(mouse_pos, scaled_size);
100 int painter_x =
static_cast<int>(painter_pos.x);
101 int painter_y =
static_cast<int>(painter_pos.y);
103 auto tile16_x = (painter_x % kSmallMapSize) / (kSmallMapSize / 0x20);
104 auto tile16_y = (painter_y % kSmallMapSize) / (kSmallMapSize / 0x20);
106 int index_x = super_x * 0x20 + tile16_x;
107 int index_y = super_y * 0x20 + tile16_y;
109 event.start_pos = painter_pos;
110 event.selected_tiles.push_back(ImVec2(
static_cast<float>(index_x),
111 static_cast<float>(index_y)));
115 ImVec2 drag_end_pos =
AlignToGrid(mouse_pos, scaled_size);
116 if (ImGui::IsMouseDragging(mouse_button) && draw_list) {
118 event.is_active =
true;
120 event.end_pos = drag_end_pos;
125 auto end = ImVec2(geometry.
canvas_p0.x + drag_end_pos.x + tile_size,
126 geometry.
canvas_p0.y + drag_end_pos.y + tile_size);
127 draw_list->AddRect(start, end, IM_COL32(255, 255, 255, 255));
131 if (g_select_rect_state.
is_dragging && !ImGui::IsMouseDown(mouse_button)) {
133 event.is_complete =
true;
134 event.is_active =
false;
136 event.end_pos = drag_end_pos;
139 constexpr int kTile16Size = 16;
140 int start_x =
static_cast<int>(std::floor(g_select_rect_state.
drag_start_pos.x / scaled_size)) * kTile16Size;
141 int start_y =
static_cast<int>(std::floor(g_select_rect_state.
drag_start_pos.y / scaled_size)) * kTile16Size;
142 int end_x =
static_cast<int>(std::floor(drag_end_pos.x / scaled_size)) * kTile16Size;
143 int end_y =
static_cast<int>(std::floor(drag_end_pos.y / scaled_size)) * kTile16Size;
145 if (start_x > end_x) std::swap(start_x, end_x);
146 if (start_y > end_y) std::swap(start_y, end_y);
148 constexpr int kTilesPerLocalMap = kSmallMapSize / 16;
150 for (
int tile_y = start_y; tile_y <= end_y; tile_y += kTile16Size) {
151 for (
int tile_x = start_x; tile_x <= end_x; tile_x += kTile16Size) {
152 int local_map_x = tile_x / kSmallMapSize;
153 int local_map_y = tile_y / kSmallMapSize;
155 int tile16_x = (tile_x % kSmallMapSize) / kTile16Size;
156 int tile16_y = (tile_y % kSmallMapSize) / kTile16Size;
158 int index_x = local_map_x * kTilesPerLocalMap + tile16_x;
159 int index_y = local_map_y * kTilesPerLocalMap + tile16_y;
161 event.selected_tiles.emplace_back(
static_cast<float>(index_x),
162 static_cast<float>(index_y));
174 ImGuiMouseButton mouse_button) {
178 if (!
IsMouseInCanvas(geometry) || !ImGui::IsMouseClicked(mouse_button)) {
184 constexpr int kSmallMapSize = 0x200;
189 if (current_map < 0x40) {
190 super_y = current_map / 8;
191 super_x = current_map % 8;
192 }
else if (current_map < 0x80) {
193 super_y = (current_map - 0x40) / 8;
194 super_x = (current_map - 0x40) % 8;
196 super_y = (current_map - 0x80) / 8;
197 super_x = (current_map - 0x80) % 8;
200 ImVec2 painter_pos =
AlignToGrid(mouse_pos, scaled_size);
201 int painter_x =
static_cast<int>(painter_pos.x);
202 int painter_y =
static_cast<int>(painter_pos.y);
204 auto tile16_x = (painter_x % kSmallMapSize) / (kSmallMapSize / 0x20);
205 auto tile16_y = (painter_y % kSmallMapSize) / (kSmallMapSize / 0x20);
207 int index_x = super_x * 0x20 + tile16_x;
208 int index_y = super_y * 0x20 + tile16_y;
210 event.tile_position = ImVec2(
static_cast<float>(index_x),
211 static_cast<float>(index_y));
212 event.is_valid =
true;
257 ImDrawList* draw_list,
258 ImGuiMouseButton mouse_button) {
270 ImVec2 paint_pos =
AlignToGrid(mouse_pos, scaled_size);
271 event.position = mouse_pos;
272 event.grid_position = paint_pos;
274 auto paint_pos_end = ImVec2(paint_pos.x + scaled_size, paint_pos.y + scaled_size);
281 reinterpret_cast<ImTextureID
>(bitmap.
texture()),
282 ImVec2(origin.x + paint_pos.x, origin.y + paint_pos.y),
283 ImVec2(origin.x + paint_pos_end.x, origin.y + paint_pos_end.y));
287 if (ImGui::IsMouseClicked(mouse_button) &&
288 ImGui::IsMouseDragging(mouse_button)) {
289 event.is_complete =
true;
290 event.is_drag =
true;
TilePaintEvent HandleTilePaintWithPreview(const CanvasGeometry &geometry, const gfx::Bitmap &bitmap, float tile_size, ImDrawList *draw_list, ImGuiMouseButton mouse_button)
Handle tile painter with bitmap preview.
RectSelectionEvent HandleRectangleSelection(const CanvasGeometry &geometry, int current_map, float tile_size, ImDrawList *draw_list, ImGuiMouseButton mouse_button)
Handle rectangle selection interaction.
TilePaintEvent HandleTilemapPaint(const CanvasGeometry &geometry, const gfx::Tilemap &tilemap, int current_tile, ImDrawList *draw_list, ImGuiMouseButton mouse_button)
Handle tilemap painting interaction.