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}