From 83a23c65253414132d837f5d19eeb102f5386fd1 Mon Sep 17 00:00:00 2001 From: Shiny Metagross <30511800+ShinyMetagross@users.noreply.github.com> Date: Thu, 30 Jun 2022 14:37:31 -0700 Subject: [PATCH] Other updates - Moved modelDef to modelData - Replaced TArray.Deletes with TArray.Pop - Made a few other optimizations in other places in the action function --- src/playsim/actor.h | 8 +++--- src/playsim/p_actionfunctions.cpp | 27 ++++++++++++------- src/playsim/p_mobj.cpp | 14 +++++----- src/r_data/models.cpp | 6 ++--- src/rendering/hwrenderer/scene/hw_sprites.cpp | 2 +- 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 2b8b3f84e..80ac8cfbe 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -677,9 +677,10 @@ class DActorModelData : public DObject { DECLARE_CLASS(DActorModelData, DObject); public: - bool hasModel; - TArray modelIDs; - TArray skinIDs; + FName modelDef; + bool hasModel; + TArray modelIDs; + TArray skinIDs; DActorModelData() = default; virtual void Serialize(FSerializer& arc) override; @@ -1080,7 +1081,6 @@ public: DVector3 WorldOffset; double Speed; double FloatSpeed; - FName modelDef; TObjPtr modelData; // interaction info diff --git a/src/playsim/p_actionfunctions.cpp b/src/playsim/p_actionfunctions.cpp index eea576fb2..6d9dc0d10 100644 --- a/src/playsim/p_actionfunctions.cpp +++ b/src/playsim/p_actionfunctions.cpp @@ -5058,35 +5058,42 @@ DEFINE_ACTION_FUNCTION(AActor, A_ChangeModel) ptr->hasModel = modeldef != NAME_None && !mobj->hasmodel ? 0 : 1; ptr->modelIDs = *new TArray(); ptr->skinIDs = *new TArray(); + 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; diff --git a/src/playsim/p_mobj.cpp b/src/playsim/p_mobj.cpp index ae5e3dc88..6315421d6 100644 --- a/src/playsim/p_mobj.cpp +++ b/src/playsim/p_mobj.cpp @@ -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); } diff --git a/src/r_data/models.cpp b/src/r_data/models.cpp index effe9a884..7e9e8435a 100644 --- a/src/r_data/models.cpp +++ b/src/r_data/models.cpp @@ -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); } diff --git a/src/rendering/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp index 40c261cc9..d5652f409 100644 --- a/src/rendering/hwrenderer/scene/hw_sprites.cpp +++ b/src/rendering/hwrenderer/scene/hw_sprites.cpp @@ -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)