mirror of
https://github.com/bevyengine/bevy
synced 2024-11-10 15:14:50 +00:00
e1c8d60f91
# Objective This PR adds some helpers for `Triangle2d` to work with its winding order. This could also be extended to polygons (and `Triangle3d` once it's added). ## Solution - Add `WindingOrder` enum with `Clockwise`, `Counterclockwise` and `Invalid` variants - `Invalid` is for cases where the winding order can not be reliably computed, i.e. the points lie on a single line and the area is zero - Add `Triangle2d::winding_order` method that uses a signed surface area to determine the winding order - Add `Triangle2d::reverse` method that reverses the winding order by swapping the second and third vertices The API looks like this: ```rust let mut triangle = Triangle2d::new( Vec2::new(0.0, 2.0), Vec2::new(-0.5, -1.2), Vec2::new(-1.0, -1.0), ); assert_eq!(triangle.winding_order(), WindingOrder::Clockwise); // Reverse winding order triangle.reverse(); assert_eq!(triangle.winding_order(), WindingOrder::Counterclockwise); ``` I also added tests to make sure the methods work correctly. For now, they live in the same file as the primitives. ## Open questions - Should it be `Counterclockwise` or `CounterClockwise`? The first one is more correct but perhaps a bit less readable. Counter-clockwise is also a valid spelling, but it seems to be a lot less common than counterclockwise. - Is `WindingOrder::Invalid` a good name? Parry uses `TriangleOrientation::Degenerate`, but I'm not a huge fan, at least as a non-native English speaker. Any better suggestions? - Is `WindingOrder` fine in `bevy_math::primitives`? It's not specific to a dimension, so I put it there for now. |
||
---|---|---|
.. | ||
src | ||
Cargo.toml |