Merge branch 'main' of https://github.com/abnormalhare/mp4-dtk into main
This commit is contained in:
commit
501423f03e
11 changed files with 1321 additions and 90 deletions
|
|
@ -565,3 +565,6 @@ extract:
|
|||
- symbol: wrongdisc_en
|
||||
binary: wrongdisc_en.bin
|
||||
header: wrongdisc_en.inc
|
||||
- symbol: DEMOFontBitmap
|
||||
binary: DEMOFontBitmap.bin
|
||||
header: DEMOFontBitmap.inc
|
||||
|
|
@ -447,6 +447,65 @@ dolphin/mtx/quat.c:
|
|||
dolphin/mtx/psmtx.c:
|
||||
.text start:0x800BC710 end:0x800BC9E8
|
||||
|
||||
dolphin/dvd/dvdlow.c:
|
||||
.text start:0x800BC9E8 end:0x800BD83C
|
||||
.bss start:0x801A5E00 end:0x801A5EE0
|
||||
.sdata start:0x801D38E0 end:0x801D38E8
|
||||
.sbss start:0x801D4368 end:0x801D43B0
|
||||
|
||||
dolphin/dvd/dvdfs.c:
|
||||
.text start:0x800BD83C end:0x800BE118
|
||||
.data start:0x8013C3E0 end:0x8013C548
|
||||
.sdata start:0x801D38E8 end:0x801D38F0
|
||||
.sbss start:0x801D43B0 end:0x801D43D0
|
||||
|
||||
dolphin/dvd/dvd.c:
|
||||
.text start:0x800BE118 end:0x800C059C
|
||||
.data start:0x8013C548 end:0x8013C660
|
||||
.bss start:0x801A5EE0 end:0x801A5FB8
|
||||
.sdata start:0x801D38F0 end:0x801D38F8
|
||||
.sbss start:0x801D43D0 end:0x801D4418
|
||||
|
||||
dolphin/dvd/dvdqueue.c:
|
||||
.text start:0x800C059C end:0x800C0794
|
||||
.bss start:0x801A5FB8 end:0x801A5FD8
|
||||
|
||||
dolphin/dvd/dvderror.c:
|
||||
.text start:0x800C0794 end:0x800C092C
|
||||
.data start:0x8013C660 end:0x8013C6A8
|
||||
|
||||
dolphin/dvd/fstload.c:
|
||||
.text start:0x800C092C end:0x800C0B6C
|
||||
.data start:0x8013C6A8 end:0x8013C718
|
||||
.bss start:0x801A5FD8 end:0x801A6048
|
||||
.sdata start:0x801D38F8 end:0x801D3908
|
||||
.sbss start:0x801D4418 end:0x801D4428
|
||||
|
||||
dolphin/vi.c:
|
||||
.text start:0x800C0B6C end:0x800C2980
|
||||
.data start:0x8013C718 end:0x8013C9E0
|
||||
.bss start:0x801A6048 end:0x801A6190
|
||||
.sbss start:0x801D4428 end:0x801D4478
|
||||
|
||||
dolphin/demo/DEMOFont.c:
|
||||
.data start:0x8013C9E0 end:0x8013D5E0
|
||||
|
||||
dolphin/demo/DEMOInit.c:
|
||||
.text start:0x800C2980 end:0x800C2988
|
||||
.sbss start:0x801D4478 end:0x801D4480
|
||||
|
||||
dolphin/demo/DEMOPuts.c:
|
||||
.text start:0x800C2988 end:0x800C2F84
|
||||
.sbss start:0x801D4480 end:0x801D4488
|
||||
.sdata2 start:0x801D63B8 end:0x801D63D8
|
||||
|
||||
dolphin/demo/DEMOStats.c:
|
||||
.text start:0x800C2F84 end:0x800C3CDC
|
||||
.data start:0x8013D5E0 end:0x8013D748
|
||||
.sdata start:0x801D3908 end:0x801D3910
|
||||
.sbss start:0x801D4488 end:0x801D44E8
|
||||
.sdata2 start:0x801D63D8 end:0x801D63E8
|
||||
|
||||
Runtime.PPCEABI.H/global_destructor_chain.c:
|
||||
.text start:0x800E2008 end:0x800E2068
|
||||
.dtors start:0x8011DCE8 end:0x8011DCEC
|
||||
|
|
|
|||
|
|
@ -4847,7 +4847,8 @@ fcoltbl = .data:0x80122140; // type:object size:0x40 scope:local align:32
|
|||
lbl_80122180 = .data:0x80122180; // type:object size:0x1F data:string
|
||||
lbl_8012219F = .data:0x8012219F; // type:object size:0x31
|
||||
lbl_801221D0 = .data:0x801221D0; // type:object size:0x12
|
||||
bitSizeTbl = .data:0x801221E2; // type:object size:0x10E scope:local
|
||||
bitSizeTbl = .data:0x801221E2; // type:object size:0x16 scope:local
|
||||
lbl_801221F8 = .data:0x801221F8; // type:object size:0xF8 scope:local
|
||||
jumptable_801222F0 = .data:0x801222F0; // type:object size:0x2C scope:local
|
||||
jumptable_80122320 = .data:0x80122320; // type:object size:0x28 scope:local
|
||||
jumptable_80122348 = .data:0x80122348; // type:object size:0x2C scope:local
|
||||
|
|
@ -5124,7 +5125,7 @@ lbl_80132150 = .data:0x80132150; // type:object size:0x40
|
|||
lbl_80132190 = .data:0x80132190; // type:object size:0xC data:string
|
||||
lbl_8013219C = .data:0x8013219C; // type:object size:0xC data:string
|
||||
lbl_801321A8 = .data:0x801321A8; // type:object size:0xC data:string
|
||||
lbl_801321B4 = .data:0x801321B4; // type:object size:0xC
|
||||
SaveFileNameTbl = .data:0x801321B4; // type:object size:0xC
|
||||
jumptable_801321C0 = .data:0x801321C0; // type:object size:0x34 scope:local
|
||||
SR_PreRstChk = .data:0x801321F8; // type:object size:0x10
|
||||
coveropen_en = .data:0x80132208; // type:object size:0x1384 noreloc
|
||||
|
|
@ -5289,11 +5290,18 @@ lbl_8013C514 = .data:0x8013C514; // type:object size:0x34
|
|||
jumptable_8013C5B4 = .data:0x8013C5B4; // type:object size:0x40 scope:local
|
||||
jumptable_8013C5F4 = .data:0x8013C5F4; // type:object size:0x34 scope:local
|
||||
jumptable_8013C628 = .data:0x8013C628; // type:object size:0x34 scope:local
|
||||
lbl_8013C660 = .data:0x8013C660; // type:object size:0x48 data:4byte
|
||||
ErrorTable = .data:0x8013C660; // type:object size:0x48 scope:local data:4byte
|
||||
@36 = .data:0x8013C6A8; // type:object size:0x1A scope:local data:string
|
||||
lbl_8013C718 = .data:0x8013C718; // type:object size:0x164
|
||||
timing = .data:0x8013C718; // type:object size:0x130 scope:local
|
||||
taps = .data:0x8013C848; // type:object size:0x32 scope:local
|
||||
jumptable_8013C87C = .data:0x8013C87C; // type:object size:0x58 scope:local
|
||||
lbl_8013C9E0 = .data:0x8013C9E0; // type:object size:0xC00
|
||||
lbl_8013C8D4 = .data:0x8013C8D4; // type:object size:0x29 data:string
|
||||
lbl_8013C900 = .data:0x8013C900; // type:object size:0x29 data:string
|
||||
lbl_8013C92C = .data:0x8013C92C; // type:object size:0x29 data:string
|
||||
lbl_8013C958 = .data:0x8013C958; // type:object size:0x29 data:string
|
||||
lbl_8013C984 = .data:0x8013C984; // type:object size:0x29 data:string
|
||||
lbl_8013C9B0 = .data:0x8013C9B0; // type:object size:0x29 data:string
|
||||
DEMOFontBitmap = .data:0x8013C9E0; // type:object size:0xC00 align:32
|
||||
lbl_8013D5E0 = .data:0x8013D5E0; // type:object size:0xC data:string
|
||||
lbl_8013D5EC = .data:0x8013D5EC; // type:object size:0x28
|
||||
jumptable_8013D614 = .data:0x8013D614; // type:object size:0x28 scope:local
|
||||
|
|
@ -5388,8 +5396,8 @@ processjmpbuf = .bss:0x8014C398; // type:object size:0xF8 align:8
|
|||
HuSprData = .bss:0x8014C490; // type:object size:0x9600
|
||||
HuSprGrpData = .bss:0x80155A90; // type:object size:0x5400 data:2byte
|
||||
HuSprOrder = .bss:0x8015AE90; // type:object size:0x1800
|
||||
bmpNoCC = .bss:0x8015C690; // type:object size:0x20
|
||||
HuSprLayerDrawNo = .bss:0x8015C6B0; // type:object size:0x10
|
||||
bmpNoCC = .bss:0x8015C690; // type:object size:0x20 scope:local
|
||||
HuSprLayerDrawNo = .bss:0x8015C6B0; // type:object size:0x10 scope:local
|
||||
Model = .bss:0x8015C6C0; // type:object size:0x80
|
||||
head = .bss:0x8015C740; // type:object size:0x240
|
||||
lbl_8015C980 = .bss:0x8015C980; // type:object size:0x300 scope:local data:byte
|
||||
|
|
@ -5539,16 +5547,21 @@ IdleThread = .bss:0x801A5518; // type:object size:0x310 scope:local align:8 data
|
|||
DefaultThread = .bss:0x801A5828; // type:object size:0x310 scope:local align:8 data:4byte
|
||||
IdleContext = .bss:0x801A5B38; // type:object size:0x2C8 scope:local align:8 data:4byte
|
||||
CommandList = .bss:0x801A5E00; // type:object size:0x3C scope:local data:4byte
|
||||
AlarmForTimeout = .bss:0x801A5E68; // type:object size:0x28 scope:local
|
||||
AlarmForWA = .bss:0x801A5E40; // type:object size:0x28 scope:local align:8
|
||||
AlarmForTimeout = .bss:0x801A5E68; // type:object size:0x28 scope:local align:8
|
||||
AlarmForBreak = .bss:0x801A5E90; // type:object size:0x28 scope:local align:8
|
||||
Prev = .bss:0x801A5EB8; // type:object size:0xC scope:local
|
||||
Curr = .bss:0x801A5EC4; // type:object size:0xC scope:local
|
||||
tmpBuffer = .bss:0x801A5EE0; // type:object size:0x80 scope:local align:32
|
||||
DummyCommandBlock = .bss:0x801A5F60; // type:object size:0x30 scope:local
|
||||
ResetAlarm = .bss:0x801A5F90; // type:object size:0x28 scope:local align:8
|
||||
WaitingQueue = .bss:0x801A5FB8; // type:object size:0x20 scope:local data:4byte
|
||||
bb2Buf = .bss:0x801A5FD8; // type:object size:0x3F scope:local
|
||||
block$16 = .bss:0x801A6018; // type:object size:0x30 scope:local
|
||||
regs = .bss:0x801A6048; // type:object size:0x78 data:2byte
|
||||
lbl_801A60C0 = .bss:0x801A60C0; // type:object size:0x78
|
||||
lbl_801A6138 = .bss:0x801A6138; // type:object size:0x58 data:2byte
|
||||
lbl_801A6190 = .bss:0x801A6190; // type:object size:0x20
|
||||
regs = .bss:0x801A6048; // type:object size:0x78 scope:local data:2byte
|
||||
shdwRegs = .bss:0x801A60C0; // type:object size:0x78 scope:local
|
||||
HorVer = .bss:0x801A6138; // type:object size:0x58 scope:local data:2byte
|
||||
fontTexObj = .bss:0x801A6190; // type:object size:0x20 scope:local
|
||||
lbl_801A61B0 = .bss:0x801A61B0; // type:object size:0x10
|
||||
lbl_801A61C0 = .bss:0x801A61C0; // type:object size:0x40
|
||||
gxData = .bss:0x801A6200; // type:object size:0x4F8 scope:local
|
||||
|
|
@ -5882,7 +5895,7 @@ __OSArenaLo = .sdata:0x801D38C0; // type:object size:0x4 scope:local data:4byte
|
|||
@32 = .sdata:0x801D38C8; // type:object size:0x2 scope:local data:string
|
||||
fontEncode$80 = .sdata:0x801D38D0; // type:object size:0x8 scope:local data:2byte
|
||||
Unit01 = .sdata:0x801D38D8; // type:object size:0x8
|
||||
lbl_801D38E0 = .sdata:0x801D38E0; // type:object size:0x8 data:4byte
|
||||
FirstRead = .sdata:0x801D38E0; // type:object size:0x8 scope:local data:4byte
|
||||
lbl_801D38E8 = .sdata:0x801D38E8; // type:object size:0x8 data:string
|
||||
autoInvalidation = .sdata:0x801D38F0; // type:object size:0x4 scope:local data:4byte
|
||||
@35 = .sdata:0x801D38F8; // type:object size:0x2 scope:local data:string
|
||||
|
|
@ -5999,10 +6012,10 @@ procfunc = .sbss:0x801D3B38; // type:object size:0x4 data:4byte
|
|||
processcnt = .sbss:0x801D3B3C; // type:object size:0x2 scope:local data:2byte
|
||||
processcur = .sbss:0x801D3B40; // type:object size:0x4 scope:local data:4byte
|
||||
processtop = .sbss:0x801D3B44; // type:object size:0x4 scope:local data:4byte
|
||||
HuSprPauseF = .sbss:0x801D3B48; // type:object size:0x4 data:4byte
|
||||
HuSprOrderNo = .sbss:0x801D3B4C; // type:object size:0x2 data:2byte
|
||||
HuSprOrderNum = .sbss:0x801D3B4E; // type:object size:0x2 data:2byte
|
||||
bmpCCIdx = .sbss:0x801D3B50; // type:object size:0x8 data:2byte
|
||||
HuSprPauseF = .sbss:0x801D3B48; // type:object size:0x4 scope:local data:4byte
|
||||
HuSprOrderNo = .sbss:0x801D3B4C; // type:object size:0x2 scope:local data:2byte
|
||||
HuSprOrderNum = .sbss:0x801D3B4E; // type:object size:0x2 scope:local data:2byte
|
||||
bmpCCIdx = .sbss:0x801D3B50; // type:object size:0x8 scope:local data:2byte
|
||||
MaterialTop = .sbss:0x801D3B58; // type:object size:0x4 data:4byte
|
||||
AttributeTop = .sbss:0x801D3B5C; // type:object size:0x4 data:4byte
|
||||
ClusterTop = .sbss:0x801D3B60; // type:object size:0x4 data:4byte
|
||||
|
|
@ -6033,14 +6046,14 @@ matChgCnt = .sbss:0x801D3BBE; // type:object size:0x2 scope:local data:2byte
|
|||
DLFirstF = .sbss:0x801D3BC0; // type:object size:0x4 scope:local data:4byte
|
||||
modelObjNum = .sbss:0x801D3BC4; // type:object size:0x2 data:2byte
|
||||
modelMeshNum = .sbss:0x801D3BC6; // type:object size:0x2 data:2byte
|
||||
totalTexCacheCnted = .sbss:0x801D3BC8; // type:object size:0x4 scope:local data:4byte
|
||||
totalTexCacheCnt = .sbss:0x801D3BCC; // type:object size:0x4 scope:local data:4byte
|
||||
totalTexCnted = .sbss:0x801D3BD0; // type:object size:0x4 scope:local data:4byte
|
||||
totalTexCnt = .sbss:0x801D3BD4; // type:object size:0x4 scope:local data:4byte
|
||||
totalMatCnted = .sbss:0x801D3BD8; // type:object size:0x4 scope:local data:4byte
|
||||
totalMatCnt = .sbss:0x801D3BDC; // type:object size:0x4 scope:local data:4byte
|
||||
totalTexCacheCnted = .sbss:0x801D3BC8; // type:object size:0x4 data:4byte
|
||||
totalTexCacheCnt = .sbss:0x801D3BCC; // type:object size:0x4 data:4byte
|
||||
totalTexCnted = .sbss:0x801D3BD0; // type:object size:0x4 data:4byte
|
||||
totalTexCnt = .sbss:0x801D3BD4; // type:object size:0x4 data:4byte
|
||||
totalMatCnted = .sbss:0x801D3BD8; // type:object size:0x4 data:4byte
|
||||
totalMatCnt = .sbss:0x801D3BDC; // type:object size:0x4 data:4byte
|
||||
totalPolyCnted = .sbss:0x801D3BE0; // type:object size:0x4 data:4byte
|
||||
totalPolyCnt = .sbss:0x801D3BE4; // type:object size:0x4 scope:local data:4byte
|
||||
totalPolyCnt = .sbss:0x801D3BE4; // type:object size:0x4 data:4byte
|
||||
hookIdx = .sbss:0x801D3BE8; // type:object size:0x2 scope:local data:2byte
|
||||
kColorIdx = .sbss:0x801D3BEC; // type:object size:0x4 scope:local data:4byte
|
||||
kColor = .sbss:0x801D3BF0; // type:object size:0x4 scope:local data:byte
|
||||
|
|
@ -6218,11 +6231,10 @@ lbl_801D3E90 = .sbss:0x801D3E90; // type:object size:0x4
|
|||
lbl_801D3E94 = .sbss:0x801D3E94; // type:object size:0x4
|
||||
lbl_801D3E98 = .sbss:0x801D3E98; // type:object size:0x8
|
||||
lbl_801D3EA0 = .sbss:0x801D3EA0; // type:object size:0x8
|
||||
lbl_801D3EA8 = .sbss:0x801D3EA8; // type:object size:0x2 data:2byte
|
||||
lbl_801D3EAA = .sbss:0x801D3EAA; // type:object size:0x1 data:byte
|
||||
lbl_801D3EAC = .sbss:0x801D3EAC; // type:object size:0x4
|
||||
lbl_801D3EB0 = .sbss:0x801D3EB0; // type:object size:0x4 data:4byte
|
||||
lbl_801D3EB4 = .sbss:0x801D3EB4; // type:object size:0x4 data:4byte
|
||||
curSlotNo = .sbss:0x801D3EA8; // type:object size:0x2 data:2byte
|
||||
curBoxNo = .sbss:0x801D3EAA; // type:object size:0x1 data:byte
|
||||
saveExecF = .sbss:0x801D3EAC; // type:object size:0x4
|
||||
SLSerialNo = .sbss:0x801D3EB0; // type:object size:0x8 data:4byte
|
||||
H_ResetReady = .sbss:0x801D3EB8; // type:object size:0x4 scope:local data:4byte
|
||||
SR_RestartChk = .sbss:0x801D3EBC; // type:object size:0x4 scope:local data:4byte
|
||||
SR_ExecReset = .sbss:0x801D3EC0; // type:object size:0x4 data:4byte
|
||||
|
|
@ -6541,26 +6553,24 @@ Reschedule = .sbss:0x801D4358; // type:object size:0x4 scope:local data:4byte
|
|||
__DBInterface = .sbss:0x801D4360; // type:object size:0x4 scope:global data:4byte
|
||||
DBVerbose = .sbss:0x801D4364; // type:object size:0x4 scope:global data:4byte
|
||||
StopAtNextInt = .sbss:0x801D4368; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D436C = .sbss:0x801D436C; // type:object size:0x4 data:4byte
|
||||
LastLength = .sbss:0x801D436C; // type:object size:0x4 scope:local data:4byte
|
||||
Callback = .sbss:0x801D4370; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D4374 = .sbss:0x801D4374; // type:object size:0x4 data:4byte
|
||||
ResetCoverCallback = .sbss:0x801D4374; // type:object size:0x4 scope:local data:4byte
|
||||
LastResetEnd = .sbss:0x801D4378; // type:object size:0x8 scope:local data:4byte
|
||||
ResetOccurred = .sbss:0x801D4380; // type:object size:0x4 scope:local data:4byte
|
||||
WaitingCoverClose = .sbss:0x801D4384; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D4388 = .sbss:0x801D4388; // type:object size:0x4 data:4byte
|
||||
Breaking = .sbss:0x801D4388; // type:object size:0x4 scope:local data:4byte
|
||||
WorkAroundType = .sbss:0x801D438C; // type:object size:0x4 scope:local data:4byte
|
||||
WorkAroundSeekLocation = .sbss:0x801D4390; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D4398 = .sbss:0x801D4398; // type:object size:0x4 data:4byte
|
||||
lbl_801D439C = .sbss:0x801D439C; // type:object size:0x4 data:4byte
|
||||
lbl_801D43A0 = .sbss:0x801D43A0; // type:object size:0x4 data:4byte
|
||||
lbl_801D43A4 = .sbss:0x801D43A4; // type:object size:0x4 data:4byte
|
||||
lbl_801D43A8 = .sbss:0x801D43A8; // type:object size:0x4 data:4byte
|
||||
LastReadFinished = .sbss:0x801D4398; // type:object size:0x8 scope:local data:4byte
|
||||
LastReadIssued = .sbss:0x801D43A0; // type:object size:0x8 scope:local data:4byte
|
||||
LastCommandWasRead = .sbss:0x801D43A8; // type:object size:0x4 scope:local data:4byte
|
||||
NextCommandNumber = .sbss:0x801D43AC; // type:object size:0x4 scope:local data:4byte
|
||||
BootInfo = .sbss:0x801D43B0; // type:object size:0x4 scope:local data:4byte
|
||||
FstStart = .sbss:0x801D43B4; // type:object size:0x4 scope:local data:4byte
|
||||
FstStringStart = .sbss:0x801D43B8; // type:object size:0x4 scope:local data:4byte
|
||||
MaxEntryNum = .sbss:0x801D43BC; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D43C0 = .sbss:0x801D43C0; // type:object size:0x4 data:4byte
|
||||
currentDirectory = .sbss:0x801D43C0; // type:object size:0x4 scope:local data:4byte
|
||||
__DVDLongFileNameFlag = .sbss:0x801D43C4; // type:object size:0x4 scope:global data:4byte
|
||||
__DVDThreadQueue = .sbss:0x801D43C8; // type:object size:0x8 scope:global
|
||||
executing = .sbss:0x801D43D0; // type:object size:0x4 scope:local data:4byte
|
||||
|
|
@ -6568,66 +6578,64 @@ currID = .sbss:0x801D43D4; // type:object size:0x4 scope:local data:4byte
|
|||
bootInfo = .sbss:0x801D43D8; // type:object size:0x4 scope:local data:4byte
|
||||
PauseFlag = .sbss:0x801D43DC; // type:object size:0x4 scope:local data:4byte
|
||||
PausingFlag = .sbss:0x801D43E0; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D43E4 = .sbss:0x801D43E4; // type:object size:0x4 data:4byte
|
||||
AutoFinishing = .sbss:0x801D43E4; // type:object size:0x4 scope:local data:4byte
|
||||
FatalErrorFlag = .sbss:0x801D43E8; // type:object size:0x4 scope:local data:4byte
|
||||
CurrCommand = .sbss:0x801D43EC; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D43F0 = .sbss:0x801D43F0; // type:object size:0x4 data:4byte
|
||||
lbl_801D43F4 = .sbss:0x801D43F4; // type:object size:0x4 data:4byte
|
||||
Canceling = .sbss:0x801D43F0; // type:object size:0x4 scope:local data:4byte
|
||||
CancelCallback = .sbss:0x801D43F4; // type:object size:0x4 scope:local data:4byte
|
||||
ResumeFromHere = .sbss:0x801D43F8; // type:object size:0x4 scope:local data:4byte
|
||||
CancelLastError = .sbss:0x801D43FC; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D4400 = .sbss:0x801D4400; // type:object size:0x4 data:4byte
|
||||
lbl_801D4404 = .sbss:0x801D4404; // type:object size:0x4 data:4byte
|
||||
LastError = .sbss:0x801D4400; // type:object size:0x4 scope:local data:4byte
|
||||
NumInternalRetry = .sbss:0x801D4404; // type:object size:0x4 scope:local data:4byte
|
||||
ResetRequired = .sbss:0x801D4408; // type:object size:0x4 scope:local data:4byte
|
||||
FirstTimeInBootrom = .sbss:0x801D440C; // type:object size:0x4 scope:local data:4byte
|
||||
DVDInitialized = .sbss:0x801D4410; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D4414 = .sbss:0x801D4414; // type:object size:0x4 data:4byte
|
||||
lbl_801D4418 = .sbss:0x801D4418; // type:object size:0x4 data:4byte
|
||||
LastState = .sbss:0x801D4414; // type:object size:0x4 scope:local data:4byte
|
||||
status = .sbss:0x801D4418; // type:object size:0x4 scope:local data:4byte
|
||||
bb2 = .sbss:0x801D441C; // type:object size:0x4 scope:local data:4byte
|
||||
idTmp = .sbss:0x801D4420; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D4428 = .sbss:0x801D4428; // type:object size:0x4 data:4byte
|
||||
lbl_801D442C = .sbss:0x801D442C; // type:object size:0x4 data:4byte
|
||||
lbl_801D4430 = .sbss:0x801D4430; // type:object size:0x8
|
||||
lbl_801D4438 = .sbss:0x801D4438; // type:object size:0x4 data:4byte
|
||||
lbl_801D443C = .sbss:0x801D443C; // type:object size:0x4 data:4byte
|
||||
lbl_801D4440 = .sbss:0x801D4440; // type:object size:0x4 data:4byte
|
||||
lbl_801D4444 = .sbss:0x801D4444; // type:object size:0x2 data:2byte
|
||||
lbl_801D4446 = .sbss:0x801D4446; // type:object size:0x2 data:2byte
|
||||
lbl_801D4448 = .sbss:0x801D4448; // type:object size:0x8 data:4byte
|
||||
lbl_801D4450 = .sbss:0x801D4450; // type:object size:0x4 data:4byte
|
||||
lbl_801D4454 = .sbss:0x801D4454; // type:object size:0x4 data:4byte
|
||||
lbl_801D4458 = .sbss:0x801D4458; // type:object size:0x8 data:4byte
|
||||
lbl_801D4460 = .sbss:0x801D4460; // type:object size:0x4 data:4byte
|
||||
lbl_801D4464 = .sbss:0x801D4464; // type:object size:0x4 data:4byte
|
||||
lbl_801D4468 = .sbss:0x801D4468; // type:object size:0x4 data:4byte
|
||||
retraceCount = .sbss:0x801D4428; // type:object size:0x4 scope:local data:4byte
|
||||
flushFlag = .sbss:0x801D442C; // type:object size:0x4 scope:local data:4byte
|
||||
retraceQueue = .sbss:0x801D4430; // type:object size:0x8 scope:local
|
||||
PreCB = .sbss:0x801D4438; // type:object size:0x4 scope:local data:4byte
|
||||
PostCB = .sbss:0x801D443C; // type:object size:0x4 scope:local data:4byte
|
||||
encoderType = .sbss:0x801D4440; // type:object size:0x4 scope:local data:4byte
|
||||
displayOffsetH = .sbss:0x801D4444; // type:object size:0x2 scope:local data:2byte
|
||||
displayOffsetV = .sbss:0x801D4446; // type:object size:0x2 scope:local data:2byte
|
||||
changeMode = .sbss:0x801D4448; // type:object size:0x4 scope:local data:4byte
|
||||
changed = .sbss:0x801D4450; // type:object size:0x8 scope:local align:8 data:4byte
|
||||
shdwChangeMode = .sbss:0x801D4458; // type:object size:0x4 scope:local data:4byte
|
||||
shdwChanged = .sbss:0x801D4460; // type:object size:0x8 scope:local align:8 data:4byte
|
||||
CurrTiming = .sbss:0x801D4468; // type:object size:0x4 scope:local data:4byte
|
||||
CurrTvMode = .sbss:0x801D446C; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D4470 = .sbss:0x801D4470; // type:object size:0x4 data:4byte
|
||||
lbl_801D4474 = .sbss:0x801D4474; // type:object size:0x4 data:4byte
|
||||
lbl_801D4478 = .sbss:0x801D4478; // type:object size:0x8 data:4byte
|
||||
lbl_801D4480 = .sbss:0x801D4480; // type:object size:0x8 data:4byte
|
||||
lbl_801D4488 = .sbss:0x801D4488; // type:object size:0x4 data:4byte
|
||||
lbl_801D448C = .sbss:0x801D448C; // type:object size:0x4 data:4byte
|
||||
lbl_801D4490 = .sbss:0x801D4490; // type:object size:0x4 data:4byte
|
||||
lbl_801D4494 = .sbss:0x801D4494; // type:object size:0x4 data:4byte
|
||||
lbl_801D4498 = .sbss:0x801D4498; // type:object size:0x4 data:4byte
|
||||
lbl_801D449C = .sbss:0x801D449C; // type:object size:0x4 data:4byte
|
||||
lbl_801D44A0 = .sbss:0x801D44A0; // type:object size:0x4 data:4byte
|
||||
lbl_801D44A4 = .sbss:0x801D44A4; // type:object size:0x4 data:4byte
|
||||
lbl_801D44A8 = .sbss:0x801D44A8; // type:object size:0x4 data:4byte
|
||||
lbl_801D44AC = .sbss:0x801D44AC; // type:object size:0x4 data:4byte
|
||||
lbl_801D44B0 = .sbss:0x801D44B0; // type:object size:0x4 data:4byte
|
||||
lbl_801D44B4 = .sbss:0x801D44B4; // type:object size:0x4 data:4byte
|
||||
lbl_801D44B8 = .sbss:0x801D44B8; // type:object size:0x4 data:4byte
|
||||
lbl_801D44BC = .sbss:0x801D44BC; // type:object size:0x4 data:4byte
|
||||
lbl_801D44C0 = .sbss:0x801D44C0; // type:object size:0x4 data:4byte
|
||||
lbl_801D44C4 = .sbss:0x801D44C4; // type:object size:0x4 data:4byte
|
||||
lbl_801D44C8 = .sbss:0x801D44C8; // type:object size:0x4 data:4byte
|
||||
lbl_801D44CC = .sbss:0x801D44CC; // type:object size:0x4 data:4byte
|
||||
lbl_801D44D0 = .sbss:0x801D44D0; // type:object size:0x4 data:4byte
|
||||
lbl_801D44D4 = .sbss:0x801D44D4; // type:object size:0x4 data:4byte
|
||||
lbl_801D44D8 = .sbss:0x801D44D8; // type:object size:0x4 data:4byte
|
||||
lbl_801D44DC = .sbss:0x801D44DC; // type:object size:0x4 data:4byte
|
||||
lbl_801D44E0 = .sbss:0x801D44E0; // type:object size:0x4 data:4byte
|
||||
lbl_801D44E4 = .sbss:0x801D44E4; // type:object size:0x4 data:4byte
|
||||
FBSet = .sbss:0x801D4470; // type:object size:0x4 scope:local data:4byte
|
||||
message$343 = .sbss:0x801D4474; // type:object size:0x4 scope:local data:4byte
|
||||
rmode = .sbss:0x801D4478; // type:object size:0x8 scope:local data:4byte
|
||||
fontShift = .sbss:0x801D4480; // type:object size:0x8 scope:local data:4byte
|
||||
DemoStat = .sbss:0x801D4488; // type:object size:0x4 scope:local data:4byte
|
||||
DemoStatIndx = .sbss:0x801D448C; // type:object size:0x4 scope:local data:4byte
|
||||
DemoStatMaxIndx = .sbss:0x801D4490; // type:object size:0x4 scope:local data:4byte
|
||||
DemoStatClocks = .sbss:0x801D4494; // type:object size:0x4 scope:local data:4byte
|
||||
DemoStatDisp = .sbss:0x801D4498; // type:object size:0x4 scope:local data:4byte
|
||||
topPixIn = .sbss:0x801D449C; // type:object size:0x4 scope:local data:4byte
|
||||
topPixOut = .sbss:0x801D44A0; // type:object size:0x4 scope:local data:4byte
|
||||
botPixIn = .sbss:0x801D44A4; // type:object size:0x4 scope:local data:4byte
|
||||
botPixOut = .sbss:0x801D44A8; // type:object size:0x4 scope:local data:4byte
|
||||
clrPixIn = .sbss:0x801D44AC; // type:object size:0x4 scope:local data:4byte
|
||||
copyClks = .sbss:0x801D44B0; // type:object size:0x4 scope:local data:4byte
|
||||
vcCheck = .sbss:0x801D44B4; // type:object size:0x4 scope:local data:4byte
|
||||
vcMiss = .sbss:0x801D44B8; // type:object size:0x4 scope:local data:4byte
|
||||
vcStall = .sbss:0x801D44BC; // type:object size:0x4 scope:local data:4byte
|
||||
cpReq = .sbss:0x801D44C0; // type:object size:0x4 scope:local data:4byte
|
||||
tcReq = .sbss:0x801D44C4; // type:object size:0x4 scope:local data:4byte
|
||||
cpuRdReq = .sbss:0x801D44C8; // type:object size:0x4 scope:local data:4byte
|
||||
cpuWrReq = .sbss:0x801D44CC; // type:object size:0x4 scope:local data:4byte
|
||||
dspReq = .sbss:0x801D44D0; // type:object size:0x4 scope:local data:4byte
|
||||
ioReq = .sbss:0x801D44D4; // type:object size:0x4 scope:local data:4byte
|
||||
viReq = .sbss:0x801D44D8; // type:object size:0x4 scope:local data:4byte
|
||||
peReq = .sbss:0x801D44DC; // type:object size:0x4 scope:local data:4byte
|
||||
rfReq = .sbss:0x801D44E0; // type:object size:0x4 scope:local data:4byte
|
||||
fiReq = .sbss:0x801D44E4; // type:object size:0x4 scope:local data:4byte
|
||||
lbl_801D44E8 = .sbss:0x801D44E8; // type:object size:0x4 data:4byte
|
||||
lbl_801D44EC = .sbss:0x801D44EC; // type:object size:0x4 data:4byte
|
||||
lbl_801D44F0 = .sbss:0x801D44F0; // type:object size:0x4 data:4byte
|
||||
|
|
|
|||
30
configure.py
30
configure.py
|
|
@ -243,8 +243,8 @@ config.libs = [
|
|||
Object(Matching, "game/memory.c"),
|
||||
Object(Matching, "game/printfunc.c"),
|
||||
Object(Matching, "game/process.c"),
|
||||
Object(NonMatching, "game/sprman.c"),
|
||||
Object(NonMatching, "game/sprput.c"),
|
||||
Object(Matching, "game/sprman.c"),
|
||||
Object(Matching, "game/sprput.c"),
|
||||
Object(NonMatching, "game/hsfload.c"),
|
||||
Object(NonMatching, "game/hsfdraw.c"),
|
||||
Object(NonMatching, "game/hsfman.c"),
|
||||
|
|
@ -334,6 +334,32 @@ config.libs = [
|
|||
Object(NonMatching, "dolphin/mtx/psmtx.c"),
|
||||
],
|
||||
),
|
||||
DolphinLib(
|
||||
"dvd",
|
||||
[
|
||||
Object(NonMatching, "dolphin/dvd/dvdlow.c"),
|
||||
Object(NonMatching, "dolphin/dvd/dvdfs.c"),
|
||||
Object(NonMatching, "dolphin/dvd/dvd.c"),
|
||||
Object(NonMatching, "dolphin/dvd/dvdqueue.c"),
|
||||
Object(NonMatching, "dolphin/dvd/dvderror.c"),
|
||||
Object(NonMatching, "dolphin/dvd/fstload.c"),
|
||||
],
|
||||
),
|
||||
DolphinLib(
|
||||
"vi",
|
||||
[
|
||||
Object(NonMatching, "dolphin/vi.c"),
|
||||
],
|
||||
),
|
||||
DolphinLib(
|
||||
"demo",
|
||||
[
|
||||
Object(NonMatching, "dolphin/demo/DEMOInit.c"),
|
||||
Object(NonMatching, "dolphin/demo/DEMOFont.c"),
|
||||
Object(NonMatching, "dolphin/demo/DEMOPuts.c"),
|
||||
Object(NonMatching, "dolphin/demo/DEMOStats.c"),
|
||||
],
|
||||
),
|
||||
{
|
||||
"lib": "Runtime.PPCEABI.H",
|
||||
"mw_version": config.linker_version,
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
#include "types.h"
|
||||
#include "common_enums.h"
|
||||
#include "dolphin/dvd.h"
|
||||
#include "dolphin/mtx/GeoTypes.h"
|
||||
#include "dolphin/gx/GXEnum.h"
|
||||
|
||||
typedef struct om_ovl_his_data {
|
||||
OverlayID overlay;
|
||||
|
|
@ -157,4 +159,120 @@ typedef struct om_obj_data {
|
|||
void *data;
|
||||
} omObjData;
|
||||
|
||||
typedef struct anim_frame_data {
|
||||
s16 pat;
|
||||
s16 time;
|
||||
s16 shiftX;
|
||||
s16 shiftY;
|
||||
s16 flip;
|
||||
s16 pad;
|
||||
} AnimFrameData;
|
||||
|
||||
typedef struct anim_bank_data {
|
||||
s16 timeNum;
|
||||
s16 unk;
|
||||
AnimFrameData *frame;
|
||||
} AnimBankData;
|
||||
|
||||
typedef struct anim_layer_data {
|
||||
u8 alpha;
|
||||
u8 flip;
|
||||
s16 bmpNo;
|
||||
s16 startX;
|
||||
s16 startY;
|
||||
s16 sizeX;
|
||||
s16 sizeY;
|
||||
s16 shiftX;
|
||||
s16 shiftY;
|
||||
s16 vtx[8];
|
||||
} AnimLayerData;
|
||||
|
||||
typedef struct anim_pat_data {
|
||||
s16 layerNum;
|
||||
s16 centerX;
|
||||
s16 centerY;
|
||||
s16 sizeX;
|
||||
s16 sizeY;
|
||||
AnimLayerData *layer;
|
||||
} AnimPatData;
|
||||
|
||||
typedef struct anim_bmp_data {
|
||||
u8 pixSize;
|
||||
u8 dataFmt;
|
||||
s16 palNum;
|
||||
s16 sizeX;
|
||||
s16 sizeY;
|
||||
u32 dataSize;
|
||||
void *palData;
|
||||
void *data;
|
||||
} AnimBmpData;
|
||||
|
||||
typedef struct anim_data {
|
||||
s16 bankNum;
|
||||
s16 patNum;
|
||||
s16 bmpNum;
|
||||
s16 useNum;
|
||||
AnimBankData *bank;
|
||||
AnimPatData *pat;
|
||||
AnimBmpData *bmp;
|
||||
} AnimData;
|
||||
|
||||
typedef struct sprite_data {
|
||||
u8 r;
|
||||
u8 g;
|
||||
u8 b;
|
||||
char draw_no;
|
||||
short frame;
|
||||
short bank;
|
||||
short attr;
|
||||
short dirty_flag;
|
||||
short prio;
|
||||
float time;
|
||||
float x;
|
||||
float y;
|
||||
float z_rot;
|
||||
float scale_x;
|
||||
float scale_y;
|
||||
float speed;
|
||||
float a;
|
||||
GXTexWrapMode wrap_s;
|
||||
GXTexWrapMode wrap_t;
|
||||
short tex_scale_x;
|
||||
short tex_scale_y;
|
||||
Mtx *group_mtx;
|
||||
union {
|
||||
AnimData *data;
|
||||
void (*func)(struct sprite_data *sprite);
|
||||
};
|
||||
AnimPatData *pat_data;
|
||||
AnimFrameData *frame_data;
|
||||
short work[4];
|
||||
AnimData *bg;
|
||||
unsigned short bg_bank;
|
||||
short scissor_x;
|
||||
short scissor_y;
|
||||
short scissor_w;
|
||||
short scissor_h;
|
||||
} SpriteData;
|
||||
|
||||
typedef struct sprite_group_data {
|
||||
short capacity;
|
||||
float x;
|
||||
float y;
|
||||
float z_rot;
|
||||
float scale_x;
|
||||
float scale_y;
|
||||
float center_x;
|
||||
float center_y;
|
||||
short *members;
|
||||
Mtx mtx;
|
||||
} SpriteGroupData;
|
||||
|
||||
typedef struct sprite_order_data {
|
||||
unsigned short group;
|
||||
unsigned short sprite;
|
||||
unsigned short prio;
|
||||
unsigned short next;
|
||||
} SpriteOrderData;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -21,6 +21,12 @@ void GXSetTevIndirect(GXTevStageID tev_stage, GXIndTexStageID ind_stage, GXIndTe
|
|||
GXIndTexAlphaSel alpha_sel);
|
||||
void GXSetTevIndWarp(GXTevStageID tev_stage, GXIndTexStageID ind_stage, GXBool signed_offsets,
|
||||
GXBool replace_mode, GXIndTexMtxID matrix_sel);
|
||||
|
||||
void GXSetTevIndTile (GXTevStageID tev_stage, GXIndTexStageID ind_stage,
|
||||
u16 tilesize_s, u16 tilesize_t,
|
||||
u16 tilespacing_s, u16 tilespacing_t,
|
||||
GXIndTexFormat format, GXIndTexMtxID matrix_sel,
|
||||
GXIndTexBiasSel bias_sel, GXIndTexAlphaSel alpha_sel);
|
||||
void GXSetIndTexCoordScale(GXIndTexStageID ind_state, GXIndTexScale scale_s, GXIndTexScale scale_t);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ void GXInitTexCacheRegion(GXTexRegion* region, GXBool is_32b_mipmap, u32 tmem_ev
|
|||
GXTexRegionCallback GXSetTexRegionCallback(GXTexRegionCallback callback);
|
||||
void GXInvalidateTexRegion(const GXTexRegion* region);
|
||||
|
||||
void GXSetTexCoordScaleManually(GXTexCoordID coord, GXBool enable, u16 ss, u16 ts);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include "dolphin/mtx.h"
|
||||
#include "dolphin/gx/GXStruct.h"
|
||||
|
||||
void Hu3DLayerHookSet(short layer, void (*func)(short layer));
|
||||
void Hu3D2Dto3D(Vec3f*, s32, Vec3f*);
|
||||
void Hu3DModelLightInfoSet(s32, s32);
|
||||
void Hu3DBGColorSet(u8, u8, u8);
|
||||
|
|
@ -159,7 +160,50 @@ void espKill(s16);
|
|||
void espDispOn(s16);
|
||||
void espPosSet(s16, f32, f32);
|
||||
|
||||
void HuSprInit(void);
|
||||
void HuSprClose(void);
|
||||
void HuSprExec(short draw_no);
|
||||
void HuSprBegin(void);
|
||||
SpriteData *HuSprCall(void);
|
||||
void HuSprFinish(void);
|
||||
void HuSprPauseSet(BOOL value);
|
||||
AnimData *HuSprAnimRead(void *data);
|
||||
void HuSprAnimLock(AnimData *anim);
|
||||
short HuSprCreate(AnimData *anim, short prio, short bank);
|
||||
short HuSprFuncCreate(void (*func)(SpriteData *sprite), short prio);
|
||||
short HuSprGrpCreate(short capacity);
|
||||
short HuSprGrpCopy(short group);
|
||||
void HuSprGrpMemberSet(short group, short member, short sprite);
|
||||
void HuSprGrpMemberKill(short group, short member);
|
||||
void HuSprGrpKill(short group);
|
||||
void HuSprKill(short sprite);
|
||||
void HuSprAnimKill(AnimData *anim);
|
||||
void HuSprAttrSet(short group, short member, int attr);
|
||||
void HuSprAttrReset(short group, short member, int attr);
|
||||
void HuSprPosSet(short group, short member, float x, float y);
|
||||
void HuSprZRotSet(short group, short member, float z_rot);
|
||||
void HuSprScaleSet(short group, short member, float x, float y);
|
||||
void HuSprTPLvlSet(short group, short member, float tp_lvl);
|
||||
void HuSprColorSet(short group, short member, u8 r, u8 g, u8 b);
|
||||
void HuSprSpeedSet(short group, short member, float speed);
|
||||
void HuSprBankSet(short group, short member, short bank);
|
||||
void HuSprGrpPosSet(short group, float x, float y);
|
||||
void HuSprGrpCenterSet(short group, float x, float y);
|
||||
void HuSprGrpZRotSet(short group, float z_rot);
|
||||
void HuSprGrpScaleSet(short group, float x, float y);
|
||||
void HuSprGrpTPLvlSet(short group, float tp_lvl);
|
||||
void HuSprGrpDrawNoSet(short group, int draw_no);
|
||||
void HuSprDrawNoSet(short group, short member, int draw_no);
|
||||
void HuSprPriSet(short group, short member, short prio);
|
||||
void HuSprGrpScissorSet(short group, short x, short y, short w, short h);
|
||||
void HuSprScissorSet(short group, short member, short x, short y, short w, short h);
|
||||
AnimData *HuSprAnimMake(short sizeX, short sizeY, short dataFmt);
|
||||
void HuSprBGSet(short group, short member, AnimData *bg, short bg_bank);
|
||||
void HuSprSprBGSet(short sprite, AnimData *bg, short bg_bank);
|
||||
void AnimDebug(AnimData *anim);
|
||||
void HuSprDispInit(void);
|
||||
void HuSprDisp(SpriteData *sprite);
|
||||
void HuSprTexLoad(AnimData *anim, short bmp, short slot, GXTexWrapMode wrap_s, GXTexWrapMode wrap_t, GXTexFilter filter);
|
||||
|
||||
void HuWinAllKill(void);
|
||||
void HuWinMesSet(s16, s32);
|
||||
|
|
|
|||
|
|
@ -48,4 +48,6 @@ extern OverlayID omprevovl;
|
|||
extern PlayerState GWPlayer[4];
|
||||
extern SystemState GWSystem;
|
||||
|
||||
extern u32 minimumVcount;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
712
src/game/sprman.c
Normal file
712
src/game/sprman.c
Normal file
|
|
@ -0,0 +1,712 @@
|
|||
#include "common.h"
|
||||
#include "dolphin/mtx.h"
|
||||
|
||||
SpriteData HuSprData[384];
|
||||
SpriteGroupData HuSprGrpData[256];
|
||||
static SpriteOrderData HuSprOrder[384*2];
|
||||
|
||||
static short HuSprOrderNum;
|
||||
static short HuSprOrderNo;
|
||||
static BOOL HuSprPauseF;
|
||||
|
||||
|
||||
static void HuSprOrderEntry(short group, short sprite);
|
||||
|
||||
void mtxTransCat(Mtx matrix, float x, float y, int z); //Last argument should be a float
|
||||
|
||||
void HuSprInit(void)
|
||||
{
|
||||
short i;
|
||||
SpriteData *sprite;
|
||||
SpriteGroupData *group;
|
||||
for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) {
|
||||
sprite->data = NULL;
|
||||
}
|
||||
for(group = HuSprGrpData, i=0; i<256; i++, group++) {
|
||||
group->capacity = 0;
|
||||
}
|
||||
sprite = &HuSprData[0];
|
||||
sprite->prio = 0;
|
||||
sprite->data = (void *)1;
|
||||
HuSprPauseF = FALSE;
|
||||
}
|
||||
|
||||
void HuSprClose(void)
|
||||
{
|
||||
short i;
|
||||
SpriteGroupData *group;
|
||||
SpriteData *sprite;
|
||||
|
||||
for(group = HuSprGrpData, i=0; i<256; i++, group++) {
|
||||
if(group->capacity != 0) {
|
||||
HuSprGrpKill(i);
|
||||
}
|
||||
}
|
||||
for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) {
|
||||
if(sprite->data) {
|
||||
HuSprKill(i);
|
||||
}
|
||||
}
|
||||
HuSprPauseF = FALSE;
|
||||
}
|
||||
|
||||
void HuSprExec(short draw_no)
|
||||
{
|
||||
SpriteData *sprite;
|
||||
while(sprite = HuSprCall()) {
|
||||
if(!(sprite->attr & 0x4) && sprite->draw_no == draw_no) {
|
||||
HuSprDisp(sprite);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprBegin(void)
|
||||
{
|
||||
Mtx temp, rot;
|
||||
short i, j;
|
||||
Vec axis = {0, 0, 1};
|
||||
SpriteGroupData *group;
|
||||
group = HuSprGrpData;
|
||||
HuSprOrderNum = 1;
|
||||
HuSprOrder[0].next = 0;
|
||||
HuSprOrder[0].prio = -1;
|
||||
for(i=0; i<256; i++, group++) {
|
||||
if(group->capacity != 0) {
|
||||
MTXTrans(temp, group->center_x*group->scale_x, group->center_y*group->scale_y, 0.0f);
|
||||
MTXRotAxisDeg(rot, &axis, group->z_rot);
|
||||
MTXConcat(rot, temp, group->mtx);
|
||||
MTXScale(temp, group->scale_x, group->scale_y, 1.0f);
|
||||
MTXConcat(group->mtx, temp, group->mtx);
|
||||
mtxTransCat(group->mtx, group->x, group->y, 0);
|
||||
for(j=0; j<group->capacity; j++) {
|
||||
if(group->members[j] != -1) {
|
||||
HuSprOrderEntry(i, group->members[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
HuSprOrderNo = 0;
|
||||
}
|
||||
|
||||
static void HuSprOrderEntry(short group, short sprite)
|
||||
{
|
||||
SpriteOrderData *order = &HuSprOrder[HuSprOrderNum];
|
||||
short prio = HuSprData[sprite].prio;
|
||||
short prev, next;
|
||||
if(HuSprOrderNum >= 384*2) {
|
||||
OSReport("Order Max Over!\n");
|
||||
return;
|
||||
}
|
||||
next = HuSprOrder[0].next;
|
||||
for(prev = 0; next != 0; prev = next, next = HuSprOrder[next].next) {
|
||||
if(HuSprOrder[next].prio < prio) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
order->next = HuSprOrder[prev].next;
|
||||
HuSprOrder[prev].next = HuSprOrderNum;
|
||||
order->prio = prio;
|
||||
order->group = group;
|
||||
order->sprite = sprite;
|
||||
HuSprOrderNum++;
|
||||
}
|
||||
|
||||
SpriteData *HuSprCall(void)
|
||||
{
|
||||
HuSprOrderNo = HuSprOrder[HuSprOrderNo].next;
|
||||
if(HuSprOrderNo != 0) {
|
||||
SpriteOrderData *order = &HuSprOrder[HuSprOrderNo];
|
||||
SpriteData *sprite = &HuSprData[order->sprite];
|
||||
sprite->group_mtx = &HuSprGrpData[order->group].mtx;
|
||||
if(sprite->attr & 0x10) {
|
||||
return sprite;
|
||||
}
|
||||
sprite->frame_data = &sprite->data->bank[sprite->bank].frame[sprite->frame];
|
||||
sprite->pat_data = &sprite->data->pat[sprite->frame_data->pat];
|
||||
return sprite;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void SpriteCalcFrame(SpriteData *sprite, AnimBankData *bank, AnimFrameData **frame, short wrap)
|
||||
{
|
||||
if(sprite->time >= (*frame)->time) {
|
||||
sprite->frame++;
|
||||
sprite->time -= (*frame)->time;
|
||||
if(sprite->frame >= bank->timeNum || (*frame)[1].time == -1) {
|
||||
if(wrap) {
|
||||
sprite->frame = 0;
|
||||
} else {
|
||||
sprite->frame = bank->timeNum-1;
|
||||
}
|
||||
}
|
||||
*frame = &bank->frame[sprite->frame];
|
||||
} else if(sprite->time < 0) {
|
||||
sprite->frame--;
|
||||
if(sprite->frame < 0) {
|
||||
if(wrap) {
|
||||
sprite->frame = bank->timeNum-1;
|
||||
} else {
|
||||
sprite->frame = 0;
|
||||
}
|
||||
}
|
||||
*frame = &bank->frame[sprite->frame];
|
||||
sprite->time += (*frame)->time;
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprFinish(void)
|
||||
{
|
||||
AnimData *anim;
|
||||
AnimBankData *bank;
|
||||
AnimFrameData *frame;
|
||||
SpriteData *sprite;
|
||||
short i;
|
||||
short j;
|
||||
short wrap;
|
||||
short dir;
|
||||
|
||||
|
||||
for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) {
|
||||
if(sprite->data && !(sprite->attr & 0x10)) {
|
||||
if(!HuSprPauseF || (sprite->attr & 0x20)) {
|
||||
anim = sprite->data;
|
||||
bank = &anim->bank[sprite->bank];
|
||||
frame = &bank->frame[sprite->frame];
|
||||
wrap = (sprite->attr & 0x2) ? 0 : 1;
|
||||
if(!(sprite->attr & 0x1)) {
|
||||
dir = (sprite->attr & 0x40) ? -1 : 1;
|
||||
for(j=0; j<(int)sprite->speed*minimumVcount; j++) {
|
||||
sprite->time += dir;
|
||||
SpriteCalcFrame(sprite, bank, &frame, wrap);
|
||||
}
|
||||
sprite->time += (sprite->speed*(float)minimumVcount)-j;
|
||||
SpriteCalcFrame(sprite, bank, &frame, wrap);
|
||||
}
|
||||
sprite->dirty_flag = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprPauseSet(BOOL value)
|
||||
{
|
||||
HuSprPauseF = value;
|
||||
}
|
||||
|
||||
AnimData *HuSprAnimRead(void *data)
|
||||
{
|
||||
short i;
|
||||
AnimBmpData *bmp;
|
||||
AnimBankData *bank;
|
||||
AnimPatData *pat;
|
||||
|
||||
AnimData *anim = (AnimData *)data;
|
||||
if((u32)anim->bank & 0xFFFF0000) {
|
||||
anim->useNum++;
|
||||
return anim;
|
||||
}
|
||||
bank = (AnimBankData *)((u32)anim->bank+(u32)data);
|
||||
anim->bank = bank;
|
||||
pat = (AnimPatData *)((u32)anim->pat+(u32)data);
|
||||
anim->pat = pat;
|
||||
bmp = (AnimBmpData *)((u32)anim->bmp+(u32)data);
|
||||
anim->bmp = bmp;
|
||||
for(i=0; i<anim->bankNum; i++, bank++) {
|
||||
bank->frame = (AnimFrameData *)((u32)bank->frame+(u32)data);
|
||||
}
|
||||
for(i=0; i<anim->patNum; i++, pat++) {
|
||||
pat->layer = (AnimLayerData *)((u32)pat->layer+(u32)data);
|
||||
}
|
||||
for(i=0; i<anim->bmpNum; i++, bmp++) {
|
||||
bmp->palData = (void *)((u32)bmp->palData+(u32)data);
|
||||
bmp->data = (void *)((u32)bmp->data+(u32)data);
|
||||
}
|
||||
anim->useNum = 0;
|
||||
return anim;
|
||||
}
|
||||
|
||||
void HuSprAnimLock(AnimData *anim)
|
||||
{
|
||||
anim->useNum++;
|
||||
}
|
||||
|
||||
short HuSprCreate(AnimData *anim, short prio, short bank)
|
||||
{
|
||||
SpriteData *sprite;
|
||||
short i;
|
||||
for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) {
|
||||
if(!sprite->data) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i == 384) {
|
||||
return -1;
|
||||
}
|
||||
sprite->data = anim;
|
||||
sprite->speed = 1.0f;
|
||||
sprite->frame = 0;
|
||||
sprite->bank = bank;
|
||||
sprite->time = 0.0f;
|
||||
sprite->attr = 0;
|
||||
sprite->draw_no = 0;
|
||||
sprite->r = sprite->g = sprite->b = sprite->a = 255;
|
||||
sprite->x = sprite->y = sprite->z_rot = 0.0f;
|
||||
sprite->prio = prio;
|
||||
sprite->scale_x = sprite->scale_y = 1.0f;
|
||||
sprite->wrap_s = sprite->wrap_t = GX_CLAMP;
|
||||
sprite->tex_scale_x = sprite->tex_scale_y = 1;
|
||||
sprite->bg = NULL;
|
||||
sprite->scissor_x = sprite->scissor_y = 0;
|
||||
sprite->scissor_w = 640;
|
||||
sprite->scissor_h = 480;
|
||||
if(anim) {
|
||||
HuSprAnimLock(anim);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
short HuSprFuncCreate(void (*func)(SpriteData *sprite), short prio)
|
||||
{
|
||||
SpriteData *sprite;
|
||||
short index = HuSprCreate(NULL, prio, 0);
|
||||
if(index == -1) {
|
||||
return -1;
|
||||
}
|
||||
sprite = &HuSprData[index];
|
||||
sprite->func = func;
|
||||
sprite->attr |= 0x10;
|
||||
return index;
|
||||
}
|
||||
|
||||
short HuSprGrpCreate(short capacity)
|
||||
{
|
||||
SpriteGroupData *group;
|
||||
short i, j;
|
||||
for(group = HuSprGrpData, i=0; i<256; i++, group++) {
|
||||
if(group->capacity == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i == 256) {
|
||||
return -1;
|
||||
}
|
||||
group->members = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(short)*capacity);
|
||||
for(j=0; j<capacity; j++) {
|
||||
group->members[j] = -1;
|
||||
}
|
||||
group->capacity = capacity;
|
||||
group->x = group->y = group->z_rot = group->center_x = group->center_y = 0.0f;
|
||||
group->scale_x = group->scale_y = 1.0f;
|
||||
return i;
|
||||
}
|
||||
|
||||
short HuSprGrpCopy(short group)
|
||||
{
|
||||
SpriteGroupData *new_group_ptr;
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short new_group = HuSprGrpCreate(group_ptr->capacity);
|
||||
short i;
|
||||
if(new_group == -1) {
|
||||
return -1;
|
||||
}
|
||||
new_group_ptr = &HuSprGrpData[new_group];
|
||||
new_group_ptr->x = group_ptr->x;
|
||||
new_group_ptr->y = group_ptr->y;
|
||||
new_group_ptr->z_rot = group_ptr->z_rot;
|
||||
new_group_ptr->scale_x = group_ptr->scale_x;
|
||||
new_group_ptr->scale_y = group_ptr->scale_y;
|
||||
new_group_ptr->center_x = group_ptr->center_x;
|
||||
new_group_ptr->center_y = group_ptr->center_y;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
SpriteData *old_sprite = &HuSprData[group_ptr->members[i]];
|
||||
short new_sprite = HuSprCreate(old_sprite->data, old_sprite->prio, old_sprite->bank);
|
||||
HuSprData[new_sprite] = *old_sprite;
|
||||
HuSprGrpMemberSet(new_group, i, new_sprite);
|
||||
}
|
||||
}
|
||||
return new_group;
|
||||
}
|
||||
|
||||
void HuSprGrpMemberSet(short group, short member, short sprite)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
SpriteData *sprite_ptr = &HuSprData[sprite];
|
||||
if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] != -1) {
|
||||
return;
|
||||
}
|
||||
group_ptr->members[member] = sprite;
|
||||
}
|
||||
|
||||
void HuSprGrpMemberKill(short group, short member)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == -1) {
|
||||
return;
|
||||
}
|
||||
HuSprKill(group_ptr->members[member]);
|
||||
group_ptr->members[member] = -1;
|
||||
}
|
||||
|
||||
void HuSprGrpKill(short group)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprKill(group_ptr->members[i]);
|
||||
}
|
||||
}
|
||||
group_ptr->capacity = 0;
|
||||
HuMemDirectFree(group_ptr->members);
|
||||
}
|
||||
|
||||
void HuSprKill(short sprite)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[sprite];
|
||||
if(!sprite_ptr->data) {
|
||||
return;
|
||||
}
|
||||
if(!(sprite_ptr->attr & 0x10)) {
|
||||
HuSprAnimKill(sprite_ptr->data);
|
||||
if(sprite_ptr->bg) {
|
||||
HuSprAnimKill(sprite_ptr->bg);
|
||||
sprite_ptr->bg = NULL;
|
||||
}
|
||||
}
|
||||
sprite_ptr->data = NULL;
|
||||
}
|
||||
|
||||
void HuSprAnimKill(AnimData *anim)
|
||||
{
|
||||
if(--anim->useNum <= 0) {
|
||||
if(anim->bmpNum & 0x8000) {
|
||||
if(anim->bmp->data) {
|
||||
HuMemDirectFree(anim->bmp->data);
|
||||
}
|
||||
if(anim->bmp->palData) {
|
||||
HuMemDirectFree(anim->bmp->palData);
|
||||
}
|
||||
}
|
||||
HuMemDirectFree(anim);
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprAttrSet(short group, short member, int attr)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
SpriteData *sprite_ptr;
|
||||
if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == -1) {
|
||||
return;
|
||||
}
|
||||
sprite_ptr = &HuSprData[group_ptr->members[member]];
|
||||
sprite_ptr->attr |= attr;
|
||||
sprite_ptr->dirty_flag |= 0x1;
|
||||
}
|
||||
|
||||
void HuSprAttrReset(short group, short member, int attr)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
SpriteData *sprite_ptr;
|
||||
if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == -1) {
|
||||
return;
|
||||
}
|
||||
sprite_ptr = &HuSprData[group_ptr->members[member]];
|
||||
sprite_ptr->attr &= ~attr;
|
||||
sprite_ptr->dirty_flag |= 0x1;
|
||||
}
|
||||
|
||||
void HuSprPosSet(short group, short member, float x, float y)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->x = x;
|
||||
sprite_ptr->y = y;
|
||||
sprite_ptr->dirty_flag |= 0x2;
|
||||
}
|
||||
|
||||
void HuSprZRotSet(short group, short member, float z_rot)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->z_rot = z_rot;
|
||||
sprite_ptr->dirty_flag |= 0x2;
|
||||
}
|
||||
|
||||
void HuSprScaleSet(short group, short member, float x, float y)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->scale_x = x;
|
||||
sprite_ptr->scale_y = y;
|
||||
sprite_ptr->dirty_flag |= 0x2;
|
||||
}
|
||||
|
||||
void HuSprTPLvlSet(short group, short member, float tp_lvl)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->a = tp_lvl*255;
|
||||
sprite_ptr->dirty_flag |= 0x4;
|
||||
}
|
||||
|
||||
void HuSprColorSet(short group, short member, u8 r, u8 g, u8 b)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->r = r;
|
||||
sprite_ptr->g = g;
|
||||
sprite_ptr->b = b;
|
||||
sprite_ptr->dirty_flag |= 0x4;
|
||||
}
|
||||
|
||||
void HuSprSpeedSet(short group, short member, float speed)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
HuSprData[group_ptr->members[member]].speed = speed;
|
||||
}
|
||||
|
||||
void HuSprBankSet(short group, short member, short bank)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
AnimData *anim = sprite_ptr->data;
|
||||
AnimBankData *bank_ptr = &anim->bank[sprite_ptr->bank];
|
||||
AnimFrameData *frame_ptr = &bank_ptr->frame[sprite_ptr->frame];
|
||||
sprite_ptr->bank = bank;
|
||||
if(sprite_ptr->attr & 0x40) {
|
||||
sprite_ptr->frame = bank_ptr->timeNum-1;
|
||||
frame_ptr = &bank_ptr->frame[sprite_ptr->frame];
|
||||
sprite_ptr->time = frame_ptr->time;
|
||||
} else {
|
||||
sprite_ptr->time = 0;
|
||||
sprite_ptr->frame = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprGrpPosSet(short group, float x, float y)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
group_ptr->x = x;
|
||||
group_ptr->y = y;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprData[group_ptr->members[i]].dirty_flag |= 0x2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprGrpCenterSet(short group, float x, float y)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
group_ptr->center_x = x;
|
||||
group_ptr->center_y = y;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprData[group_ptr->members[i]].dirty_flag |= 0x2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprGrpZRotSet(short group, float z_rot)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
group_ptr->z_rot = z_rot;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprData[group_ptr->members[i]].dirty_flag |= 0x2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprGrpScaleSet(short group, float x, float y)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
group_ptr->scale_x = x;
|
||||
group_ptr->scale_y = y;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprData[group_ptr->members[i]].dirty_flag |= 0x2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprGrpTPLvlSet(short group, float tp_lvl)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprData[group_ptr->members[i]].a = tp_lvl*255;
|
||||
HuSprData[group_ptr->members[i]].dirty_flag |= 0x4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprGrpDrawNoSet(short group, int draw_no)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprData[group_ptr->members[i]].draw_no = draw_no;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprDrawNoSet(short group, short member, int draw_no)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->draw_no = draw_no;
|
||||
}
|
||||
|
||||
void HuSprPriSet(short group, short member, short prio)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->prio = prio;
|
||||
}
|
||||
|
||||
void HuSprGrpScissorSet(short group, short x, short y, short w, short h)
|
||||
{
|
||||
SpriteGroupData *group_ptr = &HuSprGrpData[group];
|
||||
short i;
|
||||
for(i=0; i<group_ptr->capacity; i++) {
|
||||
if(group_ptr->members[i] != -1) {
|
||||
HuSprScissorSet(group, i, x, y, w, h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprScissorSet(short group, short member, short x, short y, short w, short h)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]];
|
||||
sprite_ptr->scissor_x = x;
|
||||
sprite_ptr->scissor_y = y;
|
||||
sprite_ptr->scissor_w = w;
|
||||
sprite_ptr->scissor_h = h;
|
||||
}
|
||||
|
||||
static short bitSizeTbl[11] = { 32, 24, 16, 8, 4, 16, 8, 8, 4, 8, 4 };
|
||||
|
||||
AnimData *HuSprAnimMake(short sizeX, short sizeY, short dataFmt)
|
||||
{
|
||||
AnimLayerData *layer;
|
||||
AnimBmpData *bmp;
|
||||
AnimData *anim;
|
||||
AnimPatData *pat;
|
||||
AnimFrameData *frame;
|
||||
void *temp;
|
||||
AnimBankData *bank;
|
||||
AnimData *new_anim;
|
||||
|
||||
anim = new_anim = HuMemDirectMalloc(HEAP_DATA, sizeof(AnimData)+sizeof(AnimBankData)+sizeof(AnimFrameData)
|
||||
+sizeof(AnimPatData)+sizeof(AnimLayerData)+sizeof(AnimBmpData));
|
||||
|
||||
bank = temp = &new_anim[1];
|
||||
anim->bank = bank;
|
||||
frame = temp = ((char *)temp+sizeof(AnimBankData));
|
||||
bank->frame = frame;
|
||||
pat = temp = ((char *)temp+sizeof(AnimFrameData));
|
||||
anim->pat = pat;
|
||||
layer = temp = ((char *)temp+sizeof(AnimPatData));
|
||||
pat->layer = layer;
|
||||
bmp = temp = ((char *)temp+sizeof(AnimLayerData));
|
||||
anim->bmp = bmp;
|
||||
anim->useNum = 0;
|
||||
anim->bankNum = 1;
|
||||
anim->patNum = 1;
|
||||
anim->bmpNum = (1|0x8000);
|
||||
bank->timeNum = 1;
|
||||
bank->unk = 10;
|
||||
frame->pat = 0;
|
||||
frame->time = 10;
|
||||
frame->shiftX = frame->shiftY = frame->flip = 0;
|
||||
pat->layerNum = 1;
|
||||
pat->centerX = sizeX/2;
|
||||
pat->centerY = sizeY/2;
|
||||
pat->sizeX = sizeX;
|
||||
pat->sizeY = sizeY;
|
||||
layer->alpha = 255;
|
||||
layer->flip = 0;
|
||||
layer->bmpNo = 0;
|
||||
layer->startX = layer->startY = 0;
|
||||
layer->sizeX = sizeX;
|
||||
layer->sizeY = sizeY;
|
||||
layer->shiftX = layer->shiftY = 0;
|
||||
layer->vtx[0] = layer->vtx[1] = 0;
|
||||
layer->vtx[2] = sizeX;
|
||||
layer->vtx[3] = 0;
|
||||
layer->vtx[4] = sizeX;
|
||||
layer->vtx[5] = sizeY;
|
||||
layer->vtx[6] = 0;
|
||||
layer->vtx[7] = sizeY;
|
||||
bmp->pixSize = bitSizeTbl[dataFmt];
|
||||
bmp->dataFmt = dataFmt;
|
||||
bmp->palNum = 0;
|
||||
bmp->sizeX = sizeX;
|
||||
bmp->sizeY = sizeY;
|
||||
bmp->dataSize = sizeX*sizeY*bitSizeTbl[dataFmt]/8;
|
||||
bmp->palData = NULL;
|
||||
bmp->data = NULL;
|
||||
return anim;
|
||||
}
|
||||
|
||||
void HuSprBGSet(short group, short member, AnimData *bg, short bg_bank)
|
||||
{
|
||||
short sprite = HuSprGrpData[group].members[member];
|
||||
HuSprSprBGSet(sprite, bg, bg_bank);
|
||||
}
|
||||
|
||||
void HuSprSprBGSet(short sprite, AnimData *bg, short bg_bank)
|
||||
{
|
||||
SpriteData *sprite_ptr = &HuSprData[sprite];
|
||||
sprite_ptr->bg = bg;
|
||||
sprite_ptr->bg_bank = bg_bank;
|
||||
sprite_ptr->wrap_t = sprite_ptr->wrap_s = GX_REPEAT;
|
||||
sprite_ptr->attr &= ~0x8;
|
||||
}
|
||||
|
||||
void AnimDebug(AnimData *anim)
|
||||
{
|
||||
AnimPatData *pat;
|
||||
AnimLayerData *layer;
|
||||
s16 i;
|
||||
s16 j;
|
||||
AnimFrameData *frame;
|
||||
AnimBankData *bank;
|
||||
AnimBmpData *bmp;
|
||||
|
||||
OSReport("patNum %d,bankNum %d,bmpNum %d\n", anim->patNum, anim->bankNum, anim->bmpNum & 0x7FFF);
|
||||
pat = anim->pat;
|
||||
for(i=0; i<anim->patNum; i++) {
|
||||
OSReport("PATTERN%d:\n", i);
|
||||
OSReport("\tlayerNum %d,center (%d,%d),size (%d,%d)\n", pat->layerNum, pat->centerX, pat->centerX, pat->sizeX, pat->sizeY);
|
||||
layer = pat->layer;
|
||||
for(j=0; j<pat->layerNum; j++) {
|
||||
OSReport("\t\tfileNo %d,flip %x\n", layer->bmpNo, layer->flip);
|
||||
OSReport("\t\tstart (%d,%d),size (%d,%d),shift (%d,%d)\n", layer->startX, layer->startY, layer->sizeX, layer->sizeY, layer->shiftX, layer->shiftY);
|
||||
if(j != pat->layerNum-1) {
|
||||
OSReport("\n");
|
||||
}
|
||||
layer++;
|
||||
}
|
||||
pat++;
|
||||
}
|
||||
bank = anim->bank;
|
||||
for(i=0; i<anim->bankNum; i++) {
|
||||
OSReport("BANK%d:\n", i);
|
||||
OSReport("\ttimeNum %d\n", bank->timeNum);
|
||||
frame = bank->frame;
|
||||
for(j=0; j<bank->timeNum; j++) {
|
||||
OSReport("\t\tpat %d,time %d,shift(%d,%d),flip %x\n", frame->pat, frame->time, frame->shiftX, frame->shiftY, frame->flip);
|
||||
frame++;
|
||||
}
|
||||
bank++;
|
||||
}
|
||||
bmp = anim->bmp;
|
||||
for(i=0; i<anim->bmpNum & 0x7FFF; i++) {
|
||||
OSReport("BMP%d:\n", i);
|
||||
OSReport("\tpixSize %d,palNum %d,size (%d,%d)\n", bmp->pixSize, bmp->palNum, bmp->sizeX, bmp->sizeY);
|
||||
bmp++;
|
||||
}
|
||||
}
|
||||
252
src/game/sprput.c
Normal file
252
src/game/sprput.c
Normal file
|
|
@ -0,0 +1,252 @@
|
|||
#include "common.h"
|
||||
#include "dolphin/mtx.h"
|
||||
#include "dolphin/gx.h"
|
||||
#include "dolphin/vi.h"
|
||||
|
||||
static void *bmpNoCC[8];
|
||||
static short HuSprLayerDrawNo[8];
|
||||
|
||||
static short bmpCCIdx;
|
||||
|
||||
|
||||
void mtxTransCat(Mtx matrix, float x, float y, float z);
|
||||
|
||||
static void HuSprLayerHook(short layer);
|
||||
|
||||
void HuSprDispInit(void)
|
||||
{
|
||||
Mtx44 proj;
|
||||
short i;
|
||||
for(i=0; i<8; i++) {
|
||||
bmpNoCC[i] = NULL;
|
||||
}
|
||||
bmpCCIdx = 0;
|
||||
GXInvalidateTexAll();
|
||||
MTXOrtho(proj, 0, 480, 0, 576, 0, 10);
|
||||
GXSetProjection(proj, GX_ORTHOGRAPHIC);
|
||||
if(RenderMode->field_rendering) {
|
||||
GXSetViewportJitter(0, 0, 640, 480, 0, 1, VIGetNextField());
|
||||
} else {
|
||||
GXSetViewport(0, 0, 640, 480, 0, 1);
|
||||
}
|
||||
GXSetScissor(0, 0, 640, 480);
|
||||
GXClearVtxDesc();
|
||||
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
|
||||
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
|
||||
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
|
||||
GXSetCullMode(GX_CULL_NONE);
|
||||
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
|
||||
}
|
||||
|
||||
void HuSprDisp(SpriteData *sprite)
|
||||
{
|
||||
short i;
|
||||
AnimData *anim = sprite->data;
|
||||
AnimPatData *pat = sprite->pat_data;
|
||||
Vec axis = {0, 0, 1};
|
||||
Mtx modelview, rot;
|
||||
short color_sum;
|
||||
void (*func)(SpriteData *);
|
||||
GXSetScissor(sprite->scissor_x, sprite->scissor_y, sprite->scissor_w, sprite->scissor_h);
|
||||
if(sprite->attr & 0x10) {
|
||||
if(sprite->func) {
|
||||
func = sprite->func;
|
||||
func(sprite);
|
||||
HuSprDispInit();
|
||||
}
|
||||
|
||||
} else {
|
||||
AnimLayerData *layer;
|
||||
AnimBmpData *bg_bmp;
|
||||
GXColor color;
|
||||
GXSetNumTexGens(1);
|
||||
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
|
||||
color.r = color.g = color.b = color.a = 255;
|
||||
GXSetChanAmbColor(GX_COLOR0A0, color);
|
||||
GXSetChanMatColor(GX_COLOR0A0, color);
|
||||
color.r = sprite->r;
|
||||
color.g = sprite->g;
|
||||
color.b = sprite->b;
|
||||
color.a = sprite->a;
|
||||
color_sum = color.r+color.g+color.b+color.a;
|
||||
GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
|
||||
GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_C0, GX_CC_CPREV, GX_CC_ZERO);
|
||||
GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
||||
GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_ZERO, GX_CA_APREV, GX_CA_A0, GX_CA_ZERO);
|
||||
GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
|
||||
GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE);
|
||||
GXSetNumChans(1);
|
||||
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT0, GX_DF_CLAMP, GX_AF_SPOT);
|
||||
if(sprite->attr & 0x80) {
|
||||
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_NOOP);
|
||||
} else if(sprite->attr & 0x100) {
|
||||
GXSetBlendMode(GX_BM_BLEND, GX_BL_ZERO, GX_BL_INVDSTCLR, GX_LO_NOOP);
|
||||
} else {
|
||||
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
|
||||
}
|
||||
if(sprite->bg) {
|
||||
AnimPatData *bg_pat;
|
||||
AnimFrameData *bg_frame;
|
||||
bg_frame = sprite->bg->bank[sprite->bg_bank].frame;
|
||||
bg_pat = &sprite->bg->pat[bg_frame->pat];
|
||||
layer = bg_pat->layer;
|
||||
bg_bmp = &sprite->bg->bmp[layer->bmpNo];
|
||||
HuSprTexLoad(sprite->bg, layer->bmpNo, 1, GX_CLAMP, GX_CLAMP, GX_NEAR);
|
||||
GXSetNumIndStages(1);
|
||||
GXSetTexCoordScaleManually(GX_TEXCOORD0, GX_TRUE, bg_bmp->sizeX*16, bg_bmp->sizeY*16);
|
||||
GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD0, GX_TEXMAP1);
|
||||
GXSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_16, GX_ITS_16);
|
||||
GXSetTevIndTile(GX_TEVSTAGE0, GX_INDTEXSTAGE0, 16, 16, 16, 16, GX_ITF_4, GX_ITM_0, GX_ITB_NONE, GX_ITBA_OFF);
|
||||
}
|
||||
GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1);
|
||||
GXSetZCompLoc(GX_FALSE);
|
||||
if(0 != sprite->z_rot) {
|
||||
MTXRotAxisDeg(rot, &axis, sprite->z_rot);
|
||||
MTXScale(modelview, sprite->scale_x, sprite->scale_y, 1.0f);
|
||||
MTXConcat(rot, modelview, modelview);
|
||||
} else {
|
||||
MTXScale(modelview, sprite->scale_x, sprite->scale_y, 1.0f);
|
||||
}
|
||||
mtxTransCat(modelview, sprite->x, sprite->y, 0);
|
||||
MTXConcat(*sprite->group_mtx, modelview, modelview);
|
||||
GXLoadPosMtxImm(modelview, GX_PNMTX0);
|
||||
for(i=pat->layerNum-1; i>=0; i--) {
|
||||
float pos[4][2];
|
||||
float texcoord_x1, texcoord_y1, texcoord_x2, texcoord_y2;
|
||||
AnimBmpData *bmp;
|
||||
layer = &pat->layer[i];
|
||||
bmp = &anim->bmp[layer->bmpNo];
|
||||
if(!bmp) {
|
||||
continue;
|
||||
}
|
||||
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
|
||||
HuSprTexLoad(anim, layer->bmpNo, 0, sprite->wrap_s, sprite->wrap_t, (sprite->attr & 0x8) ? 1 : 0);
|
||||
if(layer->alpha != 0xFF || color_sum != 1020) {
|
||||
color.a = (u16)(sprite->a*layer->alpha) >> 8;
|
||||
GXSetTevColor(GX_TEVSTAGE1, color);
|
||||
GXSetNumTevStages(2);
|
||||
} else {
|
||||
GXSetNumTevStages(1);
|
||||
}
|
||||
if(!sprite->bg) {
|
||||
pos[0][0] = layer->vtx[0]-pat->centerX;
|
||||
pos[0][1] = layer->vtx[1]-pat->centerY;
|
||||
pos[1][0] = layer->vtx[2]-pat->centerX;
|
||||
pos[1][1] = layer->vtx[3]-pat->centerY;
|
||||
pos[2][0] = layer->vtx[4]-pat->centerX;
|
||||
pos[2][1] = layer->vtx[5]-pat->centerY;
|
||||
pos[3][0] = layer->vtx[6]-pat->centerX;
|
||||
pos[3][1] = layer->vtx[7]-pat->centerY;
|
||||
if(layer->flip & 0x1) {
|
||||
texcoord_x2 = layer->startX/(float)bmp->sizeX;
|
||||
texcoord_x1 = (layer->startX+layer->sizeX)/(float)bmp->sizeX;
|
||||
} else {
|
||||
texcoord_x1 = layer->startX/(float)bmp->sizeX;
|
||||
texcoord_x2 = (layer->startX+layer->sizeX)/(float)bmp->sizeX;
|
||||
}
|
||||
if(layer->flip & 0x2) {
|
||||
texcoord_y2 = layer->startY/(float)bmp->sizeY;
|
||||
texcoord_y1 = (layer->startY+layer->sizeY)/(float)bmp->sizeY;
|
||||
} else {
|
||||
texcoord_y1 = layer->startY/(float)bmp->sizeY;
|
||||
texcoord_y2 = (layer->startY+layer->sizeY)/(float)bmp->sizeY;
|
||||
}
|
||||
} else {
|
||||
pos[0][0] = pos[3][0] = -(bg_bmp->sizeX*16)/2;
|
||||
pos[0][1] = pos[1][1] = -(bg_bmp->sizeY*16)/2;
|
||||
pos[2][0] = pos[1][0] = pos[0][0]+(bg_bmp->sizeX*16);
|
||||
pos[2][1] = pos[3][1] = pos[0][1]+(bg_bmp->sizeY*16);
|
||||
texcoord_x1 = texcoord_y1 = 1.0/(bg_bmp->sizeX*16);
|
||||
texcoord_x2 = texcoord_y2 = 1.0f;
|
||||
}
|
||||
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
|
||||
GXPosition3f32(pos[0][0], pos[0][1], 0);
|
||||
GXTexCoord2f32(texcoord_x1*sprite->tex_scale_x, texcoord_y1*sprite->tex_scale_y);
|
||||
GXPosition3f32(pos[1][0], pos[1][1], 0);
|
||||
GXTexCoord2f32(texcoord_x2*sprite->tex_scale_x, texcoord_y1*sprite->tex_scale_y);
|
||||
GXPosition3f32(pos[2][0], pos[2][1], 0);
|
||||
GXTexCoord2f32(texcoord_x2*sprite->tex_scale_x, texcoord_y2*sprite->tex_scale_y);
|
||||
GXPosition3f32(pos[3][0], pos[3][1], 0);
|
||||
GXTexCoord2f32(texcoord_x1*sprite->tex_scale_x, texcoord_y2*sprite->tex_scale_y);
|
||||
GXEnd();
|
||||
}
|
||||
if(sprite->bg) {
|
||||
GXSetNumIndStages(0);
|
||||
GXSetTevDirect(GX_TEVSTAGE0);
|
||||
GXSetTexCoordScaleManually(GX_TEXCOORD0, GX_FALSE, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HuSprTexLoad(AnimData *anim, short bmp, short slot, GXTexWrapMode wrap_s, GXTexWrapMode wrap_t, GXTexFilter filter)
|
||||
{
|
||||
GXTexObj tex_obj;
|
||||
GXTlutObj tlut_obj;
|
||||
AnimBmpData *bmp_ptr = &anim->bmp[bmp];
|
||||
short sizeX = bmp_ptr->sizeX;
|
||||
short sizeY = bmp_ptr->sizeY;
|
||||
switch(bmp_ptr->dataFmt & 0xF) {
|
||||
case 0:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_RGBA8, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case 2:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_RGB5A3, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
GXInitTlutObj(&tlut_obj, bmp_ptr->palData, GX_TL_RGB5A3, bmp_ptr->palNum);
|
||||
GXLoadTlut(&tlut_obj, slot);
|
||||
GXInitTexObjCI(&tex_obj,bmp_ptr->data, sizeX, sizeY, GX_TF_C8, wrap_s, wrap_t, GX_FALSE, slot);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
GXInitTlutObj(&tlut_obj, bmp_ptr->palData, GX_TL_RGB5A3, bmp_ptr->palNum);
|
||||
GXLoadTlut(&tlut_obj, slot);
|
||||
GXInitTexObjCI(&tex_obj,bmp_ptr->data, sizeX, sizeY, GX_TF_C4, wrap_s, wrap_t, GX_FALSE, slot);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_IA8, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_IA4, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
case 7:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_I8, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_I4, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
case 9:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_CTF_A8, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
case 10:
|
||||
GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_CMPR, wrap_s, wrap_t, GX_FALSE);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
GXInitTexObjLOD(&tex_obj, filter, filter, 0, 0, 0, GX_FALSE, GX_FALSE, GX_ANISO_1);
|
||||
GXLoadTexObj(&tex_obj, slot);
|
||||
}
|
||||
|
||||
void HuSprExecLayerSet(short draw_no, short layer)
|
||||
{
|
||||
HuSprLayerDrawNo[layer] = draw_no;
|
||||
Hu3DLayerHookSet(layer, HuSprLayerHook);
|
||||
}
|
||||
|
||||
static void HuSprLayerHook(short layer)
|
||||
{
|
||||
HuSprDispInit();
|
||||
HuSprExec(HuSprLayerDrawNo[layer]);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue