Pages: [1]   Bas de page
Imprimer
Auteur Fil de discussion: [NDS / PALIB] PA_GifToTiles / FAT / Palette  (Lu 791 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Campanile Hors ligne
Sr. Member
****
Messages: 496


Voir le profil WWW
sic

« 09 Avril 2008, 18:50:20 »

Bonjour ! Voilà mon soucis :

Je charge un gif via la FAT dans un buffer, et je tente de le convertir en sprite.
En gros je charge l'image dans un buffer que je passe à au PA_GifToTiles, qui lui est censé me retourner un tableau de tiles et une palette que je m'empresse de charger. J'ai rien inventé, j'ai réutilisé des bouts qui trainent à droite à gauche.
Bref, c'est avec la palette que j'ai un soucis, elle reste toute noire... Du coup mon sprite n'apparait pas, sauf si je charge une "vraie" palette, ce qui m'arrange pas du tout, je voudrais la récupérer du fichier gif.
J'utilise un gif de 64x64 (l'escargot de légende) et le code suivant :

Code
(c):
#include <PA9.h>
 
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
 
 
u8 GLOBAL_BUFFER[192*192];
bool init_FAT()
{
if (fatInitDefault()) return true;//PA_OutputSimpleText(0, 0, 0,"Fat ok")
else
{
  PA_OutputSimpleText(0, 0, 0,"Fat not working. Have you DLDI patched the rom ?");
  PA_WaitForVBL();
  return false;  
}  
}  
 
u8* SF_LoadGif(char* path, u16* palette)
{
FILE* imgFile = fopen (path, "rb"); //rb = read  
 
if(imgFile)
{
  PA_OutputSimpleText(0, 0, 0,"File found");
// obtain file size:
u32 imgSize;
fseek (imgFile, 0 , SEEK_END);
imgSize = ftell (imgFile);
rewind (imgFile);
//store the image file in the bufer
fread (GLOBAL_BUFFER, 1, imgSize, imgFile);
// close the file
fclose (imgFile);
return PA_GifToTiles((void*)GLOBAL_BUFFER, palette);//[color=red]Ajoué[/color]
  }
  else
  {
     PA_OutputSimpleText(0, 0, 0,"File not found ?");
  }  
return NULL;  
}  
 
