stage: dashed black/yellow border around the active raster layer

Outline the active raster layer's canvas bounds (document space) so its size is
visible, especially when it differs from the document after a resize. Two strokes
sharing one dash pattern, the yellow offset by a dash to fill the black's gaps -
interlocking marching-ants. Sizes divided by zoom so the dashes stay ~constant on
screen.
This commit is contained in:
Skyler Lehmkuhl 2026-06-26 15:00:28 -04:00
parent 5bc117c518
commit 69939c066d
1 changed files with 31 additions and 0 deletions

View File

@ -2074,6 +2074,37 @@ impl egui_wgpu::CallbackTrait for VelloCallback {
scene scene
}; };
// Active raster-layer border: a black+yellow dashed outline of the layer's canvas bounds (in
// document space) so its size is visible — especially when it differs from the document (e.g.
// after a doc resize). Two strokes sharing one dash pattern, offset by a dash so the yellow
// fills the black's gaps → interlocking black/yellow marching-ants.
if let Some(active_id) = self.ctx.active_layer_id {
if let Some(lightningbeam_core::layer::AnyLayer::Raster(rl)) = self.ctx.document.get_layer(&active_id) {
if let Some(kf) = rl.keyframe_at(self.ctx.document.current_time) {
let rect = vello::kurbo::Rect::new(0.0, 0.0, kf.width as f64, kf.height as f64);
// Sizes are in document space; divide by zoom so they're ~constant on screen.
let inv_zoom = 1.0 / (self.ctx.zoom as f64).max(1e-3);
let stroke_w = 1.5 * inv_zoom;
let dash = 6.0 * inv_zoom;
let pattern = [dash, dash];
scene.stroke(
&vello::kurbo::Stroke::new(stroke_w).with_dashes(0.0, pattern),
camera_transform,
vello::peniko::Color::new([0.0, 0.0, 0.0, 1.0]),
None,
&rect,
);
scene.stroke(
&vello::kurbo::Stroke::new(stroke_w).with_dashes(dash, pattern),
camera_transform,
vello::peniko::Color::new([1.0, 0.85, 0.0, 1.0]),
None,
&rect,
);
}
}
}
// Render drag preview objects with transparency // Render drag preview objects with transparency
if let (Some(delta), Some(active_layer_id)) = (self.ctx.drag_delta, self.ctx.active_layer_id) { if let (Some(delta), Some(active_layer_id)) = (self.ctx.drag_delta, self.ctx.active_layer_id) {
if let Some(layer) = self.ctx.document.get_layer(&active_layer_id) { if let Some(layer) = self.ctx.document.get_layer(&active_layer_id) {