diff --git a/config/GMPE01_00/config.yml b/config/GMPE01_00/config.yml index 63b0b3c4..ff0d6914 100644 --- a/config/GMPE01_00/config.yml +++ b/config/GMPE01_00/config.yml @@ -565,3 +565,6 @@ extract: - symbol: wrongdisc_en binary: wrongdisc_en.bin header: wrongdisc_en.inc +- symbol: DEMOFontBitmap + binary: DEMOFontBitmap.bin + header: DEMOFontBitmap.inc \ No newline at end of file diff --git a/config/GMPE01_00/splits.txt b/config/GMPE01_00/splits.txt index 102e7c88..59286405 100644 --- a/config/GMPE01_00/splits.txt +++ b/config/GMPE01_00/splits.txt @@ -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 diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 7b6e4499..55650103 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -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 diff --git a/configure.py b/configure.py index 40f05776..8c02fecf 100755 --- a/configure.py +++ b/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, diff --git a/include/common_structs.h b/include/common_structs.h index 1525241d..f9428907 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -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 diff --git a/include/dolphin/gx/GXBump.h b/include/dolphin/gx/GXBump.h index a936ddca..74aeffed 100644 --- a/include/dolphin/gx/GXBump.h +++ b/include/dolphin/gx/GXBump.h @@ -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 diff --git a/include/dolphin/gx/GXTexture.h b/include/dolphin/gx/GXTexture.h index 32de49ca..a30b7430 100644 --- a/include/dolphin/gx/GXTexture.h +++ b/include/dolphin/gx/GXTexture.h @@ -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 diff --git a/include/functions.h b/include/functions.h index 9981c623..7868a1da 100644 --- a/include/functions.h +++ b/include/functions.h @@ -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); diff --git a/include/variables.h b/include/variables.h index 001b625b..b85f9afc 100644 --- a/include/variables.h +++ b/include/variables.h @@ -48,4 +48,6 @@ extern OverlayID omprevovl; extern PlayerState GWPlayer[4]; extern SystemState GWSystem; +extern u32 minimumVcount; + #endif diff --git a/src/game/sprman.c b/src/game/sprman.c new file mode 100644 index 00000000..4882c73c --- /dev/null +++ b/src/game/sprman.c @@ -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; jcapacity; 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; ibankNum; i++, bank++) { + bank->frame = (AnimFrameData *)((u32)bank->frame+(u32)data); + } + for(i=0; ipatNum; i++, pat++) { + pat->layer = (AnimLayerData *)((u32)pat->layer+(u32)data); + } + for(i=0; ibmpNum; 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; jmembers[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; icapacity; 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; icapacity; 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; icapacity; 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; icapacity; 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; icapacity; 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; icapacity; 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; icapacity; 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; icapacity; 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; icapacity; 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; ipatNum; 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; jlayerNum; 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; ibankNum; i++) { + OSReport("BANK%d:\n", i); + OSReport("\ttimeNum %d\n", bank->timeNum); + frame = bank->frame; + for(j=0; jtimeNum; 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; ibmpNum & 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++; + } +} \ No newline at end of file diff --git a/src/game/sprput.c b/src/game/sprput.c new file mode 100644 index 00000000..44f750e1 --- /dev/null +++ b/src/game/sprput.c @@ -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]); +} \ No newline at end of file