-
Notifications
You must be signed in to change notification settings - Fork 1
/
PMO.bt
153 lines (133 loc) · 3.51 KB
/
PMO.bt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//------------------------------------------------
//--- 010 Editor v9.0 Binary Template
//
// File:
// Authors:
// Version:
// Purpose:
// Category:
// File Mask:
// ID Bytes:
// History:
//------------------------------------------------
int mod(int a, int b)
{
local int r = a % b;
return r < 0 ? r + b : r;
}
struct alignment(int l){
local int t;
t = FTell();
byte padding[mod(-t,l)];
};
struct Header{
string pmo;
byte ver[4];
uint fileSize;//0
float clippingDistance;//1
float scale[3];//2 3 4
ushort meshCount;// 5
ushort materialCount;// 6 ??
uint meshHeaderOffset<format = hex>;//7
uint vertexGroupHeaderOffset<format = hex>;//8
uint materialRemapOffset<format = hex>;//9
uint skeletonOffset<format = hex>;//10
uint materialDataOffset<format = hex>;//11
uint meshDataOffset<format = hex>;//12
alignment padding(16);
};
struct MeshHeader{
float uvScale[2];//0 1
ubyte unkn1[8];//2 3
ushort materialCount;//4
ushort cumulativeMaterialCount;//5
ushort subMeshCount;//6
ushort cumulativeSubMeshCount;//7
//float unkn3[2];//9 10
};
string readMeshHeader(MeshHeader &mh){
local string s;
SPrintf(s,"%d | %d",mh.materialCount,mh.cumulativeMaterialCount);
return s;
}
struct VertexGroupHeader{
ubyte materialOffset;
byte weightCount;
short cumulativeWeightCount;
uint meshOffset;
uint vertexOffset;
uint indexOffset;
};
string readSubmeshHeader(VertexGroupHeader &vgh){
local string s;
SPrintf(s,"%d | %d | %d | %d | %d | %d",vgh.materialOffset,vgh.weightCount,vgh.cumulativeWeightCount,vgh.meshOffset,vgh.vertexOffset,vgh.indexOffset);
return s;
}
struct SubmeshGroups(int count){
VertexGroupHeader submeshHeaders[count]<read=readSubmeshHeader>;
};
struct SubmeshGrouping(int count){
local int i;
for (i=0;i<count;i++){
SubmeshGroups submeshGroup(meshHeaders[i].subMeshCount);
};
alignment padding(16);
};
struct MaterialIndices(int count){
byte material[count];
alignment padding(16);
};
struct Weight{
byte index;
byte weightVal;
};
string readWeight(Weight &wt){
local string s;
SPrintf(s,"%d | %03d",wt.index,wt.weightVal);
return s;
}
struct Skeleton(int count){
Weight data[count]<read = readWeight>;
alignment padding(16);
};
struct MaterialContent{
byte rgba[4];
byte rgba2[4];
int textureIndex;
byte unkn[4];
};
struct MaterialData(int count){
MaterialContent materialParams[count];
alignment padding(16);
};
struct MeshData{
int guard;
};
Header header;
MeshHeader meshHeaders[header.meshCount]<read=readMeshHeader>;
alignment padding(16);
SubmeshGrouping submeshHeaders(header.meshCount);
MaterialIndices materialRemap(meshHeaders[header.meshCount-1].materialCount+meshHeaders[header.meshCount-1].cumulativeMaterialCount);
Skeleton skeleton(submeshHeaders.submeshGroup[header.meshCount-1].submeshHeaders[meshHeaders[header.meshCount-1].subMeshCount-1].cumulativeWeightCount +
submeshHeaders.submeshGroup[header.meshCount-1].submeshHeaders[meshHeaders[header.meshCount-1].subMeshCount-1].weightCount);
MaterialData materialData(header.materialCount);
FSeek(header.meshDataOffset);
MeshData meshes;
//003 -
//002 - 9 -> 20
//001 - 5 -> 20
//00 - 15840,
//01 - 118.8517837524414,
//02 - 95.60398864746094,
//03 - 118.8517837524414,
//04 - 88.38003540039062,
//05 - 1,
//06 - 8,
//07 - 64,
//08 - 96,
//09 - 544,
//10 - 560,
//11 - 624,
//12 - 752,
//13 - 0,
//14 - 0