diff --git a/include/bink/bink.h b/include/bink/bink.h index ffa9ad29c..11dc19a72 100644 --- a/include/bink/bink.h +++ b/include/bink/bink.h @@ -1,71 +1,83 @@ -#ifndef __BINK_H__ -#define __BINK_H__ - -#include - -#define BINKSURFACE8P 0 -#define BINKSURFACE24 1 -#define BINKSURFACE24R 2 -#define BINKSURFACE32 3 -#define BINKSURFACE32R 4 -#define BINKSURFACE32A 5 -#define BINKSURFACE32RA 6 -#define BINKSURFACE4444 7 -#define BINKSURFACE5551 8 -#define BINKSURFACE555 9 -#define BINKSURFACE565 10 -#define BINKSURFACE655 11 -#define BINKSURFACE664 12 -#define BINKSURFACEYUY2 13 -#define BINKSURFACEUYVY 14 -#define BINKSURFACEYV12 15 -#define BINKSURFACEMASK 15 - -struct BINK -{ - // Do the members really need to be defined? - U32 unk_0; - U32 unk_4; - U32 unk_8; - U32 unk_c; - U32 unk_10; - U32 unk_14; - U32 unk_18; - U32 unk_1c; - U8 unk_20[0xd0]; - S32 unk_f0; -}; - -typedef struct BINK* HBINK; - -struct RAD3DIMAGE; -typedef struct RAD3DIMAGE* HRAD3DIMAGE; - -#ifdef __cplusplus -extern "C" { -#endif - -extern int BinkDoFrame(HBINK bnk); -extern int BinkCopyToBuffer(HBINK bnk, void* dest, int destpitch, unsigned int destheight, - unsigned int destx, unsigned int desty, unsigned int flags); -extern int Lock_RAD_3D_image(HRAD3DIMAGE rad_image, void* out_pixel_buffer, - unsigned int* out_buffer_pitch, unsigned int* arg3); -extern void Unlock_RAD_3D_image(HRAD3DIMAGE rad_image); -extern void Blit_RAD_3D_image(HRAD3DIMAGE Image, float, float, float, float, float); -extern void RADSetAudioMemory(void* (*malloc)(size_t), void (*free)(void*)); -extern void RADSetMemory(void* (*malloc)(size_t), void (*free)(void*)); -extern HBINK BinkOpen(const char* fname, void*); -extern void BinkGetError(); -extern void BinkSetVolume(HBINK bink, unsigned int, int volume); -extern HRAD3DIMAGE Open_RAD_3D_image(HBINK bink, unsigned int, unsigned int, unsigned int); -extern void Close_RAD_3D_image(HRAD3DIMAGE rad_image); -extern void BinkGoto(HBINK bink, int frame, unsigned int); -extern int BinkWait(HBINK bink); -extern void BinkNextFrame(HBINK bink); -extern void BinkClose(HBINK bink); - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef __BINK_H__ +#define __BINK_H__ + +#include + +#define BINKSURFACE8P 0 +#define BINKSURFACE24 1 +#define BINKSURFACE24R 2 +#define BINKSURFACE32 3 +#define BINKSURFACE32R 4 +#define BINKSURFACE32A 5 +#define BINKSURFACE32RA 6 +#define BINKSURFACE4444 7 +#define BINKSURFACE5551 8 +#define BINKSURFACE555 9 +#define BINKSURFACE565 10 +#define BINKSURFACE655 11 +#define BINKSURFACE664 12 +#define BINKSURFACEYUY2 13 +#define BINKSURFACEUYVY 14 +#define BINKSURFACEYV12 15 +#define BINKSURFACEMASK 15 + +struct BINK +{ + // Do the members really need to be defined? + U32 unk_0; + U32 unk_4; + U32 unk_8; + U32 unk_c; + U32 unk_10; + U32 unk_14; + U32 unk_18; + U32 unk_1c; + U8 unk_20[0xd0]; + S32 unk_f0; +}; + +typedef struct BINK* HBINK; + +struct RAD3DIMAGE +{ + int a; + int b; + unsigned int c; + int d; + int e; + void* f; + int g; + int h; +}; + +typedef struct RAD3DIMAGE* HRAD3DIMAGE; + +#ifdef __cplusplus +extern "C" { +#endif + +extern int BinkDoFrame(HBINK bnk); +extern int BinkCopyToBuffer(HBINK bnk, void* dest, int destpitch, unsigned int destheight, + unsigned int destx, unsigned int desty, unsigned int flags); +extern int Lock_RAD_3D_image(HRAD3DIMAGE rad_image, void* out_pixel_buffer, + unsigned int* out_buffer_pitch, unsigned int* arg3); +extern void Unlock_RAD_3D_image(HRAD3DIMAGE rad_image); +extern void Blit_RAD_3D_image(HRAD3DIMAGE Image, float, float, float, float, float); +extern void RADSetAudioMemory(void* (*malloc)(size_t), void (*free)(void*)); +extern void RADSetMemory(void* (*malloc)(size_t), void (*free)(void*)); +extern HBINK BinkOpen(const char* fname, void*); +extern void BinkGetError(); +extern void BinkSetVolume(HBINK bink, unsigned int, int volume); +extern HRAD3DIMAGE Open_RAD_3D_image(HBINK bink, unsigned int, unsigned int, unsigned int); +extern void Close_RAD_3D_image(HRAD3DIMAGE rad_image); +extern void BinkGoto(HBINK bink, int frame, unsigned int); +extern int BinkWait(HBINK bink); +extern void BinkNextFrame(HBINK bink); +extern void BinkClose(HBINK bink); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/SB/Core/gc/iFMV.h b/src/SB/Core/gc/iFMV.h index 5d0a57cb4..3c49fed20 100644 --- a/src/SB/Core/gc/iFMV.h +++ b/src/SB/Core/gc/iFMV.h @@ -5,6 +5,8 @@ #include #include +#ifdef __cplusplus + struct _GXRenderModeObj; struct iFMV @@ -22,8 +24,19 @@ struct iFMV }; void* iFMVmalloc(size_t size); + +#endif + +// C stuff + void iFMVfree(void* mem); + +#ifdef __cplusplus + U32 iFMVPlay(char* filename, U32 buttons, F32 time, bool skippable, bool lockController); static void Setup_surface_array(); void Decompress_frame(HBINK bnk, HRAD3DIMAGE rad_image, long flags); + +#endif + #endif diff --git a/src/SB/Core/gc/ngcrad3d.c b/src/SB/Core/gc/ngcrad3d.c index f69b348e8..163d52dba 100644 --- a/src/SB/Core/gc/ngcrad3d.c +++ b/src/SB/Core/gc/ngcrad3d.c @@ -1 +1,173 @@ #include "ngcrad3d.h" + +#include "iFMV.h" + +static int D3D_surface_type[5]; +static unsigned int Pixel_info[5]; + +static int Built_tables; + +static void Setup_surface_array() +{ + if (Built_tables) + { + return; + } + + D3D_surface_type[0] = 6; + D3D_surface_type[1] = 6; + D3D_surface_type[2] = 4; + D3D_surface_type[3] = 5; + D3D_surface_type[4] = -1; + + Pixel_info[0] = 0x00000004; + Pixel_info[1] = 0x80000004; + Pixel_info[2] = 0x00000002; + Pixel_info[3] = 0x80000002; + Pixel_info[4] = 0x00000002; + + Built_tables = 1; +} + +HRAD3DIMAGE Open_RAD_3D_image(HBINK param_1, unsigned int param_2, unsigned int param_3, unsigned int param_4) +{ + HRAD3DIMAGE imgDat; + int pi_p4; + + Setup_surface_array(); + + pi_p4 = Pixel_info[param_4] & 0xff; + imgDat = (HRAD3DIMAGE)iFMVmalloc(0x3c); + + if (imgDat == 0) + { + return 0; + } + + imgDat->a = param_2; + imgDat->b = param_3; + imgDat->c = Pixel_info[param_4] >> 31; + imgDat->d = pi_p4; + imgDat->e = param_4; + + imgDat->g = GXGetTexBufferSize((unsigned short)param_2, (unsigned short)param_3, D3D_surface_type[param_4], 0, 0); + imgDat->f = (void*)iFMVmalloc(imgDat->g); + + GXInitTexObj((volatile int)imgDat + 0x1c, imgDat->f, param_2 & 0xffff, param_3 & 0xffff, D3D_surface_type[param_4], 0, 0, 0); + + GXInitTexObjLOD(0.0f, 0.0f, 0.0f, (volatile int)imgDat + 0x1c, 1, 0, 0, 0, 0); + + return imgDat; + +} + +void Close_RAD_3D_image(struct RAD3DIMAGE* image) +{ + if (image != 0) + { + if (image->f != 0) + { + iFMVfree(image->f); + image->f = 0; + } + iFMVfree(image); + } +} + +int Lock_RAD_3D_image(HRAD3DIMAGE rad_image, void* out_pixel_buffer, unsigned int* out_buffer_pitch, unsigned int* arg3) +{ + if (rad_image == 0) + { + return 0; + } + + if (out_pixel_buffer != 0) + { + *(void**)(out_pixel_buffer) = rad_image->f; + } + + if (out_buffer_pitch != 0) + { + *out_buffer_pitch = rad_image->a * rad_image->d; + } + + if (arg3 != 0) + { + *arg3 = rad_image->e; + } + + return 1; +} + +void Unlock_RAD_3D_image(struct RAD3DIMAGE* image) +{ + if (image) + { + DCStoreRange(image->f, image->g); + } +} + +void GXEnd() { } + +static void GXTexCoord2f32(float f1, float f2) +{ + int ptr = 0xcc010000; + *(float*)((char*)(ptr) - 0x8000) = f1; + *(float*)((char*)(ptr) - 0x8000) = f2; +} + +static void GXColor4u8(int r3, int r4, int r5, int r6) +{ + int ptr = 0xcc010000; + *((char*)(ptr) - 0x8000) = r3; + *((char*)(ptr) - 0x8000) = r4; + *((char*)(ptr) - 0x8000) = r5; + *((char*)(ptr) - 0x8000) = r6; +} + +static void GXPosition3s16(int r3, int r4, int r5) +{ + int ptr = 0xcc010000; + *(short*)((char*)(ptr) - 0x8000) = r3; + *(short*)((char*)(ptr) - 0x8000) = r4; + *(short*)((char*)(ptr) - 0x8000) = r5; +} + +static void GXSetTextCoordGen(int a, int b, int c, int d) +{ + GXSetTexCoordGen2(a, b, c, d, 0, 0x7d); +} + +static void Submit_vertices(float param_1, float param_2, float param_3, float param_4, long param_5, long param_6, float param_7) +{ + short uVar1 = (short)(param_7 * 255.0f) & 0xff; + short iVar3; + short iVar2; + short blah = (unsigned short)param_2; + + GXSetCullMode(0); + GXSetZMode(1, 7, 1); + GXSetColorUpdate(1); + GXBegin(0x80, 0, 4); + iVar3 = param_1; + iVar2 = param_6 * param_4 + param_2; + + GXPosition3s16(iVar3, iVar2, 0); + GXColor4u8(0xff, 0xff, 0xff, uVar1); + GXTexCoord2f32(0, 1.0f); + + GXPosition3s16(iVar3, blah, 0); + GXColor4u8(0xff, 0xff, 0xff, uVar1); + GXTexCoord2f32(0, 0); + iVar3 = param_5 * param_3 + param_1; + + GXPosition3s16(iVar3, blah, 0); + GXColor4u8(0xff, 0xff, 0xff, uVar1); + GXTexCoord2f32(4503601774854144.0, 0); + + GXPosition3s16(iVar3, iVar2, 0); + GXColor4u8(0xff, 0xff, 0xff, uVar1); + GXTexCoord2f32(1.0f, 1.0f); + + GXEnd(); +} \ No newline at end of file