mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2026-06-06 08:42:35 +00:00
fixed error handling for xmodels and materials, and updated xmodel linker to check if an xmodel has valid collision.
This commit is contained in:
@@ -156,6 +156,10 @@ namespace BSP
|
|||||||
|
|
||||||
bool ClipMapLinker::loadXModelCollision(clipMap_t* clipMap, BSPData* bsp)
|
bool ClipMapLinker::loadXModelCollision(clipMap_t* clipMap, BSPData* bsp)
|
||||||
{
|
{
|
||||||
|
// it seems like for players to be able to collide with xmodels, it requires xmodel->collmaps to be valid.
|
||||||
|
// A lot of XModels don't implement collmaps (OAT also doesn't generate these collmaps), and
|
||||||
|
// even official maps instead use terrain or brushes to cover where the collision should be.
|
||||||
|
|
||||||
clipMap->numStaticModels = bsp->colWorld.xmodels.size();
|
clipMap->numStaticModels = bsp->colWorld.xmodels.size();
|
||||||
clipMap->staticModelList = new cStaticModel_s[clipMap->numStaticModels];
|
clipMap->staticModelList = new cStaticModel_s[clipMap->numStaticModels];
|
||||||
|
|
||||||
@@ -180,11 +184,9 @@ namespace BSP
|
|||||||
currModel->origin.y = bspModel.origin.y;
|
currModel->origin.y = bspModel.origin.y;
|
||||||
currModel->origin.z = bspModel.origin.z;
|
currModel->origin.z = bspModel.origin.z;
|
||||||
|
|
||||||
currModel->contents = 1;
|
|
||||||
// currModel->contents = currModel->xmodel->contents;
|
|
||||||
|
|
||||||
if (!xModelAsset->IsReference())
|
if (!xModelAsset->IsReference())
|
||||||
{
|
{
|
||||||
|
currModel->contents = currModel->xmodel->contents;
|
||||||
BSPUtil::calculateXmodelBounds(currModel->xmodel, xmodelAxis, currModel->absmin, currModel->absmax);
|
BSPUtil::calculateXmodelBounds(currModel->xmodel, xmodelAxis, currModel->absmin, currModel->absmax);
|
||||||
currModel->absmin.x = (currModel->absmin.x * bspModel.scale) + bspModel.origin.x;
|
currModel->absmin.x = (currModel->absmin.x * bspModel.scale) + bspModel.origin.x;
|
||||||
currModel->absmin.y = (currModel->absmin.y * bspModel.scale) + bspModel.origin.y;
|
currModel->absmin.y = (currModel->absmin.y * bspModel.scale) + bspModel.origin.y;
|
||||||
@@ -192,9 +194,13 @@ namespace BSP
|
|||||||
currModel->absmax.x = (currModel->absmax.x * bspModel.scale) + bspModel.origin.x;
|
currModel->absmax.x = (currModel->absmax.x * bspModel.scale) + bspModel.origin.x;
|
||||||
currModel->absmax.y = (currModel->absmax.y * bspModel.scale) + bspModel.origin.y;
|
currModel->absmax.y = (currModel->absmax.y * bspModel.scale) + bspModel.origin.y;
|
||||||
currModel->absmax.z = (currModel->absmax.z * bspModel.scale) + bspModel.origin.z;
|
currModel->absmax.z = (currModel->absmax.z * bspModel.scale) + bspModel.origin.z;
|
||||||
|
|
||||||
|
if (currModel->xmodel->numCollmaps == 0)
|
||||||
|
con::warn("Xmodel \"{}\" has no colision data", bspModel.name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
currModel->contents = 1;
|
||||||
if (bspModel.areBoundsValid)
|
if (bspModel.areBoundsValid)
|
||||||
{
|
{
|
||||||
currModel->absmin = bspModel.mins;
|
currModel->absmin = bspModel.mins;
|
||||||
@@ -225,6 +231,8 @@ namespace BSP
|
|||||||
|
|
||||||
memset(&currModel->writable, 0, sizeof(cStaticModelWritable));
|
memset(&currModel->writable, 0, sizeof(cStaticModelWritable));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// out_mins and out_maxs are initialised in the function
|
// out_mins and out_maxs are initialised in the function
|
||||||
@@ -714,9 +722,11 @@ namespace BSP
|
|||||||
|
|
||||||
loadDynEnts(clipMap);
|
loadDynEnts(clipMap);
|
||||||
|
|
||||||
loadXModelCollision(clipMap, bsp);
|
if (!loadXModelCollision(clipMap, bsp))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
loadMaterials(clipMap, bsp);
|
if (!loadMaterials(clipMap, bsp))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
if (!loadWorldCollision(clipMap, bsp))
|
if (!loadWorldCollision(clipMap, bsp))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user