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

@ -695,12 +695,17 @@ struct ModelOverride
TArray<FTextureID> surfaceSkinIDs;
};
enum ModelDataFlags
{
MODELDATA_HADMODEL = 1 << 0,
};
class DActorModelData : public DObject
{
DECLARE_CLASS(DActorModelData, DObject);
public:
FName modelDef;
bool hasModel;
int flags;
TArray<ModelOverride> models;
TArray<FTextureID> skinIDs;
TArray<int> animationIDs;

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;
}

View file

@ -1345,7 +1345,7 @@ void DActorModelData::Serialize(FSerializer& arc)
//("surfaceSkinIDs", surfaceSkinIDs)
("animationIDs", animationIDs)
("modelFrameGenerators", modelFrameGenerators)
("hasModel", hasModel);
("flags", flags);
}
void DActorModelData::OnDestroy()