Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/graphics/importer/texture.cc @ 3952

Last change on this file since 3952 was 3905, checked in by bensch, 20 years ago

orxonox/trunk: image now gets loaded with the an SDL_Surface instead of a strange pointer to a Struct that is only redundant

File size: 4.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_IMPORTER
17
18#include "texture.h"
19
20#include "graphics_engine.h"
21
22/**
23   \brief Constructor for a Texture
24*/
25Texture::Texture(const char* imageName)
26{
27  this->texture = 0;
28  if (imageName)
29    this->loadImage(imageName);
30} 
31
32/**
33   \brief Destructor of a Texture
34   
35   Frees Data, and deletes the textures from GL
36*/
37Texture::~Texture(void)
38{
39  if (this->texture)
40    glDeleteTextures(1, &this->texture);
41}
42
43/**
44   \brief a Simple function that switches two char values
45   \param a The first value
46   \param b The second value
47*/
48void Texture::swap (unsigned char &a, unsigned char &b)
49{
50  unsigned char temp;
51  temp = a;
52  a    = b;
53  b    = temp;
54}
55
56
57/**
58   \brief Loads a Texture to the openGL-environment.
59   \param surface the Image to load to openGL
60   \returns The ID of the texture.
61*/
62GLuint Texture::loadTexToGL (SDL_Surface* surface)
63{
64  if (GraphicsEngine::texturesEnabled)
65    {
66      PRINTF(4)("Loading texture to OpenGL-Environment.\n");
67
68      GLuint texture;
69      int w, h;
70      SDL_Surface *image;
71      SDL_Rect area;
72      Uint32 saved_flags;
73      Uint8  saved_alpha;
74     
75      w = surface->w;
76      h = surface->h;
77     
78      image = SDL_CreateRGBSurface(SDL_SWSURFACE,
79                                   w, h,
80                                   32,
81#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */
82                                   0x000000FF, 
83                                   0x0000FF00, 
84                                   0x00FF0000, 
85                                   0xFF000000
86#else
87                                   0xFF000000,
88                                   0x00FF0000, 
89                                   0x0000FF00, 
90                                   0x000000FF
91#endif
92                                   );
93      if ( image == NULL ) {
94        return 0;
95      }
96     
97      /* Save the alpha blending attributes */
98      saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK);
99      saved_alpha = surface->format->alpha;
100      if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
101        SDL_SetAlpha(surface, 0, 0);
102      }
103     
104      /* Copy the surface into the GL texture image */
105      area.x = 0;
106      area.y = 0;
107      area.w = surface->w;
108      area.h = surface->h;
109      SDL_BlitSurface(surface, &area, image, &area);
110     
111      /* Restore the alpha blending attributes */
112      if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
113        SDL_SetAlpha(surface, saved_flags | SDL_OPENGL, saved_alpha);
114      }
115     
116      /* Create an OpenGL texture for the image */
117      glGenTextures(1, &texture);
118      glBindTexture(GL_TEXTURE_2D, texture);
119      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
120      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
121      /*      glTexImage2D(GL_TEXTURE_2D,
122                   0,
123                   GL_RGBA,
124                   w, h,
125                   0,
126                   GL_RGBA,
127                   GL_UNSIGNED_BYTE,
128                   image->pixels);
129      */
130      gluBuild2DMipmaps(GL_TEXTURE_2D,
131                        3,
132                        w,
133                        h,
134                        GL_RGBA,
135                        GL_UNSIGNED_BYTE,
136                        image->pixels);
137
138      SDL_FreeSurface(image); /* No longer needed */
139     
140      return texture;
141    }
142}
143
144/**
145   \brief loads an Image from a file to a Texture
146   \param imageName The image to load
147*/
148bool Texture::loadImage(const char* imageName)
149{
150  if (GraphicsEngine::texturesEnabled)
151    {
152      if (imageName)
153        {
154          SDL_Surface* tmpSurf;
155          if (this->texture)
156            glDeleteTextures(1, &this->texture);
157          // load the new Image to memory
158          tmpSurf = IMG_Load(imageName);
159          if(!tmpSurf)
160            {
161              PRINTF(1)("IMG_Load: %s\n", IMG_GetError());
162              return false;
163            }
164
165          GLubyte* pixels = (GLubyte*)tmpSurf->pixels;
166         
167          /* this swaps the Mapping so lowel left will be upper left */
168          for( int i = 0 ; i < (tmpSurf->h / 2) ; ++i )
169            for( int j = 0 ; j < tmpSurf->w * tmpSurf->format->BytesPerPixel; j += tmpSurf->format->BytesPerPixel )
170              for(int k = 0; k < tmpSurf->format->BytesPerPixel; ++k)
171                swap( pixels[(i * tmpSurf->w * tmpSurf->format->BytesPerPixel) + j + k],
172                      pixels[ ( (tmpSurf->h - i - 1) * tmpSurf->w *  tmpSurf->format->BytesPerPixel) + j + k]);
173
174          PRINTF(3)("loading Image %s\n", imageName);
175          if (tmpSurf)
176            this->texture = loadTexToGL(tmpSurf);
177
178         
179          SDL_FreeSurface(tmpSurf);
180          return true;
181        }
182      else
183        {
184          PRINTF(2)("Image not Found: %s\n", imageName);
185          return false;
186        }
187    }
188}
Note: See TracBrowser for help on using the repository browser.