Skip to content

Commit

Permalink
Fix event preview rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
Speak2Erase committed Jun 16, 2024
1 parent 00fa7a6 commit d6d5041
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions crates/components/src/map_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ pub struct MapView {

/// The first sprite is for drawing on the tilemap,
/// and the second sprite is for the hover preview.
preview_events: HashMap<usize, luminol_graphics::Event>,
last_events: HashMap<usize, luminol_graphics::Event>,
preview_events: HashMap<usize, PreviewEvent>,
last_events: HashMap<usize, PreviewEvent>,
pub map: luminol_graphics::Map,

pub selected_layer: SelectedLayer,
Expand Down Expand Up @@ -64,6 +64,11 @@ pub struct MapView {
pub data_id: egui::Id,
}

struct PreviewEvent {
viewport: luminol_graphics::Viewport,
sprite: luminol_graphics::Event,
}

#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Default)]
pub enum SelectedLayer {
#[default]
Expand Down Expand Up @@ -376,6 +381,7 @@ impl MapView {

// update relevant properties
if let Some(sprite) = sprite {
// FIXME only update if necessary
sprite.set_position(&update_state.graphics.render_state, event.x, event.y);
sprite.sprite.graphic.set_opacity_multiplier(
&update_state.graphics.render_state,
Expand Down Expand Up @@ -444,38 +450,44 @@ impl MapView {
);

if has_sprite {
let mut preview_sprite =
let mut preview =
self.last_events.remove(&event.id).unwrap_or_else(|| {
let viewport = luminol_graphics::Viewport::new(
&update_state.graphics,
glam::vec2(event_size.x, event_size.y),
);
luminol_graphics::Event::new_standalone(
let sprite = luminol_graphics::Event::new_standalone(
&update_state.graphics,
update_state.filesystem,
&viewport,
event,
&self.map.atlas,
)
.unwrap()
.unwrap()
.unwrap(); // FIXME: handle error
PreviewEvent { viewport, sprite }
});

if response.rect.is_positive() {
let clipped_rect =
ui.ctx().screen_rect().intersect(response.rect);
preview.viewport.set_size(
&update_state.graphics.render_state,
glam::vec2(clipped_rect.width(), clipped_rect.height()),
);

let painter = luminol_graphics::Painter::new(
preview_sprite.prepare(&update_state.graphics),
preview.sprite.prepare(&update_state.graphics),
);
ui.painter().add(
luminol_egui_wgpu::Callback::new_paint_callback(
clipped_rect,
painter,
),
);
}

self.preview_events.insert(event.id, preview_sprite);
self.preview_events.insert(event.id, preview);
}
}

match self.selected_event_id {
Expand Down Expand Up @@ -550,6 +562,9 @@ impl MapView {
}
}

self.last_events.clear();
std::mem::swap(&mut self.preview_events, &mut self.last_events); // swap and clear preview events, so we only keep the ones used this frame

self.selected_event_id = selected_event.map(|e| e.id);

// Draw white rectangles on the border of all events
Expand Down

0 comments on commit d6d5041

Please sign in to comment.