mirror of
https://github.com/ZDoom/Raze.git
synced 2025-03-22 00:41:05 +00:00
- sprite init code.
This commit is contained in:
parent
b31e8dd8b4
commit
61bc698029
2 changed files with 93 additions and 7 deletions
|
@ -40,10 +40,86 @@
|
|||
#include "thingdef.h"
|
||||
#include "templates.h"
|
||||
#include "states.h"
|
||||
#include "texturemanager.h"
|
||||
|
||||
|
||||
// stores indices for symbolic state labels for some old-style DECORATE functions.
|
||||
FStateLabelStorage StateLabels;
|
||||
TArray<FSpriteFrame> SpriteFrames;
|
||||
TArray<FSpriteDef> SpriteDefs;
|
||||
|
||||
void InitSpriteDefs(const char** names, size_t count)
|
||||
{
|
||||
SpriteDefs.Clear();
|
||||
SpriteDefs.Push({});
|
||||
|
||||
// allocate one buffer for all sprite names.
|
||||
size_t maxlen = 0;
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
size_t ll = strlen(names[i]);
|
||||
if (ll > maxlen) maxlen = ll;
|
||||
}
|
||||
TArray<char> work(maxlen + 4, true);
|
||||
|
||||
for (size_t i = 0; i < count; i++)
|
||||
{
|
||||
FSpriteFrame swork[26]{};
|
||||
size_t ll = strlen(names[i]);
|
||||
memcpy(work.Data(), names[i], ll);
|
||||
work[ll] = '@';
|
||||
|
||||
int maxframe = -1;
|
||||
for (int j = 0; j < 26; j++)
|
||||
{
|
||||
int bits = 0;
|
||||
FTextureID texs[9];
|
||||
work[ll + 1] = 'A' + j;
|
||||
work[ll + 3] = 0;
|
||||
|
||||
for (int k = 0; k <= 8; k++)
|
||||
{
|
||||
work[ll + 2] = '0' + k;
|
||||
texs[k] = TexMan.CheckForTexture(work.Data(), ETextureType::Any);
|
||||
if (texs[k].isValid()) bits |= (1 << k);
|
||||
}
|
||||
if (bits == 1)
|
||||
{
|
||||
swork[j].Texture[0] = texs[0];
|
||||
swork[j].RotMode = 1;
|
||||
maxframe = j;
|
||||
}
|
||||
else if (bits == 2)
|
||||
{
|
||||
swork[j].Texture[0] = texs[1];
|
||||
swork[j].RotMode = 1;
|
||||
maxframe = j;
|
||||
}
|
||||
else if (bits == 62)
|
||||
{
|
||||
memcpy(swork[j].Texture, &texs[1], 5 * sizeof(FTextureID));
|
||||
swork[j].RotMode = 5;
|
||||
maxframe = j;
|
||||
}
|
||||
else if (bits == 510)
|
||||
{
|
||||
memcpy(swork[j].Texture, &texs[1], 8 * sizeof(FTextureID));
|
||||
swork[j].RotMode = 8;
|
||||
maxframe = j;
|
||||
}
|
||||
else
|
||||
{
|
||||
Printf("Incomplete frames for sprite %s, frame %c\n", names[i], 'A' + j);
|
||||
}
|
||||
}
|
||||
maxframe++;
|
||||
auto pos = SpriteFrames.Reserve(maxframe);
|
||||
memcpy(&SpriteFrames[pos], swork, maxframe * sizeof(FSpriteFrame));
|
||||
FSpriteDef def = { names[i], (uint8_t)maxframe, (uint16_t)pos };
|
||||
SpriteDefs.Push(def);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Each state is owned by an actor. Actors can own any number of
|
||||
// states, but a single state cannot be owned by more than one
|
||||
|
|
|
@ -47,6 +47,23 @@ class FStateDefinitions;
|
|||
class FInternalLightAssociation;
|
||||
struct FState;
|
||||
|
||||
struct FSpriteFrame
|
||||
{
|
||||
FTextureID Texture[8];
|
||||
uint8_t RotMode; // 1, 5, 8 are the regular ones. Duke also has mirrored 3 and 7 frame options.
|
||||
};
|
||||
struct FSpriteDef
|
||||
{
|
||||
FName name;
|
||||
uint8_t numframes;
|
||||
uint16_t spriteframes;
|
||||
|
||||
FTextureID GetSpriteFrame(int frame, int rot, DAngle ang, bool* mirror, bool flipagain = false);
|
||||
};
|
||||
|
||||
extern TArray<FSpriteFrame> SpriteFrames;
|
||||
extern TArray<FSpriteDef> SpriteDefs;
|
||||
|
||||
enum EStateDefineFlags
|
||||
{
|
||||
SDF_NEXT = 0,
|
||||
|
@ -78,13 +95,6 @@ struct FStateParamInfo
|
|||
};
|
||||
|
||||
|
||||
// Sprites that are fixed in position because they can have special meanings.
|
||||
enum
|
||||
{
|
||||
SPR_TNT1, // The empty sprite
|
||||
SPR_FIXED, // Do not change sprite or frame
|
||||
SPR_NOCHANGE, // Do not change sprite (frame change is okay)
|
||||
};
|
||||
|
||||
struct FState
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue