Projet Flipper du GCN

Le projet Flipper du GCN

Messagepar Corkus » 31 Juil 2005, 15:42

Moi je vois plutot ca comme ca:

Code: Tout sélectionner
Image* CTextureManager::GetImage(const char* filename)

{
      SDL_Surface* Image;
      
     Image = IMG_Load(filename);
    
     if(!Image)
              return 0;
    
     Image* Image2;
    
     Image2->width = Image->w
     Image2->pixels = Image->pixels;
     //etc...
    
     SDL_FreeSurface(Image);
    
     return Image2;
}


Puis pour LoadTexture
Code: Tout sélectionner
unsigned int CTextureManager::LoadTexture(const char* texturename , const char* filename )
{
       Image* picture = GetImage(filename);

  glGenTextures(1, &m_hIndexTable[texturename]);
  glBindTexture(GL_TEXTURE_2D, m_hIndexTable[texturename]);
  if (picture->channel /*je suis pas sur par contre pour le channel*/ == 32)
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, picture->w, picture->h, 0, GL_RGBA,
       GL_UNSIGNED_BYTE, picture->pixels);
  else
   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, picture->w, picture->h, 0, GL_RGB,
       GL_UNSIGNED_BYTE, picture->pixels);
  SDL_FreeSurface(picture);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  return (m_hIndexTable[texturename]);
}


J'ai pas tout modifié mais ca revient au meme pour te montrer.

Pour les flags c'est ok. On les ajoutera lors de l'initialisation d'opengl.
Avatar de l’utilisateur
Corkus
Hello World, I'm new !
 
Messages: 399
Inscription: 10 Avr 2005, 00:12

Messagepar Flamaros » 31 Juil 2005, 15:55

Regarde dans ta premiere section de code tu as fair un SDL_FreeSurface(Image) de ce fait tu supprime les donnees sur lesquelles pointe Image2->pixels c'est ca le probleme que je te disais. Si tu fais ca tu n'est pas sur de retrouver ton image (fonction temps que rien n'a ete reecrit dessus car ca ne t'es plus reserve).

En gros ca reviens a faire :
Code: Tout sélectionner
int *a;
int *b;
a = malloc(10 * sizeof(int));
b = a;
free (a);
b == ?????  // completement mort (pointe sur un truc libere)



PS : je me suis mis sur la page des membres
L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Corkus » 31 Juil 2005, 15:59

Ok je vois.

Et si on fait simplement une copie avec memcpy(). Ca fait bcp de manip par contre. Mais c'est fesable.
Avatar de l’utilisateur
Corkus
Hello World, I'm new !
 
Messages: 399
Inscription: 10 Avr 2005, 00:12

Messagepar Flamaros » 31 Juil 2005, 16:06

L'ideal si tu tiens vraiement garder la structure image qui n'a pas grande utilite, autant foutre le plutot possible les textures sur la CG avec OpenGL, d'autant plus qu'avec la SDL aussi elles peuvent etre sur la CG car la tu duplique des images non compressee en plus.

Sinon tu ajoutes l'id d'opengl a la structure Image et tu la map a la place de l'id. Mais a mon sens ca boffe trop de memoire pour rien.

Quand tu charges une scene tu load toutes les textures sur la CG avec OpenGL pas besoin de les avoir ailleur, quand tu quitte la scene de decharge tout. Le systeme des noms avec les id peut etre bien pour des objets devant apparaitre de facon ponctuelle dans la scene (sinon les charger des le debut).


Le moteur ne dois meme pas pouvoir avoir directement acces aux images (leur id doivent suffir).


