Skip to content

Commit

Permalink
use drawing modes in the tile map editor
Browse files Browse the repository at this point in the history
- rect fill is wip
  • Loading branch information
mrDIMAS committed Jul 22, 2024
1 parent cb3601f commit 304b30b
Showing 1 changed file with 52 additions and 54 deletions.
106 changes: 52 additions & 54 deletions editor/src/plugins/tilemap/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ use crate::{
engine::Engine,
graph::{BaseSceneGraph, SceneGraph, SceneGraphNode},
gui::{
button::ButtonBuilder, message::UiMessage, utils::make_simple_tooltip,
widget::WidgetBuilder, BuildContext, Thickness, UiNode, UserInterface,
button::ButtonBuilder, key::HotKey, message::KeyCode, message::UiMessage,
utils::make_simple_tooltip, widget::WidgetBuilder, BuildContext, Thickness, UiNode,
},
scene::{
debug::Line,
Expand All @@ -42,8 +42,6 @@ use crate::{
settings::Settings,
Editor, Message,
};
use fyrox::gui::key::HotKey;
use fyrox::gui::message::KeyCode;
use std::sync::Arc;

fn make_button(
Expand Down Expand Up @@ -88,7 +86,6 @@ pub struct TileMapInteractionMode {
brush_position: Vector2<i32>,
interaction_context: Option<InteractionContext>,
sender: MessageSender,
#[allow(dead_code)]
drawing_mode: DrawingMode,
}

Expand Down Expand Up @@ -116,35 +113,6 @@ impl TileMapInteractionMode {
Vector2::new(local_intersection.x as i32, local_intersection.y as i32)
})
}

fn draw_with_current_brush(
&mut self,
scene: &mut Scene,
game_scene: &GameScene,
mouse_position: Vector2<f32>,
frame_size: Vector2<f32>,
ui: &UserInterface,
) {
let modifiers = ui.keyboard_modifiers();

if let Some(grid_coord) = self.pick_grid(scene, game_scene, mouse_position, frame_size) {
self.brush_position = grid_coord;

let Some(tile_map) = scene.graph.try_get_mut_of_type::<TileMap>(self.tile_map) else {
return;
};

if self.interaction_context.is_some() {
let brush = self.brush.lock();

if modifiers.shift {
tile_map.erase(grid_coord, &brush);
} else {
tile_map.draw(grid_coord, &brush)
}
}
}
}
}

impl InteractionMode for TileMapInteractionMode {
Expand All @@ -163,21 +131,37 @@ impl InteractionMode for TileMapInteractionMode {

let scene = &mut engine.scenes[game_scene.scene];

let Some(tile_map) = scene.graph.try_get_of_type::<TileMap>(self.tile_map) else {
return;
};
let brush = self.brush.lock();

if let Some(grid_coord) = self.pick_grid(scene, game_scene, mouse_position, frame_size) {
let Some(tile_map) = scene.graph.try_get_mut_of_type::<TileMap>(self.tile_map) else {
return;
};

self.interaction_context = Some(InteractionContext {
previous_tiles: tile_map.tiles().clone(),
});
self.interaction_context = Some(InteractionContext {
previous_tiles: tile_map.tiles().clone(),
});

self.draw_with_current_brush(
scene,
game_scene,
mouse_position,
frame_size,
engine.user_interfaces.first(),
);
self.brush_position = grid_coord;

match self.drawing_mode {
DrawingMode::Draw => tile_map.draw(grid_coord, &brush),
DrawingMode::Erase => {
tile_map.erase(grid_coord, &brush);
}
DrawingMode::FloodFill => {
tile_map.flood_fill(grid_coord, &brush);
}
DrawingMode::RectFill {
ref mut click_grid_position,
}
| DrawingMode::Pick {
ref mut click_grid_position,
} => {
*click_grid_position = Some(grid_coord);
}
}
}
}

fn on_left_mouse_button_up(
Expand Down Expand Up @@ -232,13 +216,27 @@ impl InteractionMode for TileMapInteractionMode {

let scene = &mut engine.scenes[game_scene.scene];

self.draw_with_current_brush(
scene,
game_scene,
mouse_position,
frame_size,
engine.user_interfaces.first(),
);
let brush = self.brush.lock();

if let Some(grid_coord) = self.pick_grid(scene, game_scene, mouse_position, frame_size) {
let Some(tile_map) = scene.graph.try_get_mut_of_type::<TileMap>(self.tile_map) else {
return;
};

self.brush_position = grid_coord;

if self.interaction_context.is_some() {
match self.drawing_mode {
DrawingMode::Draw => tile_map.draw(grid_coord, &brush),
DrawingMode::Erase => {
tile_map.erase(grid_coord, &brush);
}
_ => {
// Do nothing
}
}
}
}
}

fn update(
Expand Down

0 comments on commit 304b30b

Please sign in to comment.