Skip to main content

plasma_prp/material/
state.rs

1//! hsGMatState — material rendering state flags.
2//!
3//! Five uint32 flag words controlling blend mode, clamping, shading, z-buffer, and misc.
4//!
5//! C++ ref: hsGMatState.h, hsGMatState.inl
6
7use std::io::Read;
8
9use anyhow::Result;
10
11use crate::resource::prp::PlasmaRead;
12
13/// Material rendering state — 5 flag words.
14#[derive(Debug, Clone, Copy, Default)]
15pub struct MatState {
16    pub blend_flags: u32,
17    pub clamp_flags: u32,
18    pub shade_flags: u32,
19    pub z_flags: u32,
20    pub misc_flags: u32,
21}
22
23impl MatState {
24    pub fn read(reader: &mut impl Read) -> Result<Self> {
25        Ok(Self {
26            blend_flags: reader.read_u32()?,
27            clamp_flags: reader.read_u32()?,
28            shade_flags: reader.read_u32()?,
29            z_flags: reader.read_u32()?,
30            misc_flags: reader.read_u32()?,
31        })
32    }
33}
34
35// Blend flags
36#[allow(dead_code)]
37pub mod blend {
38    pub const TEST: u32 = 0x1;
39    pub const ALPHA: u32 = 0x2;
40    pub const MULT: u32 = 0x4;
41    pub const ADD: u32 = 0x8;
42    pub const ADD_COLOR_TIMES_ALPHA: u32 = 0x10;
43    pub const ANTI_ALIAS: u32 = 0x20;
44    pub const DETAIL: u32 = 0x40;
45    pub const NO_COLOR: u32 = 0x80;
46    pub const MADD: u32 = 0x100;
47    pub const DOT3: u32 = 0x200;
48    pub const ADD_SIGNED: u32 = 0x400;
49    pub const ADD_SIGNED_2X: u32 = 0x800;
50    pub const MASK: u32 = 0xFFE;
51    pub const INVERT_ALPHA: u32 = 0x1000;
52    pub const INVERT_COLOR: u32 = 0x2000;
53    pub const ALPHA_MULT: u32 = 0x4000;
54    pub const ALPHA_ADD: u32 = 0x8000;
55    pub const NO_VTX_ALPHA: u32 = 0x10000;
56    pub const NO_TEX_COLOR: u32 = 0x20000;
57    pub const NO_TEX_ALPHA: u32 = 0x40000;
58    pub const INVERT_VTX_ALPHA: u32 = 0x80000;
59    pub const ALPHA_ALWAYS: u32 = 0x100000;
60    pub const INVERT_FINAL_COLOR: u32 = 0x200000;
61    pub const INVERT_FINAL_ALPHA: u32 = 0x400000;
62    pub const ENV_BUMP_NEXT: u32 = 0x800000;
63    pub const SUBTRACT: u32 = 0x1000000;
64    pub const REV_SUBTRACT: u32 = 0x2000000;
65    pub const ALPHA_TEST_HIGH: u32 = 0x4000000;
66    pub const ALPHA_PREMULTIPLIED: u32 = 0x8000000;
67}
68
69// Clamp flags
70#[allow(dead_code)]
71pub mod clamp {
72    pub const TEXTURE_U: u32 = 0x1;
73    pub const TEXTURE_V: u32 = 0x2;
74    pub const TEXTURE: u32 = 0x3;
75}
76
77// Shade flags
78#[allow(dead_code)]
79pub mod shade {
80    pub const SOFT_SHADOW: u32 = 0x1;
81    pub const NO_PROJECTORS: u32 = 0x2;
82    pub const ENVIRON_MAP: u32 = 0x4;
83    pub const VERTEX_SHADE: u32 = 0x20;
84    pub const NO_SHADE: u32 = 0x40;
85    pub const SPECULAR: u32 = 0x80;
86    pub const WHITE: u32 = 0x200;
87    pub const SPECULAR_ALPHA: u32 = 0x400;
88    pub const SPECULAR_COLOR: u32 = 0x800;
89    pub const SPECULAR_HIGHLIGHT: u32 = 0x1000;
90    pub const VERT_COL_SHADE: u32 = 0x2000;
91    pub const INHERIT: u32 = 0x4000;
92    pub const IGNORE_VTX_ILLUM: u32 = 0x8000;
93    pub const EMISSIVE: u32 = 0x10000;
94    pub const REALLY_NO_FOG: u32 = 0x20000;
95}
96
97// Z flags
98#[allow(dead_code)]
99pub mod z_flags {
100    pub const INC_LAYER: u32 = 0x1;
101    pub const CLEAR_Z: u32 = 0x4;
102    pub const NO_Z_READ: u32 = 0x8;
103    pub const NO_Z_WRITE: u32 = 0x10;
104    pub const Z_MASK: u32 = 0x1C;
105    pub const LOD_BIAS: u32 = 0x20;
106}
107
108// Misc flags
109#[allow(dead_code)]
110pub mod misc {
111    pub const WIRE_FRAME: u32 = 0x1;
112    pub const DRAW_MESH_OUTLINES: u32 = 0x2;
113    pub const TWO_SIDED: u32 = 0x4;
114    pub const DRAW_AS_SPLATS: u32 = 0x8;
115    pub const ADJUST_PLANE: u32 = 0x10;
116    pub const ADJUST_CYLINDER: u32 = 0x20;
117    pub const ADJUST_SPHERE: u32 = 0x40;
118    pub const ADJUST: u32 = 0x70;
119    pub const TROUBLED_LONER: u32 = 0x80;
120    pub const BIND_SKIP: u32 = 0x100;
121    pub const BIND_MASK: u32 = 0x200;
122    pub const BIND_NEXT: u32 = 0x400;
123    pub const LIGHT_MAP: u32 = 0x800;
124    pub const USE_REFLECTION_XFM: u32 = 0x1000;
125    pub const PERSP_PROJECTION: u32 = 0x2000;
126    pub const ORTHO_PROJECTION: u32 = 0x4000;
127    pub const PROJECTION: u32 = 0x6000;
128    pub const RESTART_PASS_HERE: u32 = 0x8000;
129    pub const BUMP_LAYER: u32 = 0x10000;
130    pub const BUMP_DU: u32 = 0x20000;
131    pub const BUMP_DV: u32 = 0x40000;
132    pub const BUMP_DW: u32 = 0x80000;
133    pub const BUMP_CHANS: u32 = 0xE0000;
134    pub const NO_SHADOW_ALPHA: u32 = 0x100000;
135    pub const USE_REFRACTION_XFM: u32 = 0x200000;
136    pub const CAM2_SCREEN: u32 = 0x400000;
137}