dmnieto escribió:Hola Hermes,
Gracias por tu respuesta, y perdona por no haber mirado tu firma! El tutorial 3D explica prácticamente todo, (y sinceramente, me he enterado mejor de como va el Tiling con tu tiling4x4 que con el reverse engineering que estaba sacando de PNGU).
Todavía tengo algunos problemas, puesto que no puedo cargar la textura 640x480 ARGB8 (supongo que por problemas de memoria, 320x240 cabe). Y sigo utilizando GRRLIB para sacar la textura a display... (que hace un filtrado bastante feo.
Pues si, si que interesa la librería... en cualquier caso será más rapido que lanzar 640x480 peticiones de drawrect a GX
Mi tiling4x4 tiene un fallo en ese tutorial: si te fijas, usa una memoria local para luego hacer el volcado u16 mem_tile[]; pues cambialo a u16 mem_tile[1024*8]; y podras trabajar con texturas a pantalla completa (el fallo está en un despiste mio, porque al principio el programa trabajaba con texturas de 16 bits, que sería lo logico como textura para ahorrar espacio y usar color directo)
En la libreria lo tengo resuelto (me di cuenta del fallo haciendo Wiiengine, donde uso esa misma tecnica y si estudias el fuente, veras que "camuflo" el tema de forma similar a como te he explicado aqui, para trabajar con una pantalla de 384x256 en los menus y de hasta 512x256 en el caso del emulador.
Te explico algunas cosas de la librería:
s_printf(), funciona como printf() (admite parametros con formatos y tal) pero está pensado para trabajar a una linea de pantalla (si desborda por la derecha, se pierde el texto)
Para controlarlo tienes estas variables en screen.c
static struct tagsizeletter // font size table (use 'sizeletter' as index)
{
unsigned tx,ty;
} sizelet[9] = {
{64,64},{32,32},{16,24},{12,16},{16,16},{12,24},{15,24},{128,192},{128,128}
};
int xclip=640; // screen width (recorte)
int autocenter=0; // centra en la linea
unsigned sizeletter=2; // tamaño de letra 2 (16x24) ver sizelet
unsigned bkcolor=0x00000000; // color de fondo de las letras (transparente en este caso)
unsigned color=0xffffffff; // color de las letras (blanco en este caso)
unsigned PX=0,PY=0; // coordenadas donde se empezara a dibujar el texto (en pixeles)
Por defecto, te sube una fuente de letra que es de un tamaño de 16x16 y te la prepara con una mascara (en la medida de lo posible) para mejorar el contraste.
Eso lo puedes controlar tu con UploadFontTexture(0) (sin mascara) o UploadFontTexture(1) (con mascara), pero recuerda
que eso es una textura que no deberias cambiar durante el frame a menos que aguardes a que se dibuje todo el texto con GX_DrawDone(); (cada letra es un quad y esa funcion de GX aguarda a que se dibujen todos los poligonos)
Mas: las funciones incluyen un parametro 'layer'. Esto tecnicamente, es la profundidad Z donde 0 es el elemento mas prioritario y 65535 por ejemplo, es el mas lejano (no uses numeros negativos). Las letras se dibujan en layer 0. Si dibujas letras y despues un rectangulo que ocupe toda la pantalla que tenga layer 1, no borrará las letras. Puedes usar esto, para superponer capas sin necesidad de ordenar las escrituras de superficies, etc.
Tambien recuerda que el parametro alpha aqui está activo: color con alpha 0, es completamente transparente, con 0x80 es semi transparente y con 0xff es completamente solido. Por lo tanto, aqui el color negro no es 0, si no 0xff000000 (con esa ordenacion de izquierda a derecha seria ABGR con 8 bit por componente)
Las funciones:
void DrawSurface(GXTexObj *surface,int x,int y, int width, int height, int layer, u32 color);
void DrawBox(int x,int y, int width, int height, int layer, int thickness, u32 color);
void DrawFillBox(int x,int y, int width, int height, int layer, u32 color);
void DrawRoundBox(int x,int y, int width, int height, int layer, int thickness, u32 color);
void DrawRoundFillBox(int x,int y, int width, int height, int layer, u32 color);
void DrawSlice(int x,int y, int dx, int dy, int layer, int thickness, int degrees_start, int degrees_end, u32 color);
void DrawFillSlice(int x,int y, int dx, int dy, int layer, int degrees_start, int degrees_end, u32 color);
void DrawEllipse(int x,int y, int rx, int ry, int layer, int thickness, u32 color);
void DrawFillEllipse(int x,int y, int dx, int dy, int layer, u32 color);
void DrawLine(int x,int y, int x2, int y2, int layer, int thickness, u32 color);
No tienen mucho misterio: thickness es el grosor de linea de 1 a ... lo que sea!
para superficies no rellenas.
Lo que si tienes que saber que previamente, puedes usar SetTexture(NULL); para que se dibuje sin textura, usando el color especificado o con SetTexture(GXTexObj *texture); puedes usar una textura como trama (textura que puedes crear de igual forma que dibujas la pantalla y "subirla" al objeto GXTex con CreateTexture() solo que en este caso, pon el parametro 'repeat' a 1
para que se repita la trama en forma de mosaico o a 0, si no te hace falta.
Por defecto yo he creado unas pocas tramas que puedes ver definidas en screen.h (acuerdate de incluirlo
). Por ejemplo
SetTexture(SQUARE_PATTERN); para usar este tipo de tramado
#define STRIPED_PATTERN &tex_pattern[0]
#define CROSS_PATTERN &tex_pattern[1]
#define SQUARE_PATTERN &tex_pattern[2]
#define MOSAIC_PATTERN &tex_pattern[3]
#define NULL_PATTERN NULL
Y creo que ya esta todo mas o menos comentado: si quieres que Drawsurface actue como 'aumento' no tienes que hacer nada aqui (ayer me despiste y no recordé que uso coordenadas fijas en textura
). Simplemente, usa lo que te puse arriba pero en vez de subir una textura del tamaño de la pantalla, sube una de 320x240 o la resolucion que mas te apetezca (procura que siga la regla 4:3 eso si, para no ver pixeles rectangulares)
NOTA: Recuerda siempre, terminar con Screen_flip(); el frame. Esto es muy importante, si vas a salir del programa, llama antes a esa funcion para prevenir que haya cosas en transito al GX y que se pueda colgar el programaTe paso los fuentes como enlace (y si alguien lo encuentra de interés, que no se corte en bajarlo, claro
):