Loader tga opengl (textures + transparence)

Description

Ah ça faisait longtemps que je postais pas de code :)
Donc voilà : c'est une classe qui permet de charger des fichiers au format TGA., qui peut contenir une couche alpha : en clair les pixels de l'image peuvent être transparents ou pas.
Pour utiliser des formats TGA, le mieux est d'utiliser GIMP, Photoshop ou Paint Shop Pro. Vous pouvez aussi utiliser TGA Alpha Edit, une autre de mes sources (un peu de pub :p)

J'ai remarqué que sur CppFrance un loader de TGA est beaucoup utilisé : celui fait par Nate Miller. C'est celui que j'utilisais avant, mais j'ai préféré écrire celui-ci parce que l'autre comportait 2 défauts importants :
1) il n'était pas orienté objet (ce n'est pas un vrai problème en soi mais bon...la POO c'est beau ;))
2) le problème majeur : il ne supportait pas les fichiers TGA compressés.

Mon loader possède les caractéristiques suivantes :
-il est portable
-il est orienté objet
-il supporte les images compressées en RLE ou pas
-les images chargées doivent être 24 bits ou 32 bits.

Je poste juste le header ici, le reste est dans le zip.
Pour tester le programme, faites glisser une texture TGA sur TGA.exe.

Changements du 14/04/04 : maintenant on peut préciser au loader le type de filtering que l'on veut utiliser. L'exemple permet de choisir à l'exécution entre pas de filtering, linear filtering, bilinear filtering, trilinear filtering ou anisotropic filtering.
J'ai aussi rajouté les fonction LoadOpenGLTexture() et LoadOpenGLTextureWithID() à destination du programmeur fainéant (on dira "économe de lignes" ça fait mieux :p) qui permettent en un seul appel de charger une texture TGA depuis un fichier et de l'envoyer à OpenGL. On peut aussi bien sûr préciser le type de filtering à ce moment-là.

Changements du 17/02/05 : version 1.2 de TGALoader : j'ai rajouté 3 fonctions : LoadFromData(), LoadOpenGLTextureFromData() et LoadOpenGLTextureFromDataWithID() (ouais c'est "un peu" long mais bon j'aime bien quand le nom est explicite :p).
Elles donnent à la classe la capacité de charger des textures depuis un tableau statique C, créé avec le programme bin2h (fourni dans l'archive).
Je m'explique : avec le programme bin2h, on transforme un fichier .tga en fichier .h (si vous ne voyez pas comment l'utiliser, faites un glisser-déposer de votre fichier .tga sur le programme bin2h (que vous aurez compilé), ça vous sortira un fichier .h).
Le fichier .h contiendra un tableau de cette forme : static unsigned char tableau_image[] = {0, 23, 46...etc};.
Lorsque vous passez ce tableau en argument à une des fonctions Load*FromData(), la classe charge l'image, comme elle le fait avec un fichier TGA.

Cela permet d'embarquer vos images dans l'exécutable et non en fichiers "extérieurs" si vous le voulez.

Changements du 28/04/05 : version 1.3 de TGALoader.
J'ai enlevé la clause "using namespace std;", qui peut poser des problèmes dans certains codes où ce n'est pas voulu et j'ai rajouté un constructeur de copie et un opérateur d'affectation. Il y a aussi maintenant des projets Dev-C++/FreeGLUT (à utiliser avec le DevPak FreeGLUT sur devpaks.org), ainsi qu'un projet Visual C++/FreeGLUT. FreeGLUT a entre autres l'avantage de nous permettre de nous passer de glut32.dll en linkant la librairie en static.
Ben voilà c'est tout :)

Changements du 08/10/07 : version 1.4 de TGALoader.
J'ai juste changé quelques petits trucs dans les sources pour ne plus avoir de warnings lors de l'utilisation avec MinGW au sujet d'une variable non initialisée et de m_width et m_height qui ne sont pas initialisées dans le bon ordre, dans les constructeurs.

Source / Exemple :


// TGALoader.h - chargeur de fichiers TGA.
// 2004-2007 par Funto. Si vous utilisez cette classe dans un de vos projets, un mail
// de remerciement à funto66@gmail.com serait le bienvenu ;).
// Version 1.4

#ifndef TGALOADER_H
#define TGALOADER_H

#define TGA_OPENGL_SUPPORT

#include <cstdlib>
#include <iostream>
#include <fstream>

#ifdef TGA_OPENGL_SUPPORT
	#ifdef WIN32
	#include <windows.h>
	#endif
#include <GL/gl.h>
#include <GL/glu.h>
#endif // defined TGA_OPENGL_SUPPORT

enum TGAErrorCode
{
	TGA_OK,
	TGA_FILE_NOT_FOUND,
	TGA_UNSUPPORTED_TYPE,
	TGA_NOT_ENOUGH_MEMORY
};

#ifdef TGA_OPENGL_SUPPORT
enum TGAFiltering
{
	TGA_NO_FILTER,
	TGA_LINEAR,
	TGA_BILINEAR,
	TGA_TRILINEAR
#ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
	,TGA_ANISOTROPIC
#endif
};
#endif

class TGALoader
{
private:
	unsigned char* m_data;
	bool m_loaded;
	unsigned int m_width, m_height;
	unsigned int m_bpp;	// Bytes Per Pixel : 0, 3 ou 4
public:
	TGALoader();
	TGALoader(const TGALoader& ref);
	TGALoader(char* path, TGAErrorCode* error=NULL);
	~TGALoader();
	TGAErrorCode LoadFile(char* path);
	TGAErrorCode LoadFromData(unsigned char *data);

	TGALoader& operator=(const TGALoader& ref);

#ifdef TGA_OPENGL_SUPPORT
	GLuint SendToOpenGL(TGAFiltering filtering=TGA_NO_FILTER);

	void SendToOpenGLWithID(GLuint ID, TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTexture(char* path, GLuint* pID=NULL,
		TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTextureWithID(char* path, GLuint ID,
		TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTextureFromData(unsigned char *data, GLuint* pID=NULL,
		TGAFiltering filtering=TGA_NO_FILTER);

	TGAErrorCode LoadOpenGLTextureFromDataWithID(unsigned char *data, GLuint ID,
		TGAFiltering filtering=TGA_NO_FILTER);
#endif

	void Free();

	inline unsigned char* GetData() {return m_data;}
	inline bool IsLoaded() {return m_loaded;}
	inline unsigned int GetHeight() {return m_height;}
	inline unsigned int GetWidth() {return m_width;}
	inline unsigned int GetBpp() {return m_bpp;}
};

#endif // !defined TGALOADER_H

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.