/*Autor :KHLOROSDAIMON
 13/6/2006
 Entorno de desarollo -> 
 			devkitPPC Release 12  
 				:http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=124208
 			Linux 2.6.17
 			libogc 20050812 
 			gcemu 0.3 (para probar los ejecutables):
 					http://gcemu.dcemu.co.uk/
Programa simple de ejemplo de como usar las librerias libogc para usar las funciones basicas de la consola
tales como la inicializacion y uso del video y el sistema de mandos, creado basicamente por que no encontré ejemplos lo suficientemente claros y documentados y que al ser demasiado "liosos" no dan una idea clara de los pasos a seguir para tener lo minimo funcionando */
#include <ogc/video.h>
#include <gccore.h>
#include <ogcsys.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//los prototipos de funciones de iplfont.h fueron copiados del proyecto de hu-go! y modificados para usar un framebuffer sencillo(en el original era uno doble)
#include <iplfont.h> 
//VARIABLES GLOBALES
extern u32* frame_buffer =(u32*)0xC0500000;//asignar memoria de 32 bits para el framebuffer(memoria auxiliar
//donde se guarda la matriz de puntos de la pantalla
GXRModeObj *vmode; //variable de tipo "modo de video" (definida en video_types.h de libogc) 

#define AVANCE 10


int colores[10] = {//las variables estan definidas en color.h (de libogc) como valores RGB en hexadecimal 	     //ej:0xFFFFFFFF para el blanco
	COLOR_BLACK,COLOR_WHITE,
	COLOR_BLUE,COLOR_GREEN,
	COLOR_OLIVE,COLOR_NAVY,
	COLOR_PURPLE,COLOR_TEAL,
	COLOR_YELLOW,COLOR_RED
}; 

//prototiposd de las funciones :
//
int iniciar_gc(void);
int iniciar_gcvideo(void);
void pintar_pantalla(int color);
int mover(int *x,int *y);


void pintar_pantalla(int color){ // pinta todo del mismo color recorriendo uno a uno los bits del framebuffer y asignandole el valor hexadecimal del color que queremos
	int x,y;
	for(y=0;y<480;y++){
		for(x=0;x<320;x++){
			frame_buffer[x+320*y]=color;
		}
	}
}

int iniciar_gcvideo(void) { //usamos los metodos del objeto VIDEO de la libreria de video de libogc
	VIDEO_Init (); //Encender video
	vmode = &TVNtsc480IntDf; //60HZ 480i , elegimos el modo de video
	VIDEO_Configure (vmode); // "y se lo enviamos al chip grafico"
	VIDEO_SetNextFramebuffer(frame_buffer);//asignar la memoria del framebuffer al flipper
														//de esta manera al hacer un cambio sobre la memoria del framebuffer
														// usando el metodo VIDEO_FLUSH();actualizamos la memoria del chip grafico 
														// mostrandonos su contenido en pantalla
	return 0;
}

int iniciar_gc(void) {
	iniciar_gcvideo();
	PAD_Init();
	VIDEO_SetPostRetraceCallback(PAD_ScanPads);//esto no se realmente lo que hace,solo se que es necesario
															// para que detecte el movimiento de los controles
	return 0;
}
//Funcion que actualiza la posición del objeto en la pantalla
int mover(int *x,int *y) { //usamos los metodos del objeto PAD de la libreria pad (pad.h) de libogc
	int i;
	if (( PAD_ButtonsHeld (0) & PAD_BUTTON_UP)) {
		*x-=AVANCE;
	}

	if (( PAD_ButtonsHeld (0) & PAD_BUTTON_LEFT)) {
		*y-=AVANCE;
	}
	if (( PAD_ButtonsHeld (0) & PAD_BUTTON_DOWN)) {
		*x+=AVANCE;
	}

	if (( PAD_ButtonsHeld (0) & PAD_BUTTON_RIGHT)) { 
		*y+=AVANCE;
	}

	if ((PAD_ButtonsHeld (0) & PAD_BUTTON_A)) { //Hace el "Disparo" :p en las coordenadas actuales 
		write_font(*y+100,*x,"                      PUMPUMPUM");
	}
	if ((PAD_ButtonsHeld (0) & PAD_BUTTON_B)) { //si pulsas B la pantalla cambia de color :)
		for (i=1;i<10;i++) {
			pintar_pantalla(colores[i]);
		}
	}	
}

int main(void) {
	iniciar_gc();
	VIDEO_WaitVSync();
	pintar_pantalla(COLOR_WHITE);
	init_font();
	VIDEO_WaitVSync();
	int x=244; //coordenada vertical (centro)
	int y=320; //coordenada horizontal (centro)
	while (1) { //BUCLE INFINITO
	   pintar_pantalla(COLOR_WHITE);
		mover(&x,&y);
		write_font(y,x,"HOLASOYUNANAVECITA");
		VIDEO_Flush(); //enviar memoria del framebuffer a flipper.
		VIDEO_WaitVSync();//esperar al refresco de pantalla para dibujar
	}	
	return 0;
}