From 9b3bf4c3c8b03ec7c45c0ecb5f5c312c5e243269 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Mon, 13 Mar 2023 00:37:29 +0100 Subject: [PATCH 01/12] initial support for multiple models in one vox file --- common/src/comp/body/ship.rs | 4 +- common/src/figure/mod.rs | 22 +- voxygen/src/scene/figure/load.rs | 531 ++++++++++++++++++++----------- 3 files changed, 361 insertions(+), 196 deletions(-) diff --git a/common/src/comp/body/ship.rs b/common/src/comp/body/ship.rs index e33b1df53a..728b2d8bde 100644 --- a/common/src/comp/body/ship.rs +++ b/common/src/comp/body/ship.rs @@ -175,6 +175,8 @@ pub mod figuredata { pub offset: [f32; 3], pub phys_offset: [f32; 3], pub central: VoxSimple, + #[serde(default)] + pub model_index: u32, } /// manual instead of through `make_vox_spec!` so that it can be in `common` @@ -220,7 +222,7 @@ pub mod figuredata { // need to load them in the server and sync them as an ECS resource. let vox = cache.load::(&["common.voxel.", &bone.central.0].concat())?; - let dyna = Dyna::::from_vox(&vox.read().0, false); + let dyna = Dyna::::from_vox(&vox.read().0, false, bone.model_index as usize); let dyna = dyna.map_into(|cell| { if let Some(rgb) = cell.get_color() { Block::new(BlockKind::Misc, rgb) diff --git a/common/src/figure/mod.rs b/common/src/figure/mod.rs index b69ba12492..e2e7296d76 100644 --- a/common/src/figure/mod.rs +++ b/common/src/figure/mod.rs @@ -21,7 +21,11 @@ use vek::*; pub type Segment = Dyna; impl From<&DotVoxData> for Segment { - fn from(dot_vox_data: &DotVoxData) -> Self { Segment::from_vox(dot_vox_data, false) } + fn from(dot_vox_data: &DotVoxData) -> Self { Segment::from_vox(dot_vox_data, false, 0) } +} + +impl From<(&DotVoxData, usize)> for Segment { + fn from(spec: (&DotVoxData, usize)) -> Self { Segment::from_vox(spec.0, false, spec.1) } } impl Segment { @@ -30,13 +34,13 @@ impl Segment { pub fn from_voxes(data: &[(&DotVoxData, Vec3, bool)]) -> (Self, Vec3) { let mut union = DynaUnionizer::new(); for (datum, offset, xmirror) in data.iter() { - union = union.add(Segment::from_vox(datum, *xmirror), *offset); + union = union.add(Segment::from_vox(datum, *xmirror, 0), *offset); } union.unify() } - pub fn from_vox(dot_vox_data: &DotVoxData, flipped: bool) -> Self { - if let Some(model) = dot_vox_data.models.get(0) { + pub fn from_vox(dot_vox_data: &DotVoxData, flipped: bool, model_index: usize) -> Self { + if let Some(model) = dot_vox_data.models.get(model_index) { let palette = dot_vox_data .palette .iter() @@ -202,8 +206,8 @@ impl MatSegment { }) } - pub fn from_vox(dot_vox_data: &DotVoxData, flipped: bool) -> Self { - if let Some(model) = dot_vox_data.models.get(0) { + pub fn from_vox(dot_vox_data: &DotVoxData, flipped: bool, model_index: usize) -> Self { + if let Some(model) = dot_vox_data.models.get(model_index) { let palette = dot_vox_data .palette .iter() @@ -264,5 +268,9 @@ impl MatSegment { } impl From<&DotVoxData> for MatSegment { - fn from(dot_vox_data: &DotVoxData) -> Self { Self::from_vox(dot_vox_data, false) } + fn from(dot_vox_data: &DotVoxData) -> Self { Self::from_vox(dot_vox_data, false, 0) } +} + +impl From<(&DotVoxData, usize)> for MatSegment { + fn from(spec: (&DotVoxData, usize)) -> Self { Self::from_vox(spec.0, false, spec.1) } } diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 9c13aa51fe..98f9499ed1 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -34,6 +34,8 @@ use vek::*; pub type BoneMeshes = (Segment, Vec3); +const DEFAULT_INDEX: u32 = 0; + fn load_segment(mesh_name: &str) -> Segment { let full_specifier: String = ["voxygen.voxel.", mesh_name].concat(); Segment::from(&DotVoxAsset::load_expect(&full_specifier).read().0) @@ -51,20 +53,31 @@ fn graceful_load_vox_fullspec(full_specifier: &str) -> AssetHandle }, } } -fn graceful_load_segment(mesh_name: &str) -> Segment { - Segment::from(&graceful_load_vox(mesh_name).read().0) +fn graceful_load_segment(mesh_name: &str, model_index: u32) -> Segment { + Segment::from((&graceful_load_vox(mesh_name).read().0, model_index as usize)) } -fn graceful_load_segment_fullspec(full_specifier: &str) -> Segment { - Segment::from(&graceful_load_vox_fullspec(full_specifier).read().0) +fn graceful_load_segment_fullspec(full_specifier: &str, model_index: u32) -> Segment { + Segment::from(( + &graceful_load_vox_fullspec(full_specifier).read().0, + model_index as usize, + )) } -fn graceful_load_segment_flipped(mesh_name: &str, flipped: bool) -> Segment { - Segment::from_vox(&graceful_load_vox(mesh_name).read().0, flipped) +fn graceful_load_segment_flipped(mesh_name: &str, flipped: bool, model_index: u32) -> Segment { + Segment::from_vox( + &graceful_load_vox(mesh_name).read().0, + flipped, + model_index as usize, + ) } -fn graceful_load_mat_segment(mesh_name: &str) -> MatSegment { - MatSegment::from(&graceful_load_vox(mesh_name).read().0) +fn graceful_load_mat_segment(mesh_name: &str, model_index: u32) -> MatSegment { + MatSegment::from((&graceful_load_vox(mesh_name).read().0, model_index as usize)) } -fn graceful_load_mat_segment_flipped(mesh_name: &str) -> MatSegment { - MatSegment::from_vox(&graceful_load_vox(mesh_name).read().0, true) +fn graceful_load_mat_segment_flipped(mesh_name: &str, model_index: u32) -> MatSegment { + MatSegment::from_vox( + &graceful_load_vox(mesh_name).read().0, + true, + model_index as usize, + ) } pub fn load_mesh(mesh_name: &str, position: Vec3) -> BoneMeshes { @@ -273,12 +286,13 @@ impl HumHeadSpec { let eye_rgb = body.species.eye_color(body.eye_color); // Load segment pieces - let bare_head = graceful_load_mat_segment(&spec.head.0); + let bare_head = graceful_load_mat_segment(&spec.head.0, DEFAULT_INDEX); let eyes = match spec.eyes.get(body.eyes as usize) { Some(Some(spec)) => Some(( color_spec.color_segment( - graceful_load_mat_segment(&spec.0).map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), + graceful_load_mat_segment(&spec.0, DEFAULT_INDEX) + .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), skin_rgb, hair_color, eye_rgb, @@ -293,7 +307,8 @@ impl HumHeadSpec { }; let hair = match spec.hair.get(body.hair_style as usize) { Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0).map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), + graceful_load_segment(&spec.0, DEFAULT_INDEX) + .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), Vec3::from(spec.1), )), Some(None) => None, @@ -304,7 +319,8 @@ impl HumHeadSpec { }; let beard = match spec.beard.get(body.beard as usize) { Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0).map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), + graceful_load_segment(&spec.0, DEFAULT_INDEX) + .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), Vec3::from(spec.1), )), Some(None) => None, @@ -314,7 +330,10 @@ impl HumHeadSpec { }, }; let accessory = match spec.accessory.get(body.accessory as usize) { - Some(Some(spec)) => Some((graceful_load_segment(&spec.0), Vec3::from(spec.1))), + Some(Some(spec)) => Some(( + graceful_load_segment(&spec.0, DEFAULT_INDEX), + Vec3::from(spec.1), + )), Some(None) => None, None => { warn!("No specification for this accessory: {:?}", body.accessory); @@ -542,9 +561,9 @@ impl HumArmorShoulderSpec { let mut shoulder_segment = color_spec.color_segment( if flipped { - graceful_load_mat_segment_flipped(&spec.left.vox_spec.0) + graceful_load_mat_segment_flipped(&spec.left.vox_spec.0, DEFAULT_INDEX) } else { - graceful_load_mat_segment(&spec.right.vox_spec.0) + graceful_load_mat_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) }, body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), @@ -622,9 +641,9 @@ impl HumArmorChestSpec { ) }; - let bare_chest = graceful_load_mat_segment("armor.empty"); + let bare_chest = graceful_load_mat_segment("armor.empty", DEFAULT_INDEX); - let mut chest_armor = graceful_load_mat_segment(&spec.vox_spec.0); + let mut chest_armor = graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX); if let Some(color) = spec.color { let chest_color = Vec3::from(color); @@ -663,9 +682,9 @@ impl HumArmorHandSpec { let mut hand_segment = color_spec.color_segment( if flipped { - graceful_load_mat_segment_flipped(&spec.left.vox_spec.0) + graceful_load_mat_segment_flipped(&spec.left.vox_spec.0, DEFAULT_INDEX) } else { - graceful_load_mat_segment(&spec.right.vox_spec.0) + graceful_load_mat_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) }, body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), @@ -724,7 +743,7 @@ impl HumArmorBeltSpec { }; let mut belt_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0), + graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -754,7 +773,7 @@ impl HumArmorBackSpec { }; let mut back_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0), + graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -796,9 +815,9 @@ impl HumArmorPantsSpec { ) }; - let bare_pants = graceful_load_mat_segment("armor.empty"); + let bare_pants = graceful_load_mat_segment("armor.empty", DEFAULT_INDEX); - let mut pants_armor = graceful_load_mat_segment(&spec.vox_spec.0); + let mut pants_armor = graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX); if let Some(color) = spec.color { let pants_color = Vec3::from(color); @@ -837,9 +856,9 @@ impl HumArmorFootSpec { let mut foot_segment = color_spec.color_segment( if flipped { - graceful_load_mat_segment_flipped(&spec.vox_spec.0) + graceful_load_mat_segment_flipped(&spec.vox_spec.0, DEFAULT_INDEX) } else { - graceful_load_mat_segment(&spec.vox_spec.0) + graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX) }, body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), @@ -885,7 +904,8 @@ impl HumMainWeaponSpec { None => return not_found(tool), }; - let tool_kind_segment = graceful_load_segment_flipped(&spec.vox_spec.0, flipped); + let tool_kind_segment = + graceful_load_segment_flipped(&spec.vox_spec.0, flipped, DEFAULT_INDEX); let mut offset = Vec3::from(spec.vox_spec.1); if flipped { @@ -917,7 +937,7 @@ impl HumArmorLanternSpec { }; let mut lantern_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0), + graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -939,7 +959,7 @@ impl HumArmorHeadSpec { .get(&(body.species, body.body_type, head?.to_string())) { Some(spec) => Some(( - graceful_load_segment(&spec.vox_spec.0), + graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX), Vec3::::from(spec.vox_spec.1).as_(), )), None => { @@ -980,9 +1000,9 @@ impl HumArmorTabardSpec { ) }; - let bare_tabard = graceful_load_mat_segment("armor.empty"); + let bare_tabard = graceful_load_mat_segment("armor.empty", DEFAULT_INDEX); - let mut tabard_armor = graceful_load_mat_segment(&spec.vox_spec.0); + let mut tabard_armor = graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX); if let Some(color) = spec.color { let tabard_color = Vec3::from(color); @@ -1018,7 +1038,7 @@ impl HumArmorGliderSpec { }; let mut glider_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0), + graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -1054,6 +1074,8 @@ struct SidedQSCentralVoxSpec { struct QuadrupedSmallCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -1070,6 +1092,8 @@ struct SidedQSLateralVoxSpec { struct QuadrupedSmallLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -1137,7 +1161,7 @@ impl QuadrupedSmallCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -1153,7 +1177,7 @@ impl QuadrupedSmallCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest.central.0); + let central = graceful_load_segment(&spec.chest.central.0, spec.chest.model_index); (central, Vec3::from(spec.chest.offset)) } @@ -1169,7 +1193,7 @@ impl QuadrupedSmallCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail.central.0); + let central = graceful_load_segment(&spec.tail.central.0, spec.tail.model_index); (central, Vec3::from(spec.tail.offset)) } @@ -1187,7 +1211,11 @@ impl QuadrupedSmallLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.left_front.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.left_front.lateral.0, + true, + spec.left_front.model_index, + ); (lateral, Vec3::from(spec.left_front.offset)) } @@ -1203,7 +1231,8 @@ impl QuadrupedSmallLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.right_front.lateral.0); + let lateral = + graceful_load_segment(&spec.right_front.lateral.0, spec.right_front.model_index); (lateral, Vec3::from(spec.right_front.offset)) } @@ -1219,7 +1248,11 @@ impl QuadrupedSmallLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.left_back.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.left_back.lateral.0, + true, + spec.left_back.model_index, + ); (lateral, Vec3::from(spec.left_back.offset)) } @@ -1235,7 +1268,8 @@ impl QuadrupedSmallLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.right_back.lateral.0); + let lateral = + graceful_load_segment(&spec.right_back.lateral.0, spec.right_back.model_index); (lateral, Vec3::from(spec.right_back.offset)) } @@ -1259,6 +1293,8 @@ struct SidedQMCentralVoxSpec { struct QuadrupedMediumCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -1278,6 +1314,8 @@ struct SidedQMLateralVoxSpec { struct QuadrupedMediumLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -1375,7 +1413,7 @@ impl QuadrupedMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -1391,7 +1429,7 @@ impl QuadrupedMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.neck.central.0); + let central = graceful_load_segment(&spec.neck.central.0, spec.neck.model_index); (central, Vec3::from(spec.neck.offset)) } @@ -1407,7 +1445,7 @@ impl QuadrupedMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.jaw.central.0); + let central = graceful_load_segment(&spec.jaw.central.0, spec.jaw.model_index); (central, Vec3::from(spec.jaw.offset)) } @@ -1423,7 +1461,7 @@ impl QuadrupedMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.ears.central.0); + let central = graceful_load_segment(&spec.ears.central.0, spec.ears.model_index); (central, Vec3::from(spec.ears.offset)) } @@ -1439,7 +1477,8 @@ impl QuadrupedMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.torso_front.central.0); + let central = + graceful_load_segment(&spec.torso_front.central.0, spec.torso_front.model_index); (central, Vec3::from(spec.torso_front.offset)) } @@ -1455,7 +1494,8 @@ impl QuadrupedMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.torso_back.central.0); + let central = + graceful_load_segment(&spec.torso_back.central.0, spec.torso_back.model_index); (central, Vec3::from(spec.torso_back.offset)) } @@ -1471,7 +1511,7 @@ impl QuadrupedMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail.central.0); + let central = graceful_load_segment(&spec.tail.central.0, spec.tail.model_index); (central, Vec3::from(spec.tail.offset)) } @@ -1489,7 +1529,8 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_fl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_fl.lateral.0, true, spec.leg_fl.model_index); (lateral, Vec3::from(spec.leg_fl.offset)) } @@ -1505,7 +1546,7 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_fr.lateral.0); + let lateral = graceful_load_segment(&spec.leg_fr.lateral.0, spec.leg_fr.model_index); (lateral, Vec3::from(spec.leg_fr.offset)) } @@ -1521,7 +1562,8 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_bl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_bl.lateral.0, true, spec.leg_bl.model_index); (lateral, Vec3::from(spec.leg_bl.offset)) } @@ -1537,7 +1579,7 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_br.lateral.0); + let lateral = graceful_load_segment(&spec.leg_br.lateral.0, spec.leg_br.model_index); (lateral, Vec3::from(spec.leg_br.offset)) } @@ -1553,7 +1595,8 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.foot_fl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.foot_fl.lateral.0, true, spec.foot_fl.model_index); (lateral, Vec3::from(spec.foot_fl.offset)) } @@ -1569,7 +1612,7 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_fr.lateral.0); + let lateral = graceful_load_segment(&spec.foot_fr.lateral.0, spec.foot_fr.model_index); (lateral, Vec3::from(spec.foot_fr.offset)) } @@ -1585,7 +1628,8 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.foot_bl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.foot_bl.lateral.0, true, spec.foot_bl.model_index); (lateral, Vec3::from(spec.foot_bl.offset)) } @@ -1601,7 +1645,7 @@ impl QuadrupedMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_br.lateral.0); + let lateral = graceful_load_segment(&spec.foot_br.lateral.0, spec.foot_br.model_index); (lateral, Vec3::from(spec.foot_br.offset)) } @@ -1621,6 +1665,8 @@ struct SidedBMCentralVoxSpec { struct BirdMediumCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -1639,6 +1685,8 @@ struct SidedBMLateralVoxSpec { struct BirdMediumLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -1712,7 +1760,7 @@ impl BirdMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -1728,7 +1776,7 @@ impl BirdMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest.central.0); + let central = graceful_load_segment(&spec.chest.central.0, spec.chest.model_index); (central, Vec3::from(spec.chest.offset)) } @@ -1744,7 +1792,7 @@ impl BirdMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail.central.0); + let central = graceful_load_segment(&spec.tail.central.0, spec.tail.model_index); (central, Vec3::from(spec.tail.offset)) } @@ -1761,7 +1809,11 @@ impl BirdMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.wing_in_l.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.wing_in_l.lateral.0, + true, + spec.wing_in_l.model_index, + ); (lateral, Vec3::from(spec.wing_in_l.offset)) } @@ -1777,7 +1829,7 @@ impl BirdMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_in_r.lateral.0); + let lateral = graceful_load_segment(&spec.wing_in_r.lateral.0, spec.wing_in_r.model_index); (lateral, Vec3::from(spec.wing_in_r.offset)) } @@ -1793,7 +1845,11 @@ impl BirdMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.wing_out_l.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.wing_out_l.lateral.0, + true, + spec.wing_out_l.model_index, + ); (lateral, Vec3::from(spec.wing_out_l.offset)) } @@ -1809,7 +1865,8 @@ impl BirdMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_out_r.lateral.0); + let lateral = + graceful_load_segment(&spec.wing_out_r.lateral.0, spec.wing_out_r.model_index); (lateral, Vec3::from(spec.wing_out_r.offset)) } @@ -1825,7 +1882,8 @@ impl BirdMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_l.lateral.0, true, spec.leg_l.model_index); (lateral, Vec3::from(spec.leg_l.offset)) } @@ -1841,7 +1899,7 @@ impl BirdMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_r.lateral.0); + let lateral = graceful_load_segment(&spec.leg_r.lateral.0, spec.leg_r.model_index); (lateral, Vec3::from(spec.leg_r.offset)) } @@ -1865,6 +1923,8 @@ struct SidedTCentralVoxSpec { struct TheropodCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] struct TheropodLateralSpec(HashMap<(TSpecies, TBodyType), SidedTLateralVoxSpec>); @@ -1882,6 +1942,8 @@ struct SidedTLateralVoxSpec { struct TheropodLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( theropod::Body, @@ -1968,7 +2030,7 @@ impl TheropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -1984,7 +2046,7 @@ impl TheropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.jaw.central.0); + let central = graceful_load_segment(&spec.jaw.central.0, spec.jaw.model_index); (central, Vec3::from(spec.jaw.offset)) } @@ -2000,7 +2062,7 @@ impl TheropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.neck.central.0); + let central = graceful_load_segment(&spec.neck.central.0, spec.neck.model_index); (central, Vec3::from(spec.neck.offset)) } @@ -2016,7 +2078,8 @@ impl TheropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest_front.central.0); + let central = + graceful_load_segment(&spec.chest_front.central.0, spec.chest_front.model_index); (central, Vec3::from(spec.chest_front.offset)) } @@ -2032,7 +2095,8 @@ impl TheropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest_back.central.0); + let central = + graceful_load_segment(&spec.chest_back.central.0, spec.chest_back.model_index); (central, Vec3::from(spec.chest_back.offset)) } @@ -2048,7 +2112,8 @@ impl TheropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_front.central.0); + let central = + graceful_load_segment(&spec.tail_front.central.0, spec.tail_front.model_index); (central, Vec3::from(spec.tail_front.offset)) } @@ -2064,7 +2129,7 @@ impl TheropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_back.central.0); + let central = graceful_load_segment(&spec.tail_back.central.0, spec.tail_back.model_index); (central, Vec3::from(spec.tail_back.offset)) } @@ -2081,7 +2146,8 @@ impl TheropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.hand_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.hand_l.lateral.0, true, spec.hand_l.model_index); (lateral, Vec3::from(spec.hand_l.offset)) } @@ -2097,7 +2163,7 @@ impl TheropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.hand_r.lateral.0); + let lateral = graceful_load_segment(&spec.hand_r.lateral.0, spec.hand_r.model_index); (lateral, Vec3::from(spec.hand_r.offset)) } @@ -2113,7 +2179,8 @@ impl TheropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_l.lateral.0, true, spec.leg_l.model_index); (lateral, Vec3::from(spec.leg_l.offset)) } @@ -2129,7 +2196,7 @@ impl TheropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_r.lateral.0); + let lateral = graceful_load_segment(&spec.leg_r.lateral.0, spec.leg_r.model_index); (lateral, Vec3::from(spec.leg_r.offset)) } @@ -2145,7 +2212,8 @@ impl TheropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.foot_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.foot_l.lateral.0, true, spec.foot_l.model_index); (lateral, Vec3::from(spec.foot_l.offset)) } @@ -2161,7 +2229,7 @@ impl TheropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_r.lateral.0); + let lateral = graceful_load_segment(&spec.foot_r.lateral.0, spec.foot_r.model_index); (lateral, Vec3::from(spec.foot_r.offset)) } @@ -2180,6 +2248,8 @@ struct SidedACentralVoxSpec { struct ArthropodCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] struct ArthropodLateralSpec(HashMap<(ASpecies, ABodyType), SidedALateralVoxSpec>); @@ -2205,6 +2275,8 @@ struct SidedALateralVoxSpec { struct ArthropodLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( arthropod::Body, @@ -2302,7 +2374,7 @@ impl ArthropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -2318,7 +2390,7 @@ impl ArthropodCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest.central.0); + let central = graceful_load_segment(&spec.chest.central.0, spec.chest.model_index); (central, Vec3::from(spec.chest.offset)) } @@ -2335,7 +2407,11 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.mandible_l.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.mandible_l.lateral.0, + true, + spec.mandible_l.model_index, + ); (lateral, Vec3::from(spec.mandible_l.offset)) } @@ -2351,7 +2427,8 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.mandible_r.lateral.0); + let lateral = + graceful_load_segment(&spec.mandible_r.lateral.0, spec.mandible_r.model_index); (lateral, Vec3::from(spec.mandible_r.offset)) } @@ -2367,7 +2444,8 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.wing_fl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.wing_fl.lateral.0, true, spec.wing_fl.model_index); (lateral, Vec3::from(spec.wing_fl.offset)) } @@ -2383,7 +2461,7 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_fr.lateral.0); + let lateral = graceful_load_segment(&spec.wing_fr.lateral.0, spec.wing_fr.model_index); (lateral, Vec3::from(spec.wing_fr.offset)) } @@ -2399,7 +2477,8 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.wing_bl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.wing_bl.lateral.0, true, spec.wing_bl.model_index); (lateral, Vec3::from(spec.wing_bl.offset)) } @@ -2415,7 +2494,7 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_br.lateral.0); + let lateral = graceful_load_segment(&spec.wing_br.lateral.0, spec.wing_br.model_index); (lateral, Vec3::from(spec.wing_br.offset)) } @@ -2431,7 +2510,8 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_fl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_fl.lateral.0, true, spec.leg_fl.model_index); (lateral, Vec3::from(spec.leg_fl.offset)) } @@ -2447,7 +2527,7 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_fr.lateral.0); + let lateral = graceful_load_segment(&spec.leg_fr.lateral.0, spec.leg_fr.model_index); (lateral, Vec3::from(spec.leg_fr.offset)) } @@ -2464,7 +2544,8 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_fcl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_fcl.lateral.0, true, spec.leg_fcl.model_index); (lateral, Vec3::from(spec.leg_fcl.offset)) } @@ -2481,7 +2562,7 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_fcr.lateral.0); + let lateral = graceful_load_segment(&spec.leg_fcr.lateral.0, spec.leg_fcr.model_index); (lateral, Vec3::from(spec.leg_fcr.offset)) } @@ -2498,7 +2579,8 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_bcl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_bcl.lateral.0, true, spec.leg_bcl.model_index); (lateral, Vec3::from(spec.leg_bcl.offset)) } @@ -2515,7 +2597,7 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_bcr.lateral.0); + let lateral = graceful_load_segment(&spec.leg_bcr.lateral.0, spec.leg_bcr.model_index); (lateral, Vec3::from(spec.leg_bcr.offset)) } @@ -2531,7 +2613,8 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_bl.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_bl.lateral.0, true, spec.leg_bl.model_index); (lateral, Vec3::from(spec.leg_bl.offset)) } @@ -2547,7 +2630,7 @@ impl ArthropodLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_br.lateral.0); + let lateral = graceful_load_segment(&spec.leg_br.lateral.0, spec.leg_br.model_index); (lateral, Vec3::from(spec.leg_br.offset)) } @@ -2568,6 +2651,8 @@ struct SidedFMCentralVoxSpec { struct FishMediumCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] struct FishMediumLateralSpec(HashMap<(FMSpecies, FMBodyType), SidedFMLateralVoxSpec>); @@ -2580,6 +2665,8 @@ struct SidedFMLateralVoxSpec { struct FishMediumLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -2647,7 +2734,7 @@ impl FishMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -2663,7 +2750,7 @@ impl FishMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.jaw.central.0); + let central = graceful_load_segment(&spec.jaw.central.0, spec.jaw.model_index); (central, Vec3::from(spec.jaw.offset)) } @@ -2679,7 +2766,8 @@ impl FishMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest_front.central.0); + let central = + graceful_load_segment(&spec.chest_front.central.0, spec.chest_front.model_index); (central, Vec3::from(spec.chest_front.offset)) } @@ -2695,7 +2783,8 @@ impl FishMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest_back.central.0); + let central = + graceful_load_segment(&spec.chest_back.central.0, spec.chest_back.model_index); (central, Vec3::from(spec.chest_back.offset)) } @@ -2711,7 +2800,7 @@ impl FishMediumCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail.central.0); + let central = graceful_load_segment(&spec.tail.central.0, spec.tail.model_index); (central, Vec3::from(spec.tail.offset)) } @@ -2729,7 +2818,8 @@ impl FishMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.fin_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.fin_l.lateral.0, true, spec.fin_l.model_index); (lateral, Vec3::from(spec.fin_l.offset)) } @@ -2745,7 +2835,7 @@ impl FishMediumLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.fin_r.lateral.0); + let lateral = graceful_load_segment(&spec.fin_r.lateral.0, spec.fin_r.model_index); (lateral, Vec3::from(spec.fin_r.offset)) } @@ -2764,6 +2854,8 @@ struct SidedFSCentralVoxSpec { struct FishSmallCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] struct FishSmallLateralSpec(HashMap<(FSSpecies, FSBodyType), SidedFSLateralVoxSpec>); @@ -2776,6 +2868,8 @@ struct SidedFSLateralVoxSpec { struct FishSmallLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -2834,7 +2928,7 @@ impl FishSmallCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest.central.0); + let central = graceful_load_segment(&spec.chest.central.0, spec.chest.model_index); (central, Vec3::from(spec.chest.offset)) } @@ -2850,7 +2944,7 @@ impl FishSmallCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail.central.0); + let central = graceful_load_segment(&spec.tail.central.0, spec.tail.model_index); (central, Vec3::from(spec.tail.offset)) } @@ -2868,7 +2962,8 @@ impl FishSmallLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.fin_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.fin_l.lateral.0, true, spec.fin_l.model_index); (lateral, Vec3::from(spec.fin_l.offset)) } @@ -2884,7 +2979,7 @@ impl FishSmallLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.fin_r.lateral.0); + let lateral = graceful_load_segment(&spec.fin_r.lateral.0, spec.fin_r.model_index); (lateral, Vec3::from(spec.fin_r.offset)) } @@ -3001,7 +3096,7 @@ impl BipedSmallArmorHeadSpec { &self.0.default }; - let head_segment = graceful_load_segment(&spec.vox_spec.0); + let head_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3022,7 +3117,7 @@ impl BipedSmallArmorChestSpec { &self.0.default }; - let chest_segment = graceful_load_segment(&spec.vox_spec.0); + let chest_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3043,7 +3138,7 @@ impl BipedSmallArmorTailSpec { &self.0.default }; - let tail_segment = graceful_load_segment(&spec.vox_spec.0); + let tail_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3064,7 +3159,7 @@ impl BipedSmallArmorPantsSpec { &self.0.default }; - let pants_segment = graceful_load_segment(&spec.vox_spec.0); + let pants_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3086,9 +3181,9 @@ impl BipedSmallArmorHandSpec { }; let hand_segment = if flipped { - graceful_load_segment_flipped(&spec.left.vox_spec.0, true) + graceful_load_segment_flipped(&spec.left.vox_spec.0, true, DEFAULT_INDEX) } else { - graceful_load_segment(&spec.right.vox_spec.0) + graceful_load_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) }; let offset = if flipped { spec.left.vox_spec.1 @@ -3118,9 +3213,9 @@ impl BipedSmallArmorFootSpec { }; let foot_segment = if flipped { - graceful_load_segment_flipped(&spec.left.vox_spec.0, true) + graceful_load_segment_flipped(&spec.left.vox_spec.0, true, DEFAULT_INDEX) } else { - graceful_load_segment(&spec.right.vox_spec.0) + graceful_load_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) }; let offset = if flipped { spec.left.vox_spec.1 @@ -3147,9 +3242,9 @@ impl BipedSmallWeaponSpec { }; let tool_kind_segment = if flipped { - graceful_load_segment_flipped(&spec.vox_spec.0, true) + graceful_load_segment_flipped(&spec.vox_spec.0, true, DEFAULT_INDEX) } else { - graceful_load_segment(&spec.vox_spec.0) + graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX) }; let offset = Vec3::new( @@ -3184,6 +3279,8 @@ struct SidedDCentralVoxSpec { struct DragonCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -3204,6 +3301,8 @@ struct SidedDLateralVoxSpec { struct DragonLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -3297,7 +3396,7 @@ impl DragonCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.upper.central.0); + let central = graceful_load_segment(&spec.upper.central.0, spec.upper.model_index); (central, Vec3::from(spec.upper.offset)) } @@ -3313,7 +3412,7 @@ impl DragonCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.lower.central.0); + let central = graceful_load_segment(&spec.lower.central.0, spec.lower.model_index); (central, Vec3::from(spec.lower.offset)) } @@ -3329,7 +3428,7 @@ impl DragonCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.jaw.central.0); + let central = graceful_load_segment(&spec.jaw.central.0, spec.jaw.model_index); (central, Vec3::from(spec.jaw.offset)) } @@ -3345,7 +3444,8 @@ impl DragonCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest_front.central.0); + let central = + graceful_load_segment(&spec.chest_front.central.0, spec.chest_front.model_index); (central, Vec3::from(spec.chest_front.offset)) } @@ -3361,7 +3461,8 @@ impl DragonCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest_rear.central.0); + let central = + graceful_load_segment(&spec.chest_rear.central.0, spec.chest_rear.model_index); (central, Vec3::from(spec.chest_rear.offset)) } @@ -3377,7 +3478,8 @@ impl DragonCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_front.central.0); + let central = + graceful_load_segment(&spec.tail_front.central.0, spec.tail_front.model_index); (central, Vec3::from(spec.tail_front.offset)) } @@ -3393,7 +3495,7 @@ impl DragonCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_rear.central.0); + let central = graceful_load_segment(&spec.tail_rear.central.0, spec.tail_rear.model_index); (central, Vec3::from(spec.tail_rear.offset)) } @@ -3410,7 +3512,7 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_in_l.lateral.0); + let lateral = graceful_load_segment(&spec.wing_in_l.lateral.0, spec.wing_in_l.model_index); (lateral, Vec3::from(spec.wing_in_l.offset)) } @@ -3426,7 +3528,7 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_in_r.lateral.0); + let lateral = graceful_load_segment(&spec.wing_in_r.lateral.0, spec.wing_in_r.model_index); (lateral, Vec3::from(spec.wing_in_r.offset)) } @@ -3442,7 +3544,8 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_out_l.lateral.0); + let lateral = + graceful_load_segment(&spec.wing_out_l.lateral.0, spec.wing_out_l.model_index); (lateral, Vec3::from(spec.wing_out_l.offset)) } @@ -3458,7 +3561,8 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_out_r.lateral.0); + let lateral = + graceful_load_segment(&spec.wing_out_r.lateral.0, spec.wing_out_r.model_index); (lateral, Vec3::from(spec.wing_out_r.offset)) } @@ -3474,7 +3578,7 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_fl.lateral.0); + let lateral = graceful_load_segment(&spec.foot_fl.lateral.0, spec.foot_fl.model_index); (lateral, Vec3::from(spec.foot_fl.offset)) } @@ -3490,7 +3594,7 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_fr.lateral.0); + let lateral = graceful_load_segment(&spec.foot_fr.lateral.0, spec.foot_fr.model_index); (lateral, Vec3::from(spec.foot_fr.offset)) } @@ -3506,7 +3610,7 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_bl.lateral.0); + let lateral = graceful_load_segment(&spec.foot_bl.lateral.0, spec.foot_bl.model_index); (lateral, Vec3::from(spec.foot_bl.offset)) } @@ -3522,7 +3626,7 @@ impl DragonLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_br.lateral.0); + let lateral = graceful_load_segment(&spec.foot_br.lateral.0, spec.foot_br.model_index); (lateral, Vec3::from(spec.foot_br.offset)) } @@ -3545,6 +3649,8 @@ struct SidedBLACentralVoxSpec { struct BirdLargeCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -3567,6 +3673,8 @@ struct SidedBLALateralVoxSpec { struct BirdLargeLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -3663,7 +3771,7 @@ impl BirdLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -3679,7 +3787,7 @@ impl BirdLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.beak.central.0); + let central = graceful_load_segment(&spec.beak.central.0, spec.beak.model_index); (central, Vec3::from(spec.beak.offset)) } @@ -3695,7 +3803,7 @@ impl BirdLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.neck.central.0); + let central = graceful_load_segment(&spec.neck.central.0, spec.neck.model_index); (central, Vec3::from(spec.neck.offset)) } @@ -3711,7 +3819,7 @@ impl BirdLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest.central.0); + let central = graceful_load_segment(&spec.chest.central.0, spec.chest.model_index); (central, Vec3::from(spec.chest.offset)) } @@ -3727,7 +3835,8 @@ impl BirdLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_front.central.0); + let central = + graceful_load_segment(&spec.tail_front.central.0, spec.tail_front.model_index); (central, Vec3::from(spec.tail_front.offset)) } @@ -3743,7 +3852,7 @@ impl BirdLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_rear.central.0); + let central = graceful_load_segment(&spec.tail_rear.central.0, spec.tail_rear.model_index); (central, Vec3::from(spec.tail_rear.offset)) } @@ -3760,7 +3869,11 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.wing_in_l.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.wing_in_l.lateral.0, + true, + spec.wing_in_l.model_index, + ); (lateral, Vec3::from(spec.wing_in_l.offset)) } @@ -3776,7 +3889,7 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_in_r.lateral.0); + let lateral = graceful_load_segment(&spec.wing_in_r.lateral.0, spec.wing_in_r.model_index); (lateral, Vec3::from(spec.wing_in_r.offset)) } @@ -3792,7 +3905,11 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.wing_mid_l.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.wing_mid_l.lateral.0, + true, + spec.wing_mid_l.model_index, + ); (lateral, Vec3::from(spec.wing_mid_l.offset)) } @@ -3808,7 +3925,8 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_mid_r.lateral.0); + let lateral = + graceful_load_segment(&spec.wing_mid_r.lateral.0, spec.wing_mid_r.model_index); (lateral, Vec3::from(spec.wing_mid_r.offset)) } @@ -3824,7 +3942,11 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.wing_out_l.lateral.0, true); + let lateral = graceful_load_segment_flipped( + &spec.wing_out_l.lateral.0, + true, + spec.wing_out_l.model_index, + ); (lateral, Vec3::from(spec.wing_out_l.offset)) } @@ -3840,7 +3962,8 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.wing_out_r.lateral.0); + let lateral = + graceful_load_segment(&spec.wing_out_r.lateral.0, spec.wing_out_r.model_index); (lateral, Vec3::from(spec.wing_out_r.offset)) } @@ -3856,7 +3979,8 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.leg_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.leg_l.lateral.0, true, spec.leg_l.model_index); (lateral, Vec3::from(spec.leg_l.offset)) } @@ -3872,7 +3996,7 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_r.lateral.0); + let lateral = graceful_load_segment(&spec.leg_r.lateral.0, spec.leg_r.model_index); (lateral, Vec3::from(spec.leg_r.offset)) } @@ -3888,7 +4012,8 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment_flipped(&spec.foot_l.lateral.0, true); + let lateral = + graceful_load_segment_flipped(&spec.foot_l.lateral.0, true, spec.foot_l.model_index); (lateral, Vec3::from(spec.foot_l.offset)) } @@ -3904,7 +4029,7 @@ impl BirdLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_r.lateral.0); + let lateral = graceful_load_segment(&spec.foot_r.lateral.0, spec.foot_r.model_index); (lateral, Vec3::from(spec.foot_r.offset)) } @@ -3926,6 +4051,8 @@ struct SidedBLCentralVoxSpec { struct BipedLargeCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -3946,6 +4073,8 @@ struct SidedBLLateralVoxSpec { struct BipedLargeLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] struct BipedLargeMainSpec(HashMap); @@ -4064,7 +4193,7 @@ impl BipedLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -4080,7 +4209,7 @@ impl BipedLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.jaw.central.0); + let central = graceful_load_segment(&spec.jaw.central.0, spec.jaw.model_index); (central, Vec3::from(spec.jaw.offset)) } @@ -4096,7 +4225,8 @@ impl BipedLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.torso_upper.central.0); + let central = + graceful_load_segment(&spec.torso_upper.central.0, spec.torso_upper.model_index); (central, Vec3::from(spec.torso_upper.offset)) } @@ -4112,7 +4242,8 @@ impl BipedLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.torso_lower.central.0); + let central = + graceful_load_segment(&spec.torso_lower.central.0, spec.torso_lower.model_index); (central, Vec3::from(spec.torso_lower.offset)) } @@ -4128,7 +4259,7 @@ impl BipedLargeCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail.central.0); + let central = graceful_load_segment(&spec.tail.central.0, spec.tail.model_index); (central, Vec3::from(spec.tail.offset)) } @@ -4145,7 +4276,8 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.shoulder_l.lateral.0); + let lateral = + graceful_load_segment(&spec.shoulder_l.lateral.0, spec.shoulder_l.model_index); (lateral, Vec3::from(spec.shoulder_l.offset)) } @@ -4161,7 +4293,8 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.shoulder_r.lateral.0); + let lateral = + graceful_load_segment(&spec.shoulder_r.lateral.0, spec.shoulder_r.model_index); (lateral, Vec3::from(spec.shoulder_r.offset)) } @@ -4177,7 +4310,7 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.hand_l.lateral.0); + let lateral = graceful_load_segment(&spec.hand_l.lateral.0, spec.hand_l.model_index); (lateral, Vec3::from(spec.hand_l.offset)) } @@ -4193,7 +4326,7 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.hand_r.lateral.0); + let lateral = graceful_load_segment(&spec.hand_r.lateral.0, spec.hand_r.model_index); (lateral, Vec3::from(spec.hand_r.offset)) } @@ -4209,7 +4342,7 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_l.lateral.0); + let lateral = graceful_load_segment(&spec.leg_l.lateral.0, spec.leg_l.model_index); (lateral, Vec3::from(spec.leg_l.offset)) } @@ -4225,7 +4358,7 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_r.lateral.0); + let lateral = graceful_load_segment(&spec.leg_r.lateral.0, spec.leg_r.model_index); (lateral, Vec3::from(spec.leg_r.offset)) } @@ -4241,7 +4374,7 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_l.lateral.0); + let lateral = graceful_load_segment(&spec.foot_l.lateral.0, spec.foot_l.model_index); (lateral, Vec3::from(spec.foot_l.offset)) } @@ -4257,7 +4390,7 @@ impl BipedLargeLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_r.lateral.0); + let lateral = graceful_load_segment(&spec.foot_r.lateral.0, spec.foot_r.model_index); (lateral, Vec3::from(spec.foot_r.offset)) } @@ -4273,9 +4406,9 @@ impl BipedLargeMainSpec { }; let tool_kind_segment = if flipped { - graceful_load_segment_flipped(&spec.vox_spec.0, true) + graceful_load_segment_flipped(&spec.vox_spec.0, true, DEFAULT_INDEX) } else { - graceful_load_segment(&spec.vox_spec.0) + graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX) }; let offset = Vec3::new( @@ -4302,9 +4435,9 @@ impl BipedLargeSecondSpec { }; let tool_kind_segment = if flipped { - graceful_load_segment_flipped(&spec.vox_spec.0, true) + graceful_load_segment_flipped(&spec.vox_spec.0, true, DEFAULT_INDEX) } else { - graceful_load_segment(&spec.vox_spec.0) + graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX) }; let offset = Vec3::new( @@ -4335,6 +4468,8 @@ struct SidedGCentralVoxSpec { struct GolemCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -4355,6 +4490,8 @@ struct SidedGLateralVoxSpec { struct GolemLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -4439,7 +4576,7 @@ impl GolemCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.head.central.0); + let central = graceful_load_segment(&spec.head.central.0, spec.head.model_index); (central, Vec3::from(spec.head.offset)) } @@ -4455,7 +4592,7 @@ impl GolemCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.jaw.central.0); + let central = graceful_load_segment(&spec.jaw.central.0, spec.jaw.model_index); (central, Vec3::from(spec.jaw.offset)) } @@ -4471,7 +4608,8 @@ impl GolemCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.torso_upper.central.0); + let central = + graceful_load_segment(&spec.torso_upper.central.0, spec.torso_upper.model_index); (central, Vec3::from(spec.torso_upper.offset)) } @@ -4487,7 +4625,8 @@ impl GolemCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.torso_lower.central.0); + let central = + graceful_load_segment(&spec.torso_lower.central.0, spec.torso_lower.model_index); (central, Vec3::from(spec.torso_lower.offset)) } @@ -4504,7 +4643,8 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.shoulder_l.lateral.0); + let lateral = + graceful_load_segment(&spec.shoulder_l.lateral.0, spec.shoulder_l.model_index); (lateral, Vec3::from(spec.shoulder_l.offset)) } @@ -4520,7 +4660,8 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.shoulder_r.lateral.0); + let lateral = + graceful_load_segment(&spec.shoulder_r.lateral.0, spec.shoulder_r.model_index); (lateral, Vec3::from(spec.shoulder_r.offset)) } @@ -4536,7 +4677,7 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.hand_l.lateral.0); + let lateral = graceful_load_segment(&spec.hand_l.lateral.0, spec.hand_l.model_index); (lateral, Vec3::from(spec.hand_l.offset)) } @@ -4552,7 +4693,7 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.hand_r.lateral.0); + let lateral = graceful_load_segment(&spec.hand_r.lateral.0, spec.hand_r.model_index); (lateral, Vec3::from(spec.hand_r.offset)) } @@ -4568,7 +4709,7 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_l.lateral.0); + let lateral = graceful_load_segment(&spec.leg_l.lateral.0, spec.leg_l.model_index); (lateral, Vec3::from(spec.leg_l.offset)) } @@ -4584,7 +4725,7 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.leg_r.lateral.0); + let lateral = graceful_load_segment(&spec.leg_r.lateral.0, spec.leg_r.model_index); (lateral, Vec3::from(spec.leg_r.offset)) } @@ -4600,7 +4741,7 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_l.lateral.0); + let lateral = graceful_load_segment(&spec.foot_l.lateral.0, spec.foot_l.model_index); (lateral, Vec3::from(spec.foot_l.offset)) } @@ -4616,7 +4757,7 @@ impl GolemLateralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let lateral = graceful_load_segment(&spec.foot_r.lateral.0); + let lateral = graceful_load_segment(&spec.foot_r.lateral.0, spec.foot_r.model_index); (lateral, Vec3::from(spec.foot_r.offset)) } @@ -4640,6 +4781,8 @@ struct SidedQLCentralVoxSpec { struct QuadrupedLowCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } #[derive(Deserialize)] @@ -4655,6 +4798,8 @@ struct SidedQLLateralVoxSpec { struct QuadrupedLowLateralSubSpec { offset: [f32; 3], // Should be relative to initial origin lateral: VoxMirror, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -4735,7 +4880,7 @@ impl QuadrupedLowCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.upper.central.0); + let central = graceful_load_segment(&spec.upper.central.0, spec.upper.model_index); (central, Vec3::from(spec.upper.offset)) } @@ -4751,7 +4896,7 @@ impl QuadrupedLowCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.lower.central.0); + let central = graceful_load_segment(&spec.lower.central.0, spec.lower.model_index); (central, Vec3::from(spec.lower.offset)) } @@ -4767,7 +4912,7 @@ impl QuadrupedLowCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.jaw.central.0); + let central = graceful_load_segment(&spec.jaw.central.0, spec.jaw.model_index); (central, Vec3::from(spec.jaw.offset)) } @@ -4783,7 +4928,7 @@ impl QuadrupedLowCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.chest.central.0); + let central = graceful_load_segment(&spec.chest.central.0, spec.chest.model_index); (central, Vec3::from(spec.chest.offset)) } @@ -4799,7 +4944,7 @@ impl QuadrupedLowCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_rear.central.0); + let central = graceful_load_segment(&spec.tail_rear.central.0, spec.tail_rear.model_index); (central, Vec3::from(spec.tail_rear.offset)) } @@ -4815,7 +4960,8 @@ impl QuadrupedLowCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.tail_front.central.0); + let central = + graceful_load_segment(&spec.tail_front.central.0, spec.tail_front.model_index); (central, Vec3::from(spec.tail_front.offset)) } @@ -4834,7 +4980,8 @@ impl QuadrupedLowLateralSpec { }, }; let latspec = &spec.front_left.lateral; - let lateral = graceful_load_segment_flipped(&latspec.0, !latspec.1); + let lateral = + graceful_load_segment_flipped(&latspec.0, !latspec.1, spec.front_left.model_index); (lateral, Vec3::from(spec.front_left.offset)) } @@ -4851,7 +4998,8 @@ impl QuadrupedLowLateralSpec { }, }; let latspec = &spec.front_right.lateral; - let lateral = graceful_load_segment_flipped(&latspec.0, latspec.1); + let lateral = + graceful_load_segment_flipped(&latspec.0, latspec.1, spec.front_right.model_index); (lateral, Vec3::from(spec.front_right.offset)) } @@ -4868,7 +5016,8 @@ impl QuadrupedLowLateralSpec { }, }; let latspec = &spec.back_left.lateral; - let lateral = graceful_load_segment_flipped(&latspec.0, !latspec.1); + let lateral = + graceful_load_segment_flipped(&latspec.0, !latspec.1, spec.back_left.model_index); (lateral, Vec3::from(spec.back_left.offset)) } @@ -4885,7 +5034,8 @@ impl QuadrupedLowLateralSpec { }, }; let latspec = &spec.back_right.lateral; - let lateral = graceful_load_segment_flipped(&latspec.0, latspec.1); + let lateral = + graceful_load_segment_flipped(&latspec.0, latspec.1, spec.back_right.model_index); (lateral, Vec3::from(spec.back_right.offset)) } @@ -4905,6 +5055,8 @@ struct SidedObjectCentralVoxSpec { struct ObjectCentralSubSpec { offset: [f32; 3], // Should be relative to initial origin central: VoxSimple, + #[serde(default)] + model_index: u32, } make_vox_spec!( @@ -4947,7 +5099,7 @@ impl ObjectCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.bone0.central.0); + let central = graceful_load_segment(&spec.bone0.central.0, spec.bone0.model_index); (central, Vec3::from(spec.bone0.offset)) } @@ -4960,7 +5112,7 @@ impl ObjectCentralSpec { return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5)); }, }; - let central = graceful_load_segment(&spec.bone1.central.0); + let central = graceful_load_segment(&spec.bone1.central.0, spec.bone1.model_index); (central, Vec3::from(spec.bone1.offset)) } @@ -5015,7 +5167,7 @@ impl ItemDropCentralSpec { }) .to_segment(|_| Default::default()) }, - _ => graceful_load_segment_fullspec(&full_spec), + _ => graceful_load_segment_fullspec(&full_spec, DEFAULT_INDEX), }; let offset = segment_center(&segment).unwrap_or_default(); (segment, match item_drop { @@ -5086,7 +5238,10 @@ fn mesh_ship_bone &ShipCentralSubSpec }, }; let bone = f(spec); - let central = graceful_load_segment_fullspec(&["common.voxel.", &bone.central.0].concat()); + let central = graceful_load_segment_fullspec( + &["common.voxel.", &bone.central.0].concat(), + bone.model_index.into(), + ); (central, Vec3::from(bone.offset)) } From b1dc85dc0f5fab28cbdbefc7c9dd7f40f3a62974 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Wed, 15 Mar 2023 01:19:14 +0100 Subject: [PATCH 02/12] llama in one vox file --- assets/voxygen/voxel/npc/llama/male/llama.vox | 3 ++ .../quadruped_medium_central_manifest.ron | 40 ++++++++++------ .../quadruped_medium_lateral_manifest.ron | 48 ++++++++++++------- 3 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 assets/voxygen/voxel/npc/llama/male/llama.vox diff --git a/assets/voxygen/voxel/npc/llama/male/llama.vox b/assets/voxygen/voxel/npc/llama/male/llama.vox new file mode 100644 index 0000000000..3abd250912 --- /dev/null +++ b/assets/voxygen/voxel/npc/llama/male/llama.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5d225568a6ef401d6e255ca2d859c71b5afb24dbc81b35bb2c2600e2733e0ef +size 39172 diff --git a/assets/voxygen/voxel/quadruped_medium_central_manifest.ron b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron index 7b2603ce5f..9ca3c87341 100644 --- a/assets/voxygen/voxel/quadruped_medium_central_manifest.ron +++ b/assets/voxygen/voxel/quadruped_medium_central_manifest.ron @@ -1922,61 +1922,73 @@ (Llama, Male): ( head: ( offset: (-3.0, -2.0, -3.5), - central: ("npc.llama.male.head"), + central: ("npc.llama.male.llama"), ), neck: ( offset: (-3.0, -4.5, -9.5), - central: ("npc.llama.male.neck"), + central: ("npc.llama.male.llama"), + model_index: 1, ), jaw: ( offset: (-2.0, 0.0, -2.0), - central: ("npc.llama.male.jaw"), + central: ("npc.llama.male.llama"), + model_index: 2, ), torso_front: ( offset: (-6.0, -9.0, -6.0), - central: ("npc.llama.male.torso_front"), + central: ("npc.llama.male.llama"), + model_index: 3, ), torso_back: ( offset: (-5.0, -12.0, -5.0), - central: ("npc.llama.male.torso_back"), + central: ("npc.llama.male.llama"), + model_index: 4, ), ears: ( offset: (-4.0, -1.0, 0.0), - central: ("npc.llama.male.ears"), + central: ("npc.llama.male.llama"), + model_index: 5, ), tail: ( offset: (-2.0, -5.0, -7.0), - central: ("npc.llama.male.tail"), + central: ("npc.llama.male.llama"), + model_index: 6, ), ), (Llama, Female): ( head: ( offset: (-3.0, -2.0, -3.5), - central: ("npc.llama.male.head"), + central: ("npc.llama.male.llama"), ), neck: ( offset: (-3.0, -4.5, -9.5), - central: ("npc.llama.male.neck"), + central: ("npc.llama.male.llama"), + model_index: 1, ), jaw: ( offset: (-2.0, 0.0, -2.0), - central: ("npc.llama.male.jaw"), + central: ("npc.llama.male.llama"), + model_index: 2, ), torso_front: ( offset: (-6.0, -9.0, -6.0), - central: ("npc.llama.male.torso_front"), + central: ("npc.llama.male.llama"), + model_index: 3, ), torso_back: ( offset: (-5.0, -12.0, -5.0), - central: ("npc.llama.male.torso_back"), + central: ("npc.llama.male.llama"), + model_index: 4, ), ears: ( offset: (-4.0, -1.0, 0.0), - central: ("npc.llama.male.ears"), + central: ("npc.llama.male.llama"), + model_index: 5, ), tail: ( offset: (-2.0, -5.0, -7.0), - central: ("npc.llama.male.tail"), + central: ("npc.llama.male.llama"), + model_index: 6, ), ), (Alpaca, Male): ( diff --git a/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron index e76adaed73..19a0cfdf7c 100644 --- a/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron +++ b/assets/voxygen/voxel/quadruped_medium_lateral_manifest.ron @@ -2178,69 +2178,85 @@ (Llama, Male): ( leg_fl: ( offset: (-2.0, -2.5, -6.0), - lateral: ("npc.llama.male.leg_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 7, ), leg_fr: ( offset: (-2.0, -2.5, -6.0), - lateral: ("npc.llama.male.leg_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 7, ), leg_bl: ( offset: (-2.0, -3.0, -5.0), - lateral: ("npc.llama.male.leg_br"), + lateral: ("npc.llama.male.llama"), + model_index: 8, ), leg_br: ( offset: (-2.0, -3.0, -5.0), - lateral: ("npc.llama.male.leg_br"), + lateral: ("npc.llama.male.llama"), + model_index: 8, ), foot_fl: ( offset: (-1.5, -2.0, -8.0), - lateral: ("npc.llama.male.foot_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 9, ), foot_fr: ( offset: (-1.5, -2.0, -8.0), - lateral: ("npc.llama.male.foot_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 9, ), foot_bl: ( offset: (-1.5, -2.5, -9.0), - lateral: ("npc.llama.male.foot_br"), + lateral: ("npc.llama.male.llama"), + model_index: 10, ), foot_br: ( offset: (-1.5, -2.5, -9.0), - lateral: ("npc.llama.male.foot_br"), + lateral: ("npc.llama.male.llama"), + model_index: 10, ), ), (Llama, Female): ( leg_fl: ( offset: (-2.0, -2.5, -6.0), - lateral: ("npc.llama.male.leg_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 7, ), leg_fr: ( offset: (-2.0, -2.5, -6.0), - lateral: ("npc.llama.male.leg_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 7, ), leg_bl: ( offset: (-2.0, -3.0, -5.0), - lateral: ("npc.llama.male.leg_br"), + lateral: ("npc.llama.male.llama"), + model_index: 8, ), leg_br: ( offset: (-2.0, -3.0, -5.0), - lateral: ("npc.llama.male.leg_br"), + lateral: ("npc.llama.male.llama"), + model_index: 8, ), foot_fl: ( offset: (-1.5, -2.0, -8.0), - lateral: ("npc.llama.male.foot_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 9, ), foot_fr: ( offset: (-1.5, -2.0, -8.0), - lateral: ("npc.llama.male.foot_fr"), + lateral: ("npc.llama.male.llama"), + model_index: 9, ), foot_bl: ( offset: (-1.5, -2.5, -9.0), - lateral: ("npc.llama.male.foot_br"), + lateral: ("npc.llama.male.llama"), + model_index: 10, ), foot_br: ( offset: (-1.5, -2.5, -9.0), - lateral: ("npc.llama.male.foot_br"), + lateral: ("npc.llama.male.llama"), + model_index: 10, ), ), (Alpaca, Male): ( From 9205da2298e0c5cbe9020c627f9e58f2579bbd30 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Wed, 15 Mar 2023 01:23:02 +0100 Subject: [PATCH 03/12] cargo fmt --- common/src/comp/body/ship.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/comp/body/ship.rs b/common/src/comp/body/ship.rs index 728b2d8bde..84bedf43aa 100644 --- a/common/src/comp/body/ship.rs +++ b/common/src/comp/body/ship.rs @@ -222,7 +222,11 @@ pub mod figuredata { // need to load them in the server and sync them as an ECS resource. let vox = cache.load::(&["common.voxel.", &bone.central.0].concat())?; - let dyna = Dyna::::from_vox(&vox.read().0, false, bone.model_index as usize); + let dyna = Dyna::::from_vox( + &vox.read().0, + false, + bone.model_index as usize, + ); let dyna = dyna.map_into(|cell| { if let Some(rgb) = cell.get_color() { Block::new(BlockKind::Misc, rgb) From 0b8bc507acd8f34945897b599923126140bb9f11 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Thu, 16 Mar 2023 20:50:05 +0100 Subject: [PATCH 04/12] fix clippy --- voxygen/src/scene/figure/load.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 98f9499ed1..af89d53d21 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -5240,7 +5240,7 @@ fn mesh_ship_bone &ShipCentralSubSpec let bone = f(spec); let central = graceful_load_segment_fullspec( &["common.voxel.", &bone.central.0].concat(), - bone.model_index.into(), + bone.model_index, ); (central, Vec3::from(bone.offset)) From fb06bb651be50d35c59b71c0fddaec786b75f072 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Fri, 17 Mar 2023 00:35:20 +0100 Subject: [PATCH 05/12] a single llama file (smaller) --- assets/voxygen/voxel/npc/llama/male/ears.vox | 3 --- assets/voxygen/voxel/npc/llama/male/foot_br.vox | 3 --- assets/voxygen/voxel/npc/llama/male/foot_fr.vox | 3 --- assets/voxygen/voxel/npc/llama/male/head.vox | 3 --- assets/voxygen/voxel/npc/llama/male/jaw.vox | 3 --- assets/voxygen/voxel/npc/llama/male/leg_br.vox | 3 --- assets/voxygen/voxel/npc/llama/male/leg_fr.vox | 3 --- assets/voxygen/voxel/npc/llama/male/llama.vox | 4 ++-- assets/voxygen/voxel/npc/llama/male/neck.vox | 3 --- assets/voxygen/voxel/npc/llama/male/tail.vox | 3 --- assets/voxygen/voxel/npc/llama/male/torso_back.vox | 3 --- assets/voxygen/voxel/npc/llama/male/torso_front.vox | 3 --- 12 files changed, 2 insertions(+), 35 deletions(-) delete mode 100644 assets/voxygen/voxel/npc/llama/male/ears.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/foot_br.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/foot_fr.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/head.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/jaw.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/leg_br.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/leg_fr.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/neck.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/tail.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/torso_back.vox delete mode 100644 assets/voxygen/voxel/npc/llama/male/torso_front.vox diff --git a/assets/voxygen/voxel/npc/llama/male/ears.vox b/assets/voxygen/voxel/npc/llama/male/ears.vox deleted file mode 100644 index 9d4f67958c..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/ears.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e30eab986f71e9a8480d4f818c1a793db7ccd96411a56f9f5bd5586fd169b0f -size 1200 diff --git a/assets/voxygen/voxel/npc/llama/male/foot_br.vox b/assets/voxygen/voxel/npc/llama/male/foot_br.vox deleted file mode 100644 index e6c780fac0..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/foot_br.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c2927d862e271a814e073dd8c10565c3fb0467a2089b175138a70e3a16f5356 -size 1356 diff --git a/assets/voxygen/voxel/npc/llama/male/foot_fr.vox b/assets/voxygen/voxel/npc/llama/male/foot_fr.vox deleted file mode 100644 index 44bbd8341d..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/foot_fr.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0671223cb64a2b59d006d726ca69b7053a96fd37971a29829be97dd96e5923b4 -size 1368 diff --git a/assets/voxygen/voxel/npc/llama/male/head.vox b/assets/voxygen/voxel/npc/llama/male/head.vox deleted file mode 100644 index 19c4326a7a..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/head.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:788e36255e3137423b1993616f224b71e2f285efae8a036bd2f81be9df8beea6 -size 2360 diff --git a/assets/voxygen/voxel/npc/llama/male/jaw.vox b/assets/voxygen/voxel/npc/llama/male/jaw.vox deleted file mode 100644 index 1c2872c516..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/jaw.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1882295dc5e2fdc166c91325ec49cd05ab168605587d15cee89e8f0e50ed7f6f -size 1208 diff --git a/assets/voxygen/voxel/npc/llama/male/leg_br.vox b/assets/voxygen/voxel/npc/llama/male/leg_br.vox deleted file mode 100644 index 567bab2e4b..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/leg_br.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b51f1ce14a4daacacfd3bdfa85c17f19cbd70b158265ac5b1cc5ccde95b53b41 -size 1684 diff --git a/assets/voxygen/voxel/npc/llama/male/leg_fr.vox b/assets/voxygen/voxel/npc/llama/male/leg_fr.vox deleted file mode 100644 index bfb864c7ca..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/leg_fr.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50d293d04e5271d8c1992a8fc0e59ec7376a2d4908e23d3e52dc986df4c29b1c -size 1604 diff --git a/assets/voxygen/voxel/npc/llama/male/llama.vox b/assets/voxygen/voxel/npc/llama/male/llama.vox index 3abd250912..94e8a1edf4 100644 --- a/assets/voxygen/voxel/npc/llama/male/llama.vox +++ b/assets/voxygen/voxel/npc/llama/male/llama.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5d225568a6ef401d6e255ca2d859c71b5afb24dbc81b35bb2c2600e2733e0ef -size 39172 +oid sha256:3d1e0ccc1c007f10fbebc811108ffceca45912dea7a9ce6aedd81535e650a2a8 +size 16038 diff --git a/assets/voxygen/voxel/npc/llama/male/neck.vox b/assets/voxygen/voxel/npc/llama/male/neck.vox deleted file mode 100644 index 396f54b223..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/neck.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6784e3f6a9f5574baaabadd06961624ce5cf9c90d7ce44e83b44b866326a18a -size 3744 diff --git a/assets/voxygen/voxel/npc/llama/male/tail.vox b/assets/voxygen/voxel/npc/llama/male/tail.vox deleted file mode 100644 index 53d61a3a56..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/tail.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73000c9ce82db82c6d784a1cb2963ab49c9a32730eb7f0e5d4dc7bf41448154a -size 1344 diff --git a/assets/voxygen/voxel/npc/llama/male/torso_back.vox b/assets/voxygen/voxel/npc/llama/male/torso_back.vox deleted file mode 100644 index 39ae1405c7..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/torso_back.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbd269e4736b47909d50871dfcb9994c16da4539b78f3d1cb35478e2f323a0a7 -size 4232 diff --git a/assets/voxygen/voxel/npc/llama/male/torso_front.vox b/assets/voxygen/voxel/npc/llama/male/torso_front.vox deleted file mode 100644 index 944fbc586b..0000000000 --- a/assets/voxygen/voxel/npc/llama/male/torso_front.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1512a046c72120af9c2a048a356dbf6d86e23c0ed3770393a9f0a1d9b30b8edb -size 4424 From 76baf491ec5507e512319932f44c0b6627db8726 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sat, 25 Mar 2023 23:38:23 +0100 Subject: [PATCH 06/12] support model indices for humanoids --- voxygen/src/scene/figure/load.rs | 70 ++++++++++++++++---------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index af89d53d21..6122773e20 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -171,7 +171,7 @@ macro_rules! make_vox_spec { // All offsets should be relative to an initial origin that doesn't change when // combining segments #[derive(Deserialize)] -struct VoxSpec(String, [T; 3]); +struct VoxSpec(String, [T; 3], #[serde(default)] u32); #[derive(Deserialize)] struct VoxSimple(String); @@ -286,12 +286,12 @@ impl HumHeadSpec { let eye_rgb = body.species.eye_color(body.eye_color); // Load segment pieces - let bare_head = graceful_load_mat_segment(&spec.head.0, DEFAULT_INDEX); + let bare_head = graceful_load_mat_segment(&spec.head.0, spec.head.2); let eyes = match spec.eyes.get(body.eyes as usize) { Some(Some(spec)) => Some(( color_spec.color_segment( - graceful_load_mat_segment(&spec.0, DEFAULT_INDEX) + graceful_load_mat_segment(&spec.0, spec.2) .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), skin_rgb, hair_color, @@ -307,7 +307,7 @@ impl HumHeadSpec { }; let hair = match spec.hair.get(body.hair_style as usize) { Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0, DEFAULT_INDEX) + graceful_load_segment(&spec.0, spec.2) .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), Vec3::from(spec.1), )), @@ -319,7 +319,7 @@ impl HumHeadSpec { }; let beard = match spec.beard.get(body.beard as usize) { Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0, DEFAULT_INDEX) + graceful_load_segment(&spec.0, spec.2) .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), Vec3::from(spec.1), )), @@ -331,7 +331,7 @@ impl HumHeadSpec { }; let accessory = match spec.accessory.get(body.accessory as usize) { Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0, DEFAULT_INDEX), + graceful_load_segment(&spec.0, spec.2), Vec3::from(spec.1), )), Some(None) => None, @@ -561,9 +561,9 @@ impl HumArmorShoulderSpec { let mut shoulder_segment = color_spec.color_segment( if flipped { - graceful_load_mat_segment_flipped(&spec.left.vox_spec.0, DEFAULT_INDEX) + graceful_load_mat_segment_flipped(&spec.left.vox_spec.0, spec.left.vox_spec.2) } else { - graceful_load_mat_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) + graceful_load_mat_segment(&spec.right.vox_spec.0, spec.right.vox_spec.2) }, body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), @@ -643,7 +643,7 @@ impl HumArmorChestSpec { let bare_chest = graceful_load_mat_segment("armor.empty", DEFAULT_INDEX); - let mut chest_armor = graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX); + let mut chest_armor = graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2); if let Some(color) = spec.color { let chest_color = Vec3::from(color); @@ -682,9 +682,9 @@ impl HumArmorHandSpec { let mut hand_segment = color_spec.color_segment( if flipped { - graceful_load_mat_segment_flipped(&spec.left.vox_spec.0, DEFAULT_INDEX) + graceful_load_mat_segment_flipped(&spec.left.vox_spec.0, spec.left.vox_spec.2) } else { - graceful_load_mat_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) + graceful_load_mat_segment(&spec.right.vox_spec.0, spec.right.vox_spec.2) }, body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), @@ -743,7 +743,7 @@ impl HumArmorBeltSpec { }; let mut belt_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), + graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -773,7 +773,7 @@ impl HumArmorBackSpec { }; let mut back_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), + graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -817,7 +817,7 @@ impl HumArmorPantsSpec { let bare_pants = graceful_load_mat_segment("armor.empty", DEFAULT_INDEX); - let mut pants_armor = graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX); + let mut pants_armor = graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2); if let Some(color) = spec.color { let pants_color = Vec3::from(color); @@ -856,9 +856,9 @@ impl HumArmorFootSpec { let mut foot_segment = color_spec.color_segment( if flipped { - graceful_load_mat_segment_flipped(&spec.vox_spec.0, DEFAULT_INDEX) + graceful_load_mat_segment_flipped(&spec.vox_spec.0, spec.vox_spec.2) } else { - graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX) + graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2) }, body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), @@ -905,7 +905,7 @@ impl HumMainWeaponSpec { }; let tool_kind_segment = - graceful_load_segment_flipped(&spec.vox_spec.0, flipped, DEFAULT_INDEX); + graceful_load_segment_flipped(&spec.vox_spec.0, flipped, spec.vox_spec.2); let mut offset = Vec3::from(spec.vox_spec.1); if flipped { @@ -937,7 +937,7 @@ impl HumArmorLanternSpec { }; let mut lantern_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), + graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -959,7 +959,7 @@ impl HumArmorHeadSpec { .get(&(body.species, body.body_type, head?.to_string())) { Some(spec) => Some(( - graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX), + graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2), Vec3::::from(spec.vox_spec.1).as_(), )), None => { @@ -1002,7 +1002,7 @@ impl HumArmorTabardSpec { let bare_tabard = graceful_load_mat_segment("armor.empty", DEFAULT_INDEX); - let mut tabard_armor = graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX); + let mut tabard_armor = graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2); if let Some(color) = spec.color { let tabard_color = Vec3::from(color); @@ -1038,7 +1038,7 @@ impl HumArmorGliderSpec { }; let mut glider_segment = color_spec.color_segment( - graceful_load_mat_segment(&spec.vox_spec.0, DEFAULT_INDEX), + graceful_load_mat_segment(&spec.vox_spec.0, spec.vox_spec.2), body.species.skin_color(body.skin), color_spec.hair_color(body.species, body.hair_color), body.species.eye_color(body.eye_color), @@ -3096,7 +3096,7 @@ impl BipedSmallArmorHeadSpec { &self.0.default }; - let head_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); + let head_segment = graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3117,7 +3117,7 @@ impl BipedSmallArmorChestSpec { &self.0.default }; - let chest_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); + let chest_segment = graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3138,7 +3138,7 @@ impl BipedSmallArmorTailSpec { &self.0.default }; - let tail_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); + let tail_segment = graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3159,7 +3159,7 @@ impl BipedSmallArmorPantsSpec { &self.0.default }; - let pants_segment = graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX); + let pants_segment = graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2); let offset = Vec3::new(spec.vox_spec.1[0], spec.vox_spec.1[1], spec.vox_spec.1[2]); @@ -3181,9 +3181,9 @@ impl BipedSmallArmorHandSpec { }; let hand_segment = if flipped { - graceful_load_segment_flipped(&spec.left.vox_spec.0, true, DEFAULT_INDEX) + graceful_load_segment_flipped(&spec.left.vox_spec.0, true, spec.left.vox_spec.2) } else { - graceful_load_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) + graceful_load_segment(&spec.right.vox_spec.0, spec.right.vox_spec.2) }; let offset = if flipped { spec.left.vox_spec.1 @@ -3213,9 +3213,9 @@ impl BipedSmallArmorFootSpec { }; let foot_segment = if flipped { - graceful_load_segment_flipped(&spec.left.vox_spec.0, true, DEFAULT_INDEX) + graceful_load_segment_flipped(&spec.left.vox_spec.0, true, spec.left.vox_spec.2) } else { - graceful_load_segment(&spec.right.vox_spec.0, DEFAULT_INDEX) + graceful_load_segment(&spec.right.vox_spec.0, spec.right.vox_spec.2) }; let offset = if flipped { spec.left.vox_spec.1 @@ -3242,9 +3242,9 @@ impl BipedSmallWeaponSpec { }; let tool_kind_segment = if flipped { - graceful_load_segment_flipped(&spec.vox_spec.0, true, DEFAULT_INDEX) + graceful_load_segment_flipped(&spec.vox_spec.0, true, spec.vox_spec.2) } else { - graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX) + graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2) }; let offset = Vec3::new( @@ -4406,9 +4406,9 @@ impl BipedLargeMainSpec { }; let tool_kind_segment = if flipped { - graceful_load_segment_flipped(&spec.vox_spec.0, true, DEFAULT_INDEX) + graceful_load_segment_flipped(&spec.vox_spec.0, true, spec.vox_spec.2) } else { - graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX) + graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2) }; let offset = Vec3::new( @@ -4435,9 +4435,9 @@ impl BipedLargeSecondSpec { }; let tool_kind_segment = if flipped { - graceful_load_segment_flipped(&spec.vox_spec.0, true, DEFAULT_INDEX) + graceful_load_segment_flipped(&spec.vox_spec.0, true, spec.vox_spec.2) } else { - graceful_load_segment(&spec.vox_spec.0, DEFAULT_INDEX) + graceful_load_segment(&spec.vox_spec.0, spec.vox_spec.2) }; let offset = Vec3::new( From 5cb974f77021a064ff018448c55d7a1721b2c561 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sat, 25 Mar 2023 23:40:31 +0100 Subject: [PATCH 07/12] cargo fmt --- voxygen/src/scene/figure/load.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 6122773e20..c8ebebdca1 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -307,8 +307,7 @@ impl HumHeadSpec { }; let hair = match spec.hair.get(body.hair_style as usize) { Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0, spec.2) - .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), + graceful_load_segment(&spec.0, spec.2).map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), Vec3::from(spec.1), )), Some(None) => None, @@ -319,8 +318,7 @@ impl HumHeadSpec { }; let beard = match spec.beard.get(body.beard as usize) { Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0, spec.2) - .map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), + graceful_load_segment(&spec.0, spec.2).map_rgb(|rgb| recolor_grey(rgb, hair_rgb)), Vec3::from(spec.1), )), Some(None) => None, @@ -330,10 +328,7 @@ impl HumHeadSpec { }, }; let accessory = match spec.accessory.get(body.accessory as usize) { - Some(Some(spec)) => Some(( - graceful_load_segment(&spec.0, spec.2), - Vec3::from(spec.1), - )), + Some(Some(spec)) => Some((graceful_load_segment(&spec.0, spec.2), Vec3::from(spec.1))), Some(None) => None, None => { warn!("No specification for this accessory: {:?}", body.accessory); From e26cbffa0cff990fa04cf45bc4e0b9314ba94f99 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sun, 2 Apr 2023 13:49:15 +0200 Subject: [PATCH 08/12] correct offsets from animation settings --- assets/voxygen/voxel/npc/llama/male/llama.vox | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/voxygen/voxel/npc/llama/male/llama.vox b/assets/voxygen/voxel/npc/llama/male/llama.vox index 94e8a1edf4..f72842c96d 100644 --- a/assets/voxygen/voxel/npc/llama/male/llama.vox +++ b/assets/voxygen/voxel/npc/llama/male/llama.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d1e0ccc1c007f10fbebc811108ffceca45912dea7a9ce6aedd81535e650a2a8 -size 16038 +oid sha256:9f62afad5961c292cf0fea991e8726a09171783639f758ffeeb3d2e6e85c2a2f +size 16037 From 4da41b0dd0142175ba895b1a1b6d6ca79de612af Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sun, 2 Apr 2023 16:37:36 +0200 Subject: [PATCH 09/12] move alchemist set to single file (with reduced hat size) --- assets/voxygen/voxel/armor/alchemist.vox | 3 +++ assets/voxygen/voxel/armor/alchemist/belt.vox | 3 --- .../voxygen/voxel/armor/alchemist/chest.vox | 3 --- assets/voxygen/voxel/armor/alchemist/hat.vox | 3 --- .../voxygen/voxel/armor/alchemist/pants.vox | 3 --- .../voxel/humanoid_armor_belt_manifest.ron | 2 +- .../voxel/humanoid_armor_chest_manifest.ron | 2 +- .../voxel/humanoid_armor_head_manifest.ron | 24 +++++++++---------- .../voxel/humanoid_armor_pants_manifest.ron | 2 +- 9 files changed, 18 insertions(+), 27 deletions(-) create mode 100644 assets/voxygen/voxel/armor/alchemist.vox delete mode 100644 assets/voxygen/voxel/armor/alchemist/belt.vox delete mode 100644 assets/voxygen/voxel/armor/alchemist/chest.vox delete mode 100644 assets/voxygen/voxel/armor/alchemist/hat.vox delete mode 100644 assets/voxygen/voxel/armor/alchemist/pants.vox diff --git a/assets/voxygen/voxel/armor/alchemist.vox b/assets/voxygen/voxel/armor/alchemist.vox new file mode 100644 index 0000000000..66aea4ce6d --- /dev/null +++ b/assets/voxygen/voxel/armor/alchemist.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab47851ee89caf8c6529c33b521e4c9b1f467d082a31f37fd9c51b1eda03d50e +size 5803 diff --git a/assets/voxygen/voxel/armor/alchemist/belt.vox b/assets/voxygen/voxel/armor/alchemist/belt.vox deleted file mode 100644 index f0d1ac60d9..0000000000 --- a/assets/voxygen/voxel/armor/alchemist/belt.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c475b02c5119a0e41eddfc2f96aad350bb83b99401cef23f1b17a20175f1c760 -size 1512 diff --git a/assets/voxygen/voxel/armor/alchemist/chest.vox b/assets/voxygen/voxel/armor/alchemist/chest.vox deleted file mode 100644 index e4d5cb3bf8..0000000000 --- a/assets/voxygen/voxel/armor/alchemist/chest.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eab1f58e12b63b83828c5689534d781fe08848280c9eb2e5e104c5c2fd436d59 -size 2704 diff --git a/assets/voxygen/voxel/armor/alchemist/hat.vox b/assets/voxygen/voxel/armor/alchemist/hat.vox deleted file mode 100644 index 7d4c2056c1..0000000000 --- a/assets/voxygen/voxel/armor/alchemist/hat.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd6cc5ba8c3b5a25d76d7dc03c3c208a0895acb81e09039cfad07dd870ccdac0 -size 1272 diff --git a/assets/voxygen/voxel/armor/alchemist/pants.vox b/assets/voxygen/voxel/armor/alchemist/pants.vox deleted file mode 100644 index 6131dca49c..0000000000 --- a/assets/voxygen/voxel/armor/alchemist/pants.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc67d21bc4fe57f1e0ee3557bb15142c2169d7c93551afef37631541d35acbcb -size 2248 diff --git a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron index 87653926f7..64da3dee17 100644 --- a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron @@ -117,7 +117,7 @@ color: None ), "common.items.armor.alchemist.belt":( - vox_spec: ("armor.alchemist.belt", (-4.0, -4.0, 2.5)), + vox_spec: ("armor.alchemist", (-4.0, -4.0, 2.5), 2), color: None ), "common.items.armor.blacksmith.belt":( diff --git a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron index 0a2e60f19d..05acf8861d 100644 --- a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron @@ -187,7 +187,7 @@ color: None ), "common.items.armor.alchemist.chest": ( - vox_spec: ("armor.alchemist.chest", (-7.0, -4.0, 2.0)), + vox_spec: ("armor.alchemist", (-7.0, -4.0, 2.0), 1), color: None ), "common.items.armor.blacksmith.chest": ( diff --git a/assets/voxygen/voxel/humanoid_armor_head_manifest.ron b/assets/voxygen/voxel/humanoid_armor_head_manifest.ron index 8f15dc98fc..789bf09542 100644 --- a/assets/voxygen/voxel/humanoid_armor_head_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_head_manifest.ron @@ -325,51 +325,51 @@ ), // Alchemist Goggles (Human, Male, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-4.0, 0.0, 1.0)), + vox_spec: ("armor.alchemist", (2.0, 9.0, 1.0), 0), color: None ), (Human, Female, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-4.0, 1.0, 1.0)), + vox_spec: ("armor.alchemist", (2.0, 10.0, 1.0), 0), color: None ), (Elf, Male, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-3.0, 0.0, 1.0)), + vox_spec: ("armor.alchemist", (3.0, 9.0, 1.0), 0), color: None ), (Elf, Female, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-3.0, -1.0, 1.0)), + vox_spec: ("armor.alchemist", (3.0, 8.0, 1.0), 0), color: None ), (Dwarf, Male, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-5.0, 1.0, 1.0)), + vox_spec: ("armor.alchemist", (1.0, 10.0, 1.0), 0), color: None ), (Dwarf, Female, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-5.0, 1.0, 1.0)), + vox_spec: ("armor.alchemist", (1.0, 10.0, 1.0), 0), color: None ), (Danari, Male, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-2.0, 0.0, 3.0)), + vox_spec: ("armor.alchemist", (4.0, 9.0, 3.0), 0), color: None ), (Danari, Female, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-2.0, 1.0, 3.0)), + vox_spec: ("armor.alchemist", (4.0, 10.0, 3.0), 0), color: None ), (Draugr, Male, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-6.0, 0.0, 3.0)), + vox_spec: ("armor.alchemist", (0.0, 9.0, 3.0), 0), color: None ), (Draugr, Female, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-6.0, 0.0, 2.0)), + vox_spec: ("armor.alchemist", (0.0, 9.0, 2.0), 0), color: None ), (Orc, Male, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-3.0, 2.0, 4.0)), + vox_spec: ("armor.alchemist", (3.0, 11.0, 4.0), 0), color: None ), (Orc, Female, "common.items.armor.alchemist.hat"): ( - vox_spec: ("armor.alchemist.hat", (-3.0, -1.0, 1.0)), + vox_spec: ("armor.alchemist", (3.0, 8.0, 1.0), 0), color: None ), // Chef hat diff --git a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron index 50dd8b1d30..c7be27809d 100644 --- a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron @@ -145,7 +145,7 @@ color: None ), "common.items.armor.alchemist.pants": ( - vox_spec: ("armor.alchemist.pants", (-5.0, -4.0, 0.5)), + vox_spec: ("armor.alchemist", (-5.0, -4.0, 0.5), 3), color: None ), "common.items.armor.blacksmith.pants": ( From 8d2b9b9a9c5722b86ee19c1af7373e80eca9b935 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Sun, 2 Apr 2023 18:05:28 +0200 Subject: [PATCH 10/12] single file orichalcum armor --- assets/voxygen/item_image_manifest.ron | 28 +++++++++---------- .../voxygen/voxel/armor/mail/orichalcum.vox | 3 ++ .../voxel/armor/mail/orichalcum/back.vox | 3 -- .../voxel/armor/mail/orichalcum/belt.vox | 3 -- .../voxel/armor/mail/orichalcum/chest.vox | 3 -- .../voxel/armor/mail/orichalcum/foot.vox | 3 -- .../voxel/armor/mail/orichalcum/hand.vox | 3 -- .../voxel/armor/mail/orichalcum/pants.vox | 3 -- .../voxel/armor/mail/orichalcum/shoulder.vox | 3 -- .../voxel/humanoid_armor_back_manifest.ron | 2 +- .../voxel/humanoid_armor_belt_manifest.ron | 2 +- .../voxel/humanoid_armor_chest_manifest.ron | 2 +- .../voxel/humanoid_armor_foot_manifest.ron | 2 +- .../voxel/humanoid_armor_hand_manifest.ron | 4 +-- .../voxel/humanoid_armor_pants_manifest.ron | 2 +- .../humanoid_armor_shoulder_manifest.ron | 4 +-- voxygen/src/bin/img-export.rs | 9 +++--- voxygen/src/hud/item_imgs.rs | 18 ++++++------ 18 files changed, 40 insertions(+), 57 deletions(-) create mode 100644 assets/voxygen/voxel/armor/mail/orichalcum.vox delete mode 100644 assets/voxygen/voxel/armor/mail/orichalcum/back.vox delete mode 100644 assets/voxygen/voxel/armor/mail/orichalcum/belt.vox delete mode 100644 assets/voxygen/voxel/armor/mail/orichalcum/chest.vox delete mode 100644 assets/voxygen/voxel/armor/mail/orichalcum/foot.vox delete mode 100644 assets/voxygen/voxel/armor/mail/orichalcum/hand.vox delete mode 100644 assets/voxygen/voxel/armor/mail/orichalcum/pants.vox delete mode 100644 assets/voxygen/voxel/armor/mail/orichalcum/shoulder.vox diff --git a/assets/voxygen/item_image_manifest.ron b/assets/voxygen/item_image_manifest.ron index ccb70704d3..2a4039a30e 100644 --- a/assets/voxygen/item_image_manifest.ron +++ b/assets/voxygen/item_image_manifest.ron @@ -2769,32 +2769,32 @@ ), //Orichalcum Set Simple("common.items.armor.mail.orichalcum.chest"): VoxTrans( - "voxel.armor.mail.orichalcum.chest", - (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 1.1, + "voxel.armor.mail.orichalcum", + (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 1.1, 0, ), Simple("common.items.armor.mail.orichalcum.pants"): VoxTrans( - "voxel.armor.mail.orichalcum.pants", - (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 0.9, + "voxel.armor.mail.orichalcum", + (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 0.9, 1, ), Simple("common.items.armor.mail.orichalcum.belt"): VoxTrans( - "voxel.armor.mail.orichalcum.belt", - (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + "voxel.armor.mail.orichalcum", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, 2, ), Simple("common.items.armor.mail.orichalcum.foot"): VoxTrans( - "voxel.armor.mail.orichalcum.foot", - (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + "voxel.armor.mail.orichalcum", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, 3, ), Simple("common.items.armor.mail.orichalcum.hand"): VoxTrans( - "voxel.armor.mail.orichalcum.hand", - (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + "voxel.armor.mail.orichalcum", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, 4, ), Simple("common.items.armor.mail.orichalcum.shoulder"): VoxTrans( - "voxel.armor.mail.orichalcum.shoulder", - (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 1.0, + "voxel.armor.mail.orichalcum", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 1.0, 5, ), Simple("common.items.armor.mail.orichalcum.back"): VoxTrans( - "voxel.armor.mail.orichalcum.back", - (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + "voxel.armor.mail.orichalcum", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, 6, ), //misc Simple("common.items.armor.misc.pants.hunting"): VoxTrans( diff --git a/assets/voxygen/voxel/armor/mail/orichalcum.vox b/assets/voxygen/voxel/armor/mail/orichalcum.vox new file mode 100644 index 0000000000..3fa9309175 --- /dev/null +++ b/assets/voxygen/voxel/armor/mail/orichalcum.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6637dc1b7805900c44f3e5c4125a088f100b58f3a077b0f55554250a6cd7bd2c +size 9089 diff --git a/assets/voxygen/voxel/armor/mail/orichalcum/back.vox b/assets/voxygen/voxel/armor/mail/orichalcum/back.vox deleted file mode 100644 index 1751a92237..0000000000 --- a/assets/voxygen/voxel/armor/mail/orichalcum/back.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86238f991646428c1b2344c6a7788bd54b4fdb30a1d970c627d5cd686e32a87a -size 1760 diff --git a/assets/voxygen/voxel/armor/mail/orichalcum/belt.vox b/assets/voxygen/voxel/armor/mail/orichalcum/belt.vox deleted file mode 100644 index 39ff83bc5c..0000000000 --- a/assets/voxygen/voxel/armor/mail/orichalcum/belt.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f74ef4ba012cbabbdb802dbe390d5bfa3f3a68b71e7f3f52290279e1e269440d -size 1560 diff --git a/assets/voxygen/voxel/armor/mail/orichalcum/chest.vox b/assets/voxygen/voxel/armor/mail/orichalcum/chest.vox deleted file mode 100644 index 407f8c5961..0000000000 --- a/assets/voxygen/voxel/armor/mail/orichalcum/chest.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:316b7bd34c42ce5270f491d60a348a7e31db877a6d9f8db60768b576d0a955fd -size 3264 diff --git a/assets/voxygen/voxel/armor/mail/orichalcum/foot.vox b/assets/voxygen/voxel/armor/mail/orichalcum/foot.vox deleted file mode 100644 index c9942e7093..0000000000 --- a/assets/voxygen/voxel/armor/mail/orichalcum/foot.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbc9281e5a4fe28f8b0c83091883007351b5e1d3a2877513c67d1cdc4e8dcb20 -size 1596 diff --git a/assets/voxygen/voxel/armor/mail/orichalcum/hand.vox b/assets/voxygen/voxel/armor/mail/orichalcum/hand.vox deleted file mode 100644 index 4cda474d0a..0000000000 --- a/assets/voxygen/voxel/armor/mail/orichalcum/hand.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70c20303577860ab575ad038bff56ce0273d453a4fd06ca9013dc99e6b0962dd -size 1380 diff --git a/assets/voxygen/voxel/armor/mail/orichalcum/pants.vox b/assets/voxygen/voxel/armor/mail/orichalcum/pants.vox deleted file mode 100644 index ade90e2210..0000000000 --- a/assets/voxygen/voxel/armor/mail/orichalcum/pants.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f761b4d3f4b8698901cbd92f064a9128ac773983c48ce43dd70bb7b65f1cd8f -size 2320 diff --git a/assets/voxygen/voxel/armor/mail/orichalcum/shoulder.vox b/assets/voxygen/voxel/armor/mail/orichalcum/shoulder.vox deleted file mode 100644 index 9a548c9db9..0000000000 --- a/assets/voxygen/voxel/armor/mail/orichalcum/shoulder.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:452ebc799789c21b39a64ef21ae066cf1bde02ace722cc8ee44a53b37746406a -size 1936 diff --git a/assets/voxygen/voxel/humanoid_armor_back_manifest.ron b/assets/voxygen/voxel/humanoid_armor_back_manifest.ron index 8e5128abdc..f1d95ca8f9 100644 --- a/assets/voxygen/voxel/humanoid_armor_back_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_back_manifest.ron @@ -137,7 +137,7 @@ color: None ), "common.items.armor.mail.orichalcum.back": ( - vox_spec: ("armor.mail.orichalcum.back", (-5.0, -4.5, -12.0)), + vox_spec: ("armor.mail.orichalcum", (-5.0, -4.5, -12.0), 6), color: None ), "common.items.armor.merchant.back": ( diff --git a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron index 64da3dee17..5c8168bd02 100644 --- a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron @@ -173,7 +173,7 @@ color: None ), "common.items.armor.mail.orichalcum.belt":( - vox_spec: ("armor.mail.orichalcum.belt", (-4.0, -3.5, 1.0)), + vox_spec: ("armor.mail.orichalcum", (-4.0, -3.5, 1.0), 2), color: None ), "common.items.armor.cardinal.belt": ( diff --git a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron index 05acf8861d..aa334b5328 100644 --- a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron @@ -243,7 +243,7 @@ color: None ), "common.items.armor.mail.orichalcum.chest": ( - vox_spec: ("armor.mail.orichalcum.chest", (-7.0, -4.0, 1.0)), + vox_spec: ("armor.mail.orichalcum", (-7.0, -4.0, 1.0), 0), color: None ), "common.items.armor.cardinal.chest": ( diff --git a/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron b/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron index 67686101a0..14ae1ce70c 100644 --- a/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron @@ -161,7 +161,7 @@ color: None ), "common.items.armor.mail.orichalcum.foot": ( - vox_spec: ("armor.mail.orichalcum.foot", (-2.5, -3.5, -2.0)), + vox_spec: ("armor.mail.orichalcum", (-2.5, -3.5, -2.0), 3), color: None ), "common.items.armor.cardinal.foot": ( diff --git a/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron b/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron index 298a6d24db..6fb2d99faf 100644 --- a/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron @@ -382,11 +382,11 @@ ), "common.items.armor.mail.orichalcum.hand": ( left: ( - vox_spec: ("armor.mail.orichalcum.hand", (-4.5, -2.0, -4.0)), + vox_spec: ("armor.mail.orichalcum", (-4.5, -2.0, -4.0), 4), color: None ), right: ( - vox_spec: ("armor.mail.orichalcum.hand", (-1.5, -2.0, -4.0)), + vox_spec: ("armor.mail.orichalcum", (-1.5, -2.0, -4.0), 4), color: None ) ), diff --git a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron index c7be27809d..ae2fc48e5b 100644 --- a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron @@ -201,7 +201,7 @@ color: None ), "common.items.armor.mail.orichalcum.pants": ( - vox_spec: ("armor.mail.orichalcum.pants", (-6.0, -4.0, 0.5)), + vox_spec: ("armor.mail.orichalcum", (-6.0, -4.0, 0.5), 1), color: None ), "common.items.armor.cardinal.pants": ( diff --git a/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron b/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron index 501bab7447..d990aa543f 100644 --- a/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron @@ -453,11 +453,11 @@ ), "common.items.armor.mail.orichalcum.shoulder": ( left: ( - vox_spec: ("armor.mail.orichalcum.shoulder", (-7.5, -3.0 , -2.0)), + vox_spec: ("armor.mail.orichalcum", (-7.5, -3.0 , -2.0), 5), color: None ), right: ( - vox_spec: ("armor.mail.orichalcum.shoulder", (-1.5, -3.0, -2.0)), + vox_spec: ("armor.mail.orichalcum", (-1.5, -3.0, -2.0), 5), color: None ) ), diff --git a/voxygen/src/bin/img-export.rs b/voxygen/src/bin/img-export.rs index 6c20a3f9ce..d83959e1f7 100644 --- a/voxygen/src/bin/img-export.rs +++ b/voxygen/src/bin/img-export.rs @@ -20,8 +20,8 @@ pub fn main() { let manifest = ItemImagesSpec::load_expect("voxygen.item_image_manifest"); for (_, spec) in manifest.read().0.iter() { match spec { - ImageSpec::Vox(specifier) => voxel_to_png(&specifier, Transform::default(), args.scale), - ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom) => voxel_to_png( + ImageSpec::Vox(specifier, model_index) => voxel_to_png(&specifier, Transform::default(), args.scale, model_index), + ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom, model_index) => voxel_to_png( &specifier, Transform { ori: Quaternion::rotation_x(rot_x * std::f32::consts::PI / 180.0) @@ -36,6 +36,7 @@ pub fn main() { stretch: false, }, args.scale, + model_index, ), ImageSpec::Png(specifier) => { println!("Skip png image {}", specifier); @@ -45,7 +46,7 @@ pub fn main() { } } -fn voxel_to_png(specifier: &String, transform: Transform, scale: u32) { +fn voxel_to_png(specifier: &String, transform: Transform, scale: u32, model_index: u32) { let voxel = match DotVoxAsset::load(&format!("voxygen.{}", specifier)) { Ok(dot_vox) => dot_vox, Err(err) => { @@ -56,7 +57,7 @@ fn voxel_to_png(specifier: &String, transform: Transform, scale: u32) { let dot_vox_data = &voxel.read().0; let model_size = dot_vox_data .models - .get(0) + .get(model_index) .expect("Error getting model from voxel") .size; let ori_mat = Mat4::from(transform.ori); diff --git a/voxygen/src/hud/item_imgs.rs b/voxygen/src/hud/item_imgs.rs index 1c160a0e11..cd73d2a372 100644 --- a/voxygen/src/hud/item_imgs.rs +++ b/voxygen/src/hud/item_imgs.rs @@ -20,24 +20,24 @@ pub fn animate_by_pulse(ids: &[Id], pulse: f32) -> Id { #[derive(Serialize, Deserialize)] pub enum ImageSpec { Png(String), - Vox(String), - // (specifier, offset, (axis, 2 * angle / pi), zoom) - VoxTrans(String, [f32; 3], [f32; 3], f32), + Vox(String, #[serde(default)] u32), + // (specifier, offset, (axis, 2 * angle / pi), zoom, model_index) + VoxTrans(String, [f32; 3], [f32; 3], f32, #[serde(default)] u32), } impl ImageSpec { fn create_graphic(&self) -> Graphic { match self { ImageSpec::Png(specifier) => Graphic::Image(graceful_load_img(specifier), None), - ImageSpec::Vox(specifier) => Graphic::Voxel( - graceful_load_segment_no_skin(specifier), + ImageSpec::Vox(specifier, model_index) => Graphic::Voxel( + graceful_load_segment_no_skin(specifier, *model_index), Transform { stretch: false, ..Default::default() }, SampleStrat::None, ), - ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom) => Graphic::Voxel( - graceful_load_segment_no_skin(specifier), + ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom, model_index) => Graphic::Voxel( + graceful_load_segment_no_skin(specifier, *model_index), Transform { ori: Quaternion::rotation_x(rot_x * std::f32::consts::PI / 180.0) .rotated_y(rot_y * std::f32::consts::PI / 180.0) @@ -163,9 +163,9 @@ fn graceful_load_img(specifier: &str) -> Arc { handle.read().to_image() } -fn graceful_load_segment_no_skin(specifier: &str) -> Arc { +fn graceful_load_segment_no_skin(specifier: &str, model_index: u32) -> Arc { use common::figure::{mat_cell::MatCell, MatSegment}; - let mat_seg = MatSegment::from(&graceful_load_vox(specifier).read().0); + let mat_seg = MatSegment::from((&graceful_load_vox(specifier).read().0, model_index as usize)); let seg = mat_seg .map(|mat_cell| match mat_cell { MatCell::None => None, From f4a87e9f0bdbc36ebd179218b1fba6fc2f20e75e Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Tue, 4 Apr 2023 23:47:31 +0200 Subject: [PATCH 11/12] cargo fmt --- voxygen/src/bin/img-export.rs | 40 +++++++++++++++++++---------------- voxygen/src/hud/item_imgs.rs | 28 ++++++++++++------------ 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/voxygen/src/bin/img-export.rs b/voxygen/src/bin/img-export.rs index d83959e1f7..dca0d67a9e 100644 --- a/voxygen/src/bin/img-export.rs +++ b/voxygen/src/bin/img-export.rs @@ -20,24 +20,28 @@ pub fn main() { let manifest = ItemImagesSpec::load_expect("voxygen.item_image_manifest"); for (_, spec) in manifest.read().0.iter() { match spec { - ImageSpec::Vox(specifier, model_index) => voxel_to_png(&specifier, Transform::default(), args.scale, model_index), - ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom, model_index) => voxel_to_png( - &specifier, - Transform { - ori: Quaternion::rotation_x(rot_x * std::f32::consts::PI / 180.0) - .rotated_y(rot_y * std::f32::consts::PI / 180.0) - .rotated_z(rot_z * std::f32::consts::PI / 180.0), - offset: Vec3::from(*offset), - /* FIXME: This is a dirty workaround to not cut off the edges of some objects - * like ./img-export/weapon/component/axe/poleaxe/bronze.vox - * more details here: https://gitlab.com/veloren/veloren/-/merge_requests/3494#note_1205030803 */ - zoom: *zoom * 0.8, - orth: true, - stretch: false, - }, - args.scale, - model_index, - ), + ImageSpec::Vox(specifier, model_index) => { + voxel_to_png(&specifier, Transform::default(), args.scale, model_index) + }, + ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom, model_index) => { + voxel_to_png( + &specifier, + Transform { + ori: Quaternion::rotation_x(rot_x * std::f32::consts::PI / 180.0) + .rotated_y(rot_y * std::f32::consts::PI / 180.0) + .rotated_z(rot_z * std::f32::consts::PI / 180.0), + offset: Vec3::from(*offset), + /* FIXME: This is a dirty workaround to not cut off the edges of some + * objects like ./img-export/weapon/component/ + * axe/poleaxe/bronze.vox more details here: https://gitlab.com/veloren/veloren/-/merge_requests/3494#note_1205030803 */ + zoom: *zoom * 0.8, + orth: true, + stretch: false, + }, + args.scale, + model_index, + ) + }, ImageSpec::Png(specifier) => { println!("Skip png image {}", specifier); continue; diff --git a/voxygen/src/hud/item_imgs.rs b/voxygen/src/hud/item_imgs.rs index cd73d2a372..cd8c9fcf36 100644 --- a/voxygen/src/hud/item_imgs.rs +++ b/voxygen/src/hud/item_imgs.rs @@ -36,19 +36,21 @@ impl ImageSpec { }, SampleStrat::None, ), - ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom, model_index) => Graphic::Voxel( - graceful_load_segment_no_skin(specifier, *model_index), - Transform { - ori: Quaternion::rotation_x(rot_x * std::f32::consts::PI / 180.0) - .rotated_y(rot_y * std::f32::consts::PI / 180.0) - .rotated_z(rot_z * std::f32::consts::PI / 180.0), - offset: Vec3::from(*offset), - zoom: *zoom, - orth: true, // TODO: Is this what we want here? @Pfau - stretch: false, - }, - SampleStrat::None, - ), + ImageSpec::VoxTrans(specifier, offset, [rot_x, rot_y, rot_z], zoom, model_index) => { + Graphic::Voxel( + graceful_load_segment_no_skin(specifier, *model_index), + Transform { + ori: Quaternion::rotation_x(rot_x * std::f32::consts::PI / 180.0) + .rotated_y(rot_y * std::f32::consts::PI / 180.0) + .rotated_z(rot_z * std::f32::consts::PI / 180.0), + offset: Vec3::from(*offset), + zoom: *zoom, + orth: true, // TODO: Is this what we want here? @Pfau + stretch: false, + }, + SampleStrat::None, + ) + }, } } } From e60aace448eac2d2cca32593da44a66667cfc843 Mon Sep 17 00:00:00 2001 From: Christof Petig Date: Wed, 5 Apr 2023 00:11:26 +0200 Subject: [PATCH 12/12] realize zesterers proposal --- common/src/figure/mod.rs | 24 ++++++++-------------- voxygen/src/hud/item_imgs.rs | 5 ++++- voxygen/src/scene/figure/load.rs | 34 ++++++++++++++++++-------------- voxygen/src/scene/particle.rs | 2 +- voxygen/src/scene/terrain.rs | 3 ++- voxygen/src/ui/img_ids.rs | 2 +- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/common/src/figure/mod.rs b/common/src/figure/mod.rs index e2e7296d76..f23035e615 100644 --- a/common/src/figure/mod.rs +++ b/common/src/figure/mod.rs @@ -20,14 +20,6 @@ use vek::*; /// Figures are used to represent things like characters, NPCs, mobs, etc. pub type Segment = Dyna; -impl From<&DotVoxData> for Segment { - fn from(dot_vox_data: &DotVoxData) -> Self { Segment::from_vox(dot_vox_data, false, 0) } -} - -impl From<(&DotVoxData, usize)> for Segment { - fn from(spec: (&DotVoxData, usize)) -> Self { Segment::from_vox(spec.0, false, spec.1) } -} - impl Segment { /// Take a list of voxel data, offsets, and x-mirror flags, and assembled /// them into a combined segment @@ -39,6 +31,10 @@ impl Segment { union.unify() } + pub fn from_vox_model_index(dot_vox_data: &DotVoxData, model_index: usize) -> Self { + Self::from_vox(dot_vox_data, false, model_index) + } + pub fn from_vox(dot_vox_data: &DotVoxData, flipped: bool, model_index: usize) -> Self { if let Some(model) = dot_vox_data.models.get(model_index) { let palette = dot_vox_data @@ -206,6 +202,10 @@ impl MatSegment { }) } + pub fn from_vox_model_index(dot_vox_data: &DotVoxData, model_index: usize) -> Self { + Self::from_vox(dot_vox_data, false, model_index) + } + pub fn from_vox(dot_vox_data: &DotVoxData, flipped: bool, model_index: usize) -> Self { if let Some(model) = dot_vox_data.models.get(model_index) { let palette = dot_vox_data @@ -266,11 +266,3 @@ impl MatSegment { } } } - -impl From<&DotVoxData> for MatSegment { - fn from(dot_vox_data: &DotVoxData) -> Self { Self::from_vox(dot_vox_data, false, 0) } -} - -impl From<(&DotVoxData, usize)> for MatSegment { - fn from(spec: (&DotVoxData, usize)) -> Self { Self::from_vox(spec.0, false, spec.1) } -} diff --git a/voxygen/src/hud/item_imgs.rs b/voxygen/src/hud/item_imgs.rs index cd8c9fcf36..ef5ab60de5 100644 --- a/voxygen/src/hud/item_imgs.rs +++ b/voxygen/src/hud/item_imgs.rs @@ -167,7 +167,10 @@ fn graceful_load_img(specifier: &str) -> Arc { fn graceful_load_segment_no_skin(specifier: &str, model_index: u32) -> Arc { use common::figure::{mat_cell::MatCell, MatSegment}; - let mat_seg = MatSegment::from((&graceful_load_vox(specifier).read().0, model_index as usize)); + let mat_seg = MatSegment::from_vox_model_index( + &graceful_load_vox(specifier).read().0, + model_index as usize, + ); let seg = mat_seg .map(|mat_cell| match mat_cell { MatCell::None => None, diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index c8ebebdca1..ecd1d71b6d 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -38,7 +38,10 @@ const DEFAULT_INDEX: u32 = 0; fn load_segment(mesh_name: &str) -> Segment { let full_specifier: String = ["voxygen.voxel.", mesh_name].concat(); - Segment::from(&DotVoxAsset::load_expect(&full_specifier).read().0) + Segment::from_vox_model_index( + &DotVoxAsset::load_expect(&full_specifier).read().0, + DEFAULT_INDEX as usize, + ) } fn graceful_load_vox(mesh_name: &str) -> AssetHandle { let full_specifier: String = ["voxygen.voxel.", mesh_name].concat(); @@ -54,13 +57,13 @@ fn graceful_load_vox_fullspec(full_specifier: &str) -> AssetHandle } } fn graceful_load_segment(mesh_name: &str, model_index: u32) -> Segment { - Segment::from((&graceful_load_vox(mesh_name).read().0, model_index as usize)) + Segment::from_vox_model_index(&graceful_load_vox(mesh_name).read().0, model_index as usize) } fn graceful_load_segment_fullspec(full_specifier: &str, model_index: u32) -> Segment { - Segment::from(( + Segment::from_vox_model_index( &graceful_load_vox_fullspec(full_specifier).read().0, model_index as usize, - )) + ) } fn graceful_load_segment_flipped(mesh_name: &str, flipped: bool, model_index: u32) -> Segment { Segment::from_vox( @@ -70,7 +73,7 @@ fn graceful_load_segment_flipped(mesh_name: &str, flipped: bool, model_index: u3 ) } fn graceful_load_mat_segment(mesh_name: &str, model_index: u32) -> MatSegment { - MatSegment::from((&graceful_load_vox(mesh_name).read().0, model_index as usize)) + MatSegment::from_vox_model_index(&graceful_load_vox(mesh_name).read().0, model_index as usize) } fn graceful_load_mat_segment_flipped(mesh_name: &str, model_index: u32) -> MatSegment { MatSegment::from_vox( @@ -5153,15 +5156,16 @@ impl ItemDropCentralSpec { } { let full_spec: String = ["voxygen.", spec.as_str()].concat(); let segment = match item_drop { - item_drop::Body::Armor(_) => { - MatSegment::from(&graceful_load_vox_fullspec(&full_spec).read().0) - .map(|mat_cell| match mat_cell { - MatCell::None => None, - MatCell::Mat(_) => Some(MatCell::None), - MatCell::Normal(data) => data.is_hollow().then_some(MatCell::None), - }) - .to_segment(|_| Default::default()) - }, + item_drop::Body::Armor(_) => MatSegment::from_vox_model_index( + &graceful_load_vox_fullspec(&full_spec).read().0, + 0, + ) + .map(|mat_cell| match mat_cell { + MatCell::None => None, + MatCell::Mat(_) => Some(MatCell::None), + MatCell::Normal(data) => data.is_hollow().then_some(MatCell::None), + }) + .to_segment(|_| Default::default()), _ => graceful_load_segment_fullspec(&full_spec, DEFAULT_INDEX), }; let offset = segment_center(&segment).unwrap_or_default(); @@ -5234,7 +5238,7 @@ fn mesh_ship_bone &ShipCentralSubSpec }; let bone = f(spec); let central = graceful_load_segment_fullspec( - &["common.voxel.", &bone.central.0].concat(), + &format!("common.voxel.{}", &bone.central.0), bone.model_index, ); diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index 7f7494f74d..8b7c9b0219 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -1977,7 +1977,7 @@ fn default_cache(renderer: &mut Renderer) -> HashMap<&'static str, Model Result, Error> { let dot_vox = DotVoxAsset::load(specifier)?; - let seg = Segment::from(&dot_vox.read().0); + let seg = Segment::from_vox_model_index(&dot_vox.read().0, 0); Ok(Arc::new(seg)) }