From 9bf67ee7561942a45386e4175f3033963dbf2260 Mon Sep 17 00:00:00 2001 From: Kevin Schroeder Date: Sat, 26 Mar 2022 20:55:30 -0500 Subject: [PATCH] materials options --- src/gui.rs | 2 +- src/main.rs | 62 ++++++++++++++++++++++++++++++++++++++++++------- src/simplify.rs | 21 +++++++++-------- 3 files changed, 66 insertions(+), 19 deletions(-) diff --git a/src/gui.rs b/src/gui.rs index aefb306..e0d3ad3 100644 --- a/src/gui.rs +++ b/src/gui.rs @@ -62,7 +62,7 @@ pub fn footer(ctx: &CtxRef) { ui.vertical_centered(|ui| { ui.add_space(10.); ui.add(Label::new(RichText::new("obj2brs").monospace())); - ui.label("by Smallguy/Kmschr and French Fries/CheezBarger"); + ui.label("by Smallguy/Kmschr and Suficio"); let text = format!("{} {}", GITHUB, "GitHub"); ui.add(Hyperlink::from_label_and_url(text, "https://github.com/kmschr/obj2brs")); ui.add_space(10.); diff --git a/src/main.rs b/src/main.rs index 0ee98d3..5923538 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,19 +20,21 @@ use uuid::Uuid; use std::{ env, fs::File, - path::Path}; + path::Path, ops::RangeInclusive}; use voxelize::voxelize; const WINDOW_WIDTH: f32 = 600.; -const WINDOW_HEIGHT: f32 = 420.; +const WINDOW_HEIGHT: f32 = 480.; const OBJ_ICON: &[u8; 10987] = include_bytes!("../res/obj_icon.png"); #[derive(Debug)] -struct Obj2Brs { - bricktype: BrickType, +pub struct Obj2Brs { + pub bricktype: BrickType, input_file_path: String, - match_brickadia_colorset: bool, + pub match_brickadia_colorset: bool, + material: Material, + material_intensity: u32, output_directory: String, save_owner_id: String, save_owner_name: String, @@ -46,7 +48,18 @@ struct Obj2Brs { #[derive(Debug, PartialEq, Clone, Copy)] pub enum BrickType { Microbricks, - Default + Default, + Tiles +} + +#[derive(Debug, PartialEq, Clone, Copy)] +pub enum Material { + Plastic, + Glass, + Glow, + Metallic, + Hologram, + Ghost, } impl Default for Obj2Brs { @@ -55,6 +68,8 @@ impl Default for Obj2Brs { bricktype: BrickType::Microbricks, input_file_path: "test.obj".into(), match_brickadia_colorset: false, + material: Material::Plastic, + material_intensity: 5, output_directory: "builds".into(), save_owner_id: "d66c4ad5-59fc-4a9b-80b8-08dedc25bff9".into(), save_owner_name: "obj2brs".into(), @@ -183,9 +198,27 @@ impl Obj2Brs { .show_ui(ui, |ui| { ui.selectable_value(&mut self.bricktype, BrickType::Microbricks, "Microbricks"); ui.selectable_value(&mut self.bricktype, BrickType::Default, "Default"); + ui.selectable_value(&mut self.bricktype, BrickType::Tiles, "Tiles"); }); ui.end_row(); + ui.label("Material"); + ComboBox::from_label("\n") + .selected_text(format!("{:?}", &mut self.material)) + .show_ui(ui, |ui| { + ui.selectable_value(&mut self.material, Material::Plastic, "Plastic"); + ui.selectable_value(&mut self.material, Material::Glass, "Glass"); + ui.selectable_value(&mut self.material, Material::Glow, "Glow"); + ui.selectable_value(&mut self.material, Material::Metallic, "Metallic"); + ui.selectable_value(&mut self.material, Material::Hologram, "Hologram"); + ui.selectable_value(&mut self.material, Material::Ghost, "Ghost"); + }); + ui.end_row(); + + ui.label("Material Intensity"); + ui.add(Slider::new(&mut self.material_intensity, RangeInclusive::new(0, 10))); + ui.end_row(); + let id_color = bool_color(uuid_valid); ui.label("Brick Owner").on_hover_text("Who will have ownership of the generated bricks"); @@ -311,7 +344,16 @@ fn write_brs_data( "PB_DefaultBrick".into(), "PB_DefaultRamp".into(), "PB_DefaultWedge".into(), + "PB_DefaultTile".into(), ], + materials: match opts.material { + Material::Plastic => vec!["BMC_Plastic".into()], + Material::Glass => vec!["BMC_Glass".into()], + Material::Glow => vec!["BMC_Glow".into()], + Material::Metallic => vec!["BMC_Metallic".into()], + Material::Hologram => vec!["BMC_Hologram".into()], + Material::Ghost => vec!["BMC_Ghost".into()], + }, brick_owners: vec![brs::save::BrickOwner::from_user_bricks(owner.clone(), 1)], colors: palette::DEFAULT_PALETTE.to_vec(), ..Default::default() @@ -319,11 +361,15 @@ fn write_brs_data( ..Default::default() }; + if opts.bricktype == BrickType::Tiles { + write_data.header2.brick_assets[1] = "PB_DefaultTile".into(); + } + println!("Simplifying..."); if opts.simplify { - simplify_lossy(octree, &mut write_data, opts.bricktype, opts.match_brickadia_colorset, max_merge); + simplify_lossy(octree, &mut write_data, opts, max_merge); } else { - simplify_lossless(octree, &mut write_data, opts.bricktype, opts.match_brickadia_colorset, max_merge); + simplify_lossless(octree, &mut write_data, opts, max_merge); } if opts.raise { diff --git a/src/simplify.rs b/src/simplify.rs index 2f71371..db944a1 100644 --- a/src/simplify.rs +++ b/src/simplify.rs @@ -1,3 +1,4 @@ +use crate::Obj2Brs; use crate::color::*; use crate::BrickType; use crate::octree::{TreeBody, VoxelTree}; @@ -8,12 +9,11 @@ use cgmath::{Vector3, Vector4}; pub fn simplify_lossy( octree: &mut VoxelTree>, save_data: &mut brs::SaveData, - bricktype: BrickType, - match_to_colorset: bool, + opts: &Obj2Brs, max_merge: isize, ) { let colorset = convert_colorset_to_hsv(&save_data.header2.colors); - let scales: (isize, isize, isize) = if bricktype == BrickType::Microbricks { + let scales: (isize, isize, isize) = if opts.bricktype == BrickType::Microbricks { (1, 1, 1) } else { (5, 5, 2) @@ -109,7 +109,7 @@ pub fn simplify_lossy( } let avg_color = hsv_average(&colors); - let color = if match_to_colorset { + let color = if opts.match_brickadia_colorset { brs::BrickColor::Index(match_hsv_to_colorset(&colorset, &avg_color) as u32) } else { let rgba = gamma_correct(hsv2rgb(avg_color)); @@ -126,11 +126,12 @@ pub fn simplify_lossy( let depth = zp - z; save_data.bricks.push(brs::Brick { - asset_name_index: if bricktype == BrickType::Microbricks { 0 } else { 1 }, + asset_name_index: if opts.bricktype == BrickType::Microbricks { 0 } else { 1 }, // Coordinates are rotated size: scaled_size(scales, (width, depth, height)), position: scaled_pos(scales, (width, depth, height), (x, z, y)), color, + material_intensity: opts.material_intensity, ..Default::default() }); } @@ -139,8 +140,7 @@ pub fn simplify_lossy( pub fn simplify_lossless( octree: &mut VoxelTree>, save_data: &mut brs::SaveData, - bricktype: BrickType, - match_to_colorset: bool, + opts: &Obj2Brs, max_merge: isize, ) { let d: isize = 1 << octree.size; @@ -148,7 +148,7 @@ pub fn simplify_lossless( let colorset = convert_colorset_to_hsv(&save_data.header2.colors); - let scales: (isize, isize, isize) = if bricktype == BrickType::Microbricks { + let scales: (isize, isize, isize) = if opts.bricktype == BrickType::Microbricks { (1, 1, 1) } else { (5, 5, 2) @@ -275,19 +275,20 @@ pub fn simplify_lossless( let height = yp - y; let depth = zp - z; - let color = if match_to_colorset { + let color = if opts.match_brickadia_colorset { brs::BrickColor::Index(matched_color as u32) } else { unmatched_color }; save_data.bricks.push(brs::Brick { - asset_name_index: if bricktype == BrickType::Microbricks { 0 } else { 1 }, + asset_name_index: if opts.bricktype == BrickType::Microbricks { 0 } else { 1 }, // Coordinates are rotated size: scaled_size(scales, (width, depth, height)), position: scaled_pos(scales, (width, depth, height), (x, z, y)), color, owner_index: 1, + material_intensity: opts.material_intensity, ..Default::default() }); }