From eddb006a8a2612bb042d02e3f90a42fa2583ccba Mon Sep 17 00:00:00 2001 From: NiseVoid Date: Wed, 19 Jun 2024 19:28:10 +0200 Subject: [PATCH] Use u32 for all resolution/subdivision fields in bevy_gizmos (#13927) # Objective - Make gizmos behavior consistent across platforms ## Solution - Use `u32` instead of `usize` for resolution/subdivisions/segments/etc fields --- ## Changelog - Change resolutions in gizmos from `usize` to `u32` ## Migration Guide - All gizmos now take `u32` instead of `usize` for their resolution/subdivision/segment counts --- crates/bevy_gizmos/src/arcs.rs | 16 ++++---- crates/bevy_gizmos/src/circles.rs | 16 ++++---- crates/bevy_gizmos/src/primitives/dim2.rs | 18 +++------ crates/bevy_gizmos/src/primitives/dim3.rs | 42 ++++++++++---------- crates/bevy_gizmos/src/primitives/helpers.rs | 8 ++-- crates/bevy_gizmos/src/rounded_box.rs | 8 ++-- 6 files changed, 51 insertions(+), 57 deletions(-) diff --git a/crates/bevy_gizmos/src/arcs.rs b/crates/bevy_gizmos/src/arcs.rs index 8c3957c449..c2b8b1f325 100644 --- a/crates/bevy_gizmos/src/arcs.rs +++ b/crates/bevy_gizmos/src/arcs.rs @@ -79,7 +79,7 @@ where arc_angle: f32, radius: f32, color: Color, - resolution: Option, + resolution: Option, } impl Arc2dBuilder<'_, '_, '_, Config, Clear> @@ -88,7 +88,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines used to approximate the geometry of this arc. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution.replace(resolution); self } @@ -123,7 +123,7 @@ fn arc_2d_inner( direction_angle: f32, arc_angle: f32, radius: f32, - resolution: usize, + resolution: u32, ) -> impl Iterator { (0..resolution + 1).map(move |i| { let start = direction_angle - arc_angle / 2.; @@ -368,7 +368,7 @@ where angle: f32, radius: f32, color: Color, - resolution: Option, + resolution: Option, } impl Arc3dBuilder<'_, '_, '_, Config, Clear> @@ -377,7 +377,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines for this arc. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution.replace(resolution); self } @@ -415,7 +415,7 @@ fn arc_3d_inner( rotation: Quat, angle: f32, radius: f32, - resolution: usize, + resolution: u32, ) -> impl Iterator { // drawing arcs bigger than TAU degrees or smaller than -TAU degrees makes no sense since // we won't see the overlap and we would just decrease the level of details since the resolution @@ -429,6 +429,6 @@ fn arc_3d_inner( } // helper function for getting a default value for the resolution parameter -fn resolution_from_angle(angle: f32) -> usize { - ((angle.abs() / TAU) * DEFAULT_CIRCLE_RESOLUTION as f32).ceil() as usize +fn resolution_from_angle(angle: f32) -> u32 { + ((angle.abs() / TAU) * DEFAULT_CIRCLE_RESOLUTION as f32).ceil() as u32 } diff --git a/crates/bevy_gizmos/src/circles.rs b/crates/bevy_gizmos/src/circles.rs index 6fcd034938..9f3c485753 100644 --- a/crates/bevy_gizmos/src/circles.rs +++ b/crates/bevy_gizmos/src/circles.rs @@ -9,9 +9,9 @@ use bevy_math::Mat2; use bevy_math::{Dir3, Quat, Vec2, Vec3}; use std::f32::consts::TAU; -pub(crate) const DEFAULT_CIRCLE_RESOLUTION: usize = 32; +pub(crate) const DEFAULT_CIRCLE_RESOLUTION: u32 = 32; -fn ellipse_inner(half_size: Vec2, resolution: usize) -> impl Iterator { +fn ellipse_inner(half_size: Vec2, resolution: u32) -> impl Iterator { (0..resolution + 1).map(move |i| { let angle = i as f32 * TAU / resolution as f32; let (x, y) = angle.sin_cos(); @@ -230,7 +230,7 @@ where rotation: Quat, half_size: Vec2, color: Color, - resolution: usize, + resolution: u32, } impl EllipseBuilder<'_, '_, '_, Config, Clear> @@ -239,7 +239,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines used to approximate the geometry of this ellipse. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution = resolution; self } @@ -273,7 +273,7 @@ where rotation: Mat2, half_size: Vec2, color: Color, - resolution: usize, + resolution: u32, } impl Ellipse2dBuilder<'_, '_, '_, Config, Clear> @@ -282,7 +282,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of line-segments used to approximate the geometry of this ellipse. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution = resolution; self } @@ -325,7 +325,7 @@ where color: Color, // Number of line-segments used to approximate the sphere geometry - resolution: usize, + resolution: u32, } impl SphereBuilder<'_, '_, '_, Config, Clear> @@ -334,7 +334,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of line-segments used to approximate the sphere geometry. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution = resolution; self } diff --git a/crates/bevy_gizmos/src/primitives/dim2.rs b/crates/bevy_gizmos/src/primitives/dim2.rs index 9fc8a691cf..e05eaba645 100644 --- a/crates/bevy_gizmos/src/primitives/dim2.rs +++ b/crates/bevy_gizmos/src/primitives/dim2.rs @@ -227,8 +227,8 @@ where inner_radius: f32, outer_radius: f32, color: Color, - inner_resolution: usize, - outer_resolution: usize, + inner_resolution: u32, + outer_resolution: u32, } impl Annulus2dBuilder<'_, '_, '_, Config, Clear> @@ -237,20 +237,20 @@ where Clear: 'static + Send + Sync, { /// Set the number of line-segments for each circle of the annulus. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.outer_resolution = resolution; self.inner_resolution = resolution; self } /// Set the number of line-segments for the outer circle of the annulus. - pub fn outer_resolution(mut self, resolution: usize) -> Self { + pub fn outer_resolution(mut self, resolution: u32) -> Self { self.outer_resolution = resolution; self } /// Set the number of line-segments for the inner circle of the annulus. - pub fn inner_resolution(mut self, resolution: usize) -> Self { + pub fn inner_resolution(mut self, resolution: u32) -> Self { self.inner_resolution = resolution; self } @@ -852,13 +852,7 @@ where } let points = (0..=primitive.sides) - .map(|p| { - single_circle_coordinate( - primitive.circumcircle.radius, - primitive.sides as usize, - p as usize, - ) - }) + .map(|p| single_circle_coordinate(primitive.circumcircle.radius, primitive.sides, p)) .map(rotate_then_translate_2d(angle, position)); self.linestrip_2d(points, color); } diff --git a/crates/bevy_gizmos/src/primitives/dim3.rs b/crates/bevy_gizmos/src/primitives/dim3.rs index 31cb395526..0839da864a 100644 --- a/crates/bevy_gizmos/src/primitives/dim3.rs +++ b/crates/bevy_gizmos/src/primitives/dim3.rs @@ -13,7 +13,7 @@ use bevy_math::{Dir3, Quat, Vec3}; use crate::circles::SphereBuilder; use crate::prelude::{GizmoConfigGroup, Gizmos}; -const DEFAULT_RESOLUTION: usize = 5; +const DEFAULT_RESOLUTION: u32 = 5; // length used to simulate infinite lines const INFINITE_LEN: f32 = 10_000.0; @@ -95,9 +95,9 @@ where color: Color, // Number of axis to hint the plane - axis_count: usize, + axis_count: u32, // Number of segments used to hint the plane - segment_count: usize, + segment_count: u32, // Length of segments used to hint the plane segment_length: f32, } @@ -108,7 +108,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of segments used to hint the plane. - pub fn segment_count(mut self, count: usize) -> Self { + pub fn segment_count(mut self, count: u32) -> Self { self.segment_count = count; self } @@ -120,7 +120,7 @@ where } /// Set the number of axis used to hint the plane. - pub fn axis_count(mut self, count: usize) -> Self { + pub fn axis_count(mut self, count: u32) -> Self { self.axis_count = count; self } @@ -183,7 +183,7 @@ where .filter(|i| i % 2 != 0) .map(|percent| (percent as f32 + 0.5) * self.segment_length * axis_direction) .map(|position| position + self.position) - .take(self.segment_count) + .take(self.segment_count as usize) .for_each(|position| { self.gizmos.primitive_3d( &Segment3d { @@ -431,7 +431,7 @@ where color: Color, // Number of lines used to approximate the cylinder geometry - resolution: usize, + resolution: u32, } impl Cylinder3dBuilder<'_, '_, '_, Config, Clear> @@ -440,7 +440,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines used to approximate the top an bottom of the cylinder geometry. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution = resolution; self } @@ -541,7 +541,7 @@ where color: Color, // Number of lines used to approximate the capsule geometry - resolution: usize, + resolution: u32, } impl Capsule3dBuilder<'_, '_, '_, Config, Clear> @@ -550,7 +550,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines used to approximate the capsule geometry. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution = resolution; self } @@ -681,10 +681,10 @@ where color: Color, // Number of lines used to approximate the cone base geometry - base_resolution: usize, + base_resolution: u32, // Number of lines used to approximate the cone height geometry - height_resolution: usize, + height_resolution: u32, } impl Cone3dBuilder<'_, '_, '_, Config, Clear> @@ -693,7 +693,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines used to approximate the cone geometry for its base and height. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.base_resolution = resolution; self.height_resolution = resolution; self @@ -703,7 +703,7 @@ where /// /// `resolution` should be a multiple of the value passed to [`Self::height_resolution`] /// for the height to connect properly with the base. - pub fn base_resolution(mut self, resolution: usize) -> Self { + pub fn base_resolution(mut self, resolution: u32) -> Self { self.base_resolution = resolution; self } @@ -712,7 +712,7 @@ where /// /// `resolution` should be a divisor of the value passed to [`Self::base_resolution`] /// for the height to connect properly with the base. - pub fn height_resolution(mut self, resolution: usize) -> Self { + pub fn height_resolution(mut self, resolution: u32) -> Self { self.height_resolution = resolution; self } @@ -817,7 +817,7 @@ where color: Color, // Number of lines used to approximate the curved surfaces - resolution: usize, + resolution: u32, } impl ConicalFrustum3dBuilder<'_, '_, '_, Config, Clear> @@ -826,7 +826,7 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines used to approximate the curved surfaces. - pub fn resolution(mut self, resolution: usize) -> Self { + pub fn resolution(mut self, resolution: u32) -> Self { self.resolution = resolution; self } @@ -937,9 +937,9 @@ where color: Color, // Number of lines in the minor (tube) direction - minor_resolution: usize, + minor_resolution: u32, // Number of lines in the major (ring) direction - major_resolution: usize, + major_resolution: u32, } impl Torus3dBuilder<'_, '_, '_, Config, Clear> @@ -948,13 +948,13 @@ where Clear: 'static + Send + Sync, { /// Set the number of lines in the minor (tube) direction. - pub fn minor_resolution(mut self, minor_resolution: usize) -> Self { + pub fn minor_resolution(mut self, minor_resolution: u32) -> Self { self.minor_resolution = minor_resolution; self } /// Set the number of lines in the major (ring) direction. - pub fn major_resolution(mut self, major_resolution: usize) -> Self { + pub fn major_resolution(mut self, major_resolution: u32) -> Self { self.major_resolution = major_resolution; self } diff --git a/crates/bevy_gizmos/src/primitives/helpers.rs b/crates/bevy_gizmos/src/primitives/helpers.rs index 3ca4a6ad18..b76fb34f6b 100644 --- a/crates/bevy_gizmos/src/primitives/helpers.rs +++ b/crates/bevy_gizmos/src/primitives/helpers.rs @@ -29,7 +29,7 @@ pub(crate) fn rotate_then_translate_3d(rotation: Quat, translation: Vec3) -> imp /// Given a circle's radiu and its resolution, this function computes the position /// of the `nth` point along the circumference of the circle. The rotation starts at `(0.0, radius)` /// and proceeds counter-clockwise. -pub(crate) fn single_circle_coordinate(radius: f32, resolution: usize, nth_point: usize) -> Vec2 { +pub(crate) fn single_circle_coordinate(radius: f32, resolution: u32, nth_point: u32) -> Vec2 { let angle = nth_point as f32 * TAU / resolution as f32; let (x, y) = angle.sin_cos(); Vec2::new(x, y) * radius @@ -40,10 +40,10 @@ pub(crate) fn single_circle_coordinate(radius: f32, resolution: usize, nth_point /// This function creates an iterator that yields the positions of points approximating a /// circle with the given radius, divided into linear segments. The iterator produces `resolution` /// number of points. -pub(crate) fn circle_coordinates(radius: f32, resolution: usize) -> impl Iterator { +pub(crate) fn circle_coordinates(radius: f32, resolution: u32) -> impl Iterator { (0..) .map(move |p| single_circle_coordinate(radius, resolution, p)) - .take(resolution) + .take(resolution as usize) } /// Draws a circle in 3D space. @@ -54,7 +54,7 @@ pub(crate) fn circle_coordinates(radius: f32, resolution: usize) -> impl Iterato pub(crate) fn draw_circle_3d( gizmos: &mut Gizmos<'_, '_, Config, Clear>, radius: f32, - resolution: usize, + resolution: u32, rotation: Quat, translation: Vec3, color: Color, diff --git a/crates/bevy_gizmos/src/rounded_box.rs b/crates/bevy_gizmos/src/rounded_box.rs index 9766739742..d4dbd54c1a 100644 --- a/crates/bevy_gizmos/src/rounded_box.rs +++ b/crates/bevy_gizmos/src/rounded_box.rs @@ -27,7 +27,7 @@ struct RoundedBoxConfig { rotation: Quat, color: Color, corner_radius: f32, - arc_resolution: usize, + arc_resolution: u32, } impl RoundedRectBuilder<'_, '_, '_, T> { @@ -40,7 +40,7 @@ impl RoundedRectBuilder<'_, '_, '_, T> { /// Change the resolution of the arcs at the corners of the rectangle. /// The default value is 8 - pub fn arc_resolution(mut self, arc_resolution: usize) -> Self { + pub fn arc_resolution(mut self, arc_resolution: u32) -> Self { self.config.arc_resolution = arc_resolution; self } @@ -55,7 +55,7 @@ impl RoundedCuboidBuilder<'_, '_, '_, T> { /// Change the resolution of the arcs at the edges of the cuboid. /// The default value is 8 - pub fn arc_resolution(mut self, arc_resolution: usize) -> Self { + pub fn arc_resolution(mut self, arc_resolution: u32) -> Self { self.config.arc_resolution = arc_resolution; self } @@ -376,5 +376,5 @@ impl<'w, 's, T: GizmoConfigGroup> Gizmos<'w, 's, T> { } } -const DEFAULT_ARC_RESOLUTION: usize = 8; +const DEFAULT_ARC_RESOLUTION: u32 = 8; const DEFAULT_CORNER_RADIUS: f32 = 0.1;