EDIT : petite modification (appel d'une fonction dans le destructeur) qui a sont importance. La map se detruisee mais les textures restees sur la CG (pas bien du tout :00000032: ).
L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Bahamut » 01 Aoû 2005, 07:58

Un petit point : Je vois qu'il y a qlq confusions entre les objets Image et Texture. Ce sont deux chôses completement différentes.

Une image est un fichier externe que l'on va charger à l'aider d'un loader JPG/BMP/GIF/TGA/PNG/etc. dans un buffer d'octet. Ensuite, on va copier ce buffer dans une zone mémoire de la carte graphique en y associant un identifiant Unique :Création d'une texture.
Et finalement, on détruit le buffer d'octet alloué par l'image.

Une fois l'image chargée en mémoire et transformée en texture OGL, celle-ci est détruite....SURTOUT pas besoin de pointer dessus ni de faire des memcpy etc.
Le seul lien entre la texture et notre code, c'est l'identifiant Unique.

Dans TextureManager, chaque texture est associée à un ID et un nom. Soit, l'application est capable de détruire une/des textures à n'importe quel moment à partir d'un nom ou d'un ID (A aucun moment, l'image chargée par la SDL n'intervient puisqu'elle est détruite.Je rappelle encore une fois que les structures images (via SDL_image ou autre) ne sont utilisées qu'au moment de l'initialisation de l'appli/du niveau.

Enfin pour répondre à une autre question posée : les textures doivent être libérées à tout moment : soit par décision de l'application...soit à la destruction du TextureManager : évidemment, dans le destructeur, il faut libérer les textures OGL avant de détruire la liste des id (map<...>).

J'espère que ca vous éclairera. Si vous avez du code dispo..je peux faire une passe dessus afin de limiter les erreurs. Pour ce qui sont des opérations (méthodes) définies dans le wiki, elles doivent rester telles qu'elles.
Et surtout, codez en pur C++ (pas de types spécifiques à un OS/lib).
Avatar de l’utilisateur
Bahamut
Hello World, I'm new !
 
Messages: 644
Inscription: 11 Avr 2005, 09:40

Messagepar Flamaros » 01 Aoû 2005, 13:06

L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Flamaros » 15 Aoû 2005, 04:22

Je publie le code des deux dernieres fonctions dans un post car elles ne sont pas definitives, je ne comprend pas vraiment quel est leur but et comment on doit les utiliser (= comment les faire)

Premiere fonction :
Code: Tout sélectionner
Image* CTextureManager::GetImage(const char* filename)

{
  SDL_Surface   *picture;
  Image      image;

  if (!(picture = IMG_Load(filename)))
    {
      cerr << "[SDL_IMG] Echec lors du chargement de l'image: " << IMG_GetError() << endl;
      exit(1);
    }
  image.width = picture->w;
  image.height = picture->h;
  image.channels = picture->format->BitsPerPixel;


  image.pixels = picture->pixels;
  SDL_FreeSurface(picture);
  return ℑ
}


Le probleme est que si je fais le SDL_FreeSurface alors image.pixels ne sert plus a rien (pas sur du contenu).
Faut-il faire une copie de picture->pixels vers image.pixels?
Si je ne fais pas le SDL_FreeSurface ca fonctionnera seulement la SDL alloue d'autres choses en plus du tableau de pixels dans la structure SDL_Surface (qui ne pourra etre libere ici).


Seconde fonction :
Code: Tout sélectionner
unsigned int CTextureManager::GenTexture(Image* image)

{
  GLUint   id;

  glGenTextures(1, &id]);
  glBindTexture(GL_TEXTURE_2D, id);
  if (image->channels == 32)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->width, image->height, 0,
       GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
  else
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height, 0,
       GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  return (id);
}


Le probleme ici c'est que l'on retourne l'ID de la texture et non pas sont adresse qui est necessaire pour liberer la texture avec glDeleteTextures.



PS : J'etais rarement chez moi ces derniers temps (je ne suis pas chez moi en ce moment meme).
L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Corkus » 15 Aoû 2005, 18:28

Note: Avec la nouvelle version de Fmod (Fmod Ex), je souhaiterais que le début du code du CSoundManager puisse être mis à jour. Donc si quelqu'un pourrait s'en occuper et en même temps le finir, ca serait bien:D.

Bien sur, si vous bloquez, ca me fera un plaisir de vous aider:)
Avatar de l’utilisateur
Corkus
Hello World, I'm new !
 
Messages: 399
Inscription: 10 Avr 2005, 00:12

Messagepar Bahamut » 16 Aoû 2005, 08:21

En ce qui concerne la classe CTextureManager :

Les deux opérations citées ( GetImage(...) et GenTexture(...) sont des opérations privées (voir définition dans le .h).

Le fait d'être privées signifie simplement qu'elles ne servent qu'en interne pour découper proprement le processus de création d'une texture OpenGL.
On aurait pu simplement créer une seule méthode :

int CreateTexture(const char * fichier);

et y mettre tout le code en brut...(plus simple oui) mais ce n'est pas forcément une bonne idée. Un code clair et découpé est préférable. (pour une texture, j'avoue que c'est discutable car ici, dans une seule méthode, on n'aurait pas à recopier un tampon image ... mais dans le principe, je trouve que découper son code est une bonne chôse : non pas que c'est plus performant... mais qu'il faut etre conscient que le code que l'on va écrire servira d'exemple donc lisibilité oblige ).

Faut-il faire une copie de picture->pixels vers image.pixels?
-> la réponse est oui pour contourne le segmentation fault.

