K3dTextureBuild.cpp

Go to the documentation of this file.
00001 
00014 /***************************************************************************
00015  *   Copyright (C) 2007 by Jan Koci   *
00016  *   honza.koci@email.cz   *
00017  *   http://kengine.sourceforge.net/tutorial/
00018  *                                                                         *
00019  *   This program is free software; you can redistribute it and/or modify  *
00020  *   it under the terms of the GNU General Public License as published by  *
00021  *   the Free Software Foundation; either version 2 of the License, or     *
00022  *   (at your option) any later version.                                   *
00023  *                                                                         *
00024  *   This program is distributed in the hope that it will be useful,       *
00025  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00026  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00027  *   GNU General Public License for more details.                          *
00028  *                                                                         *
00029  *   You should have received a copy of the GNU General Public License     *
00030  *   along with this program; if not, write to the                         *
00031  *   Free Software Foundation, Inc.,                                       *
00032  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00033  ***************************************************************************/
00034 
00035 #include "K3dTextureBuild.h"
00036 
00040 K3dTextureBuild::K3dTextureBuild(K3dGameData *_pGameData)
00041 {
00042         cout << "K3dTexture::K3dTexture()" << endl;
00043         m_pGameData = _pGameData;
00044         // Set this pointer to the game data
00045         m_pGameData->SetTextureBuild(this);
00046 }
00047 
00048 K3dTextureBuild::~K3dTextureBuild()
00049 {
00050         cout << "K3dTexture::~K3dTexture()" << endl;
00051         DeleteTextures();
00052 }
00053 
00055 void K3dTextureBuild::DeleteTextures()
00056 {
00057         while(m_pGameData->GetTextureObjSP().GetNum())
00058         {
00059                 K3dTextureObj *p = m_pGameData->GetTextureObjSP().Get(0);
00060                 p = m_pGameData->GetTextureObjSP().Delete(p);
00061         }
00062 }
00063 
00065 void K3dTextureBuild::LoadTextures()
00066 {
00067         cout << "void K3dTextureBuild::LoadTextures()" << endl;
00068         K3dString strFc = "void K3dTextureBuild::LoadTextures() -- ";
00069         K3dString strOut;
00070         // Get virtual machine from global data
00071         K3dLua *pLua = m_pGameData->GetLua();
00072         // Get number of textures
00073         pLua->LuaGetGlobal(K_STR_NUM_TEXTURES);
00074     if (!pLua->LuaIsNumber(-1))
00075         {
00076                 cerr << "Warning: void K3dTextureBuild::LoadTextures(): Doesn`t load " << K_STR_NUM_TEXTURES << " from map file" << endl;
00077                 return;
00078     }
00079         int iNumTextures = (int) pLua->LuaToNumber(-1);
00080         for(int i=0; i<iNumTextures; i++)
00081         {
00082                 K3dTextureObj *pTexture = m_pGameData->GetTextureObjSP().New();
00083                 K3dString kString(K_STR_TEXTURE_TABLE);
00084                 // Add number behind string
00085                 kString.AddNumber(i);
00086                 
00087                 pLua->LuaGetGlobal(kString.GetString().c_str());
00088                 if (!pLua->LuaIsTable(-1))
00089                 {
00090                         strOut = strFc + kString;
00091                         strOut += " is not a valid texture table";
00092                         pLua->LuaError(strOut.GetString().c_str());
00093                 }
00094                 
00095                 pTexture->GetName() = pLua->LuaGetFieldString(K_STR_NAME);
00096                 K3dString strPath = pLua->LuaGetFieldString(K_STR_PATH);
00097                 // Set texture filename 
00098                 K3dString strFileName = m_pGameData->GetPath(K_PATH_APP) + strPath;
00099                 // Create texture and get texture index
00100                 pTexture->GetId() = CreateTexture(strFileName.GetString().c_str());
00101                 // Set texture width and height
00102                 pTexture->GetWidth() = GetTextureWidth();
00103                 pTexture->GetHeight() = GetTextureHeight();
00104         }
00105 }
00106 
00108 int K3dTextureBuild::FindTextureId(const char* _strName)
00109 {
00110         K3dString strName(_strName);
00111         for(int i=0; i<m_pGameData->GetTextureObjSP().GetNum(); i++)
00112         {
00113                 K3dTextureObj *pTexture = m_pGameData->GetTextureObjSP().Get(i);
00114                 if(strName == pTexture->GetName())
00115                 {
00116                         return i;
00117                 }
00118         }
00119         return -1;
00120 }
00121 
00125 bool K3dTextureBuild::SwapSurfaceRows(SDL_Surface *_ptSurface)
00126 {
00127         cout << "bool K3dTexture::SwapSurfaceRows(SDL_Surface *_ptSurface)" << endl;
00129         Uint8 *puiHiRow, *puiLoRow, *puiTmpRow;
00130 
00131         // Alokace pameti pro pomocny radek
00132         puiTmpRow = (Uint8 *)malloc(_ptSurface->pitch);
00133 
00134         if(puiTmpRow == NULL)
00135         {
00136                 fprintf(stderr, "Unable to allocate memory.\n");
00137                 cerr << "bool K3dTexture::SwapSurfaceRows() -- Error - Unable to allocate memory" << endl;
00138                 return false;
00139         }
00140 
00141         // Pointer to the firts and last row
00142         puiHiRow = (Uint8 *)_ptSurface->pixels;
00143         puiLoRow = puiHiRow + (_ptSurface->h * _ptSurface->pitch) - _ptSurface->pitch;
00144 
00145         if(SDL_MUSTLOCK(_ptSurface))
00146         {
00147                 if(SDL_LockSurface(_ptSurface) == -1)
00148                 {
00149                         fprintf(stderr, "Unable to lock _ptSurface.\n");
00150                         cerr << "bool K3dTexture::SwapSurfaceRows() -- Error - Unable to lock _ptSurface." << endl;
00151                         free(puiTmpRow);
00152                         return false;
00153                 }
00154         }
00155 
00156         for(int i = 0; i < _ptSurface->h / 2; i++)
00157         {
00158                 memcpy(puiTmpRow, puiHiRow, _ptSurface->pitch);
00159                 memcpy(puiHiRow, puiLoRow, _ptSurface->pitch);
00160                 memcpy(puiLoRow, puiTmpRow, _ptSurface->pitch);
00161 
00162                 puiHiRow += _ptSurface->pitch;
00163                 puiLoRow -= _ptSurface->pitch;
00164         }
00165 
00166         if (SDL_MUSTLOCK(_ptSurface))
00167         {
00168                 SDL_UnlockSurface(_ptSurface);
00169         }
00170 
00171         free(puiTmpRow);
00172 
00173         return true;
00174 }
00175 
00179 GLuint K3dTextureBuild::CreateTexture(SDL_Surface *_ptSurface)
00180 {
00181         cout << "GLuint K3dTexture::CreateTexture(SDL_Surface *_ptSurface)" << endl;
00182         GLuint iTexture;                
00183         Uint32 uiSavedFlags;    
00184         Uint8  uiSavedAlpha;
00185         SDL_Surface *ptTmpImg;  
00186 
00187         // Create empty RGB surface
00188         ptTmpImg = SDL_CreateRGBSurface(
00189                 SDL_SWSURFACE,          // Software surface
00190                 _ptSurface->w, _ptSurface->h,   
00191                 m_pGameData->GetGraphicOption()->iColorBits,                    // Color Depth
00192         #if SDL_BYTEORDER == SDL_LIL_ENDIAN
00193                                 0x000000FF,             // OpenGL RGBA mask
00194                                 0x0000FF00,
00195                                 0x00FF0000,
00196                                 0xFF000000
00197         #else
00198                                 0xFF000000,
00199                                 0x00FF0000,
00200                                 0x0000FF00,
00201                                 0x000000FF
00202         #endif
00203                 );
00204 
00205         if(ptTmpImg == NULL)
00206                 return 0;
00207 
00208         // Set texture width and height
00209         m_iWidth = _ptSurface->w;
00210         m_iHeight = _ptSurface->h;
00211 
00212         // Save alpha blending atribute
00213         uiSavedFlags = _ptSurface->flags & (SDL_SRCALPHA|SDL_RLEACCELOK);
00214         uiSavedAlpha = _ptSurface->format->alpha;
00215 
00216         if((uiSavedFlags & SDL_SRCALPHA) == SDL_SRCALPHA)
00217                 SDL_SetAlpha(_ptSurface, 0, 0);
00218 
00219         // Copy surface to the texture picture
00220         SDL_Rect tArea;
00221         tArea.x = 0;
00222         tArea.y = 0;
00223         tArea.w = _ptSurface->w;
00224         tArea.h = _ptSurface->h;
00225         SDL_BlitSurface(_ptSurface, &tArea, ptTmpImg, &tArea);
00226 
00227         // Restore alpha blending atributes
00228         if((uiSavedFlags & SDL_SRCALPHA) == SDL_SRCALPHA)
00229                 SDL_SetAlpha(_ptSurface, uiSavedFlags, uiSavedAlpha);
00230 
00231         // Swap surface rows
00232         if(!SwapSurfaceRows(ptTmpImg))
00233         {
00234                 cout << "GLuint K3dTexture::CreateTexture(SDL_Surface *_ptSurface) -- Error - SwapSurfaceRows returns some error..." << endl;
00235                 SDL_FreeSurface(ptTmpImg);
00236                 return 0;
00237         }
00238         
00239         cout << "GLuint K3dTexture::CreateTexture(SDL_Surface *_ptSurface) -- glGenTextures -- iTexture = " << iTexture << endl;
00240         // Create texture
00241         glGenTextures(1, &iTexture);
00242         glBindTexture(GL_TEXTURE_2D, iTexture);
00243         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00244         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00245         glTexImage2D(GL_TEXTURE_2D,
00246                 0,
00247                 GL_RGBA,
00248                 _ptSurface->w, _ptSurface->h,
00249                 0,
00250                 GL_RGBA,
00251                 GL_UNSIGNED_BYTE,
00252                 ptTmpImg->pixels);
00253 
00254         cout << "GLuint K3dTexture::CreateTexture(SDL_Surface *_ptSurface) -- SDL_FreeSurface " << ptTmpImg << endl;
00255         SDL_FreeSurface(ptTmpImg);
00256         return iTexture;
00257 }
00258 
00261 GLuint K3dTextureBuild::CreateTexture(const char* _strFileName)
00262 {
00263         cout << "GLuint K3dTexture::CreateTexture()" << endl;
00264         cout << "Input filename = " << _strFileName << endl;
00265         GLuint iTexture;
00266 
00267         //cout << "Application path = " << m_pGameData->GetPath(K_PATH_APP).GetString() << endl;
00268         //K3dString strFileName = m_pGameData->GetPath(K_PATH_APP) + _strFileName;
00269         //cout << "Filename for load = " << strFileName.GetString( ) << endl;
00270         // Load image
00271         SDL_Surface *ptImg = IMG_Load(/*_strFileName.GetString().c_str()*/_strFileName);
00272 
00273         if(ptImg == NULL)
00274         {
00275                 //fprintf(stderr, "Unable to load '%s': %s\n",
00276                 //      _strFileName, SDL_GetError());
00277                 cerr << "GLuint K3dTexture::CreateTexture() -- Error - Doesn`t load texture " << _strFileName/*.GetString()*/ << SDL_GetError() << endl;
00278                 return 0;
00279         }
00280 
00281         iTexture = CreateTexture(ptImg);
00282         cout << "GLuint K3dTexture::CreateTexture(const char* _strFileName) -- SDL_FreeSurface " << ptImg << endl;
00283         SDL_FreeSurface(ptImg);
00284         cout << "GLuint K3dTexture::CreateTexture(const char* _strFileName) -- SDL_FreeSurface - OK " << ptImg << endl;
00285         return iTexture;
00286 }
00287 

Generated on Thu Aug 16 23:53:28 2007 for K3dEngine by  doxygen 1.5.0