Document intro functions

This commit is contained in:
GriffinR
2022-09-23 15:42:53 -04:00
parent 27b2b0b24a
commit fa9808f79d
6 changed files with 1168 additions and 916 deletions
+8 -1
View File
@@ -552,6 +552,7 @@
#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) #define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)
#define WININ_WIN0_OBJ (1 << 4) #define WININ_WIN0_OBJ (1 << 4)
#define WININ_WIN0_CLR (1 << 5) #define WININ_WIN0_CLR (1 << 5)
#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR)
#define WININ_WIN1_BG0 (1 << 8) #define WININ_WIN1_BG0 (1 << 8)
#define WININ_WIN1_BG1 (1 << 9) #define WININ_WIN1_BG1 (1 << 9)
#define WININ_WIN1_BG2 (1 << 10) #define WININ_WIN1_BG2 (1 << 10)
@@ -559,6 +560,7 @@
#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) #define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)
#define WININ_WIN1_OBJ (1 << 12) #define WININ_WIN1_OBJ (1 << 12)
#define WININ_WIN1_CLR (1 << 13) #define WININ_WIN1_CLR (1 << 13)
#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR)
#define WINOUT_WIN01_BG0 (1 << 0) #define WINOUT_WIN01_BG0 (1 << 0)
#define WINOUT_WIN01_BG1 (1 << 1) #define WINOUT_WIN01_BG1 (1 << 1)
@@ -567,6 +569,7 @@
#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) #define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)
#define WINOUT_WIN01_OBJ (1 << 4) #define WINOUT_WIN01_OBJ (1 << 4)
#define WINOUT_WIN01_CLR (1 << 5) #define WINOUT_WIN01_CLR (1 << 5)
#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)
#define WINOUT_WINOBJ_BG0 (1 << 8) #define WINOUT_WINOBJ_BG0 (1 << 8)
#define WINOUT_WINOBJ_BG1 (1 << 9) #define WINOUT_WINOBJ_BG1 (1 << 9)
#define WINOUT_WINOBJ_BG2 (1 << 10) #define WINOUT_WINOBJ_BG2 (1 << 10)
@@ -574,6 +577,7 @@
#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) #define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)
#define WINOUT_WINOBJ_OBJ (1 << 12) #define WINOUT_WINOBJ_OBJ (1 << 12)
#define WINOUT_WINOBJ_CLR (1 << 13) #define WINOUT_WINOBJ_CLR (1 << 13)
#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)
#define WIN_RANGE(a, b) (((a) << 8) | (b)) #define WIN_RANGE(a, b) (((a) << 8) | (b))
#define WIN_RANGE2(a, b) ((b) | ((a) << 8)) #define WIN_RANGE2(a, b) ((b) | ((a) << 8))
@@ -584,8 +588,10 @@
#define BLDCNT_TGT1_BG1 (1 << 1) #define BLDCNT_TGT1_BG1 (1 << 1)
#define BLDCNT_TGT1_BG2 (1 << 2) #define BLDCNT_TGT1_BG2 (1 << 2)
#define BLDCNT_TGT1_BG3 (1 << 3) #define BLDCNT_TGT1_BG3 (1 << 3)
#define BLDCNT_TGT1_BG_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3)
#define BLDCNT_TGT1_OBJ (1 << 4) #define BLDCNT_TGT1_OBJ (1 << 4)
#define BLDCNT_TGT1_BD (1 << 5) #define BLDCNT_TGT1_BD (1 << 5)
#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG_ALL | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
// Bits 6-7 select the special effect // Bits 6-7 select the special effect
#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect #define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) #define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
@@ -596,9 +602,10 @@
#define BLDCNT_TGT2_BG1 (1 << 9) #define BLDCNT_TGT2_BG1 (1 << 9)
#define BLDCNT_TGT2_BG2 (1 << 10) #define BLDCNT_TGT2_BG2 (1 << 10)
#define BLDCNT_TGT2_BG3 (1 << 11) #define BLDCNT_TGT2_BG3 (1 << 11)
#define BLDCNT_TGT2_BG_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3)
#define BLDCNT_TGT2_OBJ (1 << 12) #define BLDCNT_TGT2_OBJ (1 << 12)
#define BLDCNT_TGT2_BD (1 << 13) #define BLDCNT_TGT2_BD (1 << 13)
#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) #define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG_ALL | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
// BLDALPHA // BLDALPHA
#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) #define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
+5 -2
View File
@@ -7,6 +7,9 @@
#define SPRITE_NONE 0xFF #define SPRITE_NONE 0xFF
#define TAG_NONE 0xFFFF #define TAG_NONE 0xFFFF
// Given to SetSpriteMatrixAnchor to skip anchoring one of the coords.
#define NO_ANCHOR 0x800
struct SpriteSheet struct SpriteSheet
{ {
const void *data; // Raw uncompressed pixel data const void *data; // Raw uncompressed pixel data
@@ -228,7 +231,7 @@ struct Sprite
u16 animEnded:1; //0x10 u16 animEnded:1; //0x10
u16 affineAnimEnded:1; //0x20 u16 affineAnimEnded:1; //0x20
u16 usingSheet:1; //0x40 u16 usingSheet:1; //0x40
u16 flags_f:1; //0x80 u16 anchored:1; //0x80
/*0x40*/ u16 sheetTileStart; /*0x40*/ u16 sheetTileStart;
@@ -316,6 +319,6 @@ void ClearSpriteCopyRequests(void);
void ResetAffineAnimData(void); void ResetAffineAnimData(void);
void FreeSpriteTilesIfNotUsingSheet(struct Sprite *sprite); void FreeSpriteTilesIfNotUsingSheet(struct Sprite *sprite);
s16 AllocSpriteTiles(u16 tileCount); s16 AllocSpriteTiles(u16 tileCount);
void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod); void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 xmod, s16 ymod);
#endif //GUARD_SPRITE_H #endif //GUARD_SPRITE_H
+6 -6
View File
@@ -600,14 +600,14 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op)
switch (op) switch (op)
{ {
case 0: case BG_COORD_SET:
default: default:
sGpuBgConfigs2[bg].bg_x = value; sGpuBgConfigs2[bg].bg_x = value;
break; break;
case 1: case BG_COORD_ADD:
sGpuBgConfigs2[bg].bg_x += value; sGpuBgConfigs2[bg].bg_x += value;
break; break;
case 2: case BG_COORD_SUB:
sGpuBgConfigs2[bg].bg_x -= value; sGpuBgConfigs2[bg].bg_x -= value;
break; break;
} }
@@ -679,14 +679,14 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op)
switch (op) switch (op)
{ {
case 0: case BG_COORD_SET:
default: default:
sGpuBgConfigs2[bg].bg_y = value; sGpuBgConfigs2[bg].bg_y = value;
break; break;
case 1: case BG_COORD_ADD:
sGpuBgConfigs2[bg].bg_y += value; sGpuBgConfigs2[bg].bg_y += value;
break; break;
case 2: case BG_COORD_SUB:
sGpuBgConfigs2[bg].bg_y -= value; sGpuBgConfigs2[bg].bg_y -= value;
break; break;
} }
+1037 -767
View File
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -80,8 +80,7 @@ static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId)
switch (sprite->data[0]) switch (sprite->data[0])
{ {
case 0: case 0:
// some sort of affine transform; x transform disabled SetSpriteMatrixAnchor(sprite, NO_ANCHOR, 26);
obj_pos2_update_enable(sprite, 0x800, 0x1A);
sprite->data[0]++; sprite->data[0]++;
// fallthrough // fallthrough
case 1: case 1:
+21 -48
View File
@@ -5,6 +5,9 @@
#define OAM_MATRIX_COUNT 32 #define OAM_MATRIX_COUNT 32
#define sAnchorX data[6]
#define sAnchorY data[7]
#define SET_SPRITE_TILE_RANGE(index, start, count) \ #define SET_SPRITE_TILE_RANGE(index, start, count) \
{ \ { \
sSpriteTileRanges[index * 2] = start; \ sSpriteTileRanges[index * 2] = start; \
@@ -83,7 +86,7 @@ static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameC
static u8 IndexOfSpriteTileTag(u16 tag); static u8 IndexOfSpriteTileTag(u16 tag);
static void AllocSpriteTileRange(u16 tag, u16 start, u16 count); static void AllocSpriteTileRange(u16 tag, u16 start, u16 count);
static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset); static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset);
static void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2); static void UpdateSpriteMatrixAnchorPos(struct Sprite* sprite, s32 a1, s32 a2);
typedef void (*AnimFunc)(struct Sprite *); typedef void (*AnimFunc)(struct Sprite *);
typedef void (*AnimCmdFunc)(struct Sprite *); typedef void (*AnimCmdFunc)(struct Sprite *);
@@ -161,41 +164,11 @@ static const struct Sprite sDummySprite =
{ {
.oam = DUMMY_OAM_DATA, .oam = DUMMY_OAM_DATA,
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable, .affineAnims = gDummySpriteAffineAnimTable,
.template = &gDummySpriteTemplate, .template = &gDummySpriteTemplate,
.subspriteTables = NULL,
.callback = SpriteCallbackDummy, .callback = SpriteCallbackDummy,
.x = 304, .y = 160, .x = DISPLAY_WIDTH + 64,
.x2 = 0, .y2 = 0, .y = DISPLAY_HEIGHT,
.centerToCornerVecX = 0,
.centerToCornerVecY = 0,
.animNum = 0,
.animCmdIndex = 0,
.animDelayCounter = 0,
.animPaused = 0,
.affineAnimPaused = 0,
.animLoopCounter = 0,
.data = {0, 0, 0, 0, 0, 0, 0},
.inUse = 0,
.coordOffsetEnabled = 0,
.invisible = 0,
.flags_3 = 0,
.flags_4 = 0,
.flags_5 = 0,
.flags_6 = 0,
.flags_7 = 0,
.hFlip = 0,
.vFlip = 0,
.animBeginning = 0,
.affineAnimBeginning = 0,
.animEnded = 0,
.affineAnimEnded = 0,
.usingSheet = 0,
.flags_f = 0,
.sheetTileStart = 0,
.subspriteTableNum = 0,
.subspriteMode = 0,
.subpriority = 0xFF .subpriority = 0xFF
}; };
@@ -212,7 +185,7 @@ const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffin
const struct SpriteTemplate gDummySpriteTemplate = const struct SpriteTemplate gDummySpriteTemplate =
{ {
.tileTag = 0, .tileTag = 0,
.paletteTag = 0xFFFF, .paletteTag = TAG_NONE,
.oam = &gDummyOamData, .oam = &gDummyOamData,
.anims = gDummySpriteAnimTable, .anims = gDummySpriteAnimTable,
.images = NULL, .images = NULL,
@@ -1099,8 +1072,8 @@ void BeginAffineAnim(struct Sprite *sprite)
sprite->affineAnimEnded = FALSE; sprite->affineAnimEnded = FALSE;
ApplyAffineAnimFrame(matrixNum, &frameCmd); ApplyAffineAnimFrame(matrixNum, &frameCmd);
sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration; sAffineAnimStates[matrixNum].delayCounter = frameCmd.duration;
if (sprite->flags_f) if (sprite->anchored)
obj_update_pos2(sprite, sprite->data[6], sprite->data[7]); UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY);
} }
} }
@@ -1125,8 +1098,8 @@ void ContinueAffineAnim(struct Sprite *sprite)
funcIndex = type - 32765; funcIndex = type - 32765;
sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite); sAffineAnimCmdFuncs[funcIndex](matrixNum, sprite);
} }
if (sprite->flags_f) if (sprite->anchored)
obj_update_pos2(sprite, sprite->data[6], sprite->data[7]); UpdateSpriteMatrixAnchorPos(sprite, sprite->sAnchorX, sprite->sAnchorY);
} }
} }
@@ -1220,14 +1193,14 @@ u8 GetSpriteMatrixNum(struct Sprite *sprite)
return matrixNum; return matrixNum;
} }
void obj_pos2_update_enable(struct Sprite* sprite, s16 xmod, s16 ymod) void SetSpriteMatrixAnchor(struct Sprite* sprite, s16 x, s16 y)
{ {
sprite->data[6] = xmod; sprite->sAnchorX = x;
sprite->data[7] = ymod; sprite->sAnchorY = y;
sprite->flags_f = 1; sprite->anchored = TRUE;
} }
static s32 affine_get_new_pos2(s32 baseDim, s32 xformed, s32 modifier) static s32 GetAnchorCoord(s32 baseDim, s32 xformed, s32 modifier)
{ {
s32 subResult, shiftResult; s32 subResult, shiftResult;
@@ -1239,24 +1212,24 @@ static s32 affine_get_new_pos2(s32 baseDim, s32 xformed, s32 modifier)
return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult); return modifier - ((u32)(modifier * xformed) / (u32)(baseDim) + shiftResult);
} }
static void obj_update_pos2(struct Sprite *sprite, s32 xmod, s32 ymod) static void UpdateSpriteMatrixAnchorPos(struct Sprite *sprite, s32 x, s32 y)
{ {
s32 dim, baseDim, xFormed; s32 dim, baseDim, xFormed;
u32 matrixNum = sprite->oam.matrixNum; u32 matrixNum = sprite->oam.matrixNum;
if (xmod != 0x800) if (x != NO_ANCHOR)
{ {
dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0]; dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][0];
baseDim = dim << 8; baseDim = dim << 8;
xFormed = (dim << 16) / gOamMatrices[matrixNum].a; xFormed = (dim << 16) / gOamMatrices[matrixNum].a;
sprite->x2 = affine_get_new_pos2(baseDim, xFormed, xmod); sprite->x2 = GetAnchorCoord(baseDim, xFormed, x);
} }
if (ymod != 0x800) if (y != NO_ANCHOR)
{ {
dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1]; dim = sOamDimensionsCopy[sprite->oam.shape][sprite->oam.size][1];
baseDim = dim << 8; baseDim = dim << 8;
xFormed = (dim << 16) / gOamMatrices[matrixNum].d; xFormed = (dim << 16) / gOamMatrices[matrixNum].d;
sprite->y2 = affine_get_new_pos2(baseDim, xFormed, ymod); sprite->y2 = GetAnchorCoord(baseDim, xFormed, y);
} }
} }