bevy_mesh/primitives/dim3/
segment3d.rs

1use crate::{Indices, Mesh, MeshBuilder, Meshable, PrimitiveTopology};
2use bevy_asset::RenderAssetUsages;
3use bevy_math::primitives::Segment3d;
4use bevy_reflect::prelude::*;
5
6/// A builder used for creating a [`Mesh`] with a [`Segment3d`] shape.
7#[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}