Parcontre le exit(1) -> c'est moyen :)
A la moindre texture manquante, PAN tout se ferme ^^

int CTextureManager::LoadTexture;
--> il suffit juste de retourner la valeur 0.
C'est au code qui appelle cette méthode qui doit décider si l'application meurt ou non..pas a CTextureManager.

Voila. ^^

Sinon, de mon coté; je vais essayer de continuer à avancer. Les 3 semaines passées, j'ai eu beaucoup de taff (professionnellement parlant) mais je vais pouvoir me dégager un peu de temps libre maintenant :D
Je vous tiens au courant.
Avatar de l’utilisateur
Bahamut
Hello World, I'm new !
 
Messages: 644
Inscription: 11 Avr 2005, 09:40

Messagepar Flamaros » 16 Aoû 2005, 11:53

Pour le exit(1) pas de probleme je vais le modifier. C'est juste que generalement je le fais directement pour eviter la double condition a moins que je vire le message d'erreur aussi, mais la je remplis la map aussi (ce qui me semble genant).

Si je comprend bien pour le reste du me demande de faire un truc du genre :
Code: Tout sélectionner

unsigned int CTextureManager::LoadTexture(const char* texturename , const char* filename )
{
Image picture;

&picture = GetImage(filename); // utilise une SDL_Surface pour charger l'image

GenTexture(&picture); // la SDL_Surface est utilisee

Impossible de detruire la SDL_Surface;

retourner l'id;

}

picture est liberee (sortie de la fonction);



Ne devrait on pas plutot directement utiliser la structure SDL_Surface plutot que Image?


EDIT : voila pour le exit (1), c'est remplace.
L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Bahamut » 16 Aoû 2005, 14:01

nop...

Image * myImage = GetImage(filename); --> tu fais une copie du tampon d'octet et tu détruis le SDL_Image dans la fonction...pas à l'exterieur.

sans oublier de désallouer myImage(detruire la copie du tampon) juste avant de retourner l'ID openGL.

Important : une fois la texture créée en OGL, on a aucun intérêt à garder en mémoire une image (ou son tampon d'octet). Une image > c'est bcp d'espoire mémoire qui occupe notre RAM.




Ne devrait on pas plutot directement utiliser la structure SDL_Surface plutot que Image?

--> ca serait effectivement plus simple :D
mais la simplicité n'est pas forcément là où on le croit : imagine que demain, on abandonne la SDL... on serait alors obligé de modifier les prototypes de fonction qui utilise la SDL... d'ou l'utilisation d'un type Image bien à nous. Je ne souhaite pas non plus ambrouiller plus que ca les gens mais l'idéal serait de faire une classe Interface.

Pour le reste du code, c'est bien ca ^^
Avatar de l’utilisateur
Bahamut
Hello World, I'm new !
 
Messages: 644
Inscription: 11 Avr 2005, 09:40

Messagepar Flamaros » 25 Aoû 2005, 20:03

Voila c'est enfin fini.

J'ai du modifier un prototype (ajout du second parametre) :
unsigned int GenTexture(Image* image, const char* texturename);

revoila le lien :
http://profringo.free.fr/perso/GCN%20participation/TextureManager.cpp


Je l'ai fais mais je pense que la copie du buffer pixels n'est pas forcement une bonne chose car on se retrouve avec deux fois le buffer en RAM (pas longtemps), mais si l'image est tres grosse on peut facilement la saturer. Deplus je trouve que ca fait plus d'operations pas tres utiles, et que dans ce cas le code n'est pas plus simple a comprendre (en plus de la lenteur induite).


PS : Vraiment desole pour le temps, j'ai ete tres pris.
L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Bahamut » 26 Aoû 2005, 11:38

Le seul objectif de ce découpage était de faciliter la compréhension du code. Effectivement, comme tu le dis, le gain n'est peut-etre pas réel.

Si tu souhaites qu'on élimine cet aspect, je ne m'y oppose pas du tout ^^
On peut enlever la méthode de génération d'id et encapsuler dans le code dans une unique opération (méthode).



En ce qui concerne l'avancement du projet, bientot du travail à distribuer pour coder. (le temps pour moi de racheter un nouveau disque dur/carte mere et alim)...mon troisieme disque vient de me lacher hier soir :'(

Je vous encourage à visiter de temps en temps le wiki.
Avatar de l’utilisateur
Bahamut
Hello World, I'm new !
 
Messages: 644
Inscription: 11 Avr 2005, 09:40

Messagepar Flamaros » 26 Aoû 2005, 15:04

J'ai gardé la version précédente sur mon PC, au cas ou, quand je serrais chez moi je la mettrais en ligne.

Mais vacances vont bientot etre finies et j'ai quasiment rien fait, mais peut etre que pour la suite je pourrais etre plus présent si j'ai du temps.
L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Flamaros » 28 Aoû 2005, 15:59

L'amitie aussi ca compte.
Avatar de l’utilisateur
Flamaros
Hello World, I'm new !
 
Messages: 552
Inscription: 21 Juil 2005, 23:44

Messagepar Bahamut » 29 Aoû 2005, 07:56

Cool ;)

En tout cas, merci de ton aide :)
Avatar de l’utilisateur
Bahamut
Hello World, I'm new !
 
