Skip to content

Commit 34e3904

Browse files
committed
fix XSurface writing for IW4
1 parent b45c5aa commit 34e3904

File tree

5 files changed

+43
-228
lines changed

5 files changed

+43
-228
lines changed

src/IW4/Assets/XSurface.cpp

Lines changed: 33 additions & 211 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ namespace ZoneTool
121121
return xmodelsurfs;
122122
}
123123

124-
template <typename T> void write_xsurfaces(IZone* zone, ZoneBuffer* buf, T* data, T* dest, std::uint16_t count, bool is_console)
124+
void IXSurface::write_xsurfaces(IZone* zone, ZoneBuffer* buf, XSurface* data, std::uint16_t count)
125125
{
126126
assert(sizeof XSurface, 64);
127127
assert(sizeof Face, 6);
@@ -133,57 +133,25 @@ namespace ZoneTool
133133
assert(sizeof GfxPackedVertex, 32);
134134
assert(sizeof XSurfaceVertexInfo, 12);
135135

136+
auto* dest = buf->write(data, count);
137+
136138
for (auto surf = 0u; surf < count; surf++)
137139
{
138140
if (data[surf].vertexInfo.vertsBlend)
139141
{
140-
unsigned __int16* destverts = nullptr;
141-
const auto vertcount = data[surf].vertexInfo.vertCount[0] +
142-
(data[surf].vertexInfo.vertCount[1] * 3) +
143-
(data[surf].vertexInfo.vertCount[2] * 5) +
144-
(data[surf].vertexInfo.vertCount[3] * 7);
145-
146-
dest[surf].vertexInfo.vertsBlend = buf->write_s(1, data[surf].vertexInfo.vertsBlend, count, sizeof (unsigned __int16), &destverts);
147-
148-
if (is_console && dest[surf].vertexInfo.vertsBlend == reinterpret_cast<unsigned __int16*>(-1))
149-
{
150-
for (auto a = 0u; a < vertcount; a++)
151-
{
152-
endian_convert(&destverts[a]);
153-
}
154-
}
142+
dest[surf].vertexInfo.vertsBlend = buf->write_s(1, data[surf].vertexInfo.vertsBlend,
143+
data[surf].vertexInfo.vertCount[0] +
144+
(data[surf].vertexInfo.vertCount[1] * 3) + (data[
145+
surf].vertexInfo.vertCount[2] * 5) + (data[
146+
surf].vertexInfo.vertCount[3] * 7));
155147
}
156148

157-
if (!is_console)
158-
{
159-
buf->push_stream(6);
160-
}
161-
149+
buf->push_stream(6);
162150
if (data[surf].verticies)
163151
{
164-
GfxPackedVertex* destverticies = nullptr;
165-
dest[surf].verticies = buf->write_s(15, data[surf].verticies, data[surf].vertCount, sizeof GfxPackedVertex, &destverticies);
166-
167-
if (is_console && dest[surf].verticies == reinterpret_cast<GfxPackedVertex*>(-1))
168-
{
169-
for (auto a = 0; a < data[surf].vertCount; a++)
170-
{
171-
endian_convert(&destverticies[a].xyz[0]);
172-
endian_convert(&destverticies[a].xyz[1]);
173-
endian_convert(&destverticies[a].xyz[2]);
174-
endian_convert(&destverticies[a].binormalSign);
175-
// packed data probably consists of single bytes?
176-
//endian_convert(&destverticies[a].texCoord.packed);
177-
//endian_convert(&destverticies[a].normal.packed);
178-
//endian_convert(&destverticies[a].tangent.packed);
179-
}
180-
}
181-
}
182-
183-
if (!is_console)
184-
{
185-
buf->pop_stream();
152+
dest[surf].verticies = buf->write_s(15, data[surf].verticies, data[surf].vertCount);
186153
}
154+
buf->pop_stream();
187155

188156
if (data[surf].rigidVertLists)
189157
{
@@ -193,7 +161,7 @@ namespace ZoneTool
193161

194162
if (dest[surf].rigidVertLists == reinterpret_cast<XRigidVertList*>(-1))
195163
{
196-
for (int k = 0; k < data[surf].vertListCount; k++)
164+
for (auto k = 0; k < data[surf].vertListCount; k++)
197165
{
198166
if (ct[k].collisionTree)
199167
{
@@ -205,195 +173,49 @@ namespace ZoneTool
205173
{
206174
if (entry->nodes)
207175
{
208-
XSurfaceCollisionNode* destnode = nullptr;
209-
entry->nodes = buf->write_s(15, entry->nodes, entry->nodeCount, sizeof (XSurfaceCollisionNode), &destnode);
210-
211-
if (entry->nodes == reinterpret_cast<XSurfaceCollisionNode*>(-1) && is_console)
212-
{
213-
for (auto a = 0u; a < entry->leafCount; a++)
214-
{
215-
for (auto b = 0; b < 3; b++)
216-
{
217-
endian_convert(&destnode[a].aabb.mins[b]);
218-
endian_convert(&destnode[a].aabb.maxs[b]);
219-
}
220-
221-
endian_convert(&destnode[a].childBeginIndex);
222-
endian_convert(&destnode[a].childCount);
223-
}
224-
}
176+
entry->nodes = buf->write_s(15, entry->nodes, entry->nodeCount);
225177
}
226178

227179
if (entry->leafs)
228180
{
229-
XSurfaceCollisionLeaf* destleaf = nullptr;
230-
entry->leafs = buf->write_s(1, entry->leafs, entry->leafCount, sizeof (XSurfaceCollisionLeaf), &destleaf);
231-
232-
if (entry->leafs == reinterpret_cast<XSurfaceCollisionLeaf *>(-1) && is_console)
233-
{
234-
for (auto a = 0u; a < entry->leafCount; a++)
235-
{
236-
endian_convert(&destleaf[a].triangleBeginIndex);
237-
}
238-
}
239-
}
240-
241-
if (is_console)
242-
{
243-
for (auto a = 0; a < 3; a++)
244-
{
245-
endian_convert(&entry->trans[a]);
246-
endian_convert(&entry->scale[a]);
247-
}
248-
endian_convert(&entry->nodeCount);
249-
endian_convert(&entry->nodes);
250-
endian_convert(&entry->leafCount);
251-
endian_convert(&entry->leafs);
181+
entry->leafs = buf->write_s(1, entry->leafs, entry->leafCount);
252182
}
253183
}
254184
}
255-
256-
if (is_console)
257-
{
258-
endian_convert(&ct[k].boneOffset);
259-
endian_convert(&ct[k].vertCount);
260-
endian_convert(&ct[k].triOffset);
261-
endian_convert(&ct[k].triCount);
262-
endian_convert(&ct[k].collisionTree);
263-
}
264185
}
265186
}
266187
}
267188

268-
if (!is_console)
269-
{
270-
buf->push_stream(7);
271-
}
272-
189+
buf->push_stream(7);
273190
if (data[surf].triIndices)
274191
{
275-
Face* dest_tris = nullptr;
276-
dest[surf].triIndices = buf->write_s(15, data[surf].triIndices, data[surf].triCount, sizeof(unsigned __int16), &dest_tris);
277-
278-
if (is_console && dest[surf].triIndices == reinterpret_cast<Face*>(-1))
279-
{
280-
for (auto a = 0u; a < data[surf].triCount; a++)
281-
{
282-
endian_convert(&dest_tris[a].v1);
283-
endian_convert(&dest_tris[a].v2);
284-
endian_convert(&dest_tris[a].v3);
285-
}
286-
}
287-
}
288-
289-
if (!is_console)
290-
{
291-
buf->pop_stream();
292-
}
293-
294-
if (is_console)
295-
{
296-
endian_convert(&dest[surf].vertCount);
297-
endian_convert(&dest[surf].triCount);
298-
endian_convert(&dest[surf].triIndices);
299-
endian_convert(&dest[surf].vertexInfo.vertCount[0]);
300-
endian_convert(&dest[surf].vertexInfo.vertCount[1]);
301-
endian_convert(&dest[surf].vertexInfo.vertCount[2]);
302-
endian_convert(&dest[surf].vertexInfo.vertCount[3]);
303-
endian_convert(&dest[surf].verticies);
304-
endian_convert(&dest[surf].vertListCount);
305-
endian_convert(&dest[surf].rigidVertLists);
306-
for (auto a = 0; a < 5; a++)
307-
{
308-
endian_convert(&dest[surf].partBits[a]);
309-
}
192+
dest[surf].triIndices = buf->write_s(15, data[surf].triIndices, data[surf].triCount);
310193
}
194+
buf->pop_stream();
311195
}
312196
}
313197

