From cd2eeac63ce4a81fda9cea8b0fd12f249db151dd Mon Sep 17 00:00:00 2001 From: davids91 Date: Sat, 10 Aug 2024 21:32:54 +0200 Subject: [PATCH] Initial implementation of rotation matrix support --- Cargo.toml | 3 +- assets/models/minecraft_arc.vox | Bin 0 -> 144483 bytes src/octree/convert/magicavoxel.rs | 251 +++++++++++++++++++++++------- 3 files changed, 194 insertions(+), 60 deletions(-) create mode 100644 assets/models/minecraft_arc.vox diff --git a/Cargo.toml b/Cargo.toml index afd4067..3f467f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ license = "MIT OR Apache-2.0" default = ["dot_vox_support"] raytracing = ["dep:image", "dep:show-image"] serialization = ["dep:serde"] -dot_vox_support = ["dep:dot_vox"] +dot_vox_support = ["dep:dot_vox", "dep:nalgebra"] bevy_wgpu = ["raytracing", "dep:bevy"] [dependencies] @@ -17,6 +17,7 @@ num-traits = "0.2.19" serde = { version = "1.0.183", features = ["derive"], optional = true } bendy = { git = "https://github.com/davids91/bendy.git" , features = ["std", "serde"]} dot_vox = { version = "5.1.1", optional = true } +nalgebra = { version = "0.33.0", optional = true } # for example cpu_render image = { version = "0.25.1", optional = true } diff --git a/assets/models/minecraft_arc.vox b/assets/models/minecraft_arc.vox new file mode 100644 index 0000000000000000000000000000000000000000..e347d7e135aed744a20158aaa4a56c51d2892642 GIT binary patch literal 144483 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 z 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 z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_)+zr2J3H|D^m+%KxPNPs;zK{7=gNr2J3H|D^m+%KxPN zPs;zK{7=gNr2J3H|D^m+%KxPNPs;zK{7=gNr2J3H|D^m+%KxPNPs;zK{7=gNr2J3H z|D^m+%KxPNPs;zK{7=gNr2J3H|D^m+%KxPNPs;zK{7>?K@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw@_+Jw z@_+Jw@_+Jw@_)+zr~H4)|EK(a%KxYQf6D)-{C~>-r~H4)|EK(a%KxYQf6D)-{C~>- zr~H4)|EK(a%KxYQf6D)-{C~>-r~H4)|EK(a%KxYQf6D)-{C~>-r~H4)|EK(a%KxYQ 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 for Color { fn from(color: Albedo) -> Self { @@ -64,8 +65,53 @@ impl VoxelData for Color { } } -fn iterate_vox_tree) -> ()>(vox_tree: &DotVoxData, mut fun: F) { - let mut node_stack: Vec<(u32, V3c, u32)> = Vec::new(); +/// Converts the given byte value to a rotation matrix +/// Rotation matrix in voxel context enables 90 degr rotations only, so the contents of the matrix is restricted to 0,1,-1 +fn parse_rotation_matrix(b: u8) -> Matrix3 { + let mut result = Matrix3::::new(0, 0, 0, 0, 0, 0, 0, 0, 0); + + // decide absolute values of each row + let index_in_first_row = b & 0x3; + let index_in_second_row = ((b & (0x3 << 2)) >> 2) & 0x3; + let index_in_third_row = !(index_in_first_row ^ index_in_second_row) & 0x3; + debug_assert!(index_in_first_row < 3); + debug_assert!(index_in_second_row < 3); + debug_assert!(index_in_third_row < 3); + debug_assert!(index_in_first_row != index_in_second_row); + debug_assert!(index_in_first_row != index_in_third_row); + debug_assert!(index_in_second_row != index_in_third_row); + + // decide the sign of the values + let sign_first_row = if 0 == (b & 0x10) { 1 } else { -1 }; + let sign_second_row = if 0 == (b & 0x20) { 1 } else { -1 }; + let sign_third_row = if 0 == (b & 0x40) { 1 } else { -1 }; + + // set the values in the matrix + result.data.0[0][index_in_first_row as usize] = sign_first_row; + result.data.0[1][index_in_second_row as usize] = sign_second_row; + result.data.0[2][index_in_third_row as usize] = sign_third_row; + + result +} + +impl V3c +where + T: num_traits::Num + Clone + Copy + std::convert::From, +{ + fn clone_transformed(&self, matrix: &Matrix3) -> V3c { + V3c::new( + self.x * matrix.m11.into() + self.y * matrix.m21.into() + self.z * matrix.m31.into(), + self.x * matrix.m21.into() + self.y * matrix.m22.into() + self.z * matrix.m23.into(), + self.x * matrix.m31.into() + self.y * matrix.m32.into() + self.z * matrix.m33.into(), + ) + } +} + +fn iterate_vox_tree, &Matrix3) -> ()>( + vox_tree: &DotVoxData, + mut fun: F, +) { + let mut node_stack: Vec<(u32, V3c, Matrix3, u32)> = Vec::new(); match &vox_tree.scenes[0] { SceneNode::Transform { @@ -74,20 +120,20 @@ fn iterate_vox_tree) -> ()>(vox_tree: &DotVoxData, mu child, layer_id: _, } => { - node_stack.push((*child, V3c::unit(0), 0)); + node_stack.push((*child, V3c::unit(0), Matrix3::identity(), 0)); } _ => { - panic!("The root node for a magicka voxel DAG should be a transform") + panic!("The root node for a magicka voxel DAG should be a translation") } } while 0 < node_stack.len() { - let (current_node, transform, index) = *node_stack.last().unwrap(); + let (current_node, translation, rotation, index) = *node_stack.last().unwrap(); // println!("========================================================="); // println!("node_stack size: {}", node_stack.len()); // println!( - // "node: {}, transform: {:?}, index: {}", - // current_node, transform, index + // "node: {}, translation: {:?}, index: {}", + // current_node, translation, index // ); match &vox_tree.scenes[current_node as usize] { SceneNode::Transform { @@ -96,28 +142,40 @@ fn iterate_vox_tree) -> ()>(vox_tree: &DotVoxData, mu child, layer_id: _, } => { - // println!("Processing transform"); - let transform_delta: V3c; - if let Some(t) = frames[0].attributes.get("_t") { - transform_delta = t - .split(" ") - .map(|x| x.parse().expect("Not an integer!")) - .collect::>() - .into(); + // println!("Processing translation"); + let translation = if let Some(t) = frames[0].attributes.get("_t") { + translation + + t.split(" ") + .map(|x| x.parse().expect("Not an integer!")) + .collect::>() + .into() } else { - transform_delta = V3c::new(0, 0, 0); - } - // 0 == index ==> iterate into the child of the transform - if 0 == index { + translation + }; + // println!("orientation: {:?}", rotation,); + let orientation = if let Some(r) = frames[0].attributes.get("_r") { + // println!( + // "orientation updated with: {:?}", + // parse_rotation_matrix(r.parse().unwrap()), + // ); // println!( - // "adding {:?} --> {:?}", - // transform_delta, - // transform + transform_delta + // "updated orientation: {:?}", + // rotation * parse_rotation_matrix(r.parse().unwrap()), // ); - node_stack.push((*child, transform + transform_delta, 0)); + rotation + * parse_rotation_matrix( + r.parse() + .expect("Expected valid u8 byte to parse rotation matrix"), + ) + } else { + rotation + }; + // 0 == index ==> iterate into the child of the translation + if 0 == index { + node_stack.push((*child, translation, orientation, 0)); } else { // println!("pop"); - // 0 != index ==> remove transform and iterate into parent + // 0 != index ==> remove translation and iterate into parent node_stack.pop(); } } @@ -125,14 +183,14 @@ fn iterate_vox_tree) -> ()>(vox_tree: &DotVoxData, mu attributes: _, children, } => { - // println!("Processing Group[{index}] at {:?}", transform); + // println!("Processing Group[{index}] at {:?}", translation); if (index as usize) < children.len() { - node_stack.last_mut().unwrap().2 += 1; - node_stack.push((children[index as usize], transform, 0)); + node_stack.last_mut().unwrap().3 += 1; + node_stack.push((children[index as usize], translation, rotation, 0)); } else { node_stack.pop(); if let Some(parent) = node_stack.last_mut() { - parent.2 += 1; + parent.3 += 1; } } } @@ -140,13 +198,17 @@ fn iterate_vox_tree) -> ()>(vox_tree: &DotVoxData, mu attributes: _, models, } => { - // println!("Processing shape at {:?}", transform); + // println!("Processing shape at {:?}", translation); for model in models { - fun(&vox_tree.models[model.model_id as usize], &transform); + fun( + &vox_tree.models[model.model_id as usize], + &translation, + &rotation, + ); } node_stack.pop(); if let Some(parent) = node_stack.last_mut() { - parent.2 += 1; + parent.3 += 1; } } } @@ -172,65 +234,107 @@ where // i += 1; // } - let mut min_position = V3c::::new(0, 0, 0); - let mut max_position = V3c::::new(0, 0, 0); - iterate_vox_tree(&vox_tree, |model, position| { + let mut min_position_lyup = V3c::::new(0, 0, 0); + let mut max_position_lyup = V3c::::new(0, 0, 0); + iterate_vox_tree(&vox_tree, |model, position, orientation| { // println!("raw pos: {:?}", position); let position = convert_coordinate( V3c::from(*position), CoordinateSystemType::RZUP, CoordinateSystemType::LYUP, ); - // println!("converted pos: {:?}", position); let model_size = convert_coordinate( - model.size.into(), + V3c::from(model.size).clone_transformed(orientation), CoordinateSystemType::RZUP, CoordinateSystemType::LYUP, ); - // println!("model_size: {:?}", model_size); - min_position.x = min_position.x.min(position.x - (model_size.x / 2)); - min_position.y = min_position.y.min(position.y - (model_size.y / 2)); - min_position.z = min_position.z.min(position.z - (model_size.z / 2)); + // println!("orientation: {:?}", orientation); + // println!("converted pos: {:?}", position); + // println!( + // "model_size: {:?} --> {:?}", + // V3c::from(model.size), + // model_size + // ); + min_position_lyup.x = min_position_lyup.x.min(position.x - (model_size.x / 2)); + min_position_lyup.y = min_position_lyup.y.min(position.y - (model_size.y / 2)); + min_position_lyup.z = min_position_lyup.z.min(position.z - (model_size.z / 2)); // println!("min position --> {:?}", min_position); // println!("max pos: {:?} + {:?}", position, model_size); - if (position.x + model_size.x) > max_position.x - || (position.y + model_size.y) > max_position.y - || (position.z + model_size.z) > max_position.z + if (position.x + model_size.x) > max_position_lyup.x + || (position.y + model_size.y) > max_position_lyup.y + || (position.z + model_size.z) > max_position_lyup.z { - max_position = position + model_size; + max_position_lyup = position + model_size; } + // println!("max_position: {:?}", max_position_lyup); + // println!("min position: {:?}", min_position_lyup); }); - max_position = max_position - min_position; - // println!("max_position: {:?}", max_position); - // println!("min position: {:?}", min_position); - let max_dimension = max_position.x.max(max_position.y).max(max_position.z); + max_position_lyup = max_position_lyup - min_position_lyup; + // println!("\nmax_position: {:?}", max_position_lyup); + // println!("min position: {:?}", min_position_lyup); + let max_dimension = max_position_lyup + .x + .max(max_position_lyup.y) + .max(max_position_lyup.z); let max_dimension = (max_dimension as f32).log2().ceil() as u32; let max_dimension = 2_u32.pow(max_dimension); // println!("octree size: {max_dimension} \n ============================ \n "); let mut shocovox_octree = Octree::::new(max_dimension).ok().unwrap(); let mut vmin = V3c::unit(max_dimension as u32); let mut vmax = V3c::unit(0u32); - iterate_vox_tree(&vox_tree, |model, position| { - // println!("raw pos: {:?}", position); + iterate_vox_tree(&vox_tree, |model, position, orientation| { + let model_size_half_lyup = convert_coordinate( + V3c::from(model.size).clone_transformed(orientation), + CoordinateSystemType::RZUP, + CoordinateSystemType::LYUP, + ) / 2; + let position = V3c::from(*position); // println!("model_size: {:?}", model.size); - let position = convert_coordinate( - V3c::from(*position - (V3c::from(model.size) / 2)), + // println!("model_size_half: {:?}", V3c::from(model.size) / 2); + // println!( + // "m11: {:?}, m21: {:?}, m31: {:?}", + // orientation.m11, orientation.m21, orientation.m31 + // ); + // println!( + // "oriented model size: {:?}", + // V3c::from(model.size).clone_transformed(orientation) + // ); + // println!("oriented model_size_half_lyup: {:?}", model_size_half_lyup); + // println!("raw pos: {:?}", position); + // println!( + // "pos_lyup: {:?}", + // convert_coordinate( + // position, + // CoordinateSystemType::RZUP, + // CoordinateSystemType::LYUP, + // ) + // ); + // println!( + // "corrected position_lyup: {:?}", + // convert_coordinate( + // position, + // CoordinateSystemType::RZUP, + // CoordinateSystemType::LYUP, + // ) - min_position_lyup + // - model_size_half_lyup + // ); + let position_lyup = convert_coordinate( + position, CoordinateSystemType::RZUP, CoordinateSystemType::LYUP, ); - // println!("converted pos: {:?}", position); - let current_position = position - min_position; - // println!("converted, corrected position: {:?}", current_position); + let current_position = position_lyup - min_position_lyup - model_size_half_lyup; for voxel in &model.voxels { let voxel_position = convert_coordinate( - V3c::from(*voxel), + V3c::from(*voxel).clone_transformed(orientation), CoordinateSystemType::RZUP, CoordinateSystemType::LYUP, ); // println!( - // "{:?} + {:?} = {:?} ", + // "{:?} + {:?} - ({:?}/2) = {:?} ", // current_position, // voxel_position, + // model_size_half_lyup * 2, // current_position + voxel_position // ); let cpos = current_position + voxel_position; @@ -241,7 +345,6 @@ where vmax = cpos.into(); } - //TODO: something is still fucks with the voxel positions? some models are rotated 90 on x shocovox_octree .insert( &V3c::::from(current_position + voxel_position.into()), @@ -251,9 +354,39 @@ where .unwrap(); } // println!("model position: {:?}", current_position); - // println!("|min, max: {:?}, {:?}", vmin, vmax); + // println!("|min, max: {:?}, {:?}\n\n", vmin, vmax); }); println!("Tree built from model!"); Ok(shocovox_octree) } } + +#[cfg(test)] +mod octree_tests { + use super::parse_rotation_matrix; + use nalgebra::Matrix3; + + #[test] + fn test_matrix_parse() { + let test_matrix = Matrix3::::new(1, 0, 0, 0, 1, 0, 0, 0, 1); + assert!(test_matrix.m11 == 1); + assert!(test_matrix.m22 == 1); + assert!(test_matrix.m33 == 1); + + let parsed_matrix = parse_rotation_matrix(4); + assert!(parse_rotation_matrix(4) == test_matrix); + assert!(parsed_matrix.m11 == 1); + assert!(parsed_matrix.m22 == 1); + assert!(parsed_matrix.m33 == 1); + + // https://github.com/ephtracy/voxel-model/blob/master/MagicaVoxel-file-format-vox-extension.txt + // Matrix3 storage is column major + let example = Matrix3::::new(0, 0, -1, 1, 0, 0, 0, -1, 0); + assert!( + parse_rotation_matrix((1 << 0) | (2 << 2) | (0 << 4) | (1 << 5) | (1 << 6)) == example + ); + assert!(example.m21 == 1); + assert!(example.m32 == -1); + assert!(example.m13 == -1); + } +}