XPlor/definitions/cod/materialtechniqueset.xscript
2026-01-01 22:18:40 -05:00

66 lines
1.7 KiB
Plaintext

type materialtechniqueset [display="Material Technique Set"]
{
i32 technique_set_name_ptr [ui, readonly, display="Technique Set Name Ptr"];
u8 world_vert_format [ui, readonly, display="World Vert Format"];
u8 has_been_uploaded [ui, readonly, display="Has Been Uploaded"];
skip(2); // padding
skip(4); // more padding
// Technique count depends on game/platform
technique_count = 0;
if (game == "COD4") {
if (platform == "PC") {
technique_count = 34;
}
if (platform == "XBOX360") {
technique_count = 26;
}
if (platform == "PS3") {
technique_count = 26;
}
}
if (game == "COD5") {
if (platform == "PC") {
technique_count = 59;
}
if (platform == "XBOX360") {
technique_count = 51;
}
if (platform == "PS3") {
technique_count = 51;
}
}
technique_count = technique_count [ui, readonly, display="Technique Count"];
// Save position after technique count
_ptrs_start_pos = pos();
// Read technique pointers as raw bytes
if (technique_count > 0) {
_ptrs_size = technique_count * 4;
_technique_ptrs_raw = read(_ptrs_size);
}
// Parse technique set name if inline
if (technique_set_name_ptr == -1) {
technique_set_name = cstring() [ui, readonly, display="Technique Set Name"];
_name = technique_set_name;
}
// Second pass: Parse each technique if ptr == -1 (inline)
techniques = 0;
if (technique_count > 0) {
repeat(technique_count) {
_ptr_offset = _ptrs_start_pos + (_i * 4);
_ptr = u32at(_ptr_offset);
if (_ptr == 4294967295) { // -1 as u32
_technique = parse_here("materialtechnique") [ui];
techniques = push("techniques", _technique);
}
}
}
}