dear_implot3d/plots/
surface.rs

1use super::{Plot3D, Plot3DError};
2use crate::{Plot3DUi, Surface3DFlags};
3
4pub struct Surface3D<'a> {
5    pub label: &'a str,
6    pub xs: &'a [f32],
7    pub ys: &'a [f32],
8    pub zs: &'a [f32],
9    pub scale_min: f64,
10    pub scale_max: f64,
11    pub flags: Surface3DFlags,
12    pub offset: i32,
13    pub stride: i32,
14}
15
16impl<'a> Surface3D<'a> {
17    pub fn new(label: &'a str, xs: &'a [f32], ys: &'a [f32], zs: &'a [f32]) -> Self {
18        Self {
19            label,
20            xs,
21            ys,
22            zs,
23            scale_min: f64::NAN,
24            scale_max: f64::NAN,
25            flags: Surface3DFlags::NONE,
26            offset: 0,
27            stride: 0,
28        }
29    }
30    pub fn scale(mut self, min: f64, max: f64) -> Self {
31        self.scale_min = min;
32        self.scale_max = max;
33        self
34    }
35    pub fn flags(mut self, flags: Surface3DFlags) -> Self {
36        self.flags = flags;
37        self
38    }
39    pub fn offset(mut self, o: i32) -> Self {
40        self.offset = o;
41        self
42    }
43    pub fn stride(mut self, s: i32) -> Self {
44        self.stride = s;
45        self
46    }
47}
48
49impl<'a> Plot3D for Surface3D<'a> {
50    fn label(&self) -> &str {
51        self.label
52    }
53    fn try_plot(&self, ui: &Plot3DUi<'_>) -> Result<(), Plot3DError> {
54        let x_count = self.xs.len();
55        let y_count = self.ys.len();
56        let expected = x_count
57            .checked_mul(y_count)
58            .ok_or(Plot3DError::GridSizeMismatch {
59                x_count,
60                y_count,
61                z_len: self.zs.len(),
62            })?;
63        if self.zs.len() != expected {
64            return Err(Plot3DError::GridSizeMismatch {
65                x_count,
66                y_count,
67                z_len: self.zs.len(),
68            });
69        }
70        ui.surface_f32_raw(
71            self.label,
72            self.xs,
73            self.ys,
74            self.zs,
75            self.scale_min,
76            self.scale_max,
77            self.flags,
78            self.offset,
79            self.stride,
80        );
81        Ok(())
82    }
83}