Its a render from the source.
Its not a gif or single file that can be extracted, but lines of code that are executing the design.
typedef struct
{
void (*handleInput)(void);
void (*renderScreen)(void);
short inMenu;
} gui_screen_handler_t;
static gui_screen_handler_t screenHandlers[] = {{&menuHandleInputMain, &menuRenderMain, 0},
{&menuHandleInputMenu, &menuRenderMenu, 1},
{&menuHandleInputInfo, &menuRenderInfo, 1},
{&menuHandleInputGameMenu, &menuRenderGameMenu, 1},
{&menuHandleInputAppMenu, &menuRenderAppMenu, 1}};
// default screen handler (menu screen)
static gui_screen_handler_t *screenHandler = &screenHandlers[GUI_SCREEN_MENU];
// screen transition handling
static gui_screen_handler_t *screenHandlerTarget = NULL;
static int transIndex;
// Helper perlin noise data
#define PLASMA_H 32
#define PLASMA_W 32
#define PLASMA_ROWS_PER_FRAME 6
#define FADE_SIZE 256
static GSTEXTURE gBackgroundTex;
static int pperm[512];
static float fadetbl[FADE_SIZE + 1];
static VU_VECTOR pgrad3[12] = {{1, 1, 0, 1}, {-1, 1, 0, 1}, {1, -1, 0, 1}, {-1, -1, 0, 1}, {1, 0, 1, 1}, {-1, 0, 1, 1}, {1, 0, -1, 1}, {-1, 0, -1, 1}, {0, 1, 1, 1}, {0, -1, 1, 1}, {0, 1, -1, 1}, {0, -1, -1, 1}};
void guiReloadScreenExtents()
{
rmGetScreenExtents(&screenWidth, &screenHeight);
}
void guiInit(void)
{
guiFrameId = 0;
guiInactiveFrames = 0;
gFrameHook = NULL;
gTerminate = 0;
gInitComplete = 0;
gScheduledOps = 0;
gCompletedOps = 0;
gUpdateList = NULL;
gUpdateEnd = NULL;
gQueueSema.init_count = 1;
gQueueSema.max_count = 1;
gQueueSema.option = 0;
gSemaId = CreateSema(&gQueueSema);
gGUILockSemaId = CreateSema(&gQueueSema);
guiReloadScreenExtents();
// background texture - for perlin
gBackgroundTex.Width = PLASMA_W;
gBackgroundTex.Height = PLASMA_H;
gBackgroundTex.Mem = memalign(128, PLASMA_W * PLASMA_H * 4);
gBackgroundTex.PSM = GS_PSM_CT32;
gBackgroundTex.Filter = GS_FILTER_LINEAR;
gBackgroundTex.Vram = 0;
gBackgroundTex.VramClut = 0;
gBackgroundTex.Clut = NULL;
gBackgroundTex.ClutStorageMode = GS_CLUT_STORAGE_CSM1;
// Precalculate the values for the perlin noise plasma
int i;
for (i = 0; i < 256; ++i) {
pperm[i] = rand() % 256;
pperm[i + 256] = pperm[i];
}
for (i = 0; i <= FADE_SIZE; ++i) {
float t = (float)(i) / FADE_SIZE;
fadetbl[i] = t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
}
}
void guiEnd()
{
if (gBackgroundTex.Mem)
free(gBackgroundTex.Mem);
DeleteSema(gSemaId);
DeleteSema(gGUILockSemaId);
}
void guiDrawBGPlasma()
{
int x, y;
// transition the colors
curbgColor[0] += cdirection(curbgColor[0], gTheme->bgColor[0]);
curbgColor[1] += cdirection(curbgColor[1], gTheme->bgColor[1]);
curbgColor[2] += cdirection(curbgColor[2], gTheme->bgColor[2]);
// it's PLASMA_ROWS_PER_FRAME rows a frame to stop being a resource hog
if (pery >= PLASMA_H) {
pery = 0;
perz += dir;
if (perz > 100.0f || perz < -100.0f)
dir = -dir;
}
u32 *buf = gBackgroundTex.Mem + PLASMA_W * pery;
int ymax = pery + PLASMA_ROWS_PER_FRAME;
if (ymax > PLASMA_H)
ymax = PLASMA_H;
for (y = pery; y < ymax; y++) {
for (x = 0; x < PLASMA_W; x++) {
u32 fper = guiCalcPerlin((float)(2 * x) / PLASMA_W, (float)(2 * y) / PLASMA_H, perz) * 0x80 + 0x80;
*buf = GS_SETREG_RGBA(
(u32)(fper * curbgColor[0]) >> 8,
(u32)(fper * curbgColor[1]) >> 8,
(u32)(fper * curbgColor[2]) >> 8,
0x80);
++buf;
}
}
pery = ymax;
rmInvalidateTexture(&gBackgroundTex);
rmDrawPixmap(&gBackgroundTex, 0, 0, ALIGN_NONE, screenWidth, screenHeight, SCALING_NONE, gDefaultCol);
}
}
I'm not really sure as I'm not a developer, but I believe there's several ways you could go about retrieving it.
If you can get all elements off the screen with a custom theme, then you could screen record and gif that
Otherwise you'll need to sift through the OPL source:
Code:typedef struct { void (*handleInput)(void); void (*renderScreen)(void); short inMenu; } gui_screen_handler_t; static gui_screen_handler_t screenHandlers[] = {{&menuHandleInputMain, &menuRenderMain, 0}, {&menuHandleInputMenu, &menuRenderMenu, 1}, {&menuHandleInputInfo, &menuRenderInfo, 1}, {&menuHandleInputGameMenu, &menuRenderGameMenu, 1}, {&menuHandleInputAppMenu, &menuRenderAppMenu, 1}}; // default screen handler (menu screen) static gui_screen_handler_t *screenHandler = &screenHandlers[GUI_SCREEN_MENU]; // screen transition handling static gui_screen_handler_t *screenHandlerTarget = NULL; static int transIndex; // Helper perlin noise data #define PLASMA_H 32 #define PLASMA_W 32 #define PLASMA_ROWS_PER_FRAME 6 #define FADE_SIZE 256 static GSTEXTURE gBackgroundTex; static int pperm[512]; static float fadetbl[FADE_SIZE + 1]; static VU_VECTOR pgrad3[12] = {{1, 1, 0, 1}, {-1, 1, 0, 1}, {1, -1, 0, 1}, {-1, -1, 0, 1}, {1, 0, 1, 1}, {-1, 0, 1, 1}, {1, 0, -1, 1}, {-1, 0, -1, 1}, {0, 1, 1, 1}, {0, -1, 1, 1}, {0, 1, -1, 1}, {0, -1, -1, 1}}; void guiReloadScreenExtents() { rmGetScreenExtents(&screenWidth, &screenHeight); } void guiInit(void) { guiFrameId = 0; guiInactiveFrames = 0; gFrameHook = NULL; gTerminate = 0; gInitComplete = 0; gScheduledOps = 0; gCompletedOps = 0; gUpdateList = NULL; gUpdateEnd = NULL; gQueueSema.init_count = 1; gQueueSema.max_count = 1; gQueueSema.option = 0; gSemaId = CreateSema(&gQueueSema); gGUILockSemaId = CreateSema(&gQueueSema); guiReloadScreenExtents(); // background texture - for perlin gBackgroundTex.Width = PLASMA_W; gBackgroundTex.Height = PLASMA_H; gBackgroundTex.Mem = memalign(128, PLASMA_W * PLASMA_H * 4); gBackgroundTex.PSM = GS_PSM_CT32; gBackgroundTex.Filter = GS_FILTER_LINEAR; gBackgroundTex.Vram = 0; gBackgroundTex.VramClut = 0; gBackgroundTex.Clut = NULL; gBackgroundTex.ClutStorageMode = GS_CLUT_STORAGE_CSM1; // Precalculate the values for the perlin noise plasma int i; for (i = 0; i < 256; ++i) { pperm[i] = rand() % 256; pperm[i + 256] = pperm[i]; } for (i = 0; i <= FADE_SIZE; ++i) { float t = (float)(i) / FADE_SIZE; fadetbl[i] = t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f); } } void guiEnd() { if (gBackgroundTex.Mem) free(gBackgroundTex.Mem); DeleteSema(gSemaId); DeleteSema(gGUILockSemaId); } void guiDrawBGPlasma() { int x, y; // transition the colors curbgColor[0] += cdirection(curbgColor[0], gTheme->bgColor[0]); curbgColor[1] += cdirection(curbgColor[1], gTheme->bgColor[1]); curbgColor[2] += cdirection(curbgColor[2], gTheme->bgColor[2]); // it's PLASMA_ROWS_PER_FRAME rows a frame to stop being a resource hog if (pery >= PLASMA_H) { pery = 0; perz += dir; if (perz > 100.0f || perz < -100.0f) dir = -dir; } u32 *buf = gBackgroundTex.Mem + PLASMA_W * pery; int ymax = pery + PLASMA_ROWS_PER_FRAME; if (ymax > PLASMA_H) ymax = PLASMA_H; for (y = pery; y < ymax; y++) { for (x = 0; x < PLASMA_W; x++) { u32 fper = guiCalcPerlin((float)(2 * x) / PLASMA_W, (float)(2 * y) / PLASMA_H, perz) * 0x80 + 0x80; *buf = GS_SETREG_RGBA( (u32)(fper * curbgColor[0]) >> 8, (u32)(fper * curbgColor[1]) >> 8, (u32)(fper * curbgColor[2]) >> 8, 0x80); ++buf; } } pery = ymax; rmInvalidateTexture(&gBackgroundTex); rmDrawPixmap(&gBackgroundTex, 0, 0, ALIGN_NONE, screenWidth, screenHeight, SCALING_NONE, gDefaultCol); } }
EDIT:
Here, I have attatched a theme that removes everything from the screen. You can then record it and turn it into a gif.