314198
void IXSurface::write(IZone* zone, ZoneBuffer* buf)
315199
{
316-
if (zone->get_target() == zone_target::pc)
317-
{
318-
auto data = this->asset_;
319-
auto dest = buf->write<XModelSurfs>(data);
320-
321-
assert(sizeof XModelSurfs, 36);
200+
auto* data = this->asset_;
201+
auto* dest = buf->write<XModelSurfs>(data);
322202

323-
buf->push_stream(3);
324-
START_LOG_STREAM;
203+
assert(sizeof XModelSurfs, 36);
325204

326-
dest->name = buf->write_str(this->name());
205+
buf->push_stream(3);
206+
START_LOG_STREAM;
327207

328-
if (data->surfs)
329-
{
330-
buf->align(3);
331-
auto destsurfaces = buf->write(data->surfs, data->numsurfs);
332-
write_xsurfaces<XSurface>(zone, buf, data->surfs, destsurfaces, data->numsurfs, false);
333-
ZoneBuffer::clear_pointer(&dest->surfs);
334-
}
208+
dest->name = buf->write_str(this->name());
335209

336-
END_LOG_STREAM;
337-
buf->pop_stream();
338-
}
339-
else
210+
if (data->surfs)
340211
{
341-
std::vector<alpha::XSurface> surfs;
342-
surfs.resize(this->asset_->numsurfs);
343-
344-
for (auto i = 0u; i < this->asset_->numsurfs; i++)
345-
{
346-
//
347-
surfs[i].tileMode = this->asset_->surfs[i].tileMode;
348-
surfs[i].deformed = this->asset_->surfs[i].deformed;
349-
surfs[i].vertCount = this->asset_->surfs[i].vertCount;
350-
surfs[i].triCount = this->asset_->surfs[i].triCount;
351-
surfs[i].triIndices = this->asset_->surfs[i].triIndices;
352-
surfs[i].verticies = this->asset_->surfs[i].verticies;
353-
surfs[i].vertListCount = this->asset_->surfs[i].vertListCount;
354-
surfs[i].rigidVertLists = this->asset_->surfs[i].rigidVertLists;
355-
memcpy(&surfs[i].vertexInfo, &this->asset_->surfs[i].vertexInfo, sizeof XSurfaceVertexInfo);
356-
memcpy(surfs[i].partBits, this->asset_->surfs[i].partBits, sizeof(int) * 5);
357-
358-
// memset console shit to 0
359-
memset(&surfs[i].vb0, 0, sizeof alpha::D3DVertexBuffer);
360-
memset(&surfs[i].indexBuffer, 0, sizeof alpha::D3DIndexBuffer);
361-
}
362-
363-
alpha::XModelSurfs alpha_surfs = {};
364-
memcpy(&alpha_surfs, this->asset_, sizeof alpha::XModelSurfs);
365-
alpha_surfs.surfs = surfs.data();
366-
367-
auto data = &alpha_surfs;
368-
auto dest = buf->write(data);
369-
370-
assert(sizeof alpha::XModelSurfs, 32);
371-
372-
buf->push_stream(3);
373-
START_LOG_STREAM;
374-
375-
dest->name = buf->write_str(this->name());
376-
377-
if (data->surfs)
378-
{
379-
buf->align(3);
380-
auto destsurfaces = buf->write(data->surfs, data->numsurfs);
381-
write_xsurfaces<alpha::XSurface>(zone, buf, data->surfs, destsurfaces, data->numsurfs, true);
382-
ZoneBuffer::clear_pointer(&dest->surfs);
383-
}
384-
385-
END_LOG_STREAM;
386-
buf->pop_stream();
387-
388-
endian_convert(&dest->name);
389-
endian_convert(&dest->surfs);
390-
endian_convert(&dest->numsurfs);
391-
for (auto a = 0; a < 5; a++)
392-
{
393-
endian_convert(&dest->partBits[a]);
394-
}
212+
buf->align(3);
213+
write_xsurfaces(zone, buf, data->surfs, data->numsurfs);
214+
ZoneBuffer::clear_pointer(&dest->surfs);
395215
}
396-
216+
217+
END_LOG_STREAM;
218+
buf->pop_stream();
397219
}
398220

