home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 February / Chip_2001-02_cd1.bin / bonus / demos / CS / exp / SOURCES / GLENGINE / texture.cpp < prev    next >
C/C++ Source or Header  |  2000-08-16  |  5KB  |  173 lines

  1. #include "texture.h"
  2. #include "macros.h"
  3.  
  4. Texture::Texture () {
  5.  
  6.   glGenTextures(1, &texture);
  7.  
  8.   wrap_s = GL_REPEAT;
  9.   wrap_t = GL_REPEAT;
  10.   min_filter = GL_LINEAR;
  11.   mag_filter = GL_LINEAR;
  12.   border_color[0] = 0.0; border_color[1] = 0.0;
  13.   border_color[2] = 0.0; border_color[3] = 0.0;
  14.   priority = 1.0;
  15.   env_mode =  GL_MODULATE;
  16.   env_color[0] = 0.0; env_color[1] = 0.0;
  17.   env_color[2] = 0.0; env_color[3] = 0.0;
  18.  
  19.   transferred = false;
  20.   altered = true;
  21. }
  22.  
  23. void Texture::WrapS (GLint n) {
  24.   wrap_s = n; altered = true;
  25. }
  26. void Texture::WrapT (GLint n) {
  27.   wrap_t = n; altered = true;
  28. }
  29. void Texture::MinFilter (GLint n) {
  30.   min_filter = n; altered = true;
  31. }
  32. void Texture::MagFilter (GLint n) {
  33.   mag_filter = n; altered = true;
  34. }
  35. void Texture::Priority (GLfloat f) {
  36.   priority = f; altered = true;
  37. }
  38. void Texture::BorderColor4fv (GLfloat *v) {
  39.   border_color[0] = *v; border_color[1] = *(v+1);
  40.   border_color[2] = *(v+2); border_color[3] = *(v+3);
  41.   altered = true;
  42. }
  43. void Texture::EnvMode (GLenum e) {
  44.   env_mode = e; altered = true;
  45. }
  46. void Texture::EnvColor4f (GLfloat r, GLfloat g, GLfloat b, GLfloat a) {
  47.   env_color[0] = r; env_color[1] = g;
  48.   env_color[2] = b; env_color[3] = a;
  49.   altered = true;
  50. }
  51. void Texture::EnvColor4fv (GLfloat *v) {
  52.   env_color[0] = *v; env_color[1] = *(v+1);
  53.   env_color[2] = *(v+2); env_color[3] = *(v+3);
  54.   altered = true;
  55. }
  56. GLint Texture::WrapS () {
  57.   return wrap_s;
  58. }
  59. GLint Texture::WrapT () {
  60.   return wrap_t;
  61. }
  62. GLint Texture::MinFilter () {
  63.   return min_filter;
  64. }
  65. GLint Texture::MagFilter () {
  66.   return mag_filter;
  67. }
  68. GLfloat Texture::Priority () {
  69.   return priority;
  70. }
  71. const GLfloat* Texture::BorderColor4fv () {
  72.   return border_color;
  73. }
  74. GLenum Texture::EnvMode () {
  75.   return env_mode;
  76. }
  77. const GLfloat* Texture::EnvColor4fv () {
  78.   return env_color;
  79. }
  80.  
  81. void TextureGL::GL ()
  82. {
  83.   glBindTexture(GL_TEXTURE_2D, texture);
  84.   if(altered) {
  85.     altered = false;
  86.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s);
  87.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t);
  88.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter);
  89.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter);
  90.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
  91.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, priority);
  92.   }
  93.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env_mode);
  94.   glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
  95. }
  96.  
  97. void TextureGL::TexImage2D (GLenum target, GLint level, GLint internalformat,
  98.                             GLsizei width, GLsizei height, GLint border,
  99.                             GLenum format, GLenum type, void *data)
  100. {
  101.   GLint old;
  102.   glGetIntegerv(GL_TEXTURE_BINDING_2D, &old);
  103.   glBindTexture(GL_TEXTURE_2D, texture);
  104.   glTexImage2D(GL_TEXTURE_2D, level, internalformat,
  105.                width, height, border,
  106.                format, type, data);
  107.   glBindTexture(GL_TEXTURE_2D, old);
  108. }
  109.  
  110. void TextureFile::GL ()
  111. {
  112.   if(Name()==0) {    
  113.     glBindTexture(GL_TEXTURE_2D, 0);
  114.     return;
  115.   }
  116.   if(texture==0)
  117.     glGenTextures(1, &texture);
  118.  
  119.   glBindTexture(GL_TEXTURE_2D, texture);
  120.  
  121.   if(altered) {
  122.     altered = false;
  123.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s);
  124.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t);
  125.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter);
  126.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter);
  127.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
  128.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_PRIORITY, priority);
  129.   }
  130.   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env_mode);
  131.   glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, env_color);
  132.  
  133.   if(!transferred) {
  134.     Image img;
  135.     img.Load(Name()());
  136.  
  137.     switch(img.format())
  138.     {
  139.       case OGL_IMAGE_RGB888:
  140.         img.FlipVertical();
  141.         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  142.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1,
  143.                      img.width(), img.height(), 0,
  144.                      GL_RGB, GL_UNSIGNED_BYTE, img.data());
  145.   
  146.         cout << "texture transferred" << endl;
  147.         break;
  148.  
  149.       case OGL_IMAGE_RGBA8888:
  150.         img.FlipVertical();
  151.         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  152.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1,
  153.                      img.width(), img.height(), 0,
  154.                      GL_RGBA, GL_UNSIGNED_BYTE, img.data());
  155.   
  156.         cout << "texture transferred" << endl;
  157.         break;
  158.  
  159.       default:
  160.         cout << "Bad image type " << img.format() << endl;
  161.         break;
  162.     }
  163.  
  164.     transferred = true;
  165.   }
  166. }
  167.  
  168. Texture::~Texture () {
  169.   if(texture==0)
  170.     return;
  171.   glDeleteTextures(1, &texture);
  172. }
  173.