gKitGL
|
00001 00002 #ifndef _GLTEXTURE2DIO_H 00003 #define _GLTEXTURE2DIO_H 00004 00005 #include "IOManager.h" 00006 #include "ImageIO.h" 00007 #include "GL/TPTexture.h" 00008 00009 00010 namespace gk { 00011 00012 //! manager pour importer des GLColorTexture / GLHDRTexture. 00013 class GLTexture2DIO : public IOManager<GLTexture2D> 00014 { 00015 // non copyable 00016 GLTexture2DIO( const GLTexture& ); 00017 GLTexture2DIO& operator=( const GLTexture& ); 00018 00019 // private default constructor, singleton 00020 GLTexture2DIO( ) 00021 : 00022 IOManager<GLTexture2D>() 00023 {} 00024 00025 ~GLTexture2DIO( ) 00026 { 00027 // detruire les ressources GL, ~IOManager() detruit les objets. 00028 int n= (int) m_objects.size(); 00029 for(int i= 0; i < n; i++) 00030 m_objects[i].object->releaseGLResource(); 00031 } 00032 00033 public: 00034 //! importe la GLTexture 'name' a partir du ficher 'filename'. 00035 static 00036 GLTexture2D *read( const int unit, const std::string& filename, const std::string& name= "" ) 00037 { 00038 // importer le fichier, si necessaire 00039 GLTexture2D *gtexture= manager().find(filename, name); 00040 if(gtexture != NULL) 00041 return gtexture; 00042 00043 // determiner le type HDR / Color de l'image 00044 if(ImageIO::isColorFile(filename)) 00045 { 00046 Image *image= ImageIO::read(filename, name); 00047 if(image == NULL) 00048 { 00049 printf("failed '%s' color image\n", filename.c_str()); 00050 return NULL; 00051 } 00052 00053 // cree la GLTexture 'directement' sans utiliser GLManager / GLContext, l'objet ne doit etre gere que par un seul manager !! 00054 gtexture= new GLTexture2D(unit, image); 00055 } 00056 else if(HDRImageIO::isHDRFile(filename)) 00057 { 00058 HDRImage *image= HDRImageIO::read(filename, name); 00059 if(image == NULL) 00060 { 00061 printf("failed '%s' hdr image\n", filename.c_str()); 00062 return NULL; 00063 } 00064 00065 // cree la GLTexture 'directement' sans utiliser GLManager / GLContext, l'objet ne doit etre gere que par un seul manager !! 00066 gtexture= new GLTexture2D(unit, image); 00067 } 00068 else 00069 { 00070 printf("failed '%s', unknown image type\n", filename.c_str()); 00071 return NULL; 00072 } 00073 00074 // cree la texture gl 00075 if(gtexture->createGLResource() < 0) 00076 { 00077 delete gtexture; 00078 gtexture= NULL; 00079 } 00080 00081 // reference la texture avec le manager 00082 return manager().insert(gtexture, filename, name); 00083 } 00084 00085 static 00086 GLTexture2DIO& manager( ) //!< singleton 00087 { 00088 static GLTexture2DIO manager; 00089 return manager; 00090 } 00091 }; 00092 00093 } 00094 00095 #endif