Add DrawTileOnBitmap to Canvas
This commit is contained in:
@@ -178,6 +178,10 @@ bool Canvas::DrawSolidTilePainter(const ImVec4 &color, int size) {
|
|||||||
painter_pos.x = std::floor((double)mouse_pos.x / size) * size;
|
painter_pos.x = std::floor((double)mouse_pos.x / size) * size;
|
||||||
painter_pos.y = std::floor((double)mouse_pos.y / size) * size;
|
painter_pos.y = std::floor((double)mouse_pos.y / size) * size;
|
||||||
|
|
||||||
|
// Clamp the size to a grid
|
||||||
|
painter_pos.x = std::clamp(painter_pos.x, 0.0f, canvas_sz_.x);
|
||||||
|
painter_pos.y = std::clamp(painter_pos.y, 0.0f, canvas_sz_.y);
|
||||||
|
|
||||||
auto painter_pos_end = ImVec2(painter_pos.x + size, painter_pos.y + size);
|
auto painter_pos_end = ImVec2(painter_pos.x + size, painter_pos.y + size);
|
||||||
points_.push_back(painter_pos);
|
points_.push_back(painter_pos);
|
||||||
points_.push_back(painter_pos_end);
|
points_.push_back(painter_pos_end);
|
||||||
@@ -200,6 +204,28 @@ bool Canvas::DrawSolidTilePainter(const ImVec4 &color, int size) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Canvas::DrawTileOnBitmap(const ImVec2 &position, int tile_size,
|
||||||
|
gfx::Bitmap &bitmap, uint16_t color) {
|
||||||
|
// Calculate the tile indices based on the click position
|
||||||
|
int tile_index_x = static_cast<int>(position.x) / tile_size;
|
||||||
|
int tile_index_y = static_cast<int>(position.y) / tile_size;
|
||||||
|
|
||||||
|
// Calculate the pixel start position based on tile index and tile size
|
||||||
|
ImVec2 start_position(tile_index_x * tile_size, tile_index_y * tile_size);
|
||||||
|
|
||||||
|
// Update the bitmap's pixel data based on the start_position and color
|
||||||
|
for (int y = 0; y < tile_size; ++y) {
|
||||||
|
for (int x = 0; x < tile_size; ++x) {
|
||||||
|
// Calculate the actual pixel index in the bitmap
|
||||||
|
int pixel_index =
|
||||||
|
(start_position.y + y) * bitmap.width() + (start_position.x + x);
|
||||||
|
|
||||||
|
// Write the color to the pixel
|
||||||
|
bitmap.WriteToPixel(pixel_index, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Canvas::DrawTileSelector(int size) {
|
void Canvas::DrawTileSelector(int size) {
|
||||||
const ImGuiIO &io = ImGui::GetIO();
|
const ImGuiIO &io = ImGui::GetIO();
|
||||||
const bool is_hovered = ImGui::IsItemHovered();
|
const bool is_hovered = ImGui::IsItemHovered();
|
||||||
@@ -230,7 +256,7 @@ void Canvas::HandleTileEdits(Canvas &blockset_canvas,
|
|||||||
current_tile = x + (y * tiles_per_row);
|
current_tile = x + (y * tiles_per_row);
|
||||||
if (DrawTilePainter(source_blockset[current_tile], tile_painter_size,
|
if (DrawTilePainter(source_blockset[current_tile], tile_painter_size,
|
||||||
scale)) {
|
scale)) {
|
||||||
RenderUpdatedBitmap(GetCurrentDrawnTilePosition(),
|
RenderUpdatedBitmap(drawn_tile_position(),
|
||||||
source_blockset[current_tile].mutable_data(),
|
source_blockset[current_tile].mutable_data(),
|
||||||
destination);
|
destination);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,10 @@ class Canvas {
|
|||||||
bool DrawTilePainter(const Bitmap& bitmap, int size, float scale = 1.0f);
|
bool DrawTilePainter(const Bitmap& bitmap, int size, float scale = 1.0f);
|
||||||
bool DrawSolidTilePainter(const ImVec4& color, int size);
|
bool DrawSolidTilePainter(const ImVec4& color, int size);
|
||||||
|
|
||||||
|
// Draws a tile on the canvas at the specified position
|
||||||
|
void DrawTileOnBitmap(const ImVec2& position, int tile_size,
|
||||||
|
gfx::Bitmap& bitmap, uint16_t color);
|
||||||
|
|
||||||
// Dictates which tile is currently selected based on what the user clicks
|
// Dictates which tile is currently selected based on what the user clicks
|
||||||
// in the canvas window. Represented and split apart into a grid of tiles.
|
// in the canvas window. Represented and split apart into a grid of tiles.
|
||||||
void DrawTileSelector(int size);
|
void DrawTileSelector(int size);
|
||||||
@@ -56,6 +60,7 @@ class Canvas {
|
|||||||
gfx::Bitmap& destination, int& current_tile,
|
gfx::Bitmap& destination, int& current_tile,
|
||||||
float scale = 1.0f, int tile_painter_size = 16,
|
float scale = 1.0f, int tile_painter_size = 16,
|
||||||
int tiles_per_row = 8);
|
int tiles_per_row = 8);
|
||||||
|
|
||||||
void RenderUpdatedBitmap(const ImVec2& click_position, const Bytes& tile_data,
|
void RenderUpdatedBitmap(const ImVec2& click_position, const Bytes& tile_data,
|
||||||
gfx::Bitmap& destination);
|
gfx::Bitmap& destination);
|
||||||
|
|
||||||
@@ -78,7 +83,7 @@ class Canvas {
|
|||||||
auto GetDrawList() const { return draw_list_; }
|
auto GetDrawList() const { return draw_list_; }
|
||||||
auto GetZeroPoint() const { return canvas_p0_; }
|
auto GetZeroPoint() const { return canvas_p0_; }
|
||||||
auto Scrolling() const { return scrolling_; }
|
auto Scrolling() const { return scrolling_; }
|
||||||
auto GetCurrentDrawnTilePosition() const { return drawn_tile_pos_; }
|
auto drawn_tile_position() const { return drawn_tile_pos_; }
|
||||||
auto GetCanvasSize() const { return canvas_sz_; }
|
auto GetCanvasSize() const { return canvas_sz_; }
|
||||||
void SetCanvasSize(ImVec2 canvas_size) {
|
void SetCanvasSize(ImVec2 canvas_size) {
|
||||||
canvas_sz_ = canvas_size;
|
canvas_sz_ = canvas_size;
|
||||||
|
|||||||
Reference in New Issue
Block a user