1 /* 2 * \file texture.hxx 3 * Texture manipulation routines 4 * 5 * Copyright (c) Mark J. Kilgard, 1997. 6 * Code added in april 2003 by Erik Hofman 7 * 8 * This program is freely distributable without licensing fees 9 * and is provided without guarantee or warrantee expressed or 10 * implied. This program is -not- in the public domain. 11 */ 12 13 #ifndef __SG_TEXTURE_HXX 14 #define __SG_TEXTURE_HXX 1 15 16 #include <simgear/compiler.h> 17 #include <osg/GL> 18 #include <zlib.h> 19 20 #include <plib/sg.h> 21 22 /** 23 * A class to encapsulate all the info surrounding an OpenGL texture 24 * and also query various info and load various file formats 25 */ 26 class SGTexture { 27 28 private: 29 30 GLuint texture_id; 31 GLubyte *texture_data; 32 33 GLsizei texture_width; 34 GLsizei texture_height; 35 GLsizei num_colors; 36 37 void resize(unsigned int width = 256, unsigned int height = 256); 38 39 const char *errstr; 40 41 protected: 42 43 FILE *file; 44 typedef struct _ImageRec { _ImageRecSGTexture::_ImageRec45 _ImageRec(void) : tmp(0), rowStart(0), rowSize(0) {} 46 unsigned short imagic; 47 unsigned short type; 48 unsigned short dim; 49 unsigned short xsize, ysize, zsize; 50 unsigned int min, max; 51 unsigned int wasteBytes; 52 char name[80]; 53 unsigned long colorMap; 54 gzFile file; 55 GLubyte *tmp; 56 unsigned long rleEnd; 57 unsigned int *rowStart; 58 int *rowSize; 59 } ImageRec; 60 61 void ConvertUint(unsigned *array, unsigned int length); 62 void ConvertShort(unsigned short *array, unsigned int length); 63 void rgbtorgb(GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *l, int n); 64 void rgbatorgba(GLubyte *r, GLubyte *g, GLubyte *b, GLubyte *a, 65 GLubyte *l, int n); 66 67 ImageRec *ImageOpen(const char *fileName); 68 ImageRec *ImageWriteOpen(const char *fileName); 69 ImageRec *RawImageOpen(const char *fileName); 70 void ImageClose(ImageRec *image); 71 void ImageGetRow(ImageRec *image, GLubyte *buf, int y, int z); 72 void ImagePutRow(ImageRec *image, GLubyte *buf, int y, int z); 73 free_id()74 inline void free_id() { 75 #ifdef GL_VERSION_1_1 76 glDeleteTextures(1, &texture_id); 77 #else 78 glDeleteTexturesEXT(1, &texture_id); 79 #endif 80 texture_id = 0; 81 } 82 83 84 public: 85 86 SGTexture(); 87 SGTexture(unsigned int width, unsigned int height); 88 ~SGTexture(); 89 90 /* Copyright (c) Mark J. Kilgard, 1997. */ 91 void read_alpha_texture(const char *name); 92 void read_rgb_texture(const char *name); 93 void read_rgba_texture(const char *name); 94 void read_raw_texture(const char *name); 95 void read_r8_texture(const char *name); 96 void write_texture(const char *name); 97 usable()98 inline bool usable() { return (texture_id > 0) ? true : false; } 99 id()100 inline GLuint id() { return texture_id; } texture()101 inline GLubyte *texture() { return texture_data; } set_data(GLubyte * data)102 inline void set_data(GLubyte *data) { texture_data = data; } 103 // inline void set_colors(int c) { num_colors = c; } 104 width()105 inline int width() { return texture_width; } height()106 inline int height() { return texture_height; } colors()107 inline int colors() { return num_colors; } 108 109 // dynamic texture functions. 110 // everything drawn to the OpenGL screen after prepare is 111 // called and before finish is called will be included 112 // in the new texture. 113 void prepare(unsigned int width = 256, unsigned int height = 256); 114 void finish(unsigned int width, unsigned int height); 115 116 // texture pixel manipulation functions. 117 void set_pixel(GLuint x, GLuint y, GLubyte *c); 118 GLubyte *get_pixel(GLuint x, GLuint y); 119 120 void bind(); select(bool keep_data=false)121 inline void select(bool keep_data = false) { 122 glTexImage2D( GL_TEXTURE_2D, 0, num_colors, 123 texture_width, texture_height, 0, 124 (num_colors==1)?GL_LUMINANCE:(num_colors==3)?GL_RGB:GL_RGBA, GL_UNSIGNED_BYTE, texture_data ); 125 126 if (!keep_data) { 127 delete[] texture_data; 128 texture_data = 0; 129 } 130 } 131 132 // Nowhere does it say that resident textures have to be in video memory! 133 // NVidia's OpenGL drivers implement glAreTexturesResident() correctly, 134 // but the Matrox G400, for example, doesn't. is_resident()135 inline bool is_resident() { 136 GLboolean is_res; 137 glAreTexturesResident(1, &texture_id, &is_res); 138 return is_res != 0; 139 } 140 err_str()141 inline const char *err_str() { return errstr; } clear_err_str()142 inline void clear_err_str() { errstr = ""; } 143 144 void make_maxcolorwindow(); 145 void make_grayscale(float contrast = 1.0); 146 void make_monochrome(float contrast = 1.0, 147 GLubyte r=255, GLubyte g=255, GLubyte b=255); 148 void make_normalmap(float brightness = 1.0, float contrast = 1.0); 149 void make_bumpmap(float brightness = 1.0, float contrast = 1.0); 150 }; 151 152 #endif 153 154