dear_implot3d/plots/
surface.rs1use 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}