diff --git a/src/mtrl.rs b/src/mtrl.rs index c4883e5..fdfd717 100644 --- a/src/mtrl.rs +++ b/src/mtrl.rs @@ -77,13 +77,13 @@ pub struct ConstantStruct { value_size: u16, } -#[binrw] -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] #[repr(C)] #[allow(dead_code)] pub struct Constant { id: u32, - value: f32 // TDOO: only supports single float for now + num_values: u32, + values: [f32; 4] } // from https://github.com/NotAdam/Lumina/blob/master/src/Lumina/Data/Parsing/MtrlStructs.cs @@ -236,10 +236,18 @@ impl Material { let mut constants = Vec::new(); for constant in mat_data.constants { - // TODO: support constants that aren't single floats + let mut values: [f32; 4] = [0.0; 4]; + + // TODO: use mem::size_of + let num_floats = constant.value_size / 4; + for i in 0..num_floats as usize { + values[i] = mat_data.shader_values[(constant.value_offset as usize / 4) + i]; + } + constants.push(Constant { id: constant.constant_id, - value: mat_data.shader_values[constant.value_offset as usize / 4] + num_values: num_floats as u32, + values }); } diff --git a/src/shpk.rs b/src/shpk.rs index 7a59b29..b2ef658 100644 --- a/src/shpk.rs +++ b/src/shpk.rs @@ -64,7 +64,8 @@ pub struct Shader { } #[binread] -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] +#[repr(C)] #[allow(unused)] pub struct MaterialParameter { id: u32, @@ -146,7 +147,7 @@ pub struct ShaderPackage { vertex_shader_count: u32, pixel_shader_count: u32, - material_parameters_size: u32, + pub material_parameters_size: u32, material_parameter_count: u16, has_mat_param_defaults: u16, @@ -172,7 +173,7 @@ pub struct ShaderPackage { pub pixel_shaders: Vec, #[br(count = material_parameter_count)] - material_parameters: Vec, + pub material_parameters: Vec, #[br(count = if has_mat_param_defaults == 0x1 { (material_parameters_size as i32) >> 2i32 } else { 0 })] mat_param_defaults: Vec,