bevy_mesh/primitives/dim3/
segment3d.rs1use crate::{Indices, Mesh, MeshBuilder, Meshable, PrimitiveTopology};
2use bevy_asset::RenderAssetUsages;
3use bevy_math::primitives::Segment3d;
4use bevy_reflect::prelude::*;
5
6#[derive(Clone, Copy, Debug, Default, Reflect)]
8#[reflect(Default, Debug, Clone)]
9pub struct Segment3dMeshBuilder {
10 segment: Segment3d,
11}
12
13impl MeshBuilder for Segment3dMeshBuilder {
14 fn build(&self) -> Mesh {
15 let positions: Vec<_> = self.segment.vertices.into();
16 let indices = Indices::U32(vec![0, 1]);
17
18 Mesh::new(PrimitiveTopology::LineList, RenderAssetUsages::default())
19 .with_inserted_indices(indices)
20 .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
21 }
22}
23
24impl Meshable for Segment3d {
25 type Output = Segment3dMeshBuilder;
26
27 fn mesh(&self) -> Self::Output {
28 Segment3dMeshBuilder { segment: *self }
29 }
30}
31
32impl From<Segment3d> for Mesh {
33 fn from(segment: Segment3d) -> Self {
34 segment.mesh().build()
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41 use crate::Meshable;
42 use bevy_math::Vec3;
43
44 #[test]
45 fn segment3d_mesh_builder() {
46 let segment = Segment3d::new(Vec3::ZERO, Vec3::X);
47 let mesh = segment.mesh().build();
48 assert_eq!(mesh.attribute(Mesh::ATTRIBUTE_POSITION).unwrap().len(), 2);
49 assert_eq!(mesh.indices().unwrap().len(), 2);
50 }
51}