ActorModelData cleanup in preparation for decoupled model animations

This commit is contained in:
Ricardo Luís Vaz Silva 2023-11-17 20:34:43 -03:00 committed by Rachael Alexanderson
commit 1a8dfd2dfa
9 changed files with 73 additions and 52 deletions

View file

@ -5088,6 +5088,35 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetMugshotState)
// This function allows the changing of an actor's modeldef, or models and/or skins at a given index
//==========================================================================
static void EnsureModelData(AActor * mobj)
{
if (mobj->modelData == nullptr)
{
auto ptr = Create<DActorModelData>();
ptr->flags = (mobj->hasmodel ? MODELDATA_HADMODEL : 0);
ptr->modelDef = NAME_None;
mobj->modelData = ptr;
mobj->hasmodel = true;
GC::WriteBarrier(mobj, ptr);
}
}
static void CleanupModelData(AActor * mobj)
{
if ( mobj->modelData->models.Size() == 0
&& mobj->modelData->modelFrameGenerators.Size() == 0
&& mobj->modelData->skinIDs.Size() == 0
&& mobj->modelData->animationIDs.Size() == 0
&& mobj->modelData->modelDef == NAME_None)
{
mobj->hasmodel = mobj->modelData->flags & MODELDATA_HADMODEL;
mobj->modelData->Destroy();
mobj->modelData = nullptr;
}
}
enum ChangeModelFlags
{
CMDL_WEAPONTOPLAYER = 1,
@ -5139,17 +5168,7 @@ void ChangeModelNative(
if (skinpath.Len() != 0 && skinpath[(int)skinpath.Len() - 1] != '/') skinpath += '/';
if (animationpath.Len() != 0 && animationpath[(int)animationpath.Len() - 1] != '/') animationpath += '/';
if (mobj->modelData == nullptr)
{
auto ptr = Create<DActorModelData>();
ptr->hasModel = mobj->hasmodel;
ptr->modelDef = NAME_None;
mobj->modelData = ptr;
mobj->hasmodel = true;
GC::WriteBarrier(mobj, ptr);
};
EnsureModelData(mobj);
int queryModel = !(flags & CMDL_HIDEMODEL) ? model != NAME_None ? FindModel(modelpath.GetChars(), model.GetChars()) : -1 : -2;
int queryAnimation = animation != NAME_None ? FindModel(animationpath.GetChars(), animation.GetChars()) : -1;
@ -5290,12 +5309,7 @@ void ChangeModelNative(
if(!found) savedModelFiles.Push(fullName);
}
if (mobj->modelData->models.Size() == 0 && mobj->modelData->modelFrameGenerators.Size() == 0 && mobj->modelData->skinIDs.Size() == 0 && mobj->modelData->animationIDs.Size() == 0 && modeldef == NAME_None)
{
mobj->hasmodel = mobj->modelData->hasModel;
mobj->modelData->Destroy();
mobj->modelData = nullptr;
}
CleanupModelData(mobj);
return;
}