Skip to content

Commit

Permalink
Material params pre-loading
Browse files Browse the repository at this point in the history
  • Loading branch information
markusmoenig committed Jul 2, 2024
1 parent b45616a commit 9ee083b
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 43 deletions.
8 changes: 4 additions & 4 deletions creator/src/modelfxeditor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ impl ModelFXEditor {
PRERENDERTHREAD
.lock()
.unwrap()
.render_region(region.clone(), Some(area));
.render_region(region.shallow_clone(), Some(area));
}

if let Some(widget) = ui.get_widget(&id.name) {
Expand Down Expand Up @@ -570,7 +570,7 @@ impl ModelFXEditor {

region.update_geometry_areas();

region_to_render = Some(region.clone());
region_to_render = Some(region.shallow_clone());

server.update_region(region);
}
Expand Down Expand Up @@ -665,7 +665,7 @@ impl ModelFXEditor {
project.get_region_mut(&server_ctx.curr_region)
{
tiles_to_render = region.get_material_area(material_id);
region_to_render = Some(region.clone());
region_to_render = Some(region.shallow_clone());
}

let undo =
Expand Down Expand Up @@ -1274,7 +1274,7 @@ impl ModelFXEditor {

if let Some(region) = project.get_region_mut(&server_ctx.curr_region) {
tiles_to_render = region.get_material_area(material_id);
region_to_render = Some(region.clone());
region_to_render = Some(region.shallow_clone());
}
if let Some(region) = region_to_render {
PRERENDERTHREAD
Expand Down
8 changes: 4 additions & 4 deletions creator/src/sidebar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1096,11 +1096,11 @@ impl Sidebar {
PRERENDERTHREAD
.lock()
.unwrap()
.render_region_coord_tree(region.clone());
.render_region_coord_tree(region.shallow_clone());
PRERENDERTHREAD
.lock()
.unwrap()
.render_region(region.clone(), None);
.render_region(region.shallow_clone(), None);

if let Some(rgba_layout) = ui.get_rgba_layout("Region Editor") {
if let Some(rgba) = rgba_layout.rgba_view_mut().as_rgba_view() {
Expand All @@ -1118,11 +1118,11 @@ impl Sidebar {
PRERENDERTHREAD
.lock()
.unwrap()
.render_region_coord_tree(region.clone());
.render_region_coord_tree(region.shallow_clone());
PRERENDERTHREAD
.lock()
.unwrap()
.render_region(region.clone(), None);
.render_region(region.shallow_clone(), None);
}
}
} else if id.name == "Region Min Brightness" {
Expand Down
4 changes: 2 additions & 2 deletions creator/src/tileeditor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -415,11 +415,11 @@ impl TileEditor {
PRERENDERTHREAD
.lock()
.unwrap()
.render_region_coord_tree(region.clone());
.render_region_coord_tree(region.shallow_clone());
PRERENDERTHREAD
.lock()
.unwrap()
.render_region(region.clone(), None);
.render_region(region.shallow_clone(), None);
redraw = true;
}
} else if item_id.name == "Create Area" {
Expand Down
45 changes: 34 additions & 11 deletions shared/src/materialfxnode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,31 @@ impl MaterialFXNode {
]
}

/// Loads the parameters of the nodes into memory for faster access.
pub fn load_parameters(&self, _time: &TheTime) -> Vec<f32> {
let mut params = vec![];

let coll = self.collection();

match self.role {
MaterialFXNodeRole::BoxSubdivision => {
params.push(coll.get_f32_default("Scale", 1.0));
params.push(coll.get_f32_default("Gap", 1.0));
params.push(coll.get_f32_default("Rotation", 0.15));
params.push(coll.get_f32_default("Rounding", 0.15));
}
MaterialFXNodeRole::Tiles => {
params.push(coll.get_f32_default("Size", 0.8));
params.push(coll.get_i32_default("Subdivisions", 2) as f32);
params.push(coll.get_f32_default("Rotation", 0.15));
params.push(coll.get_f32_default("Rounding", 0.15));
}
_ => {}
}

params
}

pub fn inputs(&self) -> Vec<TheNodeTerminal> {
match self.role {
Brick => {
Expand Down Expand Up @@ -476,15 +501,14 @@ impl MaterialFXNode {
}
}

pub fn geometry(&self, hit: &mut Hit) -> Option<u8> {
pub fn geometry(&self, hit: &mut Hit, params: &[f32]) -> Option<u8> {
#[allow(clippy::single_match)]
match self.role {
BoxSubdivision => {
let collection = self.collection();
let scale = collection.get_f32_default("Scale", 1.0);
let gap = collection.get_f32_default("Gap", 1.0);
let rotation = collection.get_f32_default("Rotation", 0.15);
let rounding = collection.get_f32_default("Rounding", 0.15);
let scale = params[0];
let gap = params[1];
let rotation = params[2];
let rounding = params[3];

let p = hit.pattern_pos / (5.0 * scale);
let rc = box_divide(p, gap, rotation, rounding);
Expand All @@ -493,11 +517,10 @@ impl MaterialFXNode {
hit.hash = rc.1;
}
Tiles => {
let collection = self.collection();
let size = collection.get_f32_default("Size", 0.8);
let subdivisions = collection.get_i32_default("Subdivisions", 2);
let _rotation = collection.get_f32_default("Rotation", 0.15);
let rounding = collection.get_f32_default("Rounding", 0.15);
let size = params[0];
let subdivisions = params[1] as i32;
let _rotation = params[2];
let rounding = params[3];

let p = hit.pattern_pos; // / (5.0);

Expand Down
38 changes: 29 additions & 9 deletions shared/src/materialfxobject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,16 @@ impl MaterialFXObject {
}
}

/// Loads the parameters of the nodes into memory for faster access.
pub fn load_parameters(&self, time: &TheTime) -> Vec<Vec<f32>> {
let mut data = vec![];

for n in &self.nodes {
data.push(n.load_parameters(time));
}
data
}

/// Computes the material
pub fn compute(
&self,
Expand All @@ -65,10 +75,11 @@ impl MaterialFXObject {
hit: &mut Hit,
geo_obj: &GeoFXObject,
scale: f32,
mat_obj_params: &[Vec<f32>],
) -> (f32, usize) {
hit.pattern_pos = p;
let d = geo_obj.distance(time, p, scale, &mut Some(hit));
if self.follow_geo_trail(time, hit) {
if self.follow_geo_trail(time, hit, mat_obj_params) {
if hit.interior_distance <= 0.01 {
hit.value = 0.0;
} else {
Expand All @@ -86,9 +97,10 @@ impl MaterialFXObject {
hit: &mut Hit,
geo_obj: &GeoFXObject,
geo_obj_params: &[Vec<f32>],
mat_obj_params: &[Vec<f32>],
) -> (f32, usize) {
let mut d = geo_obj.distance_3d(time, p, &mut Some(hit), geo_obj_params);
_ = self.follow_geo_trail(time, hit);
_ = self.follow_geo_trail(time, hit, mat_obj_params);

match hit.extrusion {
GeoFXNodeExtrusion::X => {
Expand Down Expand Up @@ -168,9 +180,14 @@ impl MaterialFXObject {
d
}

pub fn follow_geo_trail(&self, _time: &TheTime, hit: &mut Hit) -> bool {
pub fn follow_geo_trail(
&self,
_time: &TheTime,
hit: &mut Hit,
mat_obj_params: &[Vec<f32>],
) -> bool {
if let Some((index, _input)) = self.find_connected_input_node(0, 1) {
self.nodes[index as usize].geometry(hit);
self.nodes[index as usize].geometry(hit, &mat_obj_params[index as usize]);
return true;
}
false
Expand All @@ -184,6 +201,7 @@ impl MaterialFXObject {
hit: &mut Hit,
geo_obj: &GeoFXObject,
geo_obj_params: &[Vec<f32>],
mat_obj_params: &[Vec<f32>],
) -> Vec3f {
let scale = 0.5773 * 0.0005;
let e = vec2f(1.0 * scale, -1.0 * scale);
Expand All @@ -197,16 +215,16 @@ impl MaterialFXObject {

let n = e1
* self
.get_distance_3d(time, p + e1, hit, geo_obj, geo_obj_params)
.get_distance_3d(time, p + e1, hit, geo_obj, geo_obj_params, mat_obj_params)
.0
+ e2 * self
.get_distance_3d(time, p + e2, hit, geo_obj, geo_obj_params)
.get_distance_3d(time, p + e2, hit, geo_obj, geo_obj_params, mat_obj_params)
.0
+ e3 * self
.get_distance_3d(time, p + e3, hit, geo_obj, geo_obj_params)
.get_distance_3d(time, p + e3, hit, geo_obj, geo_obj_params, mat_obj_params)
.0
+ e4 * self
.get_distance_3d(time, p + e4, hit, geo_obj, geo_obj_params)
.get_distance_3d(time, p + e4, hit, geo_obj, geo_obj_params, mat_obj_params)
.0;
normalize(n)
}
Expand Down Expand Up @@ -408,6 +426,8 @@ impl MaterialFXObject {

let noise2d = MaterialFXNode::new(MaterialFXNodeRole::Noise2D);

let mat_obj_params = self.load_parameters(&time);

buffer
.pixels_mut()
.par_rchunks_exact_mut(width * 4)
Expand All @@ -432,7 +452,7 @@ impl MaterialFXObject {
hit.global_uv = hit.uv;

noise2d.compute(&mut hit, palette, textures, vec![]);
self.get_distance(&time, hit.uv, &mut hit, &geo_object, 1.0);
self.get_distance(&time, hit.uv, &mut hit, &geo_object, 1.0, &mat_obj_params);
self.compute(&mut hit, palette, textures);

color.x = hit.albedo.x;
Expand Down
8 changes: 8 additions & 0 deletions shared/src/region.rs
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,14 @@ impl Region {
pub fn to_json(&self) -> String {
serde_json::to_string(&self).unwrap_or_default()
}

/// Create a shallow clone without any of the prerendered data.
pub fn shallow_clone(&self) -> Region {
Region {
prerendered: PreRendered::zero(),
..self.clone()
}
}
}

#[derive(Serialize, Deserialize, PartialEq, Clone, Copy, Debug)]
Expand Down
Loading

0 comments on commit 9ee083b

Please sign in to comment.