edger_bevy_shape/
shape.rs

1use bevy::prelude::*;
2use bevy_prototype_lyon::entity::ShapeBundle;
3use bevy_prototype_lyon::prelude::*;
4
5pub trait Shape {
6    fn _create(&self, commands: &mut Commands, entity: Entity);
7    fn create(&self, commands: &mut Commands, parent: Entity) -> Entity {
8        let entity = commands.spawn_empty().id();
9        commands.entity(parent).add_children(&[entity]);
10        self._create(commands, entity);
11        entity
12    }
13    fn update(&self, commands: &mut Commands, entity: Entity) {
14        commands.entity(entity).remove::<ShapeBundle>();
15        self._create(commands, entity);
16    }
17}
18
19pub trait SingleShape<T: Geometry>: Shape {
20    fn get_shape(&self) -> T;
21    fn get_fill(&self) -> Option<Fill> {
22        None
23    }
24    fn get_stroke(&self) -> Option<Stroke> {
25        None
26    }
27    fn get_transform(&self) -> Transform;
28    fn _do_create(&self, commands: &mut Commands, entity: Entity) {
29        let shape = self.get_shape();
30        let mut op = commands.entity(entity);
31        op
32            .insert(ShapeBundle {
33                path: GeometryBuilder::build_as(&shape),
34                transform: self.get_transform(),
35                ..default()
36            });
37        if let Some(fill) = self.get_fill() {
38            op.insert(fill);
39        }
40        if let Some(stroke) = self.get_stroke() {
41            op.insert(stroke);
42        }
43    }
44}
45
46pub trait ShapeOp<Env, S: Shape>: Clone + Component {
47    fn get_shape(&self, env: &Env) -> S;
48    fn create(&self, commands: &mut Commands, env: &Env, parent: Entity) -> Entity {
49        let shape = self.get_shape(env);
50        let shape_entity = shape.create(commands, parent);
51        commands.entity(shape_entity).insert(self.clone());
52        shape_entity
53    }
54    fn update(&self, commands: &mut Commands, env: &Env, entity: Entity) {
55        let shape = self.get_shape(env);
56        shape.update(commands, entity);
57    }
58}