Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_mesh/src/primitives/dim3/segment3d.rs
6598 views
1
use crate::{Indices, Mesh, MeshBuilder, Meshable, PrimitiveTopology};
2
use bevy_asset::RenderAssetUsages;
3
use bevy_math::primitives::Segment3d;
4
use 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)]
9
pub struct Segment3dMeshBuilder {
10
segment: Segment3d,
11
}
12
13
impl 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
24
impl Meshable for Segment3d {
25
type Output = Segment3dMeshBuilder;
26
27
fn mesh(&self) -> Self::Output {
28
Segment3dMeshBuilder { segment: *self }
29
}
30
}
31
32
impl From<Segment3d> for Mesh {
33
fn from(segment: Segment3d) -> Self {
34
segment.mesh().build()
35
}
36
}
37
38
#[cfg(test)]
39
mod 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
}
52
53