399221
void IXSurface::dump(XModelSurfs* asset)
@@ -409,14 +231,14 @@ namespace ZoneTool
409231
dump.dump_array(asset, 1);
410232
dump.dump_string(asset->name);
411233

412-
for (int i = 0; i < asset->numsurfs; i++)
234+
for (auto i = 0u; i < asset->numsurfs; i++)
413235
{
414236
dump.dump_int(asset->surfs[i].tileMode);
415237
dump.dump_int(asset->surfs[i].deformed);
416238
dump.dump_int(asset->surfs[i].baseTriIndex);
417239
dump.dump_int(asset->surfs[i].baseVertIndex);
418240

419-
for (int j = 0; j < 6; j++)
241+
for (auto j = 0; j < 6; j++)
420242
{
421243
dump.dump_int(asset->surfs[i].partBits[j]);
422244
}
@@ -438,7 +260,7 @@ namespace ZoneTool
438260

439261
dump.dump_int(asset->surfs[i].vertListCount);
440262
dump.dump_array(asset->surfs[i].rigidVertLists, asset->surfs[i].vertListCount);
441-
for (int vert = 0; vert < asset->surfs[i].vertListCount; vert++)
263+
for (auto vert = 0; vert < asset->surfs[i].vertListCount; vert++)
442264
{
443265
if (asset->surfs[i].rigidVertLists[vert].collisionTree)
444266
{

src/IW4/Assets/XSurface.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace ZoneTool
3030
void* pointer() override { return asset_; }
3131
std::string name() override;
3232
std::int32_t type() override;
33+
void write_xsurfaces(IZone* zone, ZoneBuffer* buf, XSurface* data, std::uint16_t count);
3334
void write(IZone* zone, ZoneBuffer* buffer) override;
3435

3536
static void dump(XModelSurfs* asset);

src/IW5/Assets/MenuDef.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,6 @@ namespace ZoneTool
1212
{
1313
namespace IW5
1414
{
15-
IMenuDef::IMenuDef()
16-
{
17-
}
18-
19-
IMenuDef::~IMenuDef()
20-
{
21-
}
22-
2315
void IMenuDef::init(const std::string& name, ZoneMemory* mem)
2416
{
2517
this->name_ = name;
@@ -44,7 +36,7 @@ namespace ZoneTool
4436
return menu;
4537
}
4638

47-
void IMenuDef::write_MenuData(IZone* zone, ZoneBuffer* buf, menuData_t* data)
39+
void IMenuDef::write_menu_data(IZone* zone, ZoneBuffer* buf, menuData_t* data)
4840
{
4941
auto* dest = buf->write(data);
5042
memset(dest, 0, sizeof menuData_t);
@@ -66,7 +58,7 @@ namespace ZoneTool
6658
if (data->data)
6759
{
6860
buf->align(3);
69-
write_MenuData(zone, buf, data->data);
61+
write_menu_data(zone, buf, data->data);
7062
ZoneBuffer::clear_pointer(&dest->data);
7163
}
7264

0 commit comments

Comments
 (0)