Skip to content

Commit

Permalink
Revert "Dynamic number of models per frame instead of a hard limit of…
Browse files Browse the repository at this point in the history
… four. (#1298)"

This reverts commit 769d60a.
  • Loading branch information
madame-rachelle committed Feb 25, 2021
1 parent cdb3fcc commit d6987ff
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 77 deletions.
10 changes: 5 additions & 5 deletions src/common/models/model.h
Expand Up @@ -15,15 +15,15 @@ void FlushModels();
extern TDeletingArray<FModel*> Models;
extern TArray<FSpriteModelFrame> SpriteModelFrames;

#define MAX_MODELS_PER_FRAME 4
#define MD3_MAX_SURFACES 32

struct FSpriteModelFrame
{
uint8_t modelsAmount = 0;
TArray<int> modelIDs;
TArray<FTextureID> skinIDs;
TArray<FTextureID> surfaceskinIDs;
TArray<int> modelframes;
int modelIDs[MAX_MODELS_PER_FRAME];
FTextureID skinIDs[MAX_MODELS_PER_FRAME];
FTextureID surfaceskinIDs[MAX_MODELS_PER_FRAME][MD3_MAX_SURFACES];
int modelframes[MAX_MODELS_PER_FRAME];
float xscale, yscale, zscale;
// [BB] Added zoffset, rotation parameters and flags.
// Added xoffset, yoffset
Expand Down
12 changes: 5 additions & 7 deletions src/common/models/models_md3.cpp
@@ -1,4 +1,4 @@
//
//
//---------------------------------------------------------------------------
//
// Copyright(C) 2006-2016 Christoph Oelckers
Expand Down Expand Up @@ -306,10 +306,9 @@ void FMD3Model::AddSkins(uint8_t *hitlist)
{
for (unsigned i = 0; i < Surfaces.Size(); i++)
{
int ssIndex = i + curMDLIndex * MD3_MAX_SURFACES;
if (curSpriteMDLFrame->surfaceskinIDs[ssIndex].isValid())
if (curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
{
hitlist[curSpriteMDLFrame->surfaceskinIDs[ssIndex].GetIndex()] |= FTextureManager::HIT_Flat;
hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].GetIndex()] |= FTextureManager::HIT_Flat;
}

MD3Surface * surf = &Surfaces[i];
Expand Down Expand Up @@ -358,10 +357,9 @@ void FMD3Model::RenderFrame(FModelRenderer *renderer, FGameTexture * skin, int f
FGameTexture *surfaceSkin = skin;
if (!surfaceSkin)
{
int ssIndex = i + curMDLIndex * MD3_MAX_SURFACES;
if (curSpriteMDLFrame->surfaceskinIDs[ssIndex].isValid())
if (curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
{
surfaceSkin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[ssIndex], true);
surfaceSkin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i], true);
}
else if (surf->numSkins > 0 && surf->Skins[0].isValid())
{
Expand Down
10 changes: 4 additions & 6 deletions src/common/models/models_obj.cpp
Expand Up @@ -638,10 +638,9 @@ void FOBJModel::RenderFrame(FModelRenderer *renderer, FGameTexture * skin, int f
FGameTexture *userSkin = skin;
if (!userSkin)
{
int ssIndex = i + curMDLIndex * MD3_MAX_SURFACES;
if (i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[ssIndex].isValid())
if (i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
{
userSkin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[ssIndex], true);
userSkin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i], true);
}
else if (surf->skin.isValid())
{
Expand Down Expand Up @@ -670,14 +669,13 @@ void FOBJModel::AddSkins(uint8_t* hitlist)
{
for (size_t i = 0; i < surfaces.Size(); i++)
{
size_t ssIndex = i + curMDLIndex * MD3_MAX_SURFACES;
if (i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[ssIndex].isValid())
if (i < MD3_MAX_SURFACES && curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].isValid())
{
// Precache skins manually reassigned by the user.
// On OBJs with lots of skins, such as Doom map OBJs exported from GZDB,
// there may be too many skins for the user to manually change, unless
// the limit is bumped or surfaceskinIDs is changed to a TArray<FTextureID>.
hitlist[curSpriteMDLFrame->surfaceskinIDs[ssIndex].GetIndex()] |= FTextureManager::HIT_Flat;
hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].GetIndex()] |= FTextureManager::HIT_Flat;
return; // No need to precache skin that was replaced
}

Expand Down
15 changes: 5 additions & 10 deletions src/common/models/models_ue1.cpp
Expand Up @@ -242,9 +242,8 @@ void FUE1Model::RenderFrame( FModelRenderer *renderer, FGameTexture *skin, int f
FGameTexture *sskin = skin;
if ( !sskin )
{
int ssIndex = groups[i].texNum + curMDLIndex * MD3_MAX_SURFACES;
if (curSpriteMDLFrame->surfaceskinIDs[ssIndex].isValid())
sskin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[ssIndex], true);
if ( curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].isValid() )
sskin = TexMan.GetGameTexture(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum], true);
if ( !sskin )
{
vofs += vsize;
Expand Down Expand Up @@ -303,13 +302,9 @@ void FUE1Model::BuildVertexBuffer( FModelRenderer *renderer )

void FUE1Model::AddSkins( uint8_t *hitlist )
{
for (int i = 0; i < numGroups; i++)
{
int ssIndex = groups[i].texNum + curMDLIndex * MD3_MAX_SURFACES;
if (curSpriteMDLFrame->surfaceskinIDs[ssIndex].isValid())
hitlist[curSpriteMDLFrame->surfaceskinIDs[ssIndex].GetIndex()] |= FTextureManager::HIT_Flat;
}

for ( int i=0; i<numGroups; i++ )
if ( curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].isValid() )
hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][groups[i].texNum].GetIndex()] |= FTextureManager::HIT_Flat;
}

FUE1Model::~FUE1Model()
Expand Down
59 changes: 11 additions & 48 deletions src/r_data/models.cpp
Expand Up @@ -267,7 +267,8 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
}
}
}
for (int i = 0; i < smf->modelsAmount; i++)

