dear_implot3d/plots/
quads.rs

1use super::{Plot3D, Plot3DError, validate_lengths, validate_multiple, validate_nonempty};
2use crate::{Plot3DUi, Quad3DFlags};
3
4pub struct Quads3D<'a> {
5    pub label: &'a str,
6    pub xs_f32: Option<&'a [f32]>,
7    pub ys_f32: Option<&'a [f32]>,
8    pub zs_f32: Option<&'a [f32]>,
9    pub xs_f64: Option<&'a [f64]>,
10    pub ys_f64: Option<&'a [f64]>,
11    pub zs_f64: Option<&'a [f64]>,
12    pub flags: Quad3DFlags,
13    pub offset: i32,
14    pub stride: i32,
15    pub points_f32: Option<&'a [[f32; 3]]>,
16    pub points_f64: Option<&'a [[f64; 3]]>,
17}
18
19impl<'a> Quads3D<'a> {
20    pub fn f32(label: &'a str, xs: &'a [f32], ys: &'a [f32], zs: &'a [f32]) -> Self {
21        Self {
22            label,
23            xs_f32: Some(xs),
24            ys_f32: Some(ys),
25            zs_f32: Some(zs),
26            xs_f64: None,
27            ys_f64: None,
28            zs_f64: None,
29            flags: Quad3DFlags::NONE,
30            offset: 0,
31            stride: 0,
32            points_f32: None,
33            points_f64: None,
34        }
35    }
36    pub fn f64(label: &'a str, xs: &'a [f64], ys: &'a [f64], zs: &'a [f64]) -> Self {
37        Self {
38            label,
39            xs_f32: None,
40            ys_f32: None,
41            zs_f32: None,
42            xs_f64: Some(xs),
43            ys_f64: Some(ys),
44            zs_f64: Some(zs),
45            flags: Quad3DFlags::NONE,
46            offset: 0,
47            stride: 0,
48            points_f32: None,
49            points_f64: None,
50        }
51    }
52    pub fn points_f32(label: &'a str, pts: &'a [[f32; 3]]) -> Self {
53        Self {
54            label,
55            xs_f32: None,
56            ys_f32: None,
57            zs_f32: None,
58            xs_f64: None,
59            ys_f64: None,
60            zs_f64: None,
61            flags: Quad3DFlags::NONE,
62            offset: 0,
63            stride: 0,
64            points_f32: Some(pts),
65            points_f64: None,
66        }
67    }
68    pub fn points_f64(label: &'a str, pts: &'a [[f64; 3]]) -> Self {
69        Self {
70            label,
71            xs_f32: None,
72            ys_f32: None,
73            zs_f32: None,
74            xs_f64: None,
75            ys_f64: None,
76            zs_f64: None,
77            flags: Quad3DFlags::NONE,
78            offset: 0,
79            stride: 0,
80            points_f32: None,
81            points_f64: Some(pts),
82        }
83    }
84    pub fn flags(mut self, flags: Quad3DFlags) -> Self {
85        self.flags = flags;
86        self
87    }
88    pub fn offset(mut self, o: i32) -> Self {
89        self.offset = o;
90        self
91    }
92    pub fn stride(mut self, s: i32) -> Self {
93        self.stride = s;
94        self
95    }
96}
97
98impl<'a> Plot3D for Quads3D<'a> {
99    fn label(&self) -> &str {
100        self.label
101    }
102    fn try_plot(&self, ui: &Plot3DUi<'_>) -> Result<(), Plot3DError> {
103        if let Some(pts) = self.points_f32 {
104            validate_nonempty(pts)?;
105            validate_multiple(pts.len(), 4, "quads(points)")?;
106            let mut xs = Vec::with_capacity(pts.len());
107            let mut ys = Vec::with_capacity(pts.len());
108            let mut zs = Vec::with_capacity(pts.len());
109            for p in pts {
110                xs.push(p[0]);
111                ys.push(p[1]);
112                zs.push(p[2]);
113            }
114            ui.plot_quads_f32(self.label, &xs, &ys, &zs, self.flags);
115            return Ok(());
116        }
117        if let Some(pts) = self.points_f64 {
118            validate_nonempty(pts)?;
119            validate_multiple(pts.len(), 4, "quads(points)")?;
120            let mut xs = Vec::with_capacity(pts.len());
121            let mut ys = Vec::with_capacity(pts.len());
122            let mut zs = Vec::with_capacity(pts.len());
123            for p in pts {
124                xs.push(p[0]);
125                ys.push(p[1]);
126                zs.push(p[2]);
127            }
128            ui.plot_quads_f64(self.label, &xs, &ys, &zs, self.flags);
129            return Ok(());
130        }
131        if let (Some(x), Some(y), Some(z)) = (self.xs_f32, self.ys_f32, self.zs_f32) {
132            validate_nonempty(x)?;
133            validate_lengths(x, y, "x/y")?;
134            validate_lengths(y, z, "y/z")?;
135            validate_multiple(x.len(), 4, "quads")?;
136            ui.plot_quads_f32_raw(self.label, x, y, z, self.flags, self.offset, self.stride);
137            return Ok(());
138        }
139        if let (Some(x), Some(y), Some(z)) = (self.xs_f64, self.ys_f64, self.zs_f64) {
140            validate_nonempty(x)?;
141            validate_lengths(x, y, "x/y")?;
142            validate_lengths(y, z, "y/z")?;
143            validate_multiple(x.len(), 4, "quads")?;
144            ui.plot_quads_f64_raw(self.label, x, y, z, self.flags, self.offset, self.stride);
145            return Ok(());
146        }
147        Err(Plot3DError::EmptyData)
148    }
149}