XPlor/definitions/cod/materialtechnique.xscript

67 lines
2.2 KiB
Plaintext
Raw Normal View History

2026-01-01 22:18:40 -05:00
type materialtechnique [display="Material Technique"]
{
i32 technique_name_ptr [ui, readonly, display="Technique Name Ptr"];
u16 flags [ui, readonly, display="Flags"];
u16 pass_count [ui, readonly, display="Pass Count"];
// COD zone streaming order:
// 1. All pass HEADERS (20 bytes each)
// 2. Technique name (if inline)
// 3. Inline data for each pass (vertex_decl, vertex_shader, pixel_shader, args)
// First pass: Read all pass headers (20 bytes each) and store key values
// MaterialPass header = vertex_decl_ptr(4) + vertex_shader_ptr(4) + pixel_shader_ptr(4) +
// arg_counts(4) + args_ptr(4) = 20 bytes
_pass_headers_start = pos();
_pass_header_size = 20;
if (pass_count > 0) {
_total_header_bytes = pass_count * _pass_header_size;
pass_headers_raw = read(_total_header_bytes);
}
// Parse technique name (comes AFTER headers, BEFORE inline data)
2026-01-01 22:18:40 -05:00
if (technique_name_ptr == -1) {
technique_name = cstring() [ui, readonly, display="Technique Name"];
_name = technique_name;
}
// Second pass: Parse inline data for each pass based on stored header values
// Just parse sequentially - data is laid out in order
2026-01-01 22:18:40 -05:00
if (pass_count > 0) {
repeat(pass_count) {
_base = _pass_headers_start + (_i * _pass_header_size);
_vertex_decl_ptr = i32at(_base);
_vertex_shader_ptr = i32at(_base + 4);
_pixel_shader_ptr = i32at(_base + 8);
_per_prim_arg_count = u8at(_base + 12);
_per_obj_arg_count = u8at(_base + 13);
_stable_arg_count = u8at(_base + 14);
_args_ptr = i32at(_base + 16);
// Parse vertex declaration if inline
if (_vertex_decl_ptr == -1) {
_vd = parse_here("materialvertexdeclaration");
}
// Parse vertex shader if inline
if (_vertex_shader_ptr == -1) {
_vs = parse_here("materialvertexshader");
}
// Parse pixel shader if inline
if (_pixel_shader_ptr == -1) {
_ps = parse_here("pixelshader");
}
// Parse shader arguments if inline
_arg_count = _stable_arg_count + _per_obj_arg_count + _per_prim_arg_count;
if (_args_ptr == -1 && _arg_count > 0) {
repeat(_arg_count) {
_arg = parse_here("materialshaderargument");
}
}
2026-01-01 22:18:40 -05:00
}
}
}