fj_core/layers/
geometry.rs

1//! Layer infrastructure for [`Geometry`]
2
3use crate::{
4    geometry::{Geometry, HalfEdgeGeometry, SurfaceGeometry},
5    objects::{HalfEdge, Surface},
6    storage::Handle,
7};
8
9use super::{Command, Event, Layer};
10
11impl Layer<Geometry> {
12    /// Define the geometry of the provided half-edge
13    pub fn define_half_edge(
14        &mut self,
15        half_edge: Handle<HalfEdge>,
16        geometry: HalfEdgeGeometry,
17    ) {
18        let mut events = Vec::new();
19        self.process(
20            DefineHalfEdge {
21                half_edge,
22                geometry,
23            },
24            &mut events,
25        );
26    }
27
28    /// Define the geometry of the provided surface
29    pub fn define_surface(
30        &mut self,
31        surface: Handle<Surface>,
32        geometry: SurfaceGeometry,
33    ) {
34        let mut events = Vec::new();
35        self.process(DefineSurface { surface, geometry }, &mut events);
36    }
37}
38
39/// Define the geometry of a half-edge
40pub struct DefineHalfEdge {
41    half_edge: Handle<HalfEdge>,
42    geometry: HalfEdgeGeometry,
43}
44
45impl Command<Geometry> for DefineHalfEdge {
46    type Result = ();
47    type Event = Self;
48
49    fn decide(
50        self,
51        _: &Geometry,
52        events: &mut Vec<Self::Event>,
53    ) -> Self::Result {
54        events.push(self);
55    }
56}
57
58impl Event<Geometry> for DefineHalfEdge {
59    fn evolve(&self, state: &mut Geometry) {
60        state.define_half_edge_inner(self.half_edge.clone(), self.geometry);
61    }
62}
63
64/// Define the geometry of a surface
65pub struct DefineSurface {
66    surface: Handle<Surface>,
67    geometry: SurfaceGeometry,
68}
69
70impl Command<Geometry> for DefineSurface {
71    type Result = ();
72    type Event = Self;
73
74    fn decide(
75        self,
76        _: &Geometry,
77        events: &mut Vec<Self::Event>,
78    ) -> Self::Result {
79        events.push(self);
80    }
81}
82
83impl Event<Geometry> for DefineSurface {
84    fn evolve(&self, state: &mut Geometry) {
85        state.define_surface_inner(self.surface.clone(), self.geometry);
86    }
87}