/*===========================================
        GRRLIB (GX Version)
        Example code by Xane

        This example shows the different
        new blending modes.
============================================*/
#include <grrlib.h>

#include <stdlib.h>
#include <wiiuse/wpad.h>
#include <math.h>

// Include Graphics
#include "GFX/RGFX_Background.h"
#include "GFX/RGFX_Blob01.h"
#include "GFX/RGFX_Blob02.h"
#include "GFX/RGFX_Blob03.h"
#include "GFX/RGFX_Font.h"

// Declare Static Functions
static void ExitGame();

// General Variables
extern GXRModeObj *rmode;
ir_t P1Mote;

// Prepare Graphics
GRRLIB_texImg *GFX_Background;
GRRLIB_texImg *GFX_Blob[3];
GRRLIB_texImg *GFX_Font;


int main() {
	// Init Variables
    u32 WPADKeyDown;
    u32 WPADKeyHeld;
    short WinW, WinH;
	int P1MX, P1MY;

	u8 Stage = 0, Blending = 0;
	u8 BlobType = 0;
	u8 Color = 255;
	u16 Step = 0;
	float SX, SY;


	// Init GRRLIB & WiiUse
    GRRLIB_Init();
    WinW = rmode->fbWidth;
	WinH = rmode->efbHeight;
    WPAD_Init();
    WPAD_SetIdleTimeout( 60*10 );
	WPAD_SetDataFormat( WPAD_CHAN_0, WPAD_FMT_BTNS_ACC_IR );

	// Load Textures
	GFX_Background = GRRLIB_LoadTextureJPG(RGFX_Background);
	GFX_Blob[0]    = GRRLIB_LoadTexturePNG(RGFX_Blob01);
	GFX_Blob[1]    = GRRLIB_LoadTexturePNG(RGFX_Blob02);
	GFX_Blob[2]    = GRRLIB_LoadTexturePNG(RGFX_Blob03);
	GFX_Font       = GRRLIB_LoadTexturePNG(RGFX_Font);
	GRRLIB_InitTileSet(GFX_Font, 8, 16, 32);

	// Set Handles
	GRRLIB_SetMidHandle( GFX_Blob[0], true );
	GRRLIB_SetMidHandle( GFX_Blob[1], true );
	GRRLIB_SetMidHandle( GFX_Blob[2], true );


    while (true) {
        WPAD_ScanPads();
        WPADKeyDown = WPAD_ButtonsDown(WPAD_CHAN_0);
        WPADKeyHeld = WPAD_ButtonsHeld(WPAD_CHAN_0);
        WPAD_SetVRes(WPAD_CHAN_0, WinW, WinH);
		WPAD_IR(WPAD_CHAN_0, &P1Mote);

		// WiiMote IR Viewport Correction
		P1MX = P1Mote.sx - 150;
		P1MY = P1Mote.sy - 150;

		// Update Stage
		Step = Step + 1;
		if (Step == 720) { Step = 0; }
		SX = 320 + (sin(DegToRad(Step  )) * 250);
		SY = 240 + (cos(DegToRad(Step*3)) * 100);

		// Draw Stage
		GRRLIB_DrawImg( 0, 0, GFX_Background, 0, 1, 1, GRRLIB_GetColor(255, 255, 255, 255) );
		GRRLIB_SetBlend( (Blending+1) ); Color = 255;
		switch (Stage) {
			case 2: Color = 160; break;
			case 3: Color = 128; break;
			case 4: Color = 64;  break;
		}
		GRRLIB_DrawImg( SX, SY, GFX_Blob[BlobType], 0, 1, 1, GRRLIB_GetColor(Color, Color, Color, 255) );

		// IR Pointer
		if (P1Mote.state == 1) {
			GRRLIB_DrawImg( P1MX, P1MY, GFX_Blob[BlobType], 0, 1, 1, GRRLIB_GetColor(Color, Color, Color, 255) );
		}

		// Draw Text
		GRRLIB_SetBlend ( GRRLIB_BLEND_ALPHA );
		GRRLIB_Rectangle( 28, 28, 480 + 16, 76, GRRLIB_GetColor(0, 0, 0, 160), 1 );
		GRRLIB_Printf   ( 32, 32, GFX_Font, 0xFFFFFFFF, 1, "Point your WiiMote on the screen." );
		GRRLIB_Printf   ( 32, 48, GFX_Font, 0xFFFFFFFF, 1, "Press LEFT and RIGHT to switch through the different stages." );
		GRRLIB_Printf   ( 32, 64, GFX_Font, 0xFFFFFFFF, 1, "Press A to change the blob sprite." );
		switch (Stage) {
			case 0: GRRLIB_Printf( 32, 88, GFX_Font, 0xFFFFFFFF, 1, "Stage 1: Additive Blending" );       Blending = 0; break;
			case 1: GRRLIB_Printf( 32, 88, GFX_Font, 0xFFFFFFFF, 1, "Stage 2: Alpha Light Blending" );    Blending = 1; break;
			case 2: GRRLIB_Printf( 32, 88, GFX_Font, 0xFFFFFFFF, 1, "Stage 3: Multiply Blending (75%)" ); Blending = 2; break;
			case 3: GRRLIB_Printf( 32, 88, GFX_Font, 0xFFFFFFFF, 1, "Stage 4: Multiply Blending (50%)" ); Blending = 2; break;
			case 4: GRRLIB_Printf( 32, 88, GFX_Font, 0xFFFFFFFF, 1, "Stage 5: Multiply Blending (25%)" ); Blending = 2; break;
			case 5: GRRLIB_Printf( 32, 88, GFX_Font, 0xFFFFFFFF, 1, "Stage 6: Invert Color Blending" );   Blending = 3; break;
		}

        GRRLIB_Render();
        if (WPADKeyDown & WPAD_BUTTON_RIGHT) { if (Stage < 5) { Stage += 1; } }
        if (WPADKeyDown & WPAD_BUTTON_LEFT ) { if (Stage > 0) { Stage -= 1; } }
        if (WPADKeyDown & WPAD_BUTTON_A    ) { BlobType += 1; if (BlobType > 2) { BlobType = 0; } }
        if (WPADKeyDown & WPAD_BUTTON_HOME ) { ExitGame(); }
    }
    ExitGame();
    return 0;
}

static void ExitGame() {
	// Deinitialize GRRLIB & Video
	GRRLIB_Exit();

	// Free all memory used by textures.
	GRRLIB_FreeTexture(GFX_Background);
	GRRLIB_FreeTexture(GFX_Blob[0]);
	GRRLIB_FreeTexture(GFX_Blob[1]);
	GRRLIB_FreeTexture(GFX_Blob[2]);
	GRRLIB_FreeTexture(GFX_Font);

	// Exit application
	exit(0);
}