Add and impl Primitives (#10580)
# Add and implement constructors for Primitives - Adds more Primitive types and adds a constructor for almost all of them - Works towards finishing #10572 ## Solution - Created new primitives - Torus - Conical Frustum - Cone - Ellipse - Implemented constructors (`Primitive::new`) for almost every single other primitive. --------- Co-authored-by: Joona Aalto <jondolf.dev@gmail.com> Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
This commit is contained in:
		
							parent
							
								
									0c9f265423
								
							
						
					
					
						commit
						33cd59fb04
					
				| @ -34,6 +34,26 @@ pub struct Circle { | ||||
| } | ||||
| impl Primitive2d for Circle {} | ||||
| 
 | ||||
| /// An ellipse primitive
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| pub struct Ellipse { | ||||
|     /// The half "width" of the ellipse
 | ||||
|     pub half_width: f32, | ||||
|     /// The half "height" of the ellipse
 | ||||
|     pub half_height: f32, | ||||
| } | ||||
| impl Primitive2d for Ellipse {} | ||||
| 
 | ||||
| impl Ellipse { | ||||
|     /// Create a new `Ellipse` from a "width" and a "height"
 | ||||
|     pub fn new(width: f32, height: f32) -> Self { | ||||
|         Self { | ||||
|             half_width: width / 2.0, | ||||
|             half_height: height / 2.0, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// An unbounded plane in 2D space. It forms a separating surface through the origin,
 | ||||
| /// stretching infinitely far
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| @ -108,6 +128,24 @@ pub struct Polyline2d<const N: usize> { | ||||
| } | ||||
| impl<const N: usize> Primitive2d for Polyline2d<N> {} | ||||
| 
 | ||||
| impl<const N: usize> FromIterator<Vec2> for Polyline2d<N> { | ||||
|     fn from_iter<I: IntoIterator<Item = Vec2>>(iter: I) -> Self { | ||||
|         let mut vertices: [Vec2; N] = [Vec2::ZERO; N]; | ||||
| 
 | ||||
|         for (index, i) in iter.into_iter().take(N).enumerate() { | ||||
|             vertices[index] = i; | ||||
|         } | ||||
|         Self { vertices } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<const N: usize> Polyline2d<N> { | ||||
|     /// Create a new `Polyline2d` from its vertices
 | ||||
|     pub fn new(vertices: impl IntoIterator<Item = Vec2>) -> Self { | ||||
|         Self::from_iter(vertices) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A series of connected line segments in 2D space, allocated on the heap
 | ||||
| /// in a `Box<[Vec2]>`.
 | ||||
| ///
 | ||||
| @ -119,6 +157,22 @@ pub struct BoxedPolyline2d { | ||||
| } | ||||
| impl Primitive2d for BoxedPolyline2d {} | ||||
| 
 | ||||
| impl FromIterator<Vec2> for BoxedPolyline2d { | ||||
|     fn from_iter<I: IntoIterator<Item = Vec2>>(iter: I) -> Self { | ||||
|         let vertices: Vec<Vec2> = iter.into_iter().collect(); | ||||
|         Self { | ||||
|             vertices: vertices.into_boxed_slice(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl BoxedPolyline2d { | ||||
|     /// Create a new `BoxedPolyline2d` from its vertices
 | ||||
|     pub fn new(vertices: impl IntoIterator<Item = Vec2>) -> Self { | ||||
|         Self::from_iter(vertices) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A triangle in 2D space
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct Triangle2d { | ||||
| @ -127,6 +181,15 @@ pub struct Triangle2d { | ||||
| } | ||||
| impl Primitive2d for Triangle2d {} | ||||
| 
 | ||||
| impl Triangle2d { | ||||
|     /// Create a new `Triangle2d` from `a`, `b`, and `c`,
 | ||||
|     pub fn new(a: Vec2, b: Vec2, c: Vec2) -> Self { | ||||
|         Self { | ||||
|             vertices: [a, b, c], | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A rectangle primitive
 | ||||
| #[doc(alias = "Quad")] | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| @ -158,22 +221,56 @@ impl Rectangle { | ||||
| /// For a version without generics: [`BoxedPolygon`]
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct Polygon<const N: usize> { | ||||
|     /// The vertices of the polygon
 | ||||
|     /// The vertices of the `Polygon`
 | ||||
|     pub vertices: [Vec2; N], | ||||
| } | ||||
| impl<const N: usize> Primitive2d for Polygon<N> {} | ||||
| 
 | ||||
| impl<const N: usize> FromIterator<Vec2> for Polygon<N> { | ||||
|     fn from_iter<I: IntoIterator<Item = Vec2>>(iter: I) -> Self { | ||||
|         let mut vertices: [Vec2; N] = [Vec2::ZERO; N]; | ||||
| 
 | ||||
|         for (index, i) in iter.into_iter().take(N).enumerate() { | ||||
|             vertices[index] = i; | ||||
|         } | ||||
|         Self { vertices } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<const N: usize> Polygon<N> { | ||||
|     /// Create a new `Polygon` from its vertices
 | ||||
|     pub fn new(vertices: impl IntoIterator<Item = Vec2>) -> Self { | ||||
|         Self::from_iter(vertices) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A polygon with a variable number of vertices, allocated on the heap
 | ||||
| /// in a `Box<[Vec2]>`.
 | ||||
| ///
 | ||||
| /// For a version without alloc: [`Polygon`]
 | ||||
| #[derive(Clone, Debug)] | ||||
| pub struct BoxedPolygon { | ||||
|     /// The vertices of the polygon
 | ||||
|     /// The vertices of the `BoxedPolygon`
 | ||||
|     pub vertices: Box<[Vec2]>, | ||||
| } | ||||
| impl Primitive2d for BoxedPolygon {} | ||||
| 
 | ||||
| impl FromIterator<Vec2> for BoxedPolygon { | ||||
|     fn from_iter<I: IntoIterator<Item = Vec2>>(iter: I) -> Self { | ||||
|         let vertices: Vec<Vec2> = iter.into_iter().collect(); | ||||
|         Self { | ||||
|             vertices: vertices.into_boxed_slice(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl BoxedPolygon { | ||||
|     /// Create a new `BoxedPolygon` from its vertices
 | ||||
|     pub fn new(vertices: impl IntoIterator<Item = Vec2>) -> Self { | ||||
|         Self::from_iter(vertices) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A polygon where all vertices lie on a circle, equally far apart
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| pub struct RegularPolygon { | ||||
| @ -183,3 +280,21 @@ pub struct RegularPolygon { | ||||
|     pub sides: usize, | ||||
| } | ||||
| impl Primitive2d for RegularPolygon {} | ||||
| 
 | ||||
| impl RegularPolygon { | ||||
|     /// Create a new `RegularPolygon`
 | ||||
|     /// from the radius of the circumcircle and number of sides
 | ||||
|     ///
 | ||||
|     /// # Panics
 | ||||
|     ///
 | ||||
|     /// Panics if `circumcircle_radius` is non-positive
 | ||||
|     pub fn new(circumcircle_radius: f32, sides: usize) -> Self { | ||||
|         assert!(circumcircle_radius > 0.0); | ||||
|         Self { | ||||
|             circumcircle: Circle { | ||||
|                 radius: circumcircle_radius, | ||||
|             }, | ||||
|             sides, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -107,6 +107,24 @@ pub struct Polyline3d<const N: usize> { | ||||
| } | ||||
| impl<const N: usize> Primitive3d for Polyline3d<N> {} | ||||
| 
 | ||||
| impl<const N: usize> FromIterator<Vec3> for Polyline3d<N> { | ||||
|     fn from_iter<I: IntoIterator<Item = Vec3>>(iter: I) -> Self { | ||||
|         let mut vertices: [Vec3; N] = [Vec3::ZERO; N]; | ||||
| 
 | ||||
|         for (index, i) in iter.into_iter().take(N).enumerate() { | ||||
|             vertices[index] = i; | ||||
|         } | ||||
|         Self { vertices } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<const N: usize> Polyline3d<N> { | ||||
|     /// Create a new `Polyline3d` from its vertices
 | ||||
|     pub fn new(vertices: impl IntoIterator<Item = Vec3>) -> Self { | ||||
|         Self::from_iter(vertices) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A series of connected line segments in 3D space, allocated on the heap
 | ||||
| /// in a `Box<[Vec3]>`.
 | ||||
| ///
 | ||||
| @ -118,6 +136,22 @@ pub struct BoxedPolyline3d { | ||||
| } | ||||
| impl Primitive3d for BoxedPolyline3d {} | ||||
| 
 | ||||
| impl FromIterator<Vec3> for BoxedPolyline3d { | ||||
|     fn from_iter<I: IntoIterator<Item = Vec3>>(iter: I) -> Self { | ||||
|         let vertices: Vec<Vec3> = iter.into_iter().collect(); | ||||
|         Self { | ||||
|             vertices: vertices.into_boxed_slice(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl BoxedPolyline3d { | ||||
|     /// Create a new `BoxedPolyline3d` from its vertices
 | ||||
|     pub fn new(vertices: impl IntoIterator<Item = Vec3>) -> Self { | ||||
|         Self::from_iter(vertices) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A cuboid primitive, more commonly known as a box.
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| pub struct Cuboid { | ||||
| @ -171,3 +205,47 @@ pub struct Capsule { | ||||
| } | ||||
| impl super::Primitive2d for Capsule {} | ||||
| impl Primitive3d for Capsule {} | ||||
| 
 | ||||
| impl Capsule { | ||||
|     /// Create a new `Capsule` from a radius and length
 | ||||
|     pub fn new(radius: f32, length: f32) -> Self { | ||||
|         Self { | ||||
|             radius, | ||||
|             half_length: length / 2.0, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A cone primitive.
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| pub struct Cone { | ||||
|     /// The radius of the base
 | ||||
|     pub radius: f32, | ||||
|     /// The height of the cone
 | ||||
|     pub height: f32, | ||||
| } | ||||
| impl Primitive3d for Cone {} | ||||
| 
 | ||||
| /// A conical frustum primitive.
 | ||||
| /// A conical frustum can be created
 | ||||
| /// by slicing off a section of a cone.
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| pub struct ConicalFrustum { | ||||
|     /// The radius of the top of the frustum
 | ||||
|     pub radius_top: f32, | ||||
|     /// The radius of the base of the frustum
 | ||||
|     pub radius_bottom: f32, | ||||
|     /// The height of the frustum
 | ||||
|     pub height: f32, | ||||
| } | ||||
| impl Primitive3d for ConicalFrustum {} | ||||
| 
 | ||||
| /// A torus (AKA donut) primitive.
 | ||||
| #[derive(Clone, Copy, Debug)] | ||||
| pub struct Torus { | ||||
|     /// The radius of the overall shape
 | ||||
|     pub radius: f32, | ||||
|     /// The radius of the internal ring
 | ||||
|     pub ring_radius: f32, | ||||
| } | ||||
| impl Primitive3d for Torus {} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Aztro
						Aztro