Messages: 644
Inscription: 11 Avr 2005, 09:40

Messagepar deathangel » 03 Sep 2005, 22:17

SAlut à tous

voilà j'ai lu la page du projet, et le son va être géré par FMod j'ai lu. Je m'y connais pas trop dans cette lib, par contre j'avais déjà créé un moteur audio utilisant OpenAl et le format ogg si ca peut vous servir.

Voili voilou
Bonne continuation
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Corkus » 04 Sep 2005, 16:12

Merci à toi pour ton offre:)

Mais bon, on a déjà commencé avec FMOD et on a décidé de l'utiliser. Si ca te tente, tu peux continuer avec FMOD, ca te permettra de découvrir une nouvelle librairie;). Si tu es d'accord, fait attention d'utiliser la version 3 puisque le début est fait avec et que la version 4 implique de gros changement.

Par contre, je ne rejète pas ta librairie, après tout, quand on aura finit, rien n'empêche d'utiliser une autre librairie, mais là pour le moment c'est pas d'actualité:)
Avatar de l’utilisateur
Corkus
Hello World, I'm new !
 
Messages: 399
Inscription: 10 Avr 2005, 00:12

Messagepar deathangel » 04 Sep 2005, 16:46

pas de problème, c'était juste comme j'ai retrouvé les fichiers dans un coin de mon disque dur en faisant du rangement...

Je vais essayer de regarder un peu Fmod, ca peut être sympa...
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Corkus » 04 Sep 2005, 17:53

Parfait, pour rappel, [wiki]Projet_flipper/codes[/wiki] contient ce qui a déjà été fait pour le sound manager. Il suffit de finir, et d'envoyé le code soit à moi, ou à Bahamut.
Avatar de l’utilisateur
Corkus
Hello World, I'm new !
 
Messages: 399
Inscription: 10 Avr 2005, 00:12

Messagepar deathangel » 04 Sep 2005, 18:21

question bête vous compilez sous VC++, devC++ ou autre ?
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Corkus » 04 Sep 2005, 18:26

On a pas vraiment de choix, chacun choisit son compilateur. Mais par contre faut faire un code portable (pas de Win32 ou chose comme ca).
Avatar de l’utilisateur
Corkus
Hello World, I'm new !
 
Messages: 399
Inscription: 10 Avr 2005, 00:12

Messagepar deathangel » 04 Sep 2005, 20:33

j'ai fait copier/coller des sources du wiki, mais j'ai rien qui compile, il manque tous les include "fmod*" et j'ai pas mal d'erreurs avec les std, getch(), je dois m'arranger pour le faire marcher ou il existe une version des sources avec tout qui marche ??

(je sais ca fait beaucoup de questions, mais faut que je me trouve une occupation :p)
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Corkus » 04 Sep 2005, 20:57

Déjà, les débuts du soundmanager ont été commencé avec FMOD v.3. Si toi tu as téléchargé la v.4 (Fmod Ex.) bien c'est normal que ca ne marche pas vu que tout le système a été modifié.

Deux choix s'offrent à toi:
  • Soit tu télécharges la version 3 et tu continues comme ca
  • Soit tu recommence le soundmanager avec la version 4


Il est sur qu'avec la version 4 ca irait mieux (plus performant, etc) Mais ca demande plus de travail, c'est toi qui voit.

Ensuite pour tout ce qui a rapport avec std( cout cin getch() ) vérifie que tu as inclus iostream.

N'oublie pas aussi le fichier Singleton.h
Avatar de l’utilisateur
Corkus
Hello World, I'm new !
 
Messages: 399
Inscription: 10 Avr 2005, 00:12

Messagepar deathangel » 04 Sep 2005, 21:24

j'ai DL la version 3, t'en fais pas, j'avais fait gaffe :D
mais sur la version du wiki y a pas tout les include c'est surtout ca qui manque, pas qu'ils soient dans un fichier plus "haut" que j'ai pas pris
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

PrécédenteSuivante

Retourner vers Projet Flipper

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron