diff --git a/.vscode/settings.json b/.vscode/settings.json index a4722f9..86d8b31 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,7 @@ "./Cargo.toml", "./Cargo.toml", "./Cargo.toml", + "./Cargo.toml", "./Cargo.toml" ], } \ No newline at end of file diff --git a/src/vvedit.rs b/src/vvedit.rs index c50d006..169801e 100644 --- a/src/vvedit.rs +++ b/src/vvedit.rs @@ -38,6 +38,7 @@ pub fn startup( mesh_assets: ResMut>, mut oct_assets: ResMut>, mut commands: Commands, + mut materials: ResMut>, ) { let id = OctTreeAsset::load(&mut pairs, asset_server, mesh_assets, "test.vvg".into()); let parent = commands @@ -50,6 +51,8 @@ pub fn startup( .spawn(( PbrBundle { mesh: id.clone(), + material: materials.add(Color::rgb(1., 1., 1.)), + ..default() }, OctAssetMarker { @@ -62,8 +65,8 @@ pub fn startup( commands.spawn(PointLightBundle { point_light: PointLight { - intensity: 1000.0, - range: 100.0, + intensity: 100000.0, + range: 1000.0, ..default() }, transform: light_transform, diff --git a/src/vvedit/editor_ui.rs b/src/vvedit/editor_ui.rs index c809701..3027d2d 100644 --- a/src/vvedit/editor_ui.rs +++ b/src/vvedit/editor_ui.rs @@ -8,10 +8,13 @@ use bevy::{ window::Window, }; use bevy_egui::{ - egui::{self, color_picker, Color32}, + egui::{ + self, color_picker, + ecolor::{hsv_from_rgb, rgb_from_hsv}, + epaint::Hsva, + }, EguiContexts, EguiPlugin, }; -use rand::Rng; use crate::{ vvedit::editor_bevy_input_shim::keybind_codes::REMOVE_VOXEL, @@ -30,8 +33,15 @@ use super::{ orbit_camera::orbit_camera::{pan_orbit_camera, spawn_camera}, }; +#[derive(Default, Resource)] +pub struct EditWindowUIState { + brush_color: Hsva, +} + pub fn register_edit_ui(app: &mut bevy::prelude::App) -> &mut bevy::prelude::App { - app.insert_resource(EditWindowUIState {}); + app.insert_resource(EditWindowUIState { + brush_color: egui_color_from(Color::RED), + }); app.add_plugins(EguiPlugin); app.add_systems(Startup, startup_system_edit_ui); app.add_systems(Update, edit_window_ui); @@ -44,26 +54,21 @@ pub fn startup_system_edit_ui(commands: Commands) { spawn_camera(commands); } -#[derive(Default, Resource)] -pub struct EditWindowUIState {} - pub fn edit_click_events( input_data: ResMut, camera_query: Query<(&Camera, &GlobalTransform)>, oct_tree: Query<(&GlobalTransform, &OctAssetMarker)>, windows: Query<&Window>, mut oct_assets: ResMut>, + shared_ui_state: ResMut, ) { let paint = input_data.get_binary_input(&PAINT_VOXEL.into()); let remove = input_data.get_binary_input(&REMOVE_VOXEL.into()); let insert = input_data.get_binary_input(&INSERT_VOXEL.into()); + for window in &windows { for (trans, oct) in &oct_tree { for (camera, cam_trans) in &camera_query { - let mut rng = rand::thread_rng(); - let r: f32 = rng.gen_range(0.0..1.0); - let g: f32 = rng.gen_range(0.0..1.0); - let b: f32 = rng.gen_range(0.0..1.0); let Some(cursor_pos) = window.cursor_position() else { continue; }; @@ -82,8 +87,10 @@ pub fn edit_click_events( if let Some(_) = paint.filter(|input| input.pressed()) { if collision.is_some() { let col = collision.unwrap(); - edit_octtree - .set_voxel_at_location(col.voxel_index_location, Color::rgb(r, g, b)); + edit_octtree.set_voxel_at_location( + col.voxel_index_location, + color_from(shared_ui_state.brush_color), + ); } } else if let Some(_) = remove.filter(|input| input.pressed()) { if collision.is_some() { @@ -97,7 +104,10 @@ pub fn edit_click_events( let hitloc = col.hit_data.hitpoint.local.clone(); let hitnorm = col.hit_data.normal.local.clone(); let hitvox = hitloc + (hitnorm * 0.25); - edit_octtree.set_voxel_at_location(hitvox.round(), Color::rgb(r, g, b)); + edit_octtree.set_voxel_at_location( + hitvox.round(), + color_from(shared_ui_state.brush_color), + ); } } } @@ -106,12 +116,11 @@ pub fn edit_click_events( } pub fn edit_window_ui( - mut _shared_ui_state: ResMut, + mut shared_ui_state: ResMut, mut contexts: EguiContexts, mut oct_assets: ResMut>, mut pairs: ResMut, ) { - let mut color: Color32 = Default::default(); egui::Window::new("VVEdit").show(contexts.ctx_mut(), |ui| { let mut label = String::from("Pre-Alpha"); use std::fmt::Write; @@ -119,8 +128,11 @@ pub fn edit_window_ui( writeln!(label, "click adds a voxel:").ok(); writeln!(label, "R+click removes a voxel:").ok(); writeln!(label, "E+click paints (edits) a voxel:").ok(); - - color_picker::color_picker_color32(ui, &mut color, color_picker::Alpha::Opaque); + color_picker::color_picker_hsva_2d( + ui, + &mut shared_ui_state.brush_color, + color_picker::Alpha::Opaque, + ); ui.label(label); if ui.button("Add Origin Voxel").clicked() { // @@ -130,9 +142,61 @@ pub fn edit_window_ui( if tree.is_some() { // let tree = tree.unwrap(); - tree.model.set_voxel_at_location(Vec3::ZERO, Color::BLUE); + tree.model + .set_voxel_at_location(Vec3::ZERO, color_from(shared_ui_state.brush_color)); } } } }); } + +fn color_from(egui_color: Hsva) -> Color { + let rgb = rgb_from_hsv((egui_color.h, egui_color.s, egui_color.v)); + return Color::rgb_linear_from_array(rgb); +} + +fn egui_color_from(color: Color) -> Hsva { + let x = hsv_from_rgb([color.r(), color.g(), color.b()]); + + return Hsva::new(x.0, x.1, x.2, 1.); +} + +#[test] +pub fn round_trip_color() { + use rand::Rng; + let mut rng = rand::thread_rng(); + let min = 0.; + let max = 1.; + for _ in 0..10000 { + let r = rng.gen_range(min..max); + let g = rng.gen_range(min..max); + let b = rng.gen_range(min..max); + let mut color = Color::rgb(r, g, b); + let mut egui_color = egui_color_from(color); + color = color_from(egui_color); + egui_color = egui_color_from(color); + color = color_from(egui_color); + egui_color = egui_color_from(color); + color = color_from(egui_color); + egui_color = egui_color_from(color); + color = color_from(egui_color); + egui_color = egui_color_from(color); + color = color_from(egui_color); + egui_color = egui_color_from(color); + color = color_from(egui_color); + egui_color = egui_color_from(color); + color = color_from(egui_color); + egui_color = egui_color_from(color); + color = color_from(egui_color); + assert_eq!((color.r() * 255.).floor(), (r * 255.).floor()); + assert_eq!((color.g() * 255.).floor(), (g * 255.).floor()); + assert_eq!((color.b() * 255.).floor(), (b * 255.).floor()); + } +} +#[test] +pub fn test_colors() { + let color = Color::rgb(1., 0., 0.); + //let x = Hsva::from_srgb() + let hsv = egui_color_from(color); + let conv = rgb_from_hsv((hsv.h, hsv.s, hsv.v)); +}