 03f4cc5dde
			
		
	
	
		03f4cc5dde
		
			
		
	
	
	
	
		
			
			# Objective - Adds a basic `Extrusion<T: Primitive2d>` shape, suggestion of #10572 ## Solution - Adds `Measured2d` and `Measured3d` traits for getting the perimeter/area or area/volume of shapes. This allows implementing `.volume()` and `.area()` for all extrusions `Extrusion<T: Primitive2d + Measured2d>` within `bevy_math` - All existing perimeter, area and volume implementations for primitves have been moved into implementations of `Measured2d` and `Measured3d` - Shapes should be extruded along the Z-axis since an extrusion of depth `0.` should be equivalent in everything but name to the base shape ## Caviats - I am not sure about the naming. `Extrusion<T>` could also be `Prism<T>` and the `MeasuredNd` could also be something like `MeasuredPrimitiveNd`. If you have any other suggestions, please fell free to share them :) ## Future work This PR adds a basic `Extrusion` shape and does not implement a lot of things you might want it to. Some of the future possibilities include: - [ ] bounding for extrusions - [ ] making extrusions work with gizmos - [ ] meshing --------- Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! This module defines primitive shapes.
 | |
| //! The origin is (0, 0) for 2D primitives and (0, 0, 0) for 3D primitives,
 | |
| //! unless stated otherwise.
 | |
| 
 | |
| mod dim2;
 | |
| pub use dim2::*;
 | |
| mod dim3;
 | |
| pub use dim3::*;
 | |
| #[cfg(feature = "serialize")]
 | |
| mod serde;
 | |
| 
 | |
| /// A marker trait for 2D primitives
 | |
| pub trait Primitive2d {}
 | |
| 
 | |
| /// A marker trait for 3D primitives
 | |
| pub trait Primitive3d {}
 | |
| 
 | |
| /// The winding order for a set of points
 | |
| #[derive(Clone, Copy, Debug, PartialEq, Eq)]
 | |
| #[doc(alias = "Orientation")]
 | |
| pub enum WindingOrder {
 | |
|     /// A clockwise winding order
 | |
|     Clockwise,
 | |
|     /// A counterclockwise winding order
 | |
|     #[doc(alias = "AntiClockwise")]
 | |
|     CounterClockwise,
 | |
|     /// An invalid winding order indicating that it could not be computed reliably.
 | |
|     /// This often happens in *degenerate cases* where the points lie on the same line
 | |
|     #[doc(alias("Degenerate", "Collinear"))]
 | |
|     Invalid,
 | |
| }
 | |
| 
 | |
| /// A trait for getting measurements of 2D shapes
 | |
| pub trait Measured2d {
 | |
|     /// Get the perimeter of the shape
 | |
|     fn perimeter(&self) -> f32;
 | |
| 
 | |
|     /// Get the area of the shape
 | |
|     fn area(&self) -> f32;
 | |
| }
 | |
| 
 | |
| /// A trait for getting measurements of 3D shapes
 | |
| pub trait Measured3d {
 | |
|     /// Get the surface area of the shape
 | |
|     fn area(&self) -> f32;
 | |
| 
 | |
|     /// Get the volume of the shape
 | |
|     fn volume(&self) -> f32;
 | |
| }
 |