#pragma once #include "constant_table.h" struct Float4Definition { be registerIndex; be count; be physicalOffset; }; struct Int4Definition { be registerIndex; be count; be values[]; }; struct DefinitionTable { be field0; be field4; be field8; be fieldC; be size; be definitions[]; // float4, int4 and bool separated by null terminators }; struct Shader { be physicalOffset; be size; be field8; be fieldC; be field10; be interpolatorInfo; // interpolator count: (interpolatorInfo >> 5) & 0x1F }; enum class DeclUsage : uint32_t { Position = 0, BlendWeight = 1, BlendIndices = 2, Normal = 3, PointSize = 4, TexCoord = 5, Tangent = 6, Binormal = 7, TessFactor = 8, PositionT = 9, Color = 10, Fog = 11, Depth = 12, Sample = 13 }; struct VertexElement { uint32_t address : 12; DeclUsage usage : 4; uint32_t usageIndex : 4; }; struct Interpolator { uint32_t usageIndex : 4; DeclUsage usage : 4; uint32_t reg : 4; uint32_t : 20; }; struct VertexShader : Shader { be field18; be vertexElementCount; be field20; be vertexElementsAndInterpolators[]; // field18 + vertex elements + interpolators }; enum PixelShaderOutputs : uint32_t { PIXEL_SHADER_OUTPUT_COLOR0 = 0x1, PIXEL_SHADER_OUTPUT_COLOR1 = 0x2, PIXEL_SHADER_OUTPUT_COLOR2 = 0x4, PIXEL_SHADER_OUTPUT_COLOR3 = 0x8, PIXEL_SHADER_OUTPUT_DEPTH = 0x10 }; struct PixelShader : Shader { be field18; be outputs; be interpolators[]; }; struct ShaderContainer { be flags; be virtualSize; be physicalSize; be fieldC; be constantTableOffset; be definitionTableOffset; be shaderOffset; be field1C; be field20; };