2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-03-16 01:43:04 +00:00

Merge pull request #712 from Laupetin/feature/iw3-techniques

feat: iw3 techsets
This commit is contained in:
Jan
2026-03-14 21:27:00 +01:00
committed by GitHub
22 changed files with 1124 additions and 398 deletions

View File

@@ -15,7 +15,7 @@ The following section specify which assets are supported to be dumped to disk (u
| XAnimParts | ❌ | ❌ | |
| XModel | ✅ | ✅ | Model data can be exported to `XMODEL_EXPORT/XMODEL_BIN`, `OBJ`, `GLB/GLTF`. |
| Material | ✅ | ✅ | |
| MaterialTechniqueSet | | | |
| MaterialTechniqueSet | | | For shaders: only dumps/loads shader bytecode. |
| GfxImage | ✅ | ✅ | |
| snd_alias_list_t | ❌ | ❌ | |
| SndCurve | ❌ | ❌ | |
@@ -46,10 +46,10 @@ The following section specify which assets are supported to be dumped to disk (u
| XAnimParts | ❌ | ❌ | |
| XModel | ✅ | ✅ | Model data can be exported to `XMODEL_EXPORT/XMODEL_BIN`, `OBJ`, `GLB/GLTF`. |
| Material | ✅ | ✅ | |
| MaterialPixelShader | ✅ | ✅ | Shaders are compiled. Only dumps/loads shader bytecode. |
| MaterialVertexShader | ✅ | ✅ | Shaders are compiled. Only dumps/loads shader bytecode. |
| MaterialVertexDeclaration | ✅ | ✅ | Vertex declarations are dumped/loaded as part of a technique. |
| MaterialTechniqueSet | ⁉️ | ⁉️ | Statemaps are currently not exported. |
| MaterialPixelShader | ✅ | ✅ | Only dumps/loads shader bytecode. |
| MaterialVertexShader | ✅ | ✅ | Only dumps/loads shader bytecode. |
| MaterialVertexDeclaration | ✅ | ✅ | |
| MaterialTechniqueSet | | | |
| GfxImage | ✅ | ❌ | A few special image encodings are not yet supported. |
| snd_alias_list_t | ❌ | ❌ | |
| SndCurve | ✅ | ✅ | |
@@ -132,7 +132,7 @@ The following section specify which assets are supported to be dumped to disk (u
| XAnimParts | ❌ | ❌ | |
| XModel | ✅ | ✅ | Model data can be exported to `XMODEL_EXPORT/XMODEL_BIN`, `OBJ`, `GLB/GLTF`. |
| Material | ✅ | ✅ | |
| MaterialTechniqueSet | | ❌ | |
| MaterialTechniqueSet | | ❌ | For shaders: only dumps/loads shader bytecode. |
| GfxImage | ✅ | ❌ | A few special image encodings are not yet supported. |
| SndBank | ❌ | ❌ | |
| SndPatch | ❌ | ❌ | |
@@ -169,7 +169,7 @@ The following section specify which assets are supported to be dumped to disk (u
| XAnimParts | ❌ | ❌ | |
| XModel | ✅ | ✅ | Model data can be exported to `XMODEL_EXPORT/XMODEL_BIN`, `OBJ`, `GLB/GLTF`. |
| Material | ✅ | ✅ | Dumping/Loading is currently possible for materials in their compiled form. There is currently no material pipeline. |
| MaterialTechniqueSet | ✅ | | Only dumps compiled shaders. |
| MaterialTechniqueSet | ✅ | | For shaders: only dumps/loads shader bytecode. |
| GfxImage | ✅ | ✅ | A few special image encodings are not yet supported. |
| SndBank | ✅ | ✅ | The current implementation is subject to change. |
| SndPatch | ❌ | ❌ | |

View File

@@ -187,6 +187,11 @@ namespace IW3
using AssetImpactFx = Asset<ASSET_TYPE_IMPACT_FX, FxImpactTable>;
using AssetRawFile = Asset<ASSET_TYPE_RAWFILE, RawFile>;
using AssetStringTable = Asset<ASSET_TYPE_STRINGTABLE, StringTable>;
using SubAssetTechnique = SubAsset<SUB_ASSET_TYPE_TECHNIQUE, MaterialTechnique>;
using SubAssetVertexDecl = SubAsset<SUB_ASSET_TYPE_VERTEX_DECL, MaterialVertexDeclaration>;
using SubAssetVertexShader = SubAsset<SUB_ASSET_TYPE_VERTEX_SHADER, MaterialVertexShader>;
using SubAssetPixelShader = SubAsset<SUB_ASSET_TYPE_PIXEL_SHADER, MaterialPixelShader>;
} // namespace IW3
DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetXModelPieces, name);

View File

@@ -967,8 +967,8 @@ namespace IW3
struct MaterialArgumentCodeConst
{
uint16_t index;
char firstRow;
char rowCount;
unsigned char firstRow;
unsigned char rowCount;
};
union MaterialArgumentDef
@@ -996,265 +996,189 @@ namespace IW3
MTL_ARG_MATERIAL_PIXEL_CONST = 0x6,
MTL_ARG_LITERAL_PIXEL_CONST = 0x7,
MLT_ARG_COUNT
MTL_ARG_COUNT
};
enum MaterialConstantSource
enum MaterialType
{
MTL_TYPE_DEFAULT = 0x0,
MTL_TYPE_MODEL = 0x1, // m_
MTL_TYPE_MODEL_VERTCOL = 0x2, // mc_
MTL_TYPE_WORLD = 0x3, // w_
MTL_TYPE_WORLD_VERTCOL = 0x4, // wc_
MTL_TYPE_COUNT,
};
struct MaterialTypeInfo
{
const char* materialPrefix;
const char* techniqueSetPrefix;
};
enum ShaderCodeConstants
{
CONST_SRC_CODE_MAYBE_DIRTY_PS_BEGIN = 0x0,
CONST_SRC_CODE_LIGHT_POSITION = 0x0,
CONST_SRC_CODE_LIGHT_DIFFUSE = 0x1,
CONST_SRC_CODE_LIGHT_SPOTDIR = 0x2,
CONST_SRC_CODE_LIGHT_SPOTFACTORS = 0x3,
CONST_SRC_CODE_LIGHT_ATTENUATION = 0x4,
CONST_SRC_CODE_LIGHT_FALLOFF_A = 0x5,
CONST_SRC_CODE_LIGHT_FALLOFF_B = 0x6,
CONST_SRC_CODE_LIGHT_SPOT_MATRIX0 = 0x7,
CONST_SRC_CODE_LIGHT_SPOT_MATRIX1 = 0x8,
CONST_SRC_CODE_LIGHT_SPOT_MATRIX2 = 0x9,
CONST_SRC_CODE_LIGHT_SPOT_MATRIX3 = 0xA,
CONST_SRC_CODE_LIGHT_SPOT_AABB = 0xB,
CONST_SRC_CODE_LIGHT_CONE_CONTROL1 = 0xC,
CONST_SRC_CODE_LIGHT_CONE_CONTROL2 = 0xD,
CONST_SRC_CODE_LIGHT_SPOT_COOKIE_SLIDE_CONTROL = 0xE,
CONST_SRC_CODE_SHADOW_PARMS = 0xF,
CONST_SRC_CODE_SHADOWMAP_POLYGON_OFFSET = 0x10,
CONST_SRC_CODE_RENDER_TARGET_SIZE = 0x11,
CONST_SRC_CODE_UPSCALED_TARGET_SIZE = 0x12,
CONST_SRC_CODE_DOF_EQUATION_VIEWMODEL_AND_FAR_BLUR = 0x13,
CONST_SRC_CODE_DOF_EQUATION_SCENE = 0x14,
CONST_SRC_CODE_DOF_LERP_SCALE = 0x15,
CONST_SRC_CODE_DOF_LERP_BIAS = 0x16,
CONST_SRC_CODE_DOF_ROW_DELTA = 0x17,
CONST_SRC_CODE_PARTICLE_CLOUD_COLOR = 0x18,
CONST_SRC_CODE_GAMETIME = 0x19,
CONST_SRC_CODE_MAYBE_DIRTY_PS_END = 0x1A,
CONST_SRC_CODE_ALWAYS_DIRTY_PS_BEGIN = 0x1A,
CONST_SRC_CODE_FILTER_TAP_0 = 0x1A,
CONST_SRC_CODE_FILTER_TAP_1 = 0x1B,
CONST_SRC_CODE_FILTER_TAP_2 = 0x1C,
CONST_SRC_CODE_FILTER_TAP_3 = 0x1D,
CONST_SRC_CODE_FILTER_TAP_4 = 0x1E,
CONST_SRC_CODE_FILTER_TAP_5 = 0x1F,
CONST_SRC_CODE_FILTER_TAP_6 = 0x20,
CONST_SRC_CODE_FILTER_TAP_7 = 0x21,
CONST_SRC_CODE_COLOR_MATRIX_R = 0x22,
CONST_SRC_CODE_COLOR_MATRIX_G = 0x23,
CONST_SRC_CODE_COLOR_MATRIX_B = 0x24,
CONST_SRC_CODE_ALWAYS_DIRTY_PS_END = 0x25,
CONST_SRC_CODE_NEVER_DIRTY_PS_BEGIN = 0x25,
CONST_SRC_CODE_SHADOWMAP_SWITCH_PARTITION = 0x25,
CONST_SRC_CODE_SUNSHADOWMAP_PIXEL_SIZE = 0x26,
CONST_SRC_CODE_SHADOWMAP_SCALE = 0x27,
CONST_SRC_CODE_ZNEAR = 0x28,
CONST_SRC_CODE_SUN_POSITION = 0x29,
CONST_SRC_CODE_SUN_DIFFUSE = 0x2A,
CONST_SRC_CODE_LIGHTING_LOOKUP_SCALE = 0x2B,
CONST_SRC_CODE_DEBUG_BUMPMAP = 0x2C,
CONST_SRC_CODE_DEBUG_PERFORMANCE = 0x2D,
CONST_SRC_CODE_MATERIAL_COLOR = 0x2E,
CONST_SRC_CODE_FOG = 0x2F,
CONST_SRC_CODE_FOG2 = 0x30,
CONST_SRC_CODE_FOG_COLOR = 0x31,
CONST_SRC_CODE_SUN_FOG = 0x32,
CONST_SRC_CODE_SUN_FOG_DIR = 0x33,
CONST_SRC_CODE_SUN_FOG_COLOR = 0x34,
CONST_SRC_CODE_GLOW_SETUP = 0x35,
CONST_SRC_CODE_GLOW_APPLY = 0x36,
CONST_SRC_CODE_COLOR_BIAS = 0x37,
CONST_SRC_CODE_COLOR_TINT_BASE = 0x38,
CONST_SRC_CODE_COLOR_TINT_DELTA = 0x39,
CONST_SRC_CODE_OUTDOOR_FEATHER_PARMS = 0x3A,
CONST_SRC_CODE_SKY_TRANSITION = 0x3B,
CONST_SRC_CODE_SPOT_SHADOWMAP_PIXEL_ADJUST = 0x3C,
CONST_SRC_CODE_DLIGHT_SPOT_SHADOWMAP_PIXEL_ADJUST = 0x3D,
CONST_SRC_CODE_CLIP_SPACE_LOOKUP_SCALE = 0x3E,
CONST_SRC_CODE_CLIP_SPACE_LOOKUP_OFFSET = 0x3F,
CONST_SRC_CODE_PARTICLE_CLOUD_MATRIX = 0x40,
CONST_SRC_CODE_PARTICLE_CLOUD_VEL_WORLD = 0x41,
CONST_SRC_CODE_DEPTH_FROM_CLIP = 0x42,
CONST_SRC_CODE_CODE_MESH_ARG_0 = 0x43,
CONST_SRC_CODE_CODE_MESH_ARG_1 = 0x44,
CONST_SRC_CODE_CODE_MESH_ARG_LAST = 0x44,
CONST_SRC_CODE_GRID_LIGHTING_COORDS_AND_VIS = 0x45,
CONST_SRC_CODE_GRID_LIGHTING_SH_0 = 0x46,
CONST_SRC_CODE_GRID_LIGHTING_SH_1 = 0x47,
CONST_SRC_CODE_GRID_LIGHTING_SH_2 = 0x48,
CONST_SRC_CODE_REFLECTION_LIGHTING_SH_0 = 0x49,
CONST_SRC_CODE_REFLECTION_LIGHTING_SH_1 = 0x4A,
CONST_SRC_CODE_REFLECTION_LIGHTING_SH_2 = 0x4B,
CONST_SRC_CODE_WIND_DIRECTION = 0x4C,
CONST_SRC_CODE_MOTIONBLUR_DIRECTION_AND_MAGNITUDE = 0x4D,
CONST_SRC_CODE_COMPOSITE_FX_DISTORTION = 0x4E,
CONST_SRC_CODE_GLOW_BLOOM_SCALE = 0x4F,
CONST_SRC_CODE_COMPOSITE_FX_OVERLAY_TEXCOORD = 0x50,
CONST_SRC_CODE_COLOR_BIAS1 = 0x51,
CONST_SRC_CODE_COLOR_TINT_BASE1 = 0x52,
CONST_SRC_CODE_COLOR_TINT_DELTA1 = 0x53,
CONST_SRC_CODE_POSTFX_FADE_EFFECT = 0x54,
CONST_SRC_CODE_VIEWPORT_DIMENSIONS = 0x55,
CONST_SRC_CODE_FRAMEBUFFER_READ = 0x56,
CONST_SRC_CODE_RESIZE_PARAMS1 = 0x57,
CONST_SRC_CODE_RESIZE_PARAMS2 = 0x58,
CONST_SRC_CODE_RESIZE_PARAMS3 = 0x59,
CONST_SRC_CODE_VARIANT_WIND_SPRING_0 = 0x5A,
CONST_SRC_CODE_VARIANT_WIND_SPRING_1 = 0x5B,
CONST_SRC_CODE_VARIANT_WIND_SPRING_2 = 0x5C,
CONST_SRC_CODE_VARIANT_WIND_SPRING_3 = 0x5D,
CONST_SRC_CODE_VARIANT_WIND_SPRING_4 = 0x5E,
CONST_SRC_CODE_VARIANT_WIND_SPRING_5 = 0x5F,
CONST_SRC_CODE_VARIANT_WIND_SPRING_6 = 0x60,
CONST_SRC_CODE_VARIANT_WIND_SPRING_7 = 0x61,
CONST_SRC_CODE_VARIANT_WIND_SPRING_8 = 0x62,
CONST_SRC_CODE_VARIANT_WIND_SPRING_9 = 0x63,
CONST_SRC_CODE_VARIANT_WIND_SPRING_10 = 0x64,
CONST_SRC_CODE_VARIANT_WIND_SPRING_11 = 0x65,
CONST_SRC_CODE_VARIANT_WIND_SPRING_12 = 0x66,
CONST_SRC_CODE_VARIANT_WIND_SPRING_13 = 0x67,
CONST_SRC_CODE_VARIANT_WIND_SPRING_14 = 0x68,
CONST_SRC_CODE_VARIANT_WIND_SPRING_15 = 0x69,
CONST_SRC_CODE_CHARACTER_CHARRED_AMOUNT = 0x6A,
CONST_SRC_CODE_POSTFX_CONTROL0 = 0x6B,
CONST_SRC_CODE_POSTFX_CONTROL1 = 0x6C,
CONST_SRC_CODE_POSTFX_CONTROL2 = 0x6D,
CONST_SRC_CODE_POSTFX_CONTROL3 = 0x6E,
CONST_SRC_CODE_POSTFX_CONTROL4 = 0x6F,
CONST_SRC_CODE_POSTFX_CONTROL5 = 0x70,
CONST_SRC_CODE_POSTFX_CONTROL6 = 0x71,
CONST_SRC_CODE_POSTFX_CONTROL7 = 0x72,
CONST_SRC_CODE_POSTFX_CONTROL8 = 0x73,
CONST_SRC_CODE_POSTFX_CONTROL9 = 0x74,
CONST_SRC_CODE_POSTFX_CONTROLA = 0x75,
CONST_SRC_CODE_POSTFX_CONTROLB = 0x76,
CONST_SRC_CODE_POSTFX_CONTROLC = 0x77,
CONST_SRC_CODE_POSTFX_CONTROLD = 0x78,
CONST_SRC_CODE_POSTFX_CONTROLE = 0x79,
CONST_SRC_CODE_POSTFX_CONTROLF = 0x7A,
CONST_SRC_CODE_HDRCONTROL_0 = 0x7B,
CONST_SRC_CODE_HDRCONTROL_1 = 0x7C,
CONST_SRC_CODE_GLIGHT_POSXS = 0x7D,
CONST_SRC_CODE_GLIGHT_POSYS = 0x7E,
CONST_SRC_CODE_GLIGHT_POSZS = 0x7F,
CONST_SRC_CODE_GLIGHT_FALLOFFS = 0x80,
CONST_SRC_CODE_GLIGHT_REDS = 0x81,
CONST_SRC_CODE_GLIGHT_GREENS = 0x82,
CONST_SRC_CODE_GLIGHT_BLUES = 0x83,
CONST_SRC_CODE_DLIGHT_POSITION = 0x84,
CONST_SRC_CODE_DLIGHT_DIFFUSE = 0x85,
CONST_SRC_CODE_DLIGHT_ATTENUATION = 0x86,
CONST_SRC_CODE_DLIGHT_FALLOFF = 0x87,
CONST_SRC_CODE_DLIGHT_SPOT_MATRIX_0 = 0x88,
CONST_SRC_CODE_DLIGHT_SPOT_MATRIX_1 = 0x89,
CONST_SRC_CODE_DLIGHT_SPOT_MATRIX_2 = 0x8A,
CONST_SRC_CODE_DLIGHT_SPOT_MATRIX_3 = 0x8B,
CONST_SRC_CODE_DLIGHT_SPOT_DIR = 0x8C,
CONST_SRC_CODE_DLIGHT_SPOT_FACTORS = 0x8D,
CONST_SRC_CODE_DLIGHT_SHADOW_LOOKUP_MATRIX_0 = 0x8E,
CONST_SRC_CODE_DLIGHT_SHADOW_LOOKUP_MATRIX_1 = 0x8F,
CONST_SRC_CODE_DLIGHT_SHADOW_LOOKUP_MATRIX_2 = 0x90,
CONST_SRC_CODE_DLIGHT_SHADOW_LOOKUP_MATRIX_3 = 0x91,
CONST_SRC_CODE_CLOUD_LAYER_CONTROL0 = 0x92,
CONST_SRC_CODE_CLOUD_LAYER_CONTROL1 = 0x93,
CONST_SRC_CODE_CLOUD_LAYER_CONTROL2 = 0x94,
CONST_SRC_CODE_CLOUD_LAYER_CONTROL3 = 0x95,
CONST_SRC_CODE_CLOUD_LAYER_CONTROL4 = 0x96,
CONST_SRC_CODE_HERO_LIGHTING_R = 0x97,
CONST_SRC_CODE_HERO_LIGHTING_G = 0x98,
CONST_SRC_CODE_HERO_LIGHTING_B = 0x99,
CONST_SRC_CODE_LIGHT_HERO_SCALE = 0x9A,
CONST_SRC_CODE_CINEMATIC_BLUR_BOX = 0x9B,
CONST_SRC_CODE_CINEMATIC_BLUR_BOX2 = 0x9C,
CONST_SRC_CODE_ADSZSCALE = 0x9D,
CONST_SRC_CODE_UI3D_UV_SETUP_0 = 0x9E,
CONST_SRC_CODE_UI3D_UV_SETUP_1 = 0x9F,
CONST_SRC_CODE_UI3D_UV_SETUP_2 = 0xA0,
CONST_SRC_CODE_UI3D_UV_SETUP_3 = 0xA1,
CONST_SRC_CODE_UI3D_UV_SETUP_4 = 0xA2,
CONST_SRC_CODE_UI3D_UV_SETUP_5 = 0xA3,
CONST_SRC_CODE_CHARACTER_DISSOLVE_COLOR = 0xA4,
CONST_SRC_CODE_CAMERA_LOOK = 0xA5,
CONST_SRC_CODE_CAMERA_UP = 0xA6,
CONST_SRC_CODE_CAMERA_SIDE = 0xA7,
CONST_SRC_CODE_RIMINTENSITY = 0xA8,
CONST_SRC_CODE_GENERIC_PARAM0 = 0xA9,
CONST_SRC_CODE_GENERIC_PARAM1 = 0xAA,
CONST_SRC_CODE_GENERIC_PARAM2 = 0xAB,
CONST_SRC_CODE_GENERIC_PARAM3 = 0xAC,
CONST_SRC_CODE_GENERIC_PARAM4 = 0xAD,
CONST_SRC_CODE_GENERIC_PARAM5 = 0xAE,
CONST_SRC_CODE_GENERIC_PARAM6 = 0xAF,
CONST_SRC_CODE_GENERIC_PARAM7 = 0xB0,
CONST_SRC_CODE_GENERIC_EYEOFFSET = 0xB1,
CONST_SRC_CODE_GENERIC_QUADINTENSITY = 0xB2,
CONST_SRC_CODE_WEAPON_PARAM0 = 0xB3,
CONST_SRC_CODE_WEAPON_PARAM1 = 0xB4,
CONST_SRC_CODE_WEAPON_PARAM2 = 0xB5,
CONST_SRC_CODE_WEAPON_PARAM3 = 0xB6,
CONST_SRC_CODE_WEAPON_PARAM4 = 0xB7,
CONST_SRC_CODE_WEAPON_PARAM5 = 0xB8,
CONST_SRC_CODE_WEAPON_PARAM6 = 0xB9,
CONST_SRC_CODE_WEAPON_PARAM7 = 0xBA,
CONST_SRC_CODE_WEAPON_PARAM8 = 0xBB,
CONST_SRC_CODE_WEAPON_PARAM9 = 0xBC,
CONST_SRC_CODE_QRCODE_0 = 0xBD,
CONST_SRC_CODE_QRCODE_1 = 0xBE,
CONST_SRC_CODE_QRCODE_2 = 0xBF,
CONST_SRC_CODE_QRCODE_3 = 0xC0,
CONST_SRC_CODE_QRCODE_4 = 0xC1,
CONST_SRC_CODE_QRCODE_5 = 0xC2,
CONST_SRC_CODE_QRCODE_6 = 0xC3,
CONST_SRC_CODE_QRCODE_7 = 0xC4,
CONST_SRC_CODE_QRCODE_8 = 0xC5,
CONST_SRC_CODE_QRCODE_9 = 0xC6,
CONST_SRC_CODE_QRCODE_10 = 0xC7,
CONST_SRC_CODE_QRCODE_11 = 0xC8,
CONST_SRC_CODE_EYEOFFSET = 0xC9,
CONST_SRC_CODE_SKY_COLOR_MULTIPLIER = 0xCA,
CONST_SRC_CODE_EXTRA_CAM_PARAM = 0xCB,
CONST_SRC_CODE_EMBLEM_LUT_SELECTOR = 0xCC,
CONST_SRC_CODE_DEBUG_COLOR_OVERRIDE = 0xCD,
CONST_SRC_CODE_DEBUG_ALPHA_OVERRIDE = 0xCE,
CONST_SRC_CODE_DEBUG_NORMAL_OVERRIDE = 0xCF,
CONST_SRC_CODE_DEBUG_SPECULAR_OVERRIDE = 0xD0,
CONST_SRC_CODE_DEBUG_GLOSS_OVERRIDE = 0xD1,
CONST_SRC_CODE_DEBUG_OCCLUSION_OVERRIDE = 0xD2,
CONST_SRC_CODE_NEVER_DIRTY_PS_END = 0xD3,
CONST_SRC_CODE_COUNT_FLOAT4 = 0xD3,
CONST_SRC_FIRST_CODE_MATRIX = 0xD3,
CONST_SRC_CODE_WORLD_MATRIX = 0xD3,
CONST_SRC_CODE_INVERSE_WORLD_MATRIX = 0xD4,
CONST_SRC_CODE_TRANSPOSE_WORLD_MATRIX = 0xD5,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_MATRIX = 0xD6,
CONST_SRC_CODE_VIEW_MATRIX = 0xD7,
CONST_SRC_CODE_INVERSE_VIEW_MATRIX = 0xD8,
CONST_SRC_CODE_TRANSPOSE_VIEW_MATRIX = 0xD9,
CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_MATRIX = 0xDA,
CONST_SRC_CODE_PROJECTION_MATRIX = 0xDB,
CONST_SRC_CODE_INVERSE_PROJECTION_MATRIX = 0xDC,
CONST_SRC_CODE_TRANSPOSE_PROJECTION_MATRIX = 0xDD,
CONST_SRC_CODE_INVERSE_TRANSPOSE_PROJECTION_MATRIX = 0xDE,
CONST_SRC_CODE_WORLD_VIEW_MATRIX = 0xDF,
CONST_SRC_CODE_INVERSE_WORLD_VIEW_MATRIX = 0xE0,
CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_MATRIX = 0xE1,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_MATRIX = 0xE2,
CONST_SRC_CODE_VIEW_PROJECTION_MATRIX = 0xE3,
CONST_SRC_CODE_INVERSE_VIEW_PROJECTION_MATRIX = 0xE4,
CONST_SRC_CODE_TRANSPOSE_VIEW_PROJECTION_MATRIX = 0xE5,
CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_PROJECTION_MATRIX = 0xE6,
CONST_SRC_CODE_WORLD_VIEW_PROJECTION_MATRIX = 0xE7,
CONST_SRC_CODE_INVERSE_WORLD_VIEW_PROJECTION_MATRIX = 0xE8,
CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX = 0xE9,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX = 0xEA,
CONST_SRC_CODE_SHADOW_LOOKUP_MATRIX = 0xEB,
CONST_SRC_CODE_INVERSE_SHADOW_LOOKUP_MATRIX = 0xEC,
CONST_SRC_CODE_TRANSPOSE_SHADOW_LOOKUP_MATRIX = 0xED,
CONST_SRC_CODE_INVERSE_TRANSPOSE_SHADOW_LOOKUP_MATRIX = 0xEE,
CONST_SRC_CODE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0xEF,
CONST_SRC_CODE_INVERSE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0xF0,
CONST_SRC_CODE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0xF1,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0xF2,
CONST_SRC_TOTAL_COUNT = 0xF3,
CONST_SRC_NONE = 0xF4,
CONST_SRC_CODE_LIGHT_SPECULAR = 0x2,
CONST_SRC_CODE_LIGHT_SPOTDIR = 0x3,
CONST_SRC_CODE_LIGHT_SPOTFACTORS = 0x4,
CONST_SRC_CODE_NEARPLANE_ORG = 0x5,
CONST_SRC_CODE_NEARPLANE_DX = 0x6,
CONST_SRC_CODE_NEARPLANE_DY = 0x7,
CONST_SRC_CODE_SHADOW_PARMS = 0x8,
CONST_SRC_CODE_SHADOWMAP_POLYGON_OFFSET = 0x9,
CONST_SRC_CODE_RENDER_TARGET_SIZE = 0xA,
CONST_SRC_CODE_LIGHT_FALLOFF_PLACEMENT = 0xB,
CONST_SRC_CODE_DOF_EQUATION_VIEWMODEL_AND_FAR_BLUR = 0xC,
CONST_SRC_CODE_DOF_EQUATION_SCENE = 0xD,
CONST_SRC_CODE_DOF_LERP_SCALE = 0xE,
CONST_SRC_CODE_DOF_LERP_BIAS = 0xF,
CONST_SRC_CODE_DOF_ROW_DELTA = 0x10,
CONST_SRC_CODE_PARTICLE_CLOUD_COLOR = 0x11,
CONST_SRC_CODE_GAMETIME = 0x12,
CONST_SRC_CODE_MAYBE_DIRTY_PS_END = 0x13,
CONST_SRC_CODE_ALWAYS_DIRTY_PS_BEGIN = 0x13,
CONST_SRC_CODE_PIXEL_COST_FRACS = 0x13,
CONST_SRC_CODE_PIXEL_COST_DECODE = 0x14,
CONST_SRC_CODE_FILTER_TAP_0 = 0x15,
CONST_SRC_CODE_FILTER_TAP_1 = 0x16,
CONST_SRC_CODE_FILTER_TAP_2 = 0x17,
CONST_SRC_CODE_FILTER_TAP_3 = 0x18,
CONST_SRC_CODE_FILTER_TAP_4 = 0x19,
CONST_SRC_CODE_FILTER_TAP_5 = 0x1A,
CONST_SRC_CODE_FILTER_TAP_6 = 0x1B,
CONST_SRC_CODE_FILTER_TAP_7 = 0x1C,
CONST_SRC_CODE_COLOR_MATRIX_R = 0x1D,
CONST_SRC_CODE_COLOR_MATRIX_G = 0x1E,
CONST_SRC_CODE_COLOR_MATRIX_B = 0x1F,
CONST_SRC_CODE_ALWAYS_DIRTY_PS_END = 0x20,
CONST_SRC_CODE_NEVER_DIRTY_PS_BEGIN = 0x20,
CONST_SRC_CODE_SHADOWMAP_SWITCH_PARTITION = 0x20,
CONST_SRC_CODE_SHADOWMAP_SCALE = 0x21,
CONST_SRC_CODE_ZNEAR = 0x22,
CONST_SRC_CODE_SUN_POSITION = 0x23,
CONST_SRC_CODE_SUN_DIFFUSE = 0x24,
CONST_SRC_CODE_SUN_SPECULAR = 0x25,
CONST_SRC_CODE_LIGHTING_LOOKUP_SCALE = 0x26,
CONST_SRC_CODE_DEBUG_BUMPMAP = 0x27,
CONST_SRC_CODE_MATERIAL_COLOR = 0x28,
CONST_SRC_CODE_FOG = 0x29,
CONST_SRC_CODE_FOG_COLOR = 0x2A,
CONST_SRC_CODE_GLOW_SETUP = 0x2B,
CONST_SRC_CODE_GLOW_APPLY = 0x2C,
CONST_SRC_CODE_COLOR_BIAS = 0x2D,
CONST_SRC_CODE_COLOR_TINT_BASE = 0x2E,
CONST_SRC_CODE_COLOR_TINT_DELTA = 0x2F,
CONST_SRC_CODE_OUTDOOR_FEATHER_PARMS = 0x30,
CONST_SRC_CODE_ENVMAP_PARMS = 0x31,
CONST_SRC_CODE_SPOT_SHADOWMAP_PIXEL_ADJUST = 0x32,
CONST_SRC_CODE_CLIP_SPACE_LOOKUP_SCALE = 0x33,
CONST_SRC_CODE_CLIP_SPACE_LOOKUP_OFFSET = 0x34,
CONST_SRC_CODE_PARTICLE_CLOUD_MATRIX = 0x35,
CONST_SRC_CODE_DEPTH_FROM_CLIP = 0x36,
CONST_SRC_CODE_CODE_MESH_ARG_0 = 0x37,
CONST_SRC_CODE_CODE_MESH_ARG_1 = 0x38,
CONST_SRC_CODE_CODE_MESH_ARG_LAST = 0x38,
CONST_SRC_CODE_BASE_LIGHTING_COORDS = 0x39,
CONST_SRC_CODE_NEVER_DIRTY_PS_END = 0x3A,
CONST_SRC_CODE_COUNT_FLOAT4 = 0x3A,
CONST_SRC_FIRST_CODE_MATRIX = 0x3A,
CONST_SRC_CODE_WORLD_MATRIX = 0x3A,
CONST_SRC_CODE_INVERSE_WORLD_MATRIX = 0x3B,
CONST_SRC_CODE_TRANSPOSE_WORLD_MATRIX = 0x3C,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_MATRIX = 0x3D,
CONST_SRC_CODE_VIEW_MATRIX = 0x3E,
CONST_SRC_CODE_INVERSE_VIEW_MATRIX = 0x3F,
CONST_SRC_CODE_TRANSPOSE_VIEW_MATRIX = 0x40,
CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_MATRIX = 0x41,
CONST_SRC_CODE_PROJECTION_MATRIX = 0x42,
CONST_SRC_CODE_INVERSE_PROJECTION_MATRIX = 0x43,
CONST_SRC_CODE_TRANSPOSE_PROJECTION_MATRIX = 0x44,
CONST_SRC_CODE_INVERSE_TRANSPOSE_PROJECTION_MATRIX = 0x45,
CONST_SRC_CODE_WORLD_VIEW_MATRIX = 0x46,
CONST_SRC_CODE_INVERSE_WORLD_VIEW_MATRIX = 0x47,
CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_MATRIX = 0x48,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_MATRIX = 0x49,
CONST_SRC_CODE_VIEW_PROJECTION_MATRIX = 0x4A,
CONST_SRC_CODE_INVERSE_VIEW_PROJECTION_MATRIX = 0x4B,
CONST_SRC_CODE_TRANSPOSE_VIEW_PROJECTION_MATRIX = 0x4C,
CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_PROJECTION_MATRIX = 0x4D,
CONST_SRC_CODE_WORLD_VIEW_PROJECTION_MATRIX = 0x4E,
CONST_SRC_CODE_INVERSE_WORLD_VIEW_PROJECTION_MATRIX = 0x4F,
CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX = 0x50,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX = 0x51,
CONST_SRC_CODE_SHADOW_LOOKUP_MATRIX = 0x52,
CONST_SRC_CODE_INVERSE_SHADOW_LOOKUP_MATRIX = 0x53,
CONST_SRC_CODE_TRANSPOSE_SHADOW_LOOKUP_MATRIX = 0x54,
CONST_SRC_CODE_INVERSE_TRANSPOSE_SHADOW_LOOKUP_MATRIX = 0x55,
CONST_SRC_CODE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0x56,
CONST_SRC_CODE_INVERSE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0x57,
CONST_SRC_CODE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0x58,
CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX = 0x59,
CONST_SRC_TOTAL_COUNT,
CONST_SRC_NONE
};
enum MaterialTextureSource
{
TEXTURE_SRC_CODE_BLACK = 0x0,
TEXTURE_SRC_CODE_WHITE = 0x1,
TEXTURE_SRC_CODE_IDENTITY_NORMAL_MAP = 0x2,
TEXTURE_SRC_CODE_MODEL_LIGHTING = 0x3,
TEXTURE_SRC_CODE_LIGHTMAP_PRIMARY = 0x4,
TEXTURE_SRC_CODE_LIGHTMAP_SECONDARY = 0x5,
TEXTURE_SRC_CODE_SHADOWCOOKIE = 0x6,
TEXTURE_SRC_CODE_SHADOWMAP_SUN = 0x7,
TEXTURE_SRC_CODE_SHADOWMAP_SPOT = 0x8,
TEXTURE_SRC_CODE_FEEDBACK = 0x9,
TEXTURE_SRC_CODE_RESOLVED_POST_SUN = 0xA,
TEXTURE_SRC_CODE_RESOLVED_SCENE = 0xB,
TEXTURE_SRC_CODE_POST_EFFECT_0 = 0xC,
TEXTURE_SRC_CODE_POST_EFFECT_1 = 0xD,
TEXTURE_SRC_CODE_SKY = 0xE,
TEXTURE_SRC_CODE_LIGHT_ATTENUATION = 0xF,
TEXTURE_SRC_CODE_DYNAMIC_SHADOWS = 0x10,
TEXTURE_SRC_CODE_OUTDOOR = 0x11,
TEXTURE_SRC_CODE_FLOATZ = 0x12,
TEXTURE_SRC_CODE_PROCESSED_FLOATZ = 0x13,
TEXTURE_SRC_CODE_RAW_FLOATZ = 0x14,
TEXTURE_SRC_CODE_CASE_TEXTURE = 0x15,
TEXTURE_SRC_CODE_CINEMATIC_Y = 0x16,
TEXTURE_SRC_CODE_CINEMATIC_CR = 0x17,
TEXTURE_SRC_CODE_CINEMATIC_CB = 0x18,
TEXTURE_SRC_CODE_CINEMATIC_A = 0x19,
TEXTURE_SRC_CODE_REFLECTION_PROBE = 0x1A,
TEXTURE_SRC_CODE_COUNT
};
enum CustomSamplers
{
CUSTOM_SAMPLER_REFLECTION_PROBE = 0x0,
CUSTOM_SAMPLER_LIGHTMAP_PRIMARY = 0x1,
CUSTOM_SAMPLER_LIGHTMAP_SECONDARY = 0x2,
CUSTOM_SAMPLER_COUNT
};
enum MaterialUpdateFrequency
{
MTL_UPDATE_PER_PRIM = 0x0,
MTL_UPDATE_PER_OBJECT = 0x1,
MTL_UPDATE_RARELY = 0x2,
MTL_UPDATE_CUSTOM = 0x3,
};
struct MaterialShaderArgument
@@ -1270,10 +1194,12 @@ namespace IW3
STREAM_SRC_COLOR = 0x1,
STREAM_SRC_TEXCOORD_0 = 0x2,
STREAM_SRC_NORMAL = 0x3,
STREAM_SRC_PRE_OPTIONAL_BEGIN = 0x4,
STREAM_SRC_TANGENT = 0x4,
STREAM_SRC_OPTIONAL_BEGIN = 0x5,
STREAM_SRC_PRE_OPTIONAL_BEGIN = 0x4,
STREAM_SRC_TEXCOORD_1 = 0x5,
STREAM_SRC_TEXCOORD_2 = 0x6,
@@ -1314,7 +1240,7 @@ namespace IW3
struct MaterialVertexDeclaration
{
char streamCount;
unsigned char streamCount;
bool hasOptionalSource;
bool isLoaded;
MaterialVertexStreamRouting routing;
@@ -1370,6 +1296,18 @@ namespace IW3
MaterialShaderArgument* args;
};
enum TechniqueFlags
{
MTL_TECHFLAG_NEEDS_RESOLVED_POST_SUN = 0x1,
MTL_TECHFLAG_NEEDS_RESOLVED_SCENE = 0x2,
MTL_TECHFLAG_ZPREPASS = 0x4,
MTL_TECHFLAG_DECL_HAS_OPTIONAL_SOURCE = 0x8,
MTL_TECHFLAG_USES_LIGHT_SPOT_FACTORS = 0x10,
MTL_TECHFLAG_USES_FLOATZ = 0x20,
};
struct MaterialTechnique
{
const char* name;

View File

@@ -0,0 +1,860 @@
#pragma once
#include "Game/IW3/IW3.h"
#include "Techset/CommonTechnique.h"
#include "Techset/CommonTechset.h"
#include <type_traits>
namespace IW3
{
inline const char* techniqueTypeNames[]{
"depth prepass",
"build floatz",
"build shadowmap depth",
"build shadowmap color",
"unlit",
"emissive",
"emissive shadow",
"lit",
"lit sun",
"lit sun shadow",
"lit spot",
"lit spot shadow",
"lit omni",
"lit omni shadow",
"lit instanced",
"lit instanced sun",
"lit instanced sun shadow",
"lit instanced spot",
"lit instanced spot shadow",
"lit instanced omni",
"lit instanced omni shadow",
"light spot",
"light omni",
"light spot shadow",
"fakelight normal",
"fakelight view",
"sunlight preview",
"case texture",
"solid wireframe",
"shaded wireframe",
"shadowcookie caster",
"shadowcookie receiver",
"debug bumpmap",
"debug bumpmap instanced",
};
static_assert(std::extent_v<decltype(techniqueTypeNames)> == TECHNIQUE_COUNT);
static inline techset::CommonTechniqueTypeNames commonTechniqueTypeNames(techniqueTypeNames, std::extent_v<decltype(techniqueTypeNames)>);
static inline techset::CommonStreamRoutingSourceInfo streamRoutingSources[]{
{
.name = "position",
.abbreviation = "p",
.optional = false,
},
{
.name = "color",
.abbreviation = "c",
.optional = false,
},
{
.name = "texcoord[0]",
.abbreviation = "t0",
.optional = false,
},
{
.name = "normal",
.abbreviation = "n",
.optional = false,
},
{
.name = "tangent",
.abbreviation = "t",
.optional = false,
},
{
.name = "texcoord[1]",
.abbreviation = "t1",
.optional = true,
},
{
.name = "texcoord[2]",
.abbreviation = "t2",
.optional = true,
},
{
.name = "normalTransform[0]",
.abbreviation = "n0",
.optional = true,
},
{
.name = "normalTransform[1]",
.abbreviation = "n1",
.optional = true,
},
};
static_assert(std::extent_v<decltype(streamRoutingSources)> == STREAM_SRC_COUNT);
static inline techset::CommonStreamRoutingDestinationInfo streamRoutingDestinations[]{
{
.name = "position",
.abbreviation = "p",
},
{
.name = "normal",
.abbreviation = "n",
},
{
.name = "color[0]",
.abbreviation = "c0",
},
{
.name = "color[1]",
.abbreviation = "c1",
},
{
.name = "texcoord[0]",
.abbreviation = "t0",
},
{
.name = "texcoord[1]",
.abbreviation = "t1",
},
{
.name = "texcoord[2]",
.abbreviation = "t2",
},
{
.name = "texcoord[3]",
.abbreviation = "t3",
},
{
.name = "texcoord[4]",
.abbreviation = "t4",
},
{
.name = "texcoord[5]",
.abbreviation = "t5",
},
{
.name = "texcoord[6]",
.abbreviation = "t6",
},
{
.name = "texcoord[7]",
.abbreviation = "t7",
},
};
static_assert(std::extent_v<decltype(streamRoutingDestinations)> == STREAM_DST_COUNT);
static inline techset::CommonStreamRoutingInfos commonRoutingInfos(streamRoutingSources,
std::extent_v<decltype(streamRoutingSources)>,
streamRoutingDestinations,
std::extent_v<decltype(streamRoutingDestinations)>);
static inline techset::CommonCodeConstSourceInfo commonCodeConstSources[]{
{
.value = CONST_SRC_CODE_LIGHT_POSITION,
.accessor = "lightPosition",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_LIGHT_DIFFUSE,
.accessor = "lightDiffuse",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_LIGHT_SPECULAR,
.accessor = "lightSpecular",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_LIGHT_SPOTDIR,
.accessor = "lightSpotDir",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_LIGHT_SPOTFACTORS,
.accessor = "lightSpotFactors",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
.techFlags = MTL_TECHFLAG_USES_LIGHT_SPOT_FACTORS,
},
{
.value = CONST_SRC_CODE_NEARPLANE_ORG,
.accessor = "nearPlaneOrg",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_NEARPLANE_DX,
.accessor = "nearPlaneDx",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_NEARPLANE_DY,
.accessor = "nearPlaneDy",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SHADOW_PARMS,
.accessor = "shadowParms",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SHADOWMAP_POLYGON_OFFSET,
.accessor = "shadowmapPolygonOffset",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_RENDER_TARGET_SIZE,
.accessor = "renderTargetSize",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_LIGHT_FALLOFF_PLACEMENT,
.accessor = "lightFalloffPlacement",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_DOF_EQUATION_VIEWMODEL_AND_FAR_BLUR,
.accessor = "dofEquationViewModelAndFarBlur",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_DOF_EQUATION_SCENE,
.accessor = "dofEquationScene",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_DOF_LERP_SCALE,
.accessor = "dofLerpScale",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_DOF_LERP_BIAS,
.accessor = "dofLerpBias",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_DOF_ROW_DELTA,
.accessor = "dofRowDelta",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_PARTICLE_CLOUD_COLOR,
.accessor = "particleCloudColor",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_GAMETIME,
.accessor = "gameTime",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_PIXEL_COST_FRACS,
.accessor = "pixelCostFracs",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_PIXEL_COST_DECODE,
.accessor = "pixelCostDecode",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_FILTER_TAP_0,
.accessor = "filterTap",
.arrayCount = 8,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_COLOR_MATRIX_R,
.accessor = "colorMatrixR",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_COLOR_MATRIX_G,
.accessor = "colorMatrixG",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_COLOR_MATRIX_B,
.accessor = "colorMatrixB",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SHADOWMAP_SWITCH_PARTITION,
.accessor = "shadowmapSwitchPartition",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SHADOWMAP_SCALE,
.accessor = "shadowmapScale",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_ZNEAR,
.accessor = "zNear",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SUN_POSITION,
.accessor = "sunPosition",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SUN_DIFFUSE,
.accessor = "sunDiffuse",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SUN_SPECULAR,
.accessor = "sunSpecular",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_LIGHTING_LOOKUP_SCALE,
.accessor = "lightingLookupScale",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_DEBUG_BUMPMAP,
.accessor = "debugBumpmap",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_MATERIAL_COLOR,
.accessor = "materialColor",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_FOG,
.accessor = "fogConsts",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_FOG_COLOR,
.accessor = "fogColor",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_GLOW_SETUP,
.accessor = "glowSetup",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_GLOW_APPLY,
.accessor = "glowApply",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_COLOR_BIAS,
.accessor = "colorBias",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_COLOR_TINT_BASE,
.accessor = "colorTintBase",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_COLOR_TINT_DELTA,
.accessor = "colorTintDelta",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_OUTDOOR_FEATHER_PARMS,
.accessor = "outdoorFeatherParms",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_ENVMAP_PARMS,
.accessor = "envMapParms",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_SPOT_SHADOWMAP_PIXEL_ADJUST,
.accessor = "spotShadowmapPixelAdjust",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = CONST_SRC_CODE_CLIP_SPACE_LOOKUP_SCALE,
.accessor = "clipSpaceLookupScale",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = CONST_SRC_CODE_CLIP_SPACE_LOOKUP_OFFSET,
.accessor = "clipSpaceLookupOffset",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = CONST_SRC_CODE_PARTICLE_CLOUD_MATRIX,
.accessor = "particleCloudMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = CONST_SRC_CODE_DEPTH_FROM_CLIP,
.accessor = "depthFromClip",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = CONST_SRC_CODE_CODE_MESH_ARG_0,
.accessor = "codeMeshArg",
.arrayCount = 2,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = CONST_SRC_CODE_BASE_LIGHTING_COORDS,
.accessor = "baseLightingCoords",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
},
{
.value = CONST_SRC_CODE_WORLD_MATRIX,
.accessor = "worldMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_WORLD_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_WORLD_MATRIX,
.accessor = "inverseWorldMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_WORLD_MATRIX,
.accessor = "transposeWorldMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_WORLD_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_MATRIX,
.accessor = "inverseTransposeWorldMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_WORLD_MATRIX,
},
{
.value = CONST_SRC_CODE_VIEW_MATRIX,
.accessor = "viewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_VIEW_MATRIX,
.accessor = "inverseViewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_VIEW_MATRIX,
.accessor = "transposeViewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_MATRIX,
.accessor = "inverseTransposeViewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_PROJECTION_MATRIX,
.accessor = "projectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_PROJECTION_MATRIX,
.accessor = "inverseProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_PROJECTION_MATRIX,
.accessor = "transposeProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_PROJECTION_MATRIX,
.accessor = "inverseTransposeProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_WORLD_VIEW_MATRIX,
.accessor = "worldViewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_WORLD_VIEW_MATRIX,
.accessor = "inverseWorldViewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_MATRIX,
.accessor = "transposeWorldViewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_WORLD_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_MATRIX,
.accessor = "inverseTransposeWorldViewMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_WORLD_VIEW_MATRIX,
},
{
.value = CONST_SRC_CODE_VIEW_PROJECTION_MATRIX,
.accessor = "viewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_VIEW_PROJECTION_MATRIX,
.accessor = "inverseViewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_VIEW_PROJECTION_MATRIX,
.accessor = "transposeViewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_VIEW_PROJECTION_MATRIX,
.accessor = "inverseTransposeViewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_WORLD_VIEW_PROJECTION_MATRIX,
.accessor = "worldViewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_WORLD_VIEW_PROJECTION_MATRIX,
.accessor = "inverseWorldViewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX,
.accessor = "transposeWorldViewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_WORLD_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_VIEW_PROJECTION_MATRIX,
.accessor = "inverseTransposeWorldViewProjectionMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_WORLD_VIEW_PROJECTION_MATRIX,
},
{
.value = CONST_SRC_CODE_SHADOW_LOOKUP_MATRIX,
.accessor = "shadowLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_SHADOW_LOOKUP_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_SHADOW_LOOKUP_MATRIX,
.accessor = "inverseShadowLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_SHADOW_LOOKUP_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_SHADOW_LOOKUP_MATRIX,
.accessor = "transposeShadowLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_SHADOW_LOOKUP_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_SHADOW_LOOKUP_MATRIX,
.accessor = "inverseTransposeShadowLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
.transposedMatrix = CONST_SRC_CODE_INVERSE_SHADOW_LOOKUP_MATRIX,
},
{
.value = CONST_SRC_CODE_WORLD_OUTDOOR_LOOKUP_MATRIX,
.accessor = "worldOutdoorLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_WORLD_OUTDOOR_LOOKUP_MATRIX,
.accessor = "inverseWorldOutdoorLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX,
},
{
.value = CONST_SRC_CODE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX,
.accessor = "transposeWorldOutdoorLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_WORLD_OUTDOOR_LOOKUP_MATRIX,
},
{
.value = CONST_SRC_CODE_INVERSE_TRANSPOSE_WORLD_OUTDOOR_LOOKUP_MATRIX,
.accessor = "inverseTransposeWorldOutdoorLookupMatrix",
.arrayCount = 0,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_PRIM,
.transposedMatrix = CONST_SRC_CODE_INVERSE_WORLD_OUTDOOR_LOOKUP_MATRIX,
},
};
static inline techset::CommonCodeSamplerSourceInfo commonCodeSamplerSources[]{
{
.value = TEXTURE_SRC_CODE_BLACK,
.accessor = "black",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_WHITE,
.accessor = "white",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_IDENTITY_NORMAL_MAP,
.accessor = "identityNormalMap",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_MODEL_LIGHTING,
.accessor = "modelLightingSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_LIGHTMAP_PRIMARY,
.accessor = "lightmapSamplerPrimary",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::CUSTOM,
.customSamplerIndex = CUSTOM_SAMPLER_LIGHTMAP_PRIMARY,
},
{
.value = TEXTURE_SRC_CODE_LIGHTMAP_SECONDARY,
.accessor = "lightmapSamplerSecondary",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::CUSTOM,
.customSamplerIndex = CUSTOM_SAMPLER_LIGHTMAP_SECONDARY,
},
{
.value = TEXTURE_SRC_CODE_SHADOWCOOKIE,
.accessor = "shadowCookieSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_SHADOWMAP_SUN,
.accessor = "shadowmapSamplerSun",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_SHADOWMAP_SPOT,
.accessor = "shadowmapSamplerSpot",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_FEEDBACK,
.accessor = "feedbackSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_RESOLVED_POST_SUN,
.accessor = "resolvedPostSun",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
.techFlags = MTL_TECHFLAG_NEEDS_RESOLVED_POST_SUN,
},
{
.value = TEXTURE_SRC_CODE_RESOLVED_SCENE,
.accessor = "resolvedScene",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
.techFlags = MTL_TECHFLAG_NEEDS_RESOLVED_SCENE,
},
{
.value = TEXTURE_SRC_CODE_POST_EFFECT_0,
.accessor = "postEffect0",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_POST_EFFECT_1,
.accessor = "postEffect1",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_SKY,
.accessor = "sky",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_LIGHT_ATTENUATION,
.accessor = "attenuationSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_DYNAMIC_SHADOWS,
.accessor = "dynamicShadowSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_OUTDOOR,
.accessor = "outdoor",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
},
{
.value = TEXTURE_SRC_CODE_FLOATZ,
.accessor = "floatZSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
.techFlags = MTL_TECHFLAG_USES_FLOATZ,
},
{
.value = TEXTURE_SRC_CODE_PROCESSED_FLOATZ,
.accessor = "processedFloatZSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
.techFlags = MTL_TECHFLAG_USES_FLOATZ,
},
{
.value = TEXTURE_SRC_CODE_RAW_FLOATZ,
.accessor = "rawFloatZSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY,
.techFlags = MTL_TECHFLAG_USES_FLOATZ,
},
{
.value = TEXTURE_SRC_CODE_CASE_TEXTURE,
.accessor = "caseTexture" /* ? */,
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_CINEMATIC_Y,
.accessor = "cinematicYSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_CINEMATIC_CR,
.accessor = "cinematicCrSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_CINEMATIC_CB,
.accessor = "cinematicCbSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_CINEMATIC_A,
.accessor = "cinematicASampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::PER_OBJECT,
},
{
.value = TEXTURE_SRC_CODE_REFLECTION_PROBE,
.accessor = "reflectionProbeSampler",
.updateFrequency = techset::CommonCodeSourceUpdateFrequency::CUSTOM,
.customSamplerIndex = CUSTOM_SAMPLER_REFLECTION_PROBE,
},
};
// See MaterialShaderArgumentType
static inline techset::CommonShaderArgumentType commonArgumentTypes[]{
{.m_shader_type = techset::CommonTechniqueShaderType::VERTEX, .m_value_type = techset::CommonShaderValueType::MATERIAL_CONST },
{.m_shader_type = techset::CommonTechniqueShaderType::VERTEX, .m_value_type = techset::CommonShaderValueType::LITERAL_CONST },
{.m_shader_type = techset::CommonTechniqueShaderType::PIXEL, .m_value_type = techset::CommonShaderValueType::MATERIAL_SAMPLER},
{.m_shader_type = techset::CommonTechniqueShaderType::VERTEX, .m_value_type = techset::CommonShaderValueType::CODE_CONST },
{.m_shader_type = techset::CommonTechniqueShaderType::PIXEL, .m_value_type = techset::CommonShaderValueType::CODE_SAMPLER },
{.m_shader_type = techset::CommonTechniqueShaderType::PIXEL, .m_value_type = techset::CommonShaderValueType::CODE_CONST },
{.m_shader_type = techset::CommonTechniqueShaderType::PIXEL, .m_value_type = techset::CommonShaderValueType::MATERIAL_CONST },
{.m_shader_type = techset::CommonTechniqueShaderType::PIXEL, .m_value_type = techset::CommonShaderValueType::LITERAL_CONST },
};
static_assert(std::extent_v<decltype(commonArgumentTypes)> == MTL_ARG_COUNT);
static inline techset::CommonCodeSourceInfos commonCodeSourceInfos(commonCodeConstSources,
std::extent_v<decltype(commonCodeConstSources)>,
commonCodeSamplerSources,
std::extent_v<decltype(commonCodeSamplerSources)>,
nullptr,
0,
commonArgumentTypes,
std::extent_v<decltype(commonArgumentTypes)>);
static inline MaterialTypeInfo g_materialTypeInfo[]{
{"", "" },
{"m/", "m_" },
{"mc/", "mc_"},
{"w/", "w_" },
{"wc/", "wc_"},
};
static_assert(std::extent_v<decltype(g_materialTypeInfo)> == MTL_TYPE_COUNT);
} // namespace IW3

View File

@@ -1,102 +0,0 @@
#pragma once
#include "Game/IW3/CommonIW3.h"
#include "Game/IW3/IW3.h"
#include <type_traits>
#include <unordered_map>
namespace IW3
{
inline const char* techniqueTypeNames[]{
"depth prepass",
"build floatz",
"build shadowmap depth",
"build shadowmap color",
"unlit",
"emissive",
"emissive shadow",
"lit",
"lit sun",
"lit sun shadow",
"lit spot",
"lit spot shadow",
"lit omni",
"lit omni shadow",
"lit instanced",
"lit instanced sun",
"lit instanced sun shadow",
"lit instanced spot",
"lit instanced spot shadow",
"lit instanced omni",
"lit instanced omni shadow",
"light spot",
"light omni",
"light spot shadow",
"fakelight normal",
"fakelight view",
"sunlight preview",
"case texture",
"solid wireframe",
"shaded wireframe",
"shadowcookie caster",
"shadowcookie receiver",
"debug bumpmap",
"debug bumpmap instanced",
};
static_assert(std::extent_v<decltype(techniqueTypeNames)> == TECHNIQUE_COUNT);
static const char* materialStreamDestinationNames[]{
"position",
"normal",
"color[0]",
"color[1]",
"texcoord[0]",
"texcoord[1]",
"texcoord[2]",
"texcoord[3]",
"texcoord[4]",
"texcoord[5]",
"texcoord[6]",
"texcoord[7]",
};
static_assert(std::extent_v<decltype(materialStreamDestinationNames)> == STREAM_DST_COUNT);
static const char* materialStreamSourceNames[]{
"position",
"color",
"texcoord[0]",
"normal",
"tangent",
"texcoord[1]",
"texcoord[2]",
"normalTransform[0]",
"normalTransform[1]",
};
static_assert(std::extent_v<decltype(materialStreamSourceNames)> == STREAM_SRC_COUNT);
static constexpr std::pair<uint32_t, const char*> KnownMaterialSource(const char* name)
{
return std::make_pair(Common::R_HashString(name, 0u), name);
}
inline std::unordered_map knownMaterialSourceNames{
KnownMaterialSource("colorMap"), KnownMaterialSource("colorMap0"), KnownMaterialSource("colorMap1"),
KnownMaterialSource("colorMap2"), KnownMaterialSource("colorMap3"), KnownMaterialSource("colorMap4"),
KnownMaterialSource("colorMap5"), KnownMaterialSource("colorMap6"), KnownMaterialSource("colorMap7"),
KnownMaterialSource("normalMap"), KnownMaterialSource("normalMap0"), KnownMaterialSource("normalMap1"),
KnownMaterialSource("normalMap2"), KnownMaterialSource("normalMap3"), KnownMaterialSource("normalMap4"),
KnownMaterialSource("normalMap5"), KnownMaterialSource("normalMap6"), KnownMaterialSource("normalMap7"),
KnownMaterialSource("specularMap"), KnownMaterialSource("specularMap0"), KnownMaterialSource("specularMap1"),
KnownMaterialSource("specularMap2"), KnownMaterialSource("specularMap3"), KnownMaterialSource("specularMap4"),
KnownMaterialSource("specularMap5"), KnownMaterialSource("specularMap6"), KnownMaterialSource("specularMap7"),
KnownMaterialSource("detailMap"), KnownMaterialSource("detailMap0"), KnownMaterialSource("detailMap1"),
KnownMaterialSource("detailMap2"), KnownMaterialSource("detailMap3"), KnownMaterialSource("detailMap4"),
KnownMaterialSource("detailMap5"), KnownMaterialSource("detailMap6"), KnownMaterialSource("detailMap7"),
KnownMaterialSource("attenuationMap"), KnownMaterialSource("attenuationMap0"), KnownMaterialSource("attenuationMap1"),
KnownMaterialSource("attenuationMap2"), KnownMaterialSource("attenuationMap3"), KnownMaterialSource("attenuationMap4"),
KnownMaterialSource("attenuationMap5"), KnownMaterialSource("attenuationMap6"), KnownMaterialSource("attenuationMap7"),
KnownMaterialSource("distortionScale"), KnownMaterialSource("eyeOffsetParms"), KnownMaterialSource("falloffBeginColor"),
KnownMaterialSource("falloffEndColor"),
};
} // namespace IW3

View File

@@ -1,6 +1,9 @@
#include "ObjCompilerIW3.h"
#include "Game/IW3/IW3.h"
#include "Game/IW3/Techset/TechniqueCompilerIW3.h"
#include "Game/IW3/Techset/TechsetCompilerIW3.h"
#include "Game/IW3/Techset/VertexDeclCompilerIW3.h"
#include "Image/ImageIwdPostProcessor.h"
#include <memory>
@@ -13,7 +16,10 @@ namespace
{
auto& memory = zone.Memory();
// No compilers yet
collection.AddAssetCreator(techset::CreateTechsetCompilerIW3(memory, searchPath));
collection.AddSubAssetCreator(techset::CreateTechniqueCompilerIW3(memory, zone, searchPath));
collection.AddSubAssetCreator(techset::CreateVertexDeclCompilerIW3(memory));
}
void ConfigurePostProcessors(AssetCreatorCollection& collection,
@@ -39,5 +45,6 @@ void ObjCompiler::ConfigureCreatorCollection(AssetCreatorCollection& collection,
IOutputPath& outDir,
IOutputPath& cacheDir) const
{
ConfigureCompilers(collection, zone, searchPath);
ConfigurePostProcessors(collection, zone, zoneDefinition, searchPath, zoneStates, outDir);
}

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/TechniqueCompiler" + GAME + ".cpp"
@@ -9,6 +9,7 @@
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_DX9
#define SHADERS_ARE_SUBASSETS
#elif GAME == "IW4"
#define FEATURE_IW4
#define IS_DX9
@@ -278,7 +279,10 @@ namespace
std::string lowerTechniqueName(commonTechnique.m_name);
utils::MakeStringLowerCase(lowerTechniqueName);
#if defined(FEATURE_IW4)
#if defined(FEATURE_IW3)
if (lowerTechniqueName == "zprepass")
technique.flags |= MTL_TECHFLAG_ZPREPASS;
#elif defined(FEATURE_IW4)
// Not a particularly cool way to do this but...
// the game actually does this :shrug:
if (lowerTechniqueName == "zprepass")
@@ -290,7 +294,7 @@ namespace
if (technique.flags & MTL_TECHFLAG_USES_FLOATZ && lowerTechniqueName.starts_with("distortion_"))
technique.flags = (technique.flags & ~MTL_TECHFLAG_USES_FLOATZ) | MTL_TECHFLAG_USES_DISTORTION_FLOATZ;
if (ShouldApplyFlag200(technique))
technique.flags |= TECHNIQUE_FLAG_200;
#elif defined(FEATURE_T6)
@@ -454,9 +458,7 @@ namespace
void FinalizeZone(AssetCreationContext& context) override
{
#if defined(FEATURE_IW4)
// TODO
#elif defined(FEATURE_T6)
#if defined(FEATURE_T6)
const auto materials = m_zone.m_pools.PoolAssets<AssetMaterial>();
for (auto* materialAsset : materials)
{

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/TechniqueCompiler" + GAME + ".h"

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/TechsetCompiler" + GAME + ".cpp"

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/TechsetCompiler" + GAME + ".h"

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/VertexDeclCompiler" + GAME + ".cpp"
@@ -8,6 +8,7 @@
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_SUB_ASSET
#elif GAME == "IW4"
#define FEATURE_IW4
#elif GAME == "IW5"

View File

@@ -1,9 +1,10 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/VertexDeclCompiler" + GAME + ".h"
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_SUB_ASSET
#elif GAME == "IW4"
#define FEATURE_IW4
#elif GAME == "IW5"
@@ -12,6 +13,7 @@
#define FEATURE_T5
#elif GAME == "T6"
#define FEATURE_T6
#define IS_SUB_ASSET
#endif
// This file was templated.
@@ -27,7 +29,7 @@
#set CREATE_COMPILER_METHOD "CreateVertexDeclCompiler" + GAME
#if defined(FEATURE_T6)
#if defined(IS_SUB_ASSET)
#define INTERFACE_NAME ISubAssetCreator
#else
#define INTERFACE_NAME IAssetCreator

View File

@@ -6,6 +6,8 @@
#include "Game/IW3/IW3.h"
#include "Game/IW3/Image/ImageLoaderEmbeddedIW3.h"
#include "Game/IW3/Image/ImageLoaderExternalIW3.h"
#include "Game/IW3/Techset/PixelShaderLoaderIW3.h"
#include "Game/IW3/Techset/VertexShaderLoaderIW3.h"
#include "Game/IW3/XModel/LoaderXModelIW3.h"
#include "Localize/AssetLoaderLocalizeIW3.h"
#include "Material/LoaderMaterialIW3.h"
@@ -118,6 +120,9 @@ namespace
// collection.AddAssetCreator(std::make_unique<AssetLoaderImpactFx>(memory));
collection.AddAssetCreator(raw_file::CreateLoaderIW3(memory, searchPath));
collection.AddAssetCreator(string_table::CreateLoaderIW3(memory, searchPath));
collection.AddSubAssetCreator(techset::CreateVertexShaderLoaderIW3(memory, searchPath));
collection.AddSubAssetCreator(techset::CreatePixelShaderLoaderIW3(memory, searchPath));
}
} // namespace

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/PixelShaderLoader" + GAME + ".cpp"
@@ -8,6 +8,7 @@
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_DX9
#define IS_SUB_ASSET
#elif GAME == "IW4"
#define FEATURE_IW4
#define IS_DX9

View File

@@ -1,9 +1,10 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/PixelShaderLoader" + GAME + ".h"
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_SUB_ASSET
#elif GAME == "IW4"
#define FEATURE_IW4
#elif GAME == "IW5"
@@ -12,6 +13,7 @@
#define FEATURE_T5
#elif GAME == "T6"
#define FEATURE_T6
#define IS_SUB_ASSET
#endif
// This file was templated.
@@ -28,7 +30,7 @@
#set CREATE_LOADER_METHOD "CreatePixelShaderLoader" + GAME
#if defined(FEATURE_T6)
#if defined(IS_SUB_ASSET)
#define INTERFACE_NAME ISubAssetCreator
#else
#define INTERFACE_NAME IAssetCreator

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/VertexShaderLoader" + GAME + ".cpp"
@@ -8,6 +8,7 @@
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_DX9
#define IS_SUB_ASSET
#elif GAME == "IW4"
#define FEATURE_IW4
#define IS_DX9

View File

@@ -1,9 +1,10 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/VertexShaderLoader" + GAME + ".h"
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_SUB_ASSET
#elif GAME == "IW4"
#define FEATURE_IW4
#elif GAME == "IW5"
@@ -12,6 +13,7 @@
#define FEATURE_T5
#elif GAME == "T6"
#define FEATURE_T6
#define IS_SUB_ASSET
#endif
// This file was templated.
@@ -28,7 +30,7 @@
#set CREATE_LOADER_METHOD "CreateVertexShaderLoader" + GAME
#if defined(FEATURE_T6)
#if defined(IS_SUB_ASSET)
#define INTERFACE_NAME ISubAssetCreator
#else
#define INTERFACE_NAME IAssetCreator

View File

@@ -1,6 +1,7 @@
#include "ObjWriterIW3.h"
#include "Game/IW3/Material/MaterialJsonDumperIW3.h"
#include "Game/IW3/Techset/TechsetDumperIW3.h"
#include "Game/IW3/XModel/XModelDumperIW3.h"
#include "Image/ImageDumperIW3.h"
#include "Localize/LocalizeDumperIW3.h"
@@ -17,7 +18,13 @@ void ObjWriter::RegisterAssetDumpers(AssetDumpingContext& context)
// REGISTER_DUMPER(AssetDumperXAnimParts)
RegisterAssetDumper(std::make_unique<xmodel::DumperIW3>());
RegisterAssetDumper(std::make_unique<material::JsonDumperIW3>());
// REGISTER_DUMPER(AssetDumperMaterialTechniqueSet)
RegisterAssetDumper(std::make_unique<techset::DumperIW3>(
#ifdef TECHSET_DEBUG
true
#else
false
#endif
));
RegisterAssetDumper(std::make_unique<image::DumperIW3>());
// REGISTER_DUMPER(AssetDumpersnd_alias_list_t)
// REGISTER_DUMPER(AssetDumperSndCurve)

View File

@@ -4,10 +4,7 @@
#set DUMPER_HEADER "\"PixelShaderDumper" + GAME + ".h\""
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_DX9
#elif GAME == "IW4"
#if GAME == "IW4"
#define FEATURE_IW4
#define IS_DX9
#elif GAME == "IW5"

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/TechsetDumper" + GAME + ".cpp"
@@ -9,6 +9,7 @@
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_DX9
#define DUMP_SHADERS "1"
#elif GAME == "IW4"
#define FEATURE_IW4
#define IS_DX9
@@ -58,7 +59,7 @@ namespace
if (!shaderFile)
return;
#if defined(FEATURE_T6)
#if defined(IS_DX11)
shaderFile->write(pixelShader.prog.loadDef.program, pixelShader.prog.loadDef.programSize);
#else
shaderFile->write(reinterpret_cast<const char*>(pixelShader.prog.loadDef.program),
@@ -73,7 +74,7 @@ namespace
if (!shaderFile)
return;
#if defined(FEATURE_T6)
#if defined(IS_DX11)
shaderFile->write(vertexShader.prog.loadDef.program, vertexShader.prog.loadDef.programSize);
#else
shaderFile->write(reinterpret_cast<const char*>(vertexShader.prog.loadDef.program),

View File

@@ -1,4 +1,4 @@
#options GAME(IW4, T6)
#options GAME(IW3, IW4, T6)
#filename "Game/" + GAME + "/Techset/TechsetDumper" + GAME + ".h"

View File

@@ -4,10 +4,7 @@
#set DUMPER_HEADER "\"VertexShaderDumper" + GAME + ".h\""
#if GAME == "IW3"
#define FEATURE_IW3
#define IS_DX9
#elif GAME == "IW4"
#if GAME == "IW4"
#define FEATURE_IW4
#define IS_DX9
#elif GAME == "IW5"