int main(int argc, char ** argv)
{
PA_Init();    // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
 
PA_InitText(0,0);
 
fatInitDefault(); //Initializes lib fat
 
u8 *data;
u16 palette[256];
u8 texture[64*64];
u16 id_gfx;
//on charge le gif qui est converti en tiles, data contient le résultat
data = SF_LoadGif("Mollusk.gif",palette);
PA_LoadSpritePal(1,0,palette);
/*
PA_LoadSpritePal(1, // Screen
0, // Palette number
(void*)sprite0_Pal); // Palette name
*/

 
id_gfx = PA_CreateGfx(1, (void*)data, OBJ_SIZE_64X64, 1);
PA_CreateSpriteFromGfx(1,0,id_gfx,OBJ_SIZE_64X64,1,0,0,0);
 
 
return 1;
}
Le sprite est tout noir, et si on décommente le LoadSprte sprite0_pal, là il a des couleurs (pas les bonnes bien sur, mais ça prouve tout marche sauf la palette.

Qu'est-ce que je loupe ?

Merci !
Journalisée
Cobain Hors ligne
Hero Member
*****
Messages: 662


Voir le profil WWW
mes talents de graphiste lol

« Réponse #1 : 09 Avril 2008, 18:57:33 »

j'y connais rien dans ce dommaine mais tu devrais tester la fat avec ta fonction init_FAT() Wink
Journalisée

DS fat +
GBAMP + flashme + 3CF 1Go
R4 + MicroSD 2Go

Mes Projets
Mon Blog
Campanile Hors ligne
Sr. Member
****
Messages: 496


Voir le profil WWW
sic

« Réponse #2 : 09 Avril 2008, 19:37:42 »

 Croa
Je teste l'init de la fat, y'a un message si c'set pas bon, et le sprite s'affiche bien, c'est juste que la palette n'est pas chargée.
Si j'inclus mon gif depuis un fichier .h via data, ça marche bien par contre  Huh?

Une autre proposition ?  whistle
Journalisée
Copper Hors ligne
Hero Member
*****
Messages: 590


Voir le profil
« Réponse #3 : 09 Avril 2008, 19:52:06 »

Essaye de mettre le tableau palette en global et supprimer le parametre palette de ta fonction SF_LoadGif pour voir...
Journalisée
Campanile Hors ligne
Sr. Member
****
Messages: 496


Voir le profil WWW
sic

« Réponse #4 : 09 Avril 2008, 21:10:53 »

Essaye de mettre le tableau palette en global et supprimer le parametre palette de ta fonction SF_LoadGif pour voir...
Saperlipopette, ça marche ! Merci  Azn
JE t'avoue que je ne comprends pas vraiment pourquoi, une idée pour pas que je mette la palette en global ? Bon au pire c'est pas la mort, mais j'aime pas trop les variables globales  Tongue
Journalisée
Copper Hors ligne
Hero Member
*****
Messages: 590


Voir le profil
« Réponse #5 : 09 Avril 2008, 21:25:35 »

Peut-être avec une variable locale static (jesuis pas sur vu que je l'utilise rarement)

static u16 palette[256];

Journalisée
Campanile Hors ligne
Sr. Member
****
Messages: 496


Voir le profil WWW
sic

« Réponse #6 : 10 Avril 2008, 13:46:10 »

C'est encore moi !
J'ai un peu de mal à saisir ces histoires de global et pas global...
Pour la palette déjà c'est pas clair, mais j'ai le même cas pour un tableau de u16 qui contient mes données retournées par PA_GifToTiles. Si je le déclare dans le main, ça marche pas, si je le déclare en global tout pareil, ça marche....   Shocked
De mémoire j'avais vu une histoire entre Mollusk et je sais plus trop qui (peut être Pypebros...)sur les alignements de tableaux et tout ça, et j'aimerai bien comprendre le truc au lieu de mettre en global sans comprendre.  Huh?

Super Mollusk, j'en peux plusk !  Cheesy
Journalisée
Copper Hors ligne
Hero Member
*****
Messages: 590


Voir le profil
« Réponse #7 : 11 Avril 2008, 10:20:15 »

J'ai regardé un peu les sources de PALib et je pense avoir compris pourquoi cela ne fonctionne pas lorsque le tableau palette est en local...

Les variables locales sont stockées sur la pile... Or par défaut la pile est stockée dans le DTCM... Il se trouve que la fonction PA_LoadSpritePal qui appelle PA_LoadSpriteExtPal utilise le DMA pour copier les valeurs dans la palette étendue... Or d'après GBATEK :

Citation
NDS9 Cache, Writebuffer, DTCM, and ITCM
Cache and tightly coupled memory are connected directly to the NDS9 CPU, without using the system bus. So that, DMA cannot access DTCM/ITCM, and access to cached memory regions must be handled with care: Drain the writebuffer before DMA-reads, and invalidate the cache after DMA-writes
Journalisée
Campanile Hors ligne
Sr. Member
****
Messages: 496


Voir le profil WWW
sic

« Réponse #8 : 11 Avril 2008, 10:57:47 »

Merci Copper pour l'explication, je comprends mieux, même si je maitrise pas le hardware comme toi  Tongue

Je vais aller trainer sur GBATEK si j'ai pas trop de boulot whistle
Journalisée
Campanile Hors ligne
Sr. Member
****
Messages: 496


Voir le profil WWW
sic

« Réponse #9 : 11 Avril 2008, 16:09:06 »

Je re-up pour dire que là ça marche, et que si qulqu'un et intéressé par un bout de code qui loade un gif, le découpe en sprites et l'affiche à l'écran, je peux essayer de le rendre présentable et vous le proposer  Tongue
« Dernière édition: 11 Avril 2008, 16:12:30 par Campanile » Journalisée
Minishlink Hors ligne
Mega Member
***
Messages: 1020


Voir le profil WWW
Quand on veut, on peut !

« Réponse #10 : 12 Avril 2008, 20:43:45 »

Bah vu que ce topic est dans la section "Tutoriaux" (d'ailleurs c'est bizarre Undecided ), tu pourrais modifier ton premier message et faire un tutorial Wink
Journalisée

http://minishlink.lyokoproject.com/images/bannTH.pnghttp://www.lyokoproject.com/banlp_88x31.jpg
Pages: [1]   Haut de page
Imprimer

Aller à: