edger_bevy_shape/
shape.rs1use 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}