diff --git a/Cargo.toml b/Cargo.toml index 616259a..dab2ee6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ clippy.nursery = "warn" [dependencies] ansi_term = { version = "0.12.1", optional = true } +bevy = { version = "0.16", optional = true } css-colors = { version = "1.0.1", optional = true } ratatui = { version = "0.29.0", optional = true } serde = { version = "1.0.203", features = ["derive"], optional = true } @@ -43,6 +44,7 @@ ansi-term = ["dep:ansi_term"] css-colors = ["dep:css-colors"] ratatui = ["dep:ratatui"] serde = ["dep:serde"] +bevy = ["dep:bevy"] [[example]] name = "css" @@ -55,3 +57,7 @@ required-features = ["ansi-term"] [[example]] name = "ratatui" required-features = ["ratatui"] + +[[example]] +name = "bevy" +required-features = ["bevy"] diff --git a/examples/bevy.rs b/examples/bevy.rs new file mode 100644 index 0000000..9ddbbb0 --- /dev/null +++ b/examples/bevy.rs @@ -0,0 +1,51 @@ +//! Example demonstrating integration with the `bevy` crate. + +use bevy::prelude::*; + +use catppuccin::PALETTE; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .run(); +} + +/// set up a simple 3D scene +fn setup( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + // circular base with catppuccin mocha surface color + commands.spawn(( + Mesh3d(meshes.add(Circle::new(4.0))), + MeshMaterial3d(materials.add(StandardMaterial::from_color(PALETTE.mocha.colors.surface0))), + Transform::from_rotation(Quat::from_rotation_x(-std::f32::consts::FRAC_PI_2)), + )); + // cube with catppuccin mocha green color + commands.spawn(( + Mesh3d(meshes.add(Cuboid::new(1.0, 1.0, 1.0))), + MeshMaterial3d(materials.add(StandardMaterial::from_color(PALETTE.mocha.colors.green))), + Transform::from_xyz(0.0, 0.5, 0.0), + )); + // Sphere on top of cube with catppuccin mocha red color + commands.spawn(( + Mesh3d(meshes.add(Sphere::new(0.5))), + MeshMaterial3d(materials.add(StandardMaterial::from_color(PALETTE.mocha.colors.red))), + Transform::from_xyz(0.0, 1.5, 0.0), + )); + // light + commands.spawn(( + PointLight { + shadows_enabled: true, + ..default() + }, + Transform::from_xyz(4.0, 8.0, 4.0), + )); + // camera + commands.spawn(( + Camera3d::default(), + Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y), + )); +} diff --git a/src/lib.rs b/src/lib.rs index 7f7d21c..60fb6ac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,6 +53,14 @@ //! //! Example: [`examples/ratatui.rs`](https://github.com/catppuccin/rust/blob/main/examples/ratatui.rs) //! +//! ### Bevy +//! +//! Enable the `bevy` feature to enable the conversion of Catppuccin colors to +//! [`bevy::prelude::Color`] instances. +//! This adds [bevy](https://crates.io/crates/bevy) as a dependency. +//! +//! Example: [`examples/bevy.rs`](https://github.com/catppuccin/rust/blob/main/examples/bevy.rs) +//! //! ### Serde //! //! Enable the `serde` feature to enable the serialization of Catppuccin's palette, @@ -647,3 +655,20 @@ mod ratatui { } } } + +#[cfg(feature = "bevy")] +mod bevy { + use crate::{AnsiColor, Color}; + + impl From for bevy::prelude::Color { + fn from(value: Color) -> Self { + Self::hsl(value.hsl.h as f32, value.hsl.s as f32, value.hsl.l as f32) + } + } + + impl From for bevy::prelude::Color { + fn from(value: AnsiColor) -> Self { + Self::hsl(value.hsl.h as f32, value.hsl.s as f32, value.hsl.l as f32) + } + } +}