PDA

Ver la versión completa : [Programacion]Problema creando paletas



kmkzk
13/12/2004, 09:39
Hola,
Escribo para ver si alguien me puede echar una manita. Programo con el SDK de gamepark y ahora me he puesto a trastear un poco con la paleta y me han surgido algunos problemas. Lo que intento hacer es poder tener varias paletas cargadas en memoria a la vez, y asi poder cambiarlas al instante. Para eso he hecho esta chapucilla:


...

#include "gpgraphic.h"
#include "defines.h"

#define GP_RGB24(r,g,b) (((((r>>3))&0x1f)<<11)|((((g>>3))&0x1f)<<6)|((((b>>3))&0x1f)<<1))
#define MAX_PAL 8

GP_PALETTEENTRY PALETTES[MAX_PAL][256]; //Datos de paleta
GP_HPALETTE HPALETTES[MAX_PAL]; //Handles a las paletas


//Cambia una entrada de la paleta actual
int SetPaletteEntry( unsigned int index, unsigned int red, unsigned int green, unsigned int blue)
{
GP_PALETTEENTRY entry = GP_RGB24(red,green,blue);
GpPaletteEntryChange ( index, 1, &entry, 0 );
}

//Inicializa
int InitPalettes(){
u8 i;
for (i = 0;i<MAX_PAL;i++)
HPALETTES[i] = GpPaletteCreate(256, (GP_PALETTEENTRY*)PALETTES[i]);
}

//Carga la paleta
int LoadPalette(int N){
GpPaletteSelect(HPALETTES[N]);
}

//Aplica la paleta al hw
int ApplyPalette(){
GpPaletteRealize();
}

...


Cuando voy a usar estar rutinas, como inicializacion, lo primero que hago es inicializar todas las paletas ('InitPalettes'), despues hago 'LoadPalette' con las que me interesen y voy creando las paletas con 'SetPaletteEntry' (las paletas son generadas en tiempo de ejecucion):

...

InitPalettes();

LoadPalette(0);
for (i=0;i<256;i++)
SetPaletteEntry(i,LOKESEA,LOKESEA,LOKESEA);

LoadPalette(1);
for (i=0;i<256;i++)
SetPaletteEntry(i,LOKESEA-i,LOKESEA-i,LOKESEA-i);
...

Una vez tenemos lo anterior montado, dibujo algo en pantalla, hago 'LoadPalette(X)' y depues 'ApplyPalette()'. La primera vez que lo hago funciona bien, pero cuando en el mismo dibujo hago 'LoadPalette(Y)' y despues 'ApplyPalette()' carga una paleta nula (supongo, todo se ve negro).

...

if (time< 100) {LoadPalette(0);ApplyPalette();}
if (time>=100) {LoadPalette(1);ApplyPalette();}
Dibuja_algo();

...


Tal vez no me aclaro muy bien con esto de las paletas, aunque he pensado que tal vez pueda ser problema de la funcion 'SetPaletteEntry'.
A ver si hay alguna mente brillante por ahi que me ilumine ;)
Un saludo!

pd:vaya lio de post, espero que alguien lo entienda

Damizean
13/12/2004, 14:12
Bueno, solo decir que eso no es RGB 24 sino RGB 16 xD

Más que utilizar las funciones propias del SDK es mejor usar un puntero a la paleta y cambiar directamente los colores desde ahi, sin necesidad de tener que hacer tanta chorrada. Ejemplo:

#define RGB15(R,G,B) (((((R>>3))&0x1f)<<11)|((((G>>3))&0x1f)<<6)|((((B>>3))&0x1f)<<1))
unsigned long *palette=(unsigned long *)0x14A00400; /* Pointer to Palette */

y despues para cambiar los colores

palette[color a cambiar]=RGB15(0-255,0-255,0-255);

kmkzk
13/12/2004, 17:53
Gracias por las aclaraciones damizean. :)
Asi parece mucho mas facil, cuando llege a casa lo probare a ver que tal.
Entonces, podria guardar en arrays los valores de las diferentes paletas, y para ir cambiando de paleta, hacer 'memcpy' al puntero de la paleta (palette),no?
un saludo