Other updates

- Moved modelDef to modelData
- Replaced TArray.Deletes with TArray.Pop
- Made a few other optimizations in other places in the action function
This commit is contained in:
Shiny Metagross 2022-06-30 14:37:31 -07:00 committed by Christoph Oelckers
parent e827e9b086
commit 83a23c6525
5 changed files with 32 additions and 25 deletions

View file

@ -677,9 +677,10 @@ class DActorModelData : public DObject
{
DECLARE_CLASS(DActorModelData, DObject);
public:
bool hasModel;
TArray<int> modelIDs;
TArray<FTextureID> skinIDs;
FName modelDef;
bool hasModel;
TArray<int> modelIDs;
TArray<FTextureID> skinIDs;
DActorModelData() = default;
virtual void Serialize(FSerializer& arc) override;
@ -1080,7 +1081,6 @@ public:
DVector3 WorldOffset;
double Speed;
double FloatSpeed;
FName modelDef;
TObjPtr<DActorModelData*> modelData;
// interaction info

View file

@ -5058,35 +5058,42 @@ DEFINE_ACTION_FUNCTION(AActor, A_ChangeModel)
ptr->hasModel = modeldef != NAME_None && !mobj->hasmodel ? 0 : 1;
ptr->modelIDs = *new TArray<int>();
ptr->skinIDs = *new TArray<FTextureID>();
ptr->modelDef = NAME_None;
mobj->modelData = ptr;
mobj->hasmodel = mobj->modelData->hasModel;
GC::WriteBarrier(mobj, ptr);
}
mobj->modelDef = modeldef;
mobj->modelData->modelIDs.Delete(index);
mobj->modelData->skinIDs.Delete(index);
int maxModels = mobj->modelData->modelIDs.Size();
int maxSkins = mobj->modelData->skinIDs.Size();
mobj->modelData->modelDef = modeldef;
if (maxModels > index) mobj->modelData->modelIDs.Pop(mobj->modelData->modelIDs[index]);
if(maxSkins > index) mobj->modelData->skinIDs.Pop(mobj->modelData->skinIDs[index]);
mobj->modelData->modelIDs.Insert(index, model != NAME_None ? FindModel(modelpath.GetChars(), model.GetChars()) : -1);
mobj->modelData->skinIDs.Insert(index, skin != NAME_None ? LoadSkin(skinpath.GetChars(), skin.GetChars()) : FNullTextureID());
//[SM] - if an indice of modelIDs or skinIDs comes up blank and it's the last one, just delete it. For using very large amounts of indices, common sense says to just not run this repeatedly.
int i = 0;
int maxModels = mobj->modelData->modelIDs.Size();
int maxSkins = mobj->modelData->modelIDs.Size();
for (i = 0; i < maxModels; i++)
{
if (mobj->modelData->modelIDs[mobj->modelData->modelIDs.Size()-1] == -1)
mobj->modelData->modelIDs.Delete(mobj->modelData->modelIDs.Size()-1);
if (mobj->modelData->modelIDs.Last() == -1) mobj->modelData->modelIDs.Pop(mobj->modelData->modelIDs.Last());
else break;
}
for (i = 0; i < maxSkins; i++)
{
if (mobj->modelData->skinIDs[mobj->modelData->skinIDs.Size()-1] == FNullTextureID())
mobj->modelData->skinIDs.Delete(mobj->modelData->skinIDs.Size()-1);
if (mobj->modelData->skinIDs.Last() == FNullTextureID()) mobj->modelData->skinIDs.Pop(mobj->modelData->skinIDs.Last());
else break;
}
if (mobj->modelData->modelIDs.Size() == 0 && mobj->modelData->skinIDs.Size() == 0 && modeldef == NAME_None)
{
mobj->hasmodel = mobj->modelData->hasModel;
mobj->modelData = nullptr;
mobj->modelData;
mobj->modelData->modelIDs.Reset();
mobj->modelData->skinIDs.Reset();
mobj->modelData->Destroy();
}
return 0;

View file