for (int i = 0; i<MAX_MODELS_PER_FRAME; i++)
{
if (smf->modelIDs[i] != -1)
{
Expand Down Expand Up @@ -316,17 +317,9 @@ void InitModels()
FSpriteModelFrame smf;
memset(&smf, 0, sizeof(smf));
smf.isVoxel = true;

smf.modelsAmount = 1;
smf.modelframes.Alloc(1);
smf.modelframes[0] = -1;

smf.modelIDs.Alloc(1);
smf.modelIDs[1] = smf.modelIDs[2] = smf.modelIDs[3] = -1;
smf.modelIDs[0] = VoxelDefs[i]->Voxel->VoxelIndex;

smf.skinIDs.Alloc(1);
smf.skinIDs[0] = md->GetPaletteTexture();

smf.xscale = smf.yscale = smf.zscale = VoxelDefs[i]->Scale;
smf.angleoffset = VoxelDefs[i]->AngleOffset.Degrees;
if (VoxelDefs[i]->PlacedSpin != 0)
Expand All @@ -352,7 +345,6 @@ void InitModels()
}
SpriteModelFrames.Push(smf);
}

}

int Lump;
Expand All @@ -378,7 +370,6 @@ void InitModels()
static void ParseModelDefLump(int Lump)
{
FScanner sc(Lump);

while (sc.GetString())
{
if (sc.Compare("model"))
Expand All @@ -389,6 +380,7 @@ static void ParseModelDefLump(int Lump)

FSpriteModelFrame smf;
memset(&smf, 0, sizeof(smf));
smf.modelIDs[0] = smf.modelIDs[1] = smf.modelIDs[2] = smf.modelIDs[3] = -1;
smf.xscale=smf.yscale=smf.zscale=1.f;

auto type = PClass::FindClass(sc.String);
Expand All @@ -397,32 +389,6 @@ static void ParseModelDefLump(int Lump)
sc.ScriptError("MODELDEF: Unknown actor type '%s'\n", sc.String);
}
smf.type = type;


FScanner::SavedPos scPos = sc.SavePos();

sc.MustGetStringName("{");
while (!sc.CheckString("}"))
{
sc.MustGetString();
if (sc.Compare("model"))
{
sc.MustGetNumber();
index = sc.Number;
if (index < 0)
{
sc.ScriptError("Too many models in %s", type->TypeName.GetChars());
}
smf.modelsAmount = index + 1;
}
}
smf.modelIDs.Alloc(smf.modelsAmount);
smf.skinIDs.Alloc(smf.modelsAmount);
smf.surfaceskinIDs.Alloc(smf.modelsAmount * MD3_MAX_SURFACES);
smf.modelframes.Alloc(smf.modelsAmount);

sc.RestorePos(scPos);

sc.MustGetStringName("{");
while (!sc.CheckString("}"))
{
Expand All @@ -438,19 +404,17 @@ static void ParseModelDefLump(int Lump)
{
sc.MustGetNumber();
index = sc.Number;
if (index < 0 || index >= smf.modelsAmount)
if (index < 0 || index >= MAX_MODELS_PER_FRAME)
{
sc.ScriptError("Too many models in %s", type->TypeName.GetChars());
}
sc.MustGetString();
FixPathSeperator(sc.String);

smf.modelIDs[index] = FindModel(path.GetChars(), sc.String);
if (smf.modelIDs[index] == -1)
{
Printf("%s: model not found in %s\n", sc.String, path.GetChars());
}

}
else if (sc.Compare("scale"))
{
Expand Down Expand Up @@ -565,7 +529,7 @@ static void ParseModelDefLump(int Lump)
{
sc.MustGetNumber();
index=sc.Number;
if (index<0 || index>= smf.modelsAmount)
if (index<0 || index>=MAX_MODELS_PER_FRAME)
{
sc.ScriptError("Too many models in %s", type->TypeName.GetChars());
}
Expand All @@ -592,7 +556,7 @@ static void ParseModelDefLump(int Lump)
sc.MustGetNumber();
surface = sc.Number;

if (index<0 || index >= smf.modelsAmount)
if (index<0 || index >= MAX_MODELS_PER_FRAME)
{
sc.ScriptError("Too many models in %s", type->TypeName.GetChars());
}
Expand All @@ -604,15 +568,14 @@ static void ParseModelDefLump(int Lump)

sc.MustGetString();
FixPathSeperator(sc.String);
int ssIndex = surface + index * MD3_MAX_SURFACES;
if (sc.Compare(""))
{
smf.surfaceskinIDs[ssIndex] = FNullTextureID();
smf.surfaceskinIDs[index][surface] = FNullTextureID();
}
else
{
smf.surfaceskinIDs[ssIndex] = LoadSkin(path.GetChars(), sc.String);
if (!smf.surfaceskinIDs[ssIndex].isValid())
smf.surfaceskinIDs[index][surface] = LoadSkin(path.GetChars(), sc.String);
if (!smf.surfaceskinIDs[index][surface].isValid())
{
Printf("Surface Skin '%s' not found in '%s'\n",
sc.String, type->TypeName.GetChars());
Expand Down Expand Up @@ -647,7 +610,7 @@ static void ParseModelDefLump(int Lump)

sc.MustGetNumber();
index=sc.Number;
if (index<0 || index>= smf.modelsAmount)
if (index<0 || index>=MAX_MODELS_PER_FRAME)
{
sc.ScriptError("Too many models in %s", type->TypeName.GetChars());
}
Expand Down
2 changes: 1 addition & 1 deletion src/rendering/hwrenderer/hw_precache.cpp
Expand Up @@ -162,7 +162,7 @@ void hw_PrecacheTexture(uint8_t *texhitlist, TMap<PClassActor*, bool> &actorhitl
FSpriteModelFrame * smf = FindModelFrame(cls, state.sprite, state.Frame, false);
if (smf != NULL)
{
for (int i = 0; i < smf->modelsAmount; i++)
for (int i = 0; i < MAX_MODELS_PER_FRAME; i++)
{
if (smf->skinIDs[i].isValid())
{
Expand Down

2 comments on commit d6987ff

@Talon1024
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why?

@alexey-lysiuk
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.