Initial commit

This commit is contained in:
RektInator
2020-12-16 20:44:46 +01:00
commit f212d7783c
291 changed files with 72238 additions and 0 deletions

215
src/IW3/Assets/ClipMap.cpp Normal file
View File

@ -0,0 +1,215 @@
// ======================= ZoneTool =======================
// zonetool, a fastfile linker for various
// Call of Duty titles.
//
// Project: https://github.com/ZoneTool/zonetool
// Author: momo5502 (https://github.com/momo5502)
// License: GNU GPL v3.0
// ========================================================
#include "stdafx.hpp"
#include "../IW4/Assets/ClipMap.hpp"
#include "ClipMap.hpp"
namespace ZoneTool
{
namespace IW3
{
void IClipMap::dump(clipMap_t* asset, ZoneMemory* mem)
{
if (!asset) return;
auto* iw4_clipmap = mem->Alloc<IW4::clipMap_t>();
memset(iw4_clipmap, 0, sizeof IW4::clipMap_t);
// convert clipmap to IW4 format
iw4_clipmap->name = asset->name;
iw4_clipmap->isInUse = asset->isInUse;
iw4_clipmap->numCPlanes = asset->planeCount;
iw4_clipmap->cPlanes = (IW4::cplane_s*)asset->planes;
iw4_clipmap->numStaticModels = (int)asset->numStaticModels;
iw4_clipmap->staticModelList = mem->Alloc<IW4::cStaticModel_s>(iw4_clipmap->numStaticModels);
for (unsigned int i = 0; i < asset->numStaticModels; ++i)
{
std::memcpy(&iw4_clipmap->staticModelList[i], &asset->staticModelList[i].xmodel,
sizeof(IW4::cStaticModel_s));
iw4_clipmap->staticModelList[i].absBounds.compute();
}
iw4_clipmap->numMaterials = (int)asset->numMaterials;
iw4_clipmap->materials = mem->Alloc<IW4::dmaterial_t>(iw4_clipmap->numMaterials);
for (auto i = 0u; i < iw4_clipmap->numMaterials; i++)
{
iw4_clipmap->materials[i].material = mem->StrDup(asset->materials[i].material);
iw4_clipmap->materials[i].contentFlags = asset->materials[i].contentFlags;
iw4_clipmap->materials[i].surfaceFlags = asset->materials[i].surfaceFlags;
}
iw4_clipmap->numCBrushSides = (int)asset->numBrushSides;
iw4_clipmap->cBrushSides = mem->Alloc<IW4::cbrushside_t>(iw4_clipmap->numCBrushSides);
std::unordered_map<cbrushside_t*, IW4::cbrushside_t*> mapped_brush_sides;
for (unsigned int i = 0; i < asset->numBrushSides; ++i)
{
mapped_brush_sides[&asset->brushsides[i]] = &iw4_clipmap->cBrushSides[i];
iw4_clipmap->cBrushSides[i].plane = (IW4::cplane_s*)asset->brushsides[i].plane;
iw4_clipmap->cBrushSides[i].materialNum = asset->brushsides[i].materialNum;
iw4_clipmap->cBrushSides[i].firstAdjacentSideOffset = (char)asset->brushsides[i].firstAdjacentSideOffset;
iw4_clipmap->cBrushSides[i].edgeCount = asset->brushsides[i].edgeCount;
}
iw4_clipmap->numCBrushEdges = (int)asset->numBrushEdges;
iw4_clipmap->cBrushEdges = (IW4::cbrushedge_t*)asset->brushEdges;
iw4_clipmap->numCNodes = (int)asset->numNodes;
iw4_clipmap->cNodes = (IW4::cNode_t*)asset->nodes;
iw4_clipmap->numCLeaf = (int)asset->numLeafs;
iw4_clipmap->cLeaf = mem->Alloc<IW4::cLeaf_t>(iw4_clipmap->numCLeaf);
for (unsigned int i = 0; i < asset->numLeafs; ++i)
{
std::memcpy(&iw4_clipmap->cLeaf[i], &asset->leafs[i], sizeof(IW4::cLeaf_t));
iw4_clipmap->cLeaf[i].bounds.compute();
}
iw4_clipmap->numCLeafBrushNodes = (int)asset->leafbrushNodesCount;
iw4_clipmap->cLeafBrushNodes = (IW4::cLeafBrushNode_s*)asset->leafbrushNodes;
iw4_clipmap->numLeafBrushes = (int)asset->numLeafBrushes;
iw4_clipmap->leafBrushes = (short*)asset->leafbrushes;
iw4_clipmap->numLeafSurfaces = (int)asset->numLeafSurfaces;
iw4_clipmap->leafSurfaces = (int*)asset->leafsurfaces;
iw4_clipmap->numVerts = (int)asset->vertCount;
iw4_clipmap->verts = (IW4::VecInternal<3>*)asset->verts;
iw4_clipmap->numTriIndices = asset->triCount;
iw4_clipmap->triIndices = (short*)asset->triIndices;
iw4_clipmap->triEdgeIsWalkable = asset->triEdgeIsWalkable;
iw4_clipmap->numCollisionBorders = asset->borderCount;
iw4_clipmap->collisionBorders = (IW4::CollisionBorder*)asset->borders;
iw4_clipmap->numCollisionPartitions = asset->partitionCount;
iw4_clipmap->collisionPartitions = (IW4::CollisionPartition*)asset->partitions;
iw4_clipmap->numCollisionAABBTrees = asset->aabbTreeCount;
iw4_clipmap->collisionAABBTrees = mem->Alloc<IW4::CollisionAabbTree>(iw4_clipmap->numCollisionAABBTrees);
for (int i = 0; i < asset->aabbTreeCount; ++i)
{
std::memcpy(&iw4_clipmap->collisionAABBTrees[i].origin, &asset->aabbTrees[i].origin, 12);
std::memcpy(&iw4_clipmap->collisionAABBTrees[i].halfSize, &asset->aabbTrees[i].halfSize, 12);
iw4_clipmap->collisionAABBTrees[i].materialIndex = asset->aabbTrees[i].materialIndex;
iw4_clipmap->collisionAABBTrees[i].childCount = asset->aabbTrees[i].childCount;
iw4_clipmap->collisionAABBTrees[i].u.firstChildIndex = asset->aabbTrees[i].u.firstChildIndex;
}
// cmodels!
iw4_clipmap->numCModels = (int)asset->numSubModels;
iw4_clipmap->cModels = mem->Alloc<IW4::cmodel_t>(iw4_clipmap->numCModels);
for (unsigned int i = 0; i < asset->numSubModels; ++i)
{
std::memcpy(&iw4_clipmap->cModels[i], &asset->cmodels[i], sizeof(IW4::cmodel_t));
iw4_clipmap->cModels[i].bounds.compute();
iw4_clipmap->cModels[i].leaf.bounds.compute();
}
iw4_clipmap->numBrushes = (short)asset->numBrushes;
iw4_clipmap->brushes = mem->Alloc<IW4::cbrush_t>(iw4_clipmap->numBrushes);
iw4_clipmap->brushBounds = mem->Alloc<IW4::Bounds>(iw4_clipmap->numBrushes);
iw4_clipmap->brushContents = mem->Alloc<int>(iw4_clipmap->numBrushes);
for (unsigned int i = 0; i < asset->numBrushes; ++i)
{
std::memcpy(&iw4_clipmap->brushes[i].axialMaterialNum, &asset->brushes[i].axialMaterialNum,
sizeof(iw4_clipmap->brushes[i].axialMaterialNum));
std::memcpy(&iw4_clipmap->brushes[i].firstAdjacentSideOffsets,
&asset->brushes[i].firstAdjacentSideOffsets,
sizeof(iw4_clipmap->brushes[i].firstAdjacentSideOffsets));
std::memcpy(&iw4_clipmap->brushes[i].edgeCount, &asset->brushes[i].edgeCount,
sizeof(iw4_clipmap->brushes[i].edgeCount));
iw4_clipmap->brushes[i].numsides = asset->brushes[i].numsides;
iw4_clipmap->brushes[i].sides = mapped_brush_sides.find(asset->brushes[i].sides)->second;
iw4_clipmap->brushes[i].edge = asset->brushes[i].baseAdjacentSide;
iw4_clipmap->brushes[i].numsides = asset->brushes[i].numsides;
iw4_clipmap->brushBounds[i].compute(asset->brushes[i].mins, asset->brushes[i].maxs);
iw4_clipmap->brushContents[i] = asset->brushes[i].contents;
}
iw4_clipmap->smodelNodeCount = 1;
iw4_clipmap->smodelNodes = mem->Alloc<IW4::SModelAabbNode>();
if (asset->numStaticModels == 0)
{
iw4_clipmap->smodelNodes[0].bounds.halfSize[0] = -131072.000f;
iw4_clipmap->smodelNodes[0].bounds.halfSize[1] = -131072.000f;
iw4_clipmap->smodelNodes[0].bounds.halfSize[2] = -131072.000f;
}
else
{
float maxs[3];
float mins[3];
maxs[0] = asset->staticModelList[0].absmax[0];
maxs[1] = asset->staticModelList[1].absmax[1];
maxs[2] = asset->staticModelList[2].absmax[2];
mins[0] = asset->staticModelList[0].absmin[0];
mins[1] = asset->staticModelList[1].absmin[1];
mins[2] = asset->staticModelList[2].absmin[2];
for (unsigned int i = 1; i < asset->numStaticModels; i++)
{
maxs[0] = max(maxs[0], asset->staticModelList[i].absmax[0]);
maxs[1] = max(maxs[1], asset->staticModelList[i].absmax[1]);
maxs[2] = max(maxs[2], asset->staticModelList[i].absmax[2]);
mins[0] = min(mins[0], asset->staticModelList[i].absmin[0]);
mins[1] = min(mins[1], asset->staticModelList[i].absmin[1]);
mins[2] = min(mins[2], asset->staticModelList[i].absmin[2]);
}
iw4_clipmap->smodelNodes[0].bounds.compute(mins, maxs);
iw4_clipmap->smodelNodes[0].childCount = static_cast<short>(asset->numStaticModels);
iw4_clipmap->smodelNodes[0].firstChild = 0;
}
iw4_clipmap->mapEnts = mem->Alloc<IW4::MapEnts>(); // asset->mapEnts;
memcpy(iw4_clipmap->mapEnts, asset->mapEnts, sizeof MapEnts);
iw4_clipmap->mapEnts->stageCount = 1;
iw4_clipmap->mapEnts->stageNames = mem->Alloc<IW4::Stage>();
iw4_clipmap->mapEnts->stageNames[0].stageName = mem->StrDup("stage 0");
iw4_clipmap->mapEnts->stageNames[0].triggerIndex = 0x400;
iw4_clipmap->mapEnts->stageNames[0].sunPrimaryLightIndex = 0x1;
iw4_clipmap->dynEntCount[0] = asset->dynEntCount[0];
iw4_clipmap->dynEntCount[1] = asset->dynEntCount[1];
iw4_clipmap->dynEntDefList[0] = (IW4::DynEntityDef*)asset->dynEntDefList[0];
iw4_clipmap->dynEntDefList[1] = (IW4::DynEntityDef*)asset->dynEntDefList[1];
iw4_clipmap->dynEntPoseList[0] = (IW4::DynEntityPose*)asset->dynEntPoseList[0];
iw4_clipmap->dynEntPoseList[1] = (IW4::DynEntityPose*)asset->dynEntPoseList[1];
iw4_clipmap->dynEntClientList[0] = (IW4::DynEntityClient*)asset->dynEntClientList[0];
iw4_clipmap->dynEntClientList[1] = (IW4::DynEntityClient*)asset->dynEntClientList[1];
iw4_clipmap->dynEntCollList[0] = (IW4::DynEntityColl*)asset->dynEntCollList[0];
iw4_clipmap->dynEntCollList[1] = (IW4::DynEntityColl*)asset->dynEntCollList[1];
iw4_clipmap->checksum = asset->checksum;
//iw4_clipmap->stageCount = 1;
//iw4_clipmap-> = mem->Alloc<IW4::Stage>();
IW4::IClipMap::dump(iw4_clipmap);
}
}
}