@ -356,10 +356,10 @@ void AActor::Serialize(FSerializer &arc)
A("cameraheight", CameraHeight)
A("camerafov", CameraFOV)
A("tag", Tag)
A("visiblestartangle",VisibleStartAngle)
A("visibleendangle",VisibleEndAngle)
A("visiblestartpitch",VisibleStartPitch)
A("visibleendpitch",VisibleEndPitch)
A("visiblestartangle", VisibleStartAngle)
A("visibleendangle", VisibleEndAngle)
A("visiblestartpitch", VisibleStartPitch)
A("visibleendpitch", VisibleEndPitch)
A("woundhealth", WoundHealth)
A("rdfactor", RadiusDamageFactor)
A("selfdamagefactor", SelfDamageFactor)
@ -376,8 +376,7 @@ void AActor::Serialize(FSerializer &arc)
A("lightlevel", LightLevel)
A("userlights", UserLights)
A("WorldOffset", WorldOffset)
A("modelData", modelData)
A("modelDef", modelDef);
("modelData", modelData);
SerializeTerrain(arc, "floorterrain", floorterrain, &def->floorterrain);
SerializeArgs(arc, "args", args, def->args, special);
@ -1365,7 +1364,8 @@ bool AActor::Massacre ()
void DActorModelData::Serialize(FSerializer& arc)
{
Super::Serialize(arc);
arc ("modelIDs", modelIDs)
arc("modelDef", modelDef)
("modelIDs", modelIDs)
("skinIDs", skinIDs)
("hasModel", hasModel);
}

View file

@ -176,14 +176,14 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
float orientation = scaleFactorX * scaleFactorY * scaleFactorZ;
renderer->BeginDrawModel(actor->RenderStyle, smf, objectToWorldMatrix, orientation < 0);
RenderFrameModels(renderer, actor->Level, smf, actor->state, actor->tics, actor->modelDef != NAME_None ? PClass::FindActor(actor->modelDef) : actor->GetClass(), translation, actor);
RenderFrameModels(renderer, actor->Level, smf, actor->state, actor->tics, actor->modelData != nullptr ? actor->modelData->modelDef != NAME_None ? PClass::FindActor(actor->modelData->modelDef) : actor->GetClass() : actor->GetClass(), translation, actor);
renderer->EndDrawModel(actor->RenderStyle, smf);
}
void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, float ofsX, float ofsY)
{
AActor * playermo = players[consoleplayer].camera;
FSpriteModelFrame *smf = psp->Caller != nullptr ? FindModelFrame(psp->Caller->modelDef != NAME_None ? PClass::FindActor(psp->Caller->modelDef) : psp->Caller->GetClass(), psp->GetSprite(), psp->GetFrame(), false) : nullptr;
FSpriteModelFrame *smf = psp->Caller != nullptr ? FindModelFrame(psp->Caller->modelData != nullptr ? psp->Caller->modelData->modelDef != NAME_None ? PClass::FindActor(psp->Caller->modelData->modelDef) : psp->Caller->GetClass() : psp->Caller->GetClass(), psp->GetSprite(), psp->GetFrame(), false) : nullptr;
// [BB] No model found for this sprite, so we can't render anything.
if (smf == nullptr)
@ -224,7 +224,7 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, float ofsX, float o
renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0);
uint32_t trans = psp->GetTranslation() != 0 ? psp->GetTranslation() : 0;
if ((psp->Flags & PSPF_PLAYERTRANSLATED)) trans = psp->Owner->mo->Translation;
RenderFrameModels(renderer, playermo->Level, smf, psp->GetState(), psp->GetTics(), psp->Caller->modelDef != NAME_None ? PClass::FindActor(psp->Caller->modelDef) : psp->Caller->GetClass(), trans, psp->Caller);
RenderFrameModels(renderer, playermo->Level, smf, psp->GetState(), psp->GetTics(), psp->Caller->modelData != nullptr ? psp->Caller->modelData->modelDef != NAME_None ? PClass::FindActor(psp->Caller->modelData->modelDef) : psp->Caller->GetClass() : psp->Caller->GetClass(), trans, psp->Caller);
renderer->EndDrawHUDModel(playermo->RenderStyle);
}

View file

@ -834,7 +834,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t
z += fz;
}
modelframe = isPicnumOverride ? nullptr : FindModelFrame(thing->modelDef != NAME_None ? PClass::FindActor(thing->modelDef) : thing->GetClass(), spritenum, thing->frame, !!(thing->flags & MF_DROPPED));
modelframe = isPicnumOverride ? nullptr : FindModelFrame(thing->modelData != nullptr ? thing->modelData->modelDef != NAME_None ? PClass::FindActor(thing->modelData->modelDef) : thing->GetClass() : thing->GetClass(), spritenum, thing->frame, !!(thing->flags & MF_DROPPED));
// don't bother drawing sprite shadows if this is a model (it will never look right)
if (modelframe && isSpriteShadow)