Skip to content

Commit 6656e84

Browse files
authored
[ZH] Add FXShader chunks from BFME (#599)
1 parent 611d31b commit 6656e84

File tree

3 files changed

+124
-3
lines changed

3 files changed

+124
-3
lines changed

GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/w3d_file.h

+30-1
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,12 @@ June 5, 2001
309309
(gth) Adding line rendering options to particle systems today. This involves a
310310
new line-properties chunk and a RenderMode variable added to the InfoV2 struct.
311311
312+
TheSuperHackers @forwardport:
313+
April 5, 2025
314+
315+
Added W3D_CHUNK_FX_SHADERS and subchunks, which were added in BFME2. These
316+
chunks are used to define usage of a specific shader and pass params.
317+
312318
********************************************************************************/
313319

314320

@@ -374,13 +380,18 @@ enum {
374380
W3D_CHUNK_DCG =0x0000003B, // per-vertex diffuse color values (array of W3dRGBAStruct's)
375381
W3D_CHUNK_DIG =0x0000003C, // per-vertex diffuse illumination values (array of W3dRGBStruct's)
376382
W3D_CHUNK_SCG =0x0000003E, // per-vertex specular color values (array of W3dRGBStruct's)
383+
W3D_CHUNK_FXSHADER_IDS =0x0000003F, // single or per-tri array of uint32 fx shader indices (check chunk size)
377384

378385
W3D_CHUNK_TEXTURE_STAGE =0x00000048, // wrapper around a texture stage.
379386
W3D_CHUNK_TEXTURE_IDS =0x00000049, // single or per-tri array of uint32 texture indices (check chunk size)
380387
W3D_CHUNK_STAGE_TEXCOORDS =0x0000004A, // per-vertex texture coordinates (array of W3dTexCoordStruct's)
381388
W3D_CHUNK_PER_FACE_TEXCOORD_IDS =0x0000004B, // indices to W3D_CHUNK_STAGE_TEXCOORDS, (array of Vector3i)
382389

383-
390+
W3D_CHUNK_FX_SHADERS =0x00000050, // define an array of shaders to be used in the mesh
391+
W3D_CHUNK_FX_SHADER =0x00000051, // a single shader entry
392+
W3D_CHUNK_FX_SHADER_INFO =0x00000052, // information about the shader to be used (W3dFXShaderInfoStruct)
393+
W3D_CHUNK_FX_SHADER_CONSTANT =0x00000053, // contains a constant name and value for the shader
394+
384395
W3D_CHUNK_DEFORM =0x00000058, // mesh deform or 'damage' information.
385396
W3D_CHUNK_DEFORM_SET =0x00000059, // set of deform information
386397
W3D_CHUNK_DEFORM_KEYFRAME =0x0000005A, // a keyframe of deform information in the set
@@ -922,6 +933,24 @@ struct W3dPS2ShaderStruct
922933
uint8 pad[3];
923934
};
924935

936+
struct W3dFXShaderInfoStruct
937+
{
938+
char ShaderName[W3D_NAME_LEN * 2];
939+
uint8 Technique;
940+
uint8 Pad[3];
941+
};
942+
943+
typedef enum
944+
{
945+
CONSTANT_TYPE_TEXTURE = 1,
946+
CONSTANT_TYPE_FLOAT1 = 2,
947+
CONSTANT_TYPE_FLOAT2 = 3,
948+
CONSTANT_TYPE_FLOAT3 = 4,
949+
CONSTANT_TYPE_FLOAT4 = 5,
950+
CONSTANT_TYPE_INT = 6,
951+
CONSTANT_TYPE_BOOL = 7
952+
} W3D_FX_SHADER_CONSTANT_TYPES;
953+
925954
inline void W3d_Shader_Reset(W3dShaderStruct * s) {
926955
s->DepthCompare = W3DSHADER_DEPTHCOMPARE_PASS_LEQUAL;
927956
s->DepthMask = W3DSHADER_DEPTHMASK_WRITE_ENABLE;

GeneralsMD/Code/Tools/wdump/chunk_d.cpp

+88-1
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,70 @@ void ChunkTableClass::List_W3D_CHUNK_PS2_SHADERS(ChunkItem * Item,CListCtrl *Lis
10521052
}
10531053
}
10541054

1055+
void ChunkTableClass::List_W3D_CHUNK_FX_SHADERS(ChunkItem * Item,CListCtrl *List)
1056+
{
1057+
List_Subitems(Item,List);
1058+
}
1059+
1060+
void ChunkTableClass::List_W3D_CHUNK_FX_SHADER(ChunkItem* Item, CListCtrl* List)
1061+
{
1062+
List_Subitems(Item, List);
1063+
}
1064+
1065+
void ChunkTableClass::List_W3D_CHUNK_FX_SHADER_INFO(ChunkItem* Item, CListCtrl* List)
1066+
{
1067+
uint8 version = *(uint8*)Item->Data;
1068+
W3dFXShaderInfoStruct* shaderinfo = (W3dFXShaderInfoStruct*)((uint8*)Item->Data + 1);
1069+
int counter = 0;
1070+
1071+
AddItem(List, counter, "Version", version);
1072+
AddItem(List, counter, "ShaderName", shaderinfo->ShaderName);
1073+
AddItem(List, counter, "Technique", shaderinfo->Technique);
1074+
}
1075+
1076+
void ChunkTableClass::List_W3D_CHUNK_FX_SHADER_CONSTANT(ChunkItem* Item, CListCtrl* List)
1077+
{
1078+
int counter = 0;
1079+
uint8 *chunkdata = (uint8 *)Item->Data;
1080+
uint32 type = *(uint32 *)chunkdata;
1081+
chunkdata += 4;
1082+
// Includes the null terminator
1083+
uint32 constantstrlen = *(uint32 *)chunkdata;
1084+
chunkdata += 4;
1085+
char* constantname = (char*)chunkdata;
1086+
chunkdata += constantstrlen;
1087+
AddItem(List, counter, "Type", type);
1088+
AddItem(List, counter, "ConstantName", constantname);
1089+
if (type == CONSTANT_TYPE_TEXTURE)
1090+
{
1091+
// This is hopefully also null-terminated
1092+
uint32 texturestrlen = *(uint32 *)chunkdata;
1093+
chunkdata += 4;
1094+
char* texture = (char*)chunkdata;
1095+
AddItem(List, counter, "Texture", texture);
1096+
}
1097+
else if (type >= CONSTANT_TYPE_FLOAT1 && type <= CONSTANT_TYPE_FLOAT4)
1098+
{
1099+
int count = type - 1;
1100+
float* floats = (float*)chunkdata;
1101+
AddItem(List, counter, "Floats", floats, count);
1102+
}
1103+
else if (type == CONSTANT_TYPE_INT)
1104+
{
1105+
uint32 u = *(uint32*)chunkdata;
1106+
AddItem(List, counter, "Int", u);
1107+
}
1108+
else if (type == CONSTANT_TYPE_BOOL)
1109+
{
1110+
uint8 u = *(uint8*)chunkdata;
1111+
AddItem(List, counter, "Bool", u);
1112+
}
1113+
else
1114+
{
1115+
AddItem(List, counter, "Unknown", "Unknown");
1116+
}
1117+
}
1118+
10551119
void ChunkTableClass::List_W3D_CHUNK_TEXTURES(ChunkItem * Item,CListCtrl *List)
10561120
{
10571121
List_Subitems(Item,List);
@@ -1183,6 +1247,24 @@ void ChunkTableClass::List_W3D_CHUNK_SCG(ChunkItem * Item,CListCtrl *List)
11831247
data++;
11841248
}
11851249
}
1250+
1251+
void ChunkTableClass::List_W3D_CHUNK_FXSHADER_IDS(ChunkItem* Item, CListCtrl* List)
1252+
{
1253+
int Counter = 0;
1254+
int counter = 0;
1255+
uint32* data = (uint32*)Item->Data;
1256+
void* max = (char*)Item->Data + Item->Length;
1257+
char buf[256];
1258+
1259+
while (data < max) {
1260+
1261+
sprintf(buf, "Vertex[%d] FXShader Index", counter);
1262+
AddItem(List, Counter, buf, *data);
1263+
1264+
counter++;
1265+
data++;
1266+
}
1267+
}
11861268

11871269
void ChunkTableClass::List_W3D_CHUNK_TEXTURE_STAGE(ChunkItem * Item,CListCtrl *List)
11881270
{
@@ -2057,6 +2139,10 @@ ChunkTableClass::ChunkTableClass() {
20572139
NewType( W3D_CHUNK_VERTEX_SHADE_INDICES, "W3D_CHUNK_VERTEX_SHADE_INDICES",List_W3D_CHUNK_VERTEX_SHADE_INDICES);
20582140
NewType( W3D_CHUNK_MATERIAL_INFO,"W3D_CHUNK_MATERIAL_INFO",List_W3D_CHUNK_MATERIAL_INFO);
20592141
NewType( W3D_CHUNK_SHADERS,"W3D_CHUNK_SHADERS",List_W3D_CHUNK_SHADERS);
2142+
NewType( W3D_CHUNK_FX_SHADERS,"W3D_CHUNK_FX_SHADERS",List_W3D_CHUNK_FX_SHADERS, true);
2143+
NewType( W3D_CHUNK_FX_SHADER,"W3D_CHUNK_FX_SHADER",List_W3D_CHUNK_FX_SHADER, true);
2144+
NewType( W3D_CHUNK_FX_SHADER_INFO, "W3D_CHUNK_FX_SHADER_INFO", List_W3D_CHUNK_FX_SHADER_INFO);
2145+
NewType( W3D_CHUNK_FX_SHADER_CONSTANT, "W3D_CHUNK_FX_SHADER_CONSTANT", List_W3D_CHUNK_FX_SHADER_CONSTANT);
20602146
NewType( W3D_CHUNK_PS2_SHADERS,"W3D_CHUNK_PS2_SHADERS",List_W3D_CHUNK_PS2_SHADERS);
20612147

20622148
NewType( W3D_CHUNK_VERTEX_MATERIALS, "W3D_CHUNK_VERTEX_MATERIALS",List_W3D_CHUNK_VERTEX_MATERIALS,true);
@@ -2077,7 +2163,8 @@ ChunkTableClass::ChunkTableClass() {
20772163
NewType( W3D_CHUNK_DCG, "W3D_CHUNK_DCG", List_W3D_CHUNK_DCG);
20782164
NewType( W3D_CHUNK_DIG, "W3D_CHUNK_DIG", List_W3D_CHUNK_DIG);
20792165
NewType( W3D_CHUNK_SCG, "W3D_CHUNK_SCG", List_W3D_CHUNK_SCG);
2080-
2166+
NewType( W3D_CHUNK_FXSHADER_IDS, "W3D_CHUNK_FXSHADER_IDS", List_W3D_CHUNK_FXSHADER_IDS);
2167+
20812168
NewType( W3D_CHUNK_TEXTURE_STAGE, "W3D_CHUNK_TEXTURE_STAGE", List_W3D_CHUNK_TEXTURE_STAGE,true);
20822169
NewType( W3D_CHUNK_TEXTURE_IDS, "W3D_CHUNK_TEXTURE_IDS", List_W3D_CHUNK_TEXTURE_IDS);
20832170
NewType( W3D_CHUNK_STAGE_TEXCOORDS, "W3D_CHUNK_STAGE_TEXCOORDS", List_W3D_CHUNK_STAGE_TEXCOORDS);

GeneralsMD/Code/Tools/wdump/chunk_d.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,11 @@ class ChunkTableClass {
113113

114114
static void List_W3D_CHUNK_SHADERS(ChunkItem * Item,CListCtrl *List);
115115
static void List_W3D_CHUNK_PS2_SHADERS(ChunkItem * Item,CListCtrl *List);
116-
116+
static void List_W3D_CHUNK_FX_SHADERS(ChunkItem * Item,CListCtrl *List);
117+
static void List_W3D_CHUNK_FX_SHADER(ChunkItem * Item,CListCtrl *List);
118+
static void List_W3D_CHUNK_FX_SHADER_INFO(ChunkItem* Item, CListCtrl* List);
119+
static void List_W3D_CHUNK_FX_SHADER_CONSTANT(ChunkItem* Item, CListCtrl* List);
120+
117121
static void List_W3D_CHUNK_VERTEX_MATERIALS(ChunkItem * Item,CListCtrl *List);
118122
static void List_W3D_CHUNK_VERTEX_MATERIAL(ChunkItem * Item,CListCtrl *List);
119123
static void List_W3D_CHUNK_VERTEX_MATERIAL_NAME(ChunkItem *Item,CListCtrl *List);
@@ -132,6 +136,7 @@ class ChunkTableClass {
132136
static void List_W3D_CHUNK_DCG(ChunkItem * Item,CListCtrl *List);
133137
static void List_W3D_CHUNK_DIG(ChunkItem * Item,CListCtrl *List);
134138
static void List_W3D_CHUNK_SCG(ChunkItem * Item,CListCtrl *List);
139+
static void List_W3D_CHUNK_FXSHADER_IDS(ChunkItem* Item, CListCtrl* List);
135140

136141
static void List_W3D_CHUNK_TEXTURE_STAGE(ChunkItem * Item,CListCtrl *List);
137142
static void List_W3D_CHUNK_TEXTURE_IDS(ChunkItem * Item,CListCtrl *List);

0 commit comments

Comments
 (0)