mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-09 01:01:05 +00:00
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:
parent
e827e9b086
commit
83a23c6525
5 changed files with 32 additions and 25 deletions
|
@ -677,9 +677,10 @@ class DActorModelData : public DObject
|
||||||
{
|
{
|
||||||
DECLARE_CLASS(DActorModelData, DObject);
|
DECLARE_CLASS(DActorModelData, DObject);
|
||||||
public:
|
public:
|
||||||
bool hasModel;
|
FName modelDef;
|
||||||
TArray<int> modelIDs;
|
bool hasModel;
|
||||||
TArray<FTextureID> skinIDs;
|
TArray<int> modelIDs;
|
||||||
|
TArray<FTextureID> skinIDs;
|
||||||
|
|
||||||
DActorModelData() = default;
|
DActorModelData() = default;
|
||||||
virtual void Serialize(FSerializer& arc) override;
|
virtual void Serialize(FSerializer& arc) override;
|
||||||
|
@ -1080,7 +1081,6 @@ public:
|
||||||
DVector3 WorldOffset;
|
DVector3 WorldOffset;
|
||||||
double Speed;
|
double Speed;
|
||||||
double FloatSpeed;
|
double FloatSpeed;
|
||||||
FName modelDef;
|
|
||||||
TObjPtr<DActorModelData*> modelData;
|
TObjPtr<DActorModelData*> modelData;
|
||||||
|
|
||||||
// interaction info
|
// interaction info
|
||||||
|
|
|
@ -5058,35 +5058,42 @@ DEFINE_ACTION_FUNCTION(AActor, A_ChangeModel)
|
||||||
ptr->hasModel = modeldef != NAME_None && !mobj->hasmodel ? 0 : 1;
|
ptr->hasModel = modeldef != NAME_None && !mobj->hasmodel ? 0 : 1;
|
||||||
ptr->modelIDs = *new TArray<int>();
|
ptr->modelIDs = *new TArray<int>();
|
||||||
ptr->skinIDs = *new TArray<FTextureID>();
|
ptr->skinIDs = *new TArray<FTextureID>();
|
||||||
|
ptr->modelDef = NAME_None;
|
||||||
mobj->modelData = ptr;
|
mobj->modelData = ptr;
|
||||||
mobj->hasmodel = mobj->modelData->hasModel;
|
mobj->hasmodel = mobj->modelData->hasModel;
|
||||||
GC::WriteBarrier(mobj, ptr);
|
GC::WriteBarrier(mobj, ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
mobj->modelDef = modeldef;
|
int maxModels = mobj->modelData->modelIDs.Size();
|
||||||
mobj->modelData->modelIDs.Delete(index);
|
int maxSkins = mobj->modelData->skinIDs.Size();
|
||||||
mobj->modelData->skinIDs.Delete(index);
|
|
||||||
|
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->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());
|
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.
|
//[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 i = 0;
|
||||||
int maxModels = mobj->modelData->modelIDs.Size();
|
|
||||||
int maxSkins = mobj->modelData->modelIDs.Size();
|
|
||||||
for (i = 0; i < maxModels; i++)
|
for (i = 0; i < maxModels; i++)
|
||||||
{
|
{
|
||||||
if (mobj->modelData->modelIDs[mobj->modelData->modelIDs.Size()-1] == -1)
|
if (mobj->modelData->modelIDs.Last() == -1) mobj->modelData->modelIDs.Pop(mobj->modelData->modelIDs.Last());
|
||||||
mobj->modelData->modelIDs.Delete(mobj->modelData->modelIDs.Size()-1);
|
else break;
|
||||||
}
|
}
|
||||||
for (i = 0; i < maxSkins; i++)
|
for (i = 0; i < maxSkins; i++)
|
||||||
{
|
{
|
||||||
if (mobj->modelData->skinIDs[mobj->modelData->skinIDs.Size()-1] == FNullTextureID())
|
if (mobj->modelData->skinIDs.Last() == FNullTextureID()) mobj->modelData->skinIDs.Pop(mobj->modelData->skinIDs.Last());
|
||||||
mobj->modelData->skinIDs.Delete(mobj->modelData->skinIDs.Size()-1);
|
else break;
|
||||||
}
|
}
|
||||||
if (mobj->modelData->modelIDs.Size() == 0 && mobj->modelData->skinIDs.Size() == 0 && modeldef == NAME_None)
|
if (mobj->modelData->modelIDs.Size() == 0 && mobj->modelData->skinIDs.Size() == 0 && modeldef == NAME_None)
|
||||||
{
|
{
|
||||||
mobj->hasmodel = mobj->modelData->hasModel;
|
mobj->hasmodel = mobj->modelData->hasModel;
|
||||||
mobj->modelData = nullptr;
|
mobj->modelData;
|
||||||
|
mobj->modelData->modelIDs.Reset();
|
||||||
|
mobj->modelData->skinIDs.Reset();
|
||||||
|
mobj->modelData->Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -356,10 +356,10 @@ void AActor::Serialize(FSerializer &arc)
|
||||||
A("cameraheight", CameraHeight)
|
A("cameraheight", CameraHeight)
|
||||||
A("camerafov", CameraFOV)
|
A("camerafov", CameraFOV)
|
||||||
A("tag", Tag)
|
A("tag", Tag)
|
||||||
A("visiblestartangle",VisibleStartAngle)
|
A("visiblestartangle", VisibleStartAngle)
|
||||||
A("visibleendangle",VisibleEndAngle)
|
A("visibleendangle", VisibleEndAngle)
|
||||||
A("visiblestartpitch",VisibleStartPitch)
|
A("visiblestartpitch", VisibleStartPitch)
|
||||||
A("visibleendpitch",VisibleEndPitch)
|
A("visibleendpitch", VisibleEndPitch)
|
||||||
A("woundhealth", WoundHealth)
|
A("woundhealth", WoundHealth)
|
||||||
A("rdfactor", RadiusDamageFactor)
|
A("rdfactor", RadiusDamageFactor)
|
||||||
A("selfdamagefactor", SelfDamageFactor)
|
A("selfdamagefactor", SelfDamageFactor)
|
||||||
|
@ -376,8 +376,7 @@ void AActor::Serialize(FSerializer &arc)
|
||||||
A("lightlevel", LightLevel)
|
A("lightlevel", LightLevel)
|
||||||
A("userlights", UserLights)
|
A("userlights", UserLights)
|
||||||
A("WorldOffset", WorldOffset)
|
A("WorldOffset", WorldOffset)
|
||||||
A("modelData", modelData)
|
("modelData", modelData);
|
||||||
A("modelDef", modelDef);
|
|
||||||
|
|
||||||
SerializeTerrain(arc, "floorterrain", floorterrain, &def->floorterrain);
|
SerializeTerrain(arc, "floorterrain", floorterrain, &def->floorterrain);
|
||||||
SerializeArgs(arc, "args", args, def->args, special);
|
SerializeArgs(arc, "args", args, def->args, special);
|
||||||
|
@ -1365,7 +1364,8 @@ bool AActor::Massacre ()
|
||||||
void DActorModelData::Serialize(FSerializer& arc)
|
void DActorModelData::Serialize(FSerializer& arc)
|
||||||
{
|
{
|
||||||
Super::Serialize(arc);
|
Super::Serialize(arc);
|
||||||
arc ("modelIDs", modelIDs)
|
arc("modelDef", modelDef)
|
||||||
|
("modelIDs", modelIDs)
|
||||||
("skinIDs", skinIDs)
|
("skinIDs", skinIDs)
|
||||||
("hasModel", hasModel);
|
("hasModel", hasModel);
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,14 +176,14 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
|
||||||
float orientation = scaleFactorX * scaleFactorY * scaleFactorZ;
|
float orientation = scaleFactorX * scaleFactorY * scaleFactorZ;
|
||||||
|
|
||||||
renderer->BeginDrawModel(actor->RenderStyle, smf, objectToWorldMatrix, orientation < 0);
|
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);
|
renderer->EndDrawModel(actor->RenderStyle, smf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, float ofsX, float ofsY)
|
void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, float ofsX, float ofsY)
|
||||||
{
|
{
|
||||||
AActor * playermo = players[consoleplayer].camera;
|
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.
|
// [BB] No model found for this sprite, so we can't render anything.
|
||||||
if (smf == nullptr)
|
if (smf == nullptr)
|
||||||
|
@ -224,7 +224,7 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, float ofsX, float o
|
||||||
renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0);
|
renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0);
|
||||||
uint32_t trans = psp->GetTranslation() != 0 ? psp->GetTranslation() : 0;
|
uint32_t trans = psp->GetTranslation() != 0 ? psp->GetTranslation() : 0;
|
||||||
if ((psp->Flags & PSPF_PLAYERTRANSLATED)) trans = psp->Owner->mo->Translation;
|
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);
|
renderer->EndDrawHUDModel(playermo->RenderStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -834,7 +834,7 @@ void HWSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t
|
||||||
z += fz;
|
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)
|
// don't bother drawing sprite shadows if this is a model (it will never look right)
|
||||||
if (modelframe && isSpriteShadow)
|
if (modelframe && isSpriteShadow)
|
||||||
|
|
Loading…
Reference in a new issue