Avanzado: ¿Como obtener las dimensiones de un sprite vía FAT?

Buenas.

Estoy haciendo un proyecto algo gordo, y estoy leyendo los sprites a través de Fat (parcheo DLDI) para que no me limiten los 4 mb.

Hasta ahí fácil. Para el que no lo haya hecho nunca, viene a ser algo tal que así:

FILE* sprite = fopen (nombreSprite, "rb");
u32 tamano;
if(sprite) // Make sure there is a file to load
{
fseek (sprite , 0 , SEEK_END);
tamano = ftell (sprite);
rewind (sprite);
char* spriteBuffer = (char*) malloc (sizeof(char)*tamano);
fread (spriteBuffer,1,tamano,sprite);
fclose (sprite);

PA_CreateSprite(pantalla, numeroSprite, spriteBuffer, OBJ_SIZE_64X64, 1 /*256 colores*/, numeroPaleta, x, y);


El problema es... a la hora de crear el sprite en sí, es necesario pasar como parámetro el tamaño que tiene el sprite (por ejemplo, OBJ_SIZE_64X64). Querría tratar de detectar automáticamente este tamaño para tener una función genérica de creación de sprites. Las constantes OBJ_SIZE_64X64 y demás, están definidas así en PaLib:

#define OBJ_SIZE_8X8 0,0
#define OBJ_SIZE_16X16 0,1
#define OBJ_SIZE_32X32 0,2
#define OBJ_SIZE_64X64 0,3
#define OBJ_SIZE_16X8 1,0
#define OBJ_SIZE_32X8 1,1
#define OBJ_SIZE_32X16 1,2
#define OBJ_SIZE_64X32 1,3
#define OBJ_SIZE_8X16 2,0
#define OBJ_SIZE_8X32 2,1
#define OBJ_SIZE_16X32 2,2
#define OBJ_SIZE_32X64 2,3

El primer número indica la forma del Sprite (0 cuadrado, 1 horizontal, 2 vertical) y el segundo el tamaño mínimo de lado (0->8, 1->16, 2->32, 3->64).

Con la variable tamano, que he obtenido en el código que he puesto arriba con tamano = ftell (sprite); se puede saber fácilmente el tamaño del fichero, y con un switch obtener cada uno de los tamaños. El problema es que esto no me resulta del todo posible, pues con este método me es completamente imposible distinguir el tamaño OBJ_SIZE_32X8 del OBJ_SIZE_8X32 (y del mismo modo para el resto de sprites rectangulares, pues el fichero ocupa lo mismo para el caso vertical que para el horizontal).

¿Sabéis como podría obtener estos parámetros para crear el sprite de forma directa sin tener que preocuparme de los tamaños al llamar a la función?

(por cierto, ¿qué ha sido de la página oficial de PaLib?)
Pues no se, pero no creo que te salga porque no tienes la paleta (vamos, creo yo). Igual podrías poner un archivo de configuración en el que se meta manualmente las dimensiones y luego las lee tu programa.

Y lo de la página de PAlib es un misterio...
Quien escribió:Buenas.

Estoy haciendo un proyecto algo gordo, y estoy leyendo los sprites a través de Fat (parcheo DLDI) para que no me limiten los 4 mb.

Hasta ahí fácil. Para el que no lo haya hecho nunca, viene a ser algo tal que así:

FILE* sprite = fopen (nombreSprite, "rb");
u32 tamano;
if(sprite) // Make sure there is a file to load
{
fseek (sprite , 0 , SEEK_END);
tamano = ftell (sprite);
rewind (sprite);
char* spriteBuffer = (char*) malloc (sizeof(char)*tamano);
fread (spriteBuffer,1,tamano,sprite);
fclose (sprite);

PA_CreateSprite(pantalla, numeroSprite, spriteBuffer, OBJ_SIZE_64X64, 1 /*256 colores*/, numeroPaleta, x, y);


El problema es... a la hora de crear el sprite en sí, es necesario pasar como parámetro el tamaño que tiene el sprite (por ejemplo, OBJ_SIZE_64X64). Querría tratar de detectar automáticamente este tamaño para tener una función genérica de creación de sprites. Las constantes OBJ_SIZE_64X64 y demás, están definidas así en PaLib:

#define OBJ_SIZE_8X8 0,0
#define OBJ_SIZE_16X16 0,1
#define OBJ_SIZE_32X32 0,2
#define OBJ_SIZE_64X64 0,3
#define OBJ_SIZE_16X8 1,0
#define OBJ_SIZE_32X8 1,1
#define OBJ_SIZE_32X16 1,2
#define OBJ_SIZE_64X32 1,3
#define OBJ_SIZE_8X16 2,0
#define OBJ_SIZE_8X32 2,1
#define OBJ_SIZE_16X32 2,2
#define OBJ_SIZE_32X64 2,3

El primer número indica la forma del Sprite (0 cuadrado, 1 horizontal, 2 vertical) y el segundo el tamaño mínimo de lado (0->8, 1->16, 2->32, 3->64).

Con la variable tamano, que he obtenido en el código que he puesto arriba con tamano = ftell (sprite); se puede saber fácilmente el tamaño del fichero, y con un switch obtener cada uno de los tamaños. El problema es que esto no me resulta del todo posible, pues con este método me es completamente imposible distinguir el tamaño OBJ_SIZE_32X8 del OBJ_SIZE_8X32 (y del mismo modo para el resto de sprites rectangulares, pues el fichero ocupa lo mismo para el caso vertical que para el horizontal).

¿Sabéis como podría obtener estos parámetros para crear el sprite de forma directa sin tener que preocuparme de los tamaños al llamar a la función?

(por cierto, ¿qué ha sido de la página oficial de PaLib?)


uff... te estas comiendo mucho el tarro... si lo que quieres es usar una funcion generica para eso, creo que lo mejor seria crear una cadena de caracteres para las constantes, y usarlo tipo variable, es una chapuza, pero asi solo necesitas una funcion para cualquier sprite. Tampoco se si daria resultado positivo, pero por provar que no quede.

Sobre la pagina de palib, esto me esta empezando a oler mal, un poco raro que esten inactivas casi a la vez varias paginas relacionadas con homebrew, consolas y nintendo...
Al menos el wiki, que es donde estan los tutos, va (o almenos ayer funcionava)

salu2
no puedes hacer nada que te detecte el tamaño del sprite :S mas que nada porque diferentes dimensiones ocupan lo mismo en memoria

8x16 = 16x8
32x64 = 64x32
32x32 = 64x16 = 16x64
16x16 = 8x32 = 32x8

etc..
Plata escribió: Sobre la pagina de palib, esto me esta empezando a oler mal, un poco raro que esten inactivas casi a la vez varias paginas relacionadas con homebrew, consolas y nintendo...


Ojalá, ojalá que no tengas razón. Si piensas lo que yo creo... ojalá que no tengamos razón...
ANTONIOND escribió:

Ojalá, ojalá que no tengas razón. Si piensas lo que yo creo... ojalá que no tengamos razón...

[mad]

ui quien que haces tu en otro foro? [qmparto]
zeltrix escribió: [mad]

ui quien que haces tu en otro foro? [qmparto]


...

No, en serio, ¿de que hablas? Es q no lo cojo. ¿Qué foro?
¿Cómo creas los archivos que contienen los Sprites?

Lo que necesitas agregarle un encabezado a cada uno de los archivos que contienen los sprites, es decir, debes agregar un par de bytes que describan al sprite antes que la propia información de los pixeles de este.

Generalmente, los encabezados tienen longitud fija. Según entiendo tu solo necesitarias un Byte para describir tanto forma como dimensiones, simplemente habria que asociar un valor de ese byte para cada posible dimensión y forma, es decir 0 para OBJ_SIZE_8X8, 1 para OBJ_SIZE_16X16, etc.

Si hicieras esto, podrías seguir utilizando tu código solo agregandole un switch/case y restandole el tamaño del encabezado al valor regresado por ftell.
Esta última opción me parece interesante. Ahora genero los sprites con PAGFX, llamándole a través de la línea de comandos. Si pudiera hacer que agregara ese byte indicador del tamaño al inicio del fichero, mis problemas estarían resueltos. ¿Dónde podría encontrar el código fuente de PAGFX o algún método para programar esta conversión con un byte de tamaño extra?

Del resto de opciones que dáis, la única que me parece válida es la de AntonioND... hasta ahora lo estoy haciendo con ficheros de configuración, por eso ahora trato de evitar este paso.
8 respuestas