mirror of
https://github.com/redstrate/Physis.git
synced 2025-07-21 16:17:45 +00:00
Fix reading some Dawntrail shader packages
Apparently no one knows what these are, so I just skip them or whatever.
This commit is contained in:
parent
f46a32462e
commit
4709a3a3c4
1 changed files with 27 additions and 13 deletions
40
src/shpk.rs
40
src/shpk.rs
|
@ -5,8 +5,8 @@
|
|||
|
||||
use std::io::{Cursor, SeekFrom};
|
||||
|
||||
use crate::ByteSpan;
|
||||
use crate::crc::XivCrc32;
|
||||
use crate::{ByteSpan, common_file_operations::read_bool_from};
|
||||
use binrw::{BinRead, binread};
|
||||
|
||||
#[binread]
|
||||
|
@ -35,6 +35,7 @@ pub struct ResourceParameter {
|
|||
|
||||
#[binread]
|
||||
#[br(little, import {
|
||||
version: u32,
|
||||
shader_data_offset: u32,
|
||||
strings_offset: u32,
|
||||
is_vertex: bool
|
||||
|
@ -50,6 +51,9 @@ pub struct Shader {
|
|||
uav_parameter_count: u16,
|
||||
texture_count: u16,
|
||||
|
||||
#[br(count = if version >= 0x0D01 { 4 } else { 0 } )]
|
||||
unk_data: Vec<u8>,
|
||||
|
||||
#[br(args { count: scalar_parameter_count as usize, inner: ResourceParameterBinReadArgs { strings_offset }})]
|
||||
pub scalar_parameters: Vec<ResourceParameter>,
|
||||
#[br(args { count: resource_parameter_count as usize, inner: ResourceParameterBinReadArgs { strings_offset }})]
|
||||
|
@ -93,11 +97,15 @@ pub struct Key {
|
|||
|
||||
#[binread]
|
||||
#[repr(C)]
|
||||
#[br(little, import {
|
||||
version: u32,
|
||||
})]
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
#[allow(unused)]
|
||||
pub struct Pass {
|
||||
id: u32,
|
||||
vertex_shader: u32,
|
||||
#[brw(pad_after = if version >= 0x0D01 { 12 } else { 0 })]
|
||||
pixel_shader: u32,
|
||||
}
|
||||
|
||||
|
@ -111,6 +119,7 @@ pub struct NodeAlias {
|
|||
|
||||
#[binread]
|
||||
#[br(little, import {
|
||||
version: u32,
|
||||
system_key_count: u32,
|
||||
scene_key_count: u32,
|
||||
material_key_count: u32,
|
||||
|
@ -122,6 +131,10 @@ pub struct Node {
|
|||
pub selector: u32,
|
||||
pub pass_count: u32,
|
||||
pub pass_indices: [u8; 16],
|
||||
|
||||
#[br(count = if version >= 0x0D01 { 8 } else { 0 } )]
|
||||
unk_data: Vec<u8>,
|
||||
|
||||
#[br(count = system_key_count)]
|
||||
pub system_keys: Vec<u32>,
|
||||
#[br(count = scene_key_count)]
|
||||
|
@ -130,7 +143,7 @@ pub struct Node {
|
|||
pub material_keys: Vec<u32>,
|
||||
#[br(count = subview_key_count)]
|
||||
pub subview_keys: Vec<u32>,
|
||||
#[br(count = pass_count)]
|
||||
#[br(args { count: pass_count as usize, inner: PassBinReadArgs { version }})]
|
||||
pub passes: Vec<Pass>,
|
||||
}
|
||||
|
||||
|
@ -140,6 +153,7 @@ pub struct Node {
|
|||
#[derive(Debug)]
|
||||
#[allow(dead_code, unused)]
|
||||
pub struct ShaderPackage {
|
||||
/// For example, 3329
|
||||
version: u32,
|
||||
|
||||
// "DX9\0" or "DX11"
|
||||
|
@ -159,15 +173,12 @@ pub struct ShaderPackage {
|
|||
pub material_parameters_size: u32,
|
||||
material_parameter_count: u16,
|
||||
|
||||
has_mat_param_defaults: u16,
|
||||
scalar_parameter_count: u16,
|
||||
#[br(temp)]
|
||||
unknown1: u16,
|
||||
#[br(map = read_bool_from::<u16>)]
|
||||
has_mat_param_defaults: bool,
|
||||
scalar_parameter_count: u32,
|
||||
sampler_count: u16,
|
||||
texture_count: u16,
|
||||
uav_count: u16,
|
||||
#[br(temp)]
|
||||
unknown2: u16,
|
||||
uav_count: u32,
|
||||
|
||||
system_key_count: u32,
|
||||
scene_key_count: u32,
|
||||
|
@ -175,16 +186,19 @@ pub struct ShaderPackage {
|
|||
node_count: u32,
|
||||
node_alias_count: u32,
|
||||
|
||||
#[br(count = if version >= 0x0D01 { 12 } else { 0 } )]
|
||||
unk_data: Vec<u8>,
|
||||
|
||||
// TODO: dx9 needs 4 bytes of padding, dx11 is 8 (correct)
|
||||
#[br(args { count: vertex_shader_count as usize, inner : ShaderBinReadArgs { is_vertex: true, shader_data_offset, strings_offset }})]
|
||||
#[br(args { count: vertex_shader_count as usize, inner : ShaderBinReadArgs { version, is_vertex: true, shader_data_offset, strings_offset }})]
|
||||
pub vertex_shaders: Vec<Shader>,
|
||||
#[br(args { count: pixel_shader_count as usize, inner: ShaderBinReadArgs { is_vertex: false, shader_data_offset, strings_offset } })]
|
||||
#[br(args { count: pixel_shader_count as usize, inner: ShaderBinReadArgs { version, is_vertex: false, shader_data_offset, strings_offset } })]
|
||||
pub pixel_shaders: Vec<Shader>,
|
||||
|
||||
#[br(count = material_parameter_count)]
|
||||
pub material_parameters: Vec<MaterialParameter>,
|
||||
|
||||
#[br(count = if has_mat_param_defaults == 0x1 { (material_parameters_size as i32) >> 2i32 } else { 0 })]
|
||||
#[br(count = if has_mat_param_defaults { (material_parameters_size as i32) >> 2i32 } else { 0 })]
|
||||
mat_param_defaults: Vec<f32>,
|
||||
|
||||
#[br(args { count: scalar_parameter_count as usize, inner: ResourceParameterBinReadArgs { strings_offset }})]
|
||||
|
@ -206,7 +220,7 @@ pub struct ShaderPackage {
|
|||
pub sub_view_key1_default: u32,
|
||||
pub sub_view_key2_default: u32,
|
||||
|
||||
#[br(args { count: node_count as usize, inner: NodeBinReadArgs { system_key_count, scene_key_count, material_key_count, subview_key_count: 2 }})]
|
||||
#[br(args { count: node_count as usize, inner: NodeBinReadArgs { version, system_key_count, scene_key_count, material_key_count, subview_key_count: 2 }})]
|
||||
pub nodes: Vec<Node>,
|
||||
|
||||
#[br(ignore)]
|
||||
|
|
Loading…
Add table
Reference in a new issue