use std::time::Instant;
use gmac::{
core::{
primitives::generate_box,
transformation::{build_transformation_matrix, transform_selected_nodes},
},
io::{stl::StlFormat, vtk::write_vtp},
morph::{design_block::DesignBlock, ffd::FreeFormDeformer},
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let start_timer = Instant::now();
let mut mesh = generate_box(
[2.0, 1.0, 1.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [12, 12, 12], )?;
mesh.write_stl(Some("target/original.stl"), Some(StlFormat::Binary))?;
let design_block = DesignBlock::new(
[1.8, 1.2, 1.2], [0.2, 0.0, 0.0], [0.0, 0.0, 0.0], [3, 2, 2], )?;
write_vtp(&design_block.nodes, Some("target/design_block.vtp"))?;
let free_design_ids = design_block.select_free_design_nodes(&mesh, Some(2))?;
let transform_matrix = build_transformation_matrix(
[0.25, 0.0, 0.0],
[125.0, 0.0, 0.0],
[1.0, 1.25, 1.25],
);
let deformed_design_nodes = transform_selected_nodes(
&design_block.nodes,
&free_design_ids,
&transform_matrix,
&[0.2, 0.0, 0.0], );
let deformation_timer = Instant::now();
let ffd = FreeFormDeformer::new(design_block)?;
mesh.nodes = ffd.deform(&mesh.nodes, &deformed_design_nodes)?;
let elapsed = deformation_timer.elapsed();
println!("Deformation took: {}ms", elapsed.as_millis());
write_vtp(
&deformed_design_nodes,
Some("target/deformed_design_block.vtp"),
)?;
mesh.write_stl(Some("target/deformed.stl"), Some(StlFormat::Binary))?;
let elapsed = start_timer.elapsed();
println!("Total took: {}ms", elapsed.as_millis());
Ok(())
}