bevy_mesh/primitives/dim3/
polyline3d.rs

1use crate::{Indices, Mesh, MeshBuilder, Meshable, PrimitiveTopology};
2use bevy_asset::RenderAssetUsages;
3use bevy_math::primitives::Polyline3d;
4use bevy_reflect::prelude::*;
5
6/// A builder used for creating a [`Mesh`] with a [`Polyline3d`] shape.
7#[derive(Clone, Debug, Default, Reflect)]
8#[reflect(Default, Debug, Clone)]
9pub struct Polyline3dMeshBuilder {
10    polyline: Polyline3d,
11}
12
13impl MeshBuilder for Polyline3dMeshBuilder {
14    fn build(&self) -> Mesh {
15        let positions: Vec<_> = self.polyline.vertices.clone();
16
17        let indices = Indices::U32(
18            (0..self.polyline.vertices.len() as u32 - 1)
19                .flat_map(|i| [i, i + 1])
20                .collect(),
21        );
22
23        Mesh::new(PrimitiveTopology::LineList, RenderAssetUsages::default())
24            .with_inserted_indices(indices)
25            .with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, positions)
26    }
27}
28
29impl Meshable for Polyline3d {
30    type Output = Polyline3dMeshBuilder;
31
32    fn mesh(&self) -> Self::Output {
33        Polyline3dMeshBuilder {
34            polyline: self.clone(),
35        }
36    }
37}
38
39impl From<Polyline3d> for Mesh {
40    fn from(polyline: Polyline3d) -> Self {
41        polyline.mesh().build()
42    }
43}