molgfx_render/engine/chunk_placement/
relations.rs1use super::{ChunkPlacementError, ChunkPlacementId};
2use molgfx_core::{ChunkVisualDescriptor, RelationStyle, ResidencyTicket, VisualCompatibility};
3use std::sync::Arc;
4
5#[derive(Clone, Debug, PartialEq)]
7pub struct RelationChunkPlacement {
8 id: ChunkPlacementId,
9 ticket: ResidencyTicket,
10 style: RelationStyle,
11 visual: Option<Arc<ChunkVisualDescriptor>>,
12}
13
14impl RelationChunkPlacement {
15 pub fn new(
21 id: ChunkPlacementId,
22 ticket: ResidencyTicket,
23 style: RelationStyle,
24 ) -> Result<Self, ChunkPlacementError> {
25 if !style.width_pixels.is_finite()
26 || style.width_pixels <= 0.0
27 || !style.opacity.is_finite()
28 || !(0.0..=1.0).contains(&style.opacity)
29 || style
30 .endpoint_insets_pixels
31 .iter()
32 .any(|value| !value.is_finite() || *value < 0.0)
33 {
34 return Err(ChunkPlacementError::InvalidRelationStyle);
35 }
36 Ok(Self {
37 id,
38 ticket,
39 style,
40 visual: None,
41 })
42 }
43
44 pub fn with_visual(
50 mut self,
51 visual: Arc<ChunkVisualDescriptor>,
52 ) -> Result<Self, ChunkPlacementError> {
53 visual
54 .style()
55 .program()
56 .validate_compatibility(VisualCompatibility::RELATIONS)
57 .map_err(|_| ChunkPlacementError::InvalidRelationVisual)?;
58 self.visual = Some(visual);
59 Ok(self)
60 }
61
62 #[must_use]
64 pub const fn id(&self) -> ChunkPlacementId {
65 self.id
66 }
67
68 #[must_use]
70 pub const fn ticket(&self) -> ResidencyTicket {
71 self.ticket
72 }
73
74 #[must_use]
76 pub const fn style(&self) -> RelationStyle {
77 self.style
78 }
79
80 #[must_use]
82 pub const fn visual(&self) -> Option<&Arc<ChunkVisualDescriptor>> {
83 self.visual.as_ref()
84 }
85}