From e37bf18e2b5291cd0620fb92264acfdf225e5a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Kawulok?= <43855236+Stanleeeeey@users.noreply.github.com> Date: Mon, 19 Aug 2024 23:40:54 +0200 Subject: [PATCH] Add conversions between Visibility and bool (#14784) # Objective Fixes #14521. ## Solution Added to methods to the VIsibility. ```rs is_visible() -> Result ``` and ```rs visbility_from_bool(bool) -> Visibility ``` ## Testing Ran * `cargo run -p ci -- lints` * `cargo run -p ci -- test` * `cargo run -p ci -- compile` it seems to be working. However I got few error messages :`ERROR bevy_log: could not set global logger and tracing subscriber as they are already set. Consider disabling LogPlugin` in `cargo run -p ci -- test`, even though all test passed. I'm not sure if that's expected behaviour Ps. I'm new to contributing, please correct me if anything is wrong --- crates/bevy_render/src/view/visibility/mod.rs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/crates/bevy_render/src/view/visibility/mod.rs b/crates/bevy_render/src/view/visibility/mod.rs index 341404d189fdb..61dfce124259e 100644 --- a/crates/bevy_render/src/view/visibility/mod.rs +++ b/crates/bevy_render/src/view/visibility/mod.rs @@ -21,6 +21,8 @@ use crate::{ primitives::{Aabb, Frustum, Sphere}, }; +use thiserror::Error; + use super::NoCpuCulling; /// User indication of whether an entity is visible. Propagates down the entity hierarchy. @@ -47,6 +49,43 @@ pub enum Visibility { Visible, } +/// Enum of errors that could occur during conversion to [`bool`] +#[non_exhaustive] +#[derive(Error, Debug)] +pub enum VisibilityToBoolConversionError { + #[error("The variant `{0:?}` cannot be converted to a bool")] + VariantNotSupported(Visibility), +} +/// Implements conversion from bool to Visibility +/// `true` corresponds to [`Visibility::Visible`], while false corresponds to [`Visibility::Hidden`]. +impl From for Visibility { + fn from(visible: bool) -> Visibility { + if visible { + Visibility::Visible + } else { + Visibility::Hidden + } + } +} + +/// Implements conversion from [`Visibility`] to [`bool`] +/// - returns `Ok(true)` if `Visibility::Visible` +/// - returns `Ok(false)` if `Visibility::Hidden` +/// - returns `Err()` if `Visibility::Inherited` +impl TryFrom for bool { + type Error = VisibilityToBoolConversionError; + + fn try_from(visible: Visibility) -> Result { + match visible { + Visibility::Hidden => Ok(false), + Visibility::Visible => Ok(true), + Visibility::Inherited => Err(VisibilityToBoolConversionError::VariantNotSupported( + Visibility::Inherited, + )), + } + } +} + // Allows `&Visibility == Visibility` impl PartialEq for &Visibility { #[inline]