Skip to content

Commit

Permalink
materials options
Browse files Browse the repository at this point in the history
  • Loading branch information
Kmschr committed Mar 27, 2022
1 parent 30d9530 commit 9bf67ee
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/gui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.);
Expand Down
62 changes: 54 additions & 8 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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 {
Expand All @@ -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(),
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -311,19 +344,32 @@ 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()
},
..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 {
Expand Down
21 changes: 11 additions & 10 deletions src/simplify.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::Obj2Brs;
use crate::color::*;
use crate::BrickType;
use crate::octree::{TreeBody, VoxelTree};
Expand All @@ -8,12 +9,11 @@ use cgmath::{Vector3, Vector4};
pub fn simplify_lossy(
octree: &mut VoxelTree<Vector4<u8>>,
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)
Expand Down Expand Up @@ -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));
Expand All @@ -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()
});
}
Expand All @@ -139,16 +140,15 @@ pub fn simplify_lossy(
pub fn simplify_lossless(
octree: &mut VoxelTree<Vector4<u8>>,
save_data: &mut brs::SaveData,
bricktype: BrickType,
match_to_colorset: bool,
opts: &Obj2Brs,
max_merge: isize,
) {
let d: isize = 1 << octree.size;
let len = d + 1;

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)
Expand Down Expand Up @@ -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()
});
}
Expand Down

0 comments on commit 9bf67ee

Please sign in to comment.