Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

d3d9texture.cpp

Go to the documentation of this file.
00001 /************************************************************************
00002         filename:       d3d9texture.cpp
00003         created:        17/7/2004
00004         author:         Paul D Turner with D3D 9 Updates by Magnus Österlind
00005         
00006         purpose:        Implements texture class for D3D9.0 system
00007 *************************************************************************/
00008 /*************************************************************************
00009     Crazy Eddie's GUI System (http://www.cegui.org.uk)
00010     Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk)
00011 
00012     This library is free software; you can redistribute it and/or
00013     modify it under the terms of the GNU Lesser General Public
00014     License as published by the Free Software Foundation; either
00015     version 2.1 of the License, or (at your option) any later version.
00016 
00017     This library is distributed in the hope that it will be useful,
00018     but WITHOUT ANY WARRANTY; without even the implied warranty of
00019     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020     Lesser General Public License for more details.
00021 
00022     You should have received a copy of the GNU Lesser General Public
00023     License along with this library; if not, write to the Free Software
00024     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00025 *************************************************************************/
00026 #include "renderers/directx9GUIRenderer/d3d9texture.h"
00027 #include "renderers/directx9GUIRenderer/d3d9renderer.h"
00028 #include "CEGUIExceptions.h"
00029 #include "CEGUISystem.h"
00030 
00031 #include <d3dx9.h>
00032 #include <dxerr9.h>
00033 #undef max
00034 
00035 // Start of CEGUI namespace section
00036 namespace CEGUI
00037 {
00038 
00039 /*************************************************************************
00040         Constructor
00041 *************************************************************************/
00042 DirectX9Texture::DirectX9Texture(Renderer* owner) :
00043         Texture(owner)
00044 {
00045         d_d3dtexture = NULL;
00046 
00047         // do this mainly to indicate the lack of a filename.
00048         d_isMemoryTexture = true;
00049 }
00050 
00051 /*************************************************************************
00052         Destructor
00053 *************************************************************************/
00054 DirectX9Texture::~DirectX9Texture(void)
00055 {
00056         freeD3DTexture();
00057 }
00058 
00059 /*************************************************************************
00060         Load texture from file.  Texture is made to be same size as image in
00061         file.
00062 *************************************************************************/
00063 void DirectX9Texture::loadFromFile(const String& filename, const String& resourceGroup)
00064 {
00065         freeD3DTexture();
00066         
00067         // load the file via the resource provider
00068         RawDataContainer texFile;
00069         System::getSingleton().getResourceProvider()->loadRawDataContainer(filename, texFile, resourceGroup);
00070 
00071         D3DXIMAGE_INFO texInfo;
00072         HRESULT hr = D3DXCreateTextureFromFileInMemoryEx(((DirectX9Renderer*)getRenderer())->getDevice(), texFile.getDataPtr(), texFile.getSize(),
00073                                                 D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT,
00074                                                 0, &texInfo, NULL, &d_d3dtexture);
00075         
00076         if (SUCCEEDED(hr))
00077         {
00078                 d_width         = (ushort)texInfo.Width;
00079                 d_height        = (ushort)texInfo.Height;
00080 
00081                 d_filename = filename;
00082         d_resourceGroup = resourceGroup;
00083                 d_isMemoryTexture = false;
00084         }
00085         else
00086         {
00087                 throw RendererException((utf8*)"Failed to create Texture object from file '" + filename + "'.  Additional Info: " + (const utf8*)DXGetErrorString9(hr));
00088         }
00089 
00090 }
00091 
00092 
00093 /*************************************************************************
00094         Load texture from raw memory.   
00095 *************************************************************************/
00096 void DirectX9Texture::loadFromMemory(const void* buffPtr, uint buffWidth, uint buffHeight)
00097 {
00098         using namespace std;
00099 
00100         // release old texture
00101         freeD3DTexture();
00102 
00103         // calculate square size big enough for whole memory buffer
00104         uint tex_size = ceguimax(buffWidth, buffHeight);
00105 
00106         // create a texture
00107         // TODO: Check resulting pixel format and react appropriately.
00108         HRESULT hr = D3DXCreateTexture(((DirectX9Renderer*)getRenderer())->getDevice(), tex_size, tex_size, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &d_d3dtexture);
00109 
00110         if (FAILED(hr))
00111         {
00112                 throw RendererException((utf8*)"Failed to load texture from memory: D3D Texture creation failed.");
00113         }
00114         else
00115         {
00116                 D3DSURFACE_DESC texdesc;
00117                 d_d3dtexture->GetLevelDesc(0, &texdesc);
00118 
00119                 // store new size;
00120                 d_width         = (ushort)texdesc.Width;
00121                 d_height        = (ushort)texdesc.Height;
00122 
00123                 // lock the D3D texture
00124                 D3DLOCKED_RECT  rect;
00125                 hr = d_d3dtexture->LockRect(0, &rect, NULL, 0);
00126 
00127                 if (FAILED(hr))
00128                 {
00129                         d_d3dtexture->Release();
00130                         d_d3dtexture = NULL;
00131 
00132                         throw RendererException((utf8*)"Failed to load texture from memory: IDirect3DTexture9::LockRect failed.");
00133                 }
00134                 else
00135                 {
00136                         // copy data from buffer into texture
00137                         ulong* dst = (ulong*)rect.pBits;
00138                         ulong* src = (ulong*)buffPtr;
00139 
00140                         for (uint i = 0; i < buffHeight; ++i)
00141                         {
00142                                 for (uint j = 0; j < buffWidth; ++j)
00143                                 {
00144                                         dst[j] = src[j];
00145                                 }
00146 
00147                                 dst += rect.Pitch / sizeof(ulong);
00148                                 src += buffWidth;
00149                         }
00150 
00151                         d_d3dtexture->UnlockRect(0);
00152                 }
00153 
00154         }
00155 
00156 }
00157 
00158 
00159 /*************************************************************************
00160         safely release D3D texture associated with this Texture
00161 *************************************************************************/
00162 void DirectX9Texture::freeD3DTexture(void)
00163 {
00164         if (d_d3dtexture != NULL)
00165         {
00166                 d_d3dtexture->Release();
00167                 d_d3dtexture = NULL;
00168         }
00169 
00170         d_filename.clear();
00171         d_isMemoryTexture = true;
00172 }
00173 
00174 
00175 /*************************************************************************
00176         allocate a D3D texture >= 'size'.  Previous D3D texture is lost
00177 *************************************************************************/
00178 void DirectX9Texture::setD3DTextureSize(uint size)
00179 {
00180         freeD3DTexture();
00181 
00182         HRESULT hr = D3DXCreateTexture(((DirectX9Renderer*)getRenderer())->getDevice(), size, size, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &d_d3dtexture);
00183 
00184         if (FAILED(hr))
00185         {
00186                 throw RendererException((utf8*)"Failed to create texture of specified size: D3D Texture creation failed.");
00187         }
00188         else
00189         {
00190                 D3DSURFACE_DESC texdesc;
00191                 d_d3dtexture->GetLevelDesc(0, &texdesc);
00192 
00193                 // store new size;
00194                 d_width         = (ushort)texdesc.Width;
00195                 d_height        = (ushort)texdesc.Height;
00196         }
00197 
00198 }
00199 
00200 
00201 /*************************************************************************
00202         Direct3D support method that must be called prior to a Reset call
00203         on the Direct3DDevice.
00204 *************************************************************************/
00205 void DirectX9Texture::preD3DReset(void)
00206 {
00207         // textures not based on files are in the managed pool, so we do
00208         // not worry about those.
00209         if (!d_isMemoryTexture)
00210         {
00211                 // release the d3d texture
00212                 if (d_d3dtexture != NULL)
00213                 {
00214                         if (FAILED(d_d3dtexture->Release()))
00215                         {
00216                                 throw RendererException("DirectX9Texture::preD3DReset - failed to release the Direct3DTexture9 object for this texture.");
00217                         }
00218 
00219                         d_d3dtexture = NULL;
00220                 }
00221 
00222         }
00223 
00224 }
00225 
00226 
00227 /*************************************************************************
00228         Direct3D support method that must be called after a Reset call on the
00229         Direct3DDevice.
00230 *************************************************************************/
00231 void DirectX9Texture::postD3DReset(void)
00232 {
00233         // textures not based on files are in the managed pool, so we do
00234         // not worry about those.
00235         if (!d_isMemoryTexture)
00236         {
00237                 // The reason this copy is made is that d_filename will be reset once we
00238                 // call loadFromFile and loading would always fail due to invalid filenames.
00239                 String name(d_filename);
00240 
00241                 // re-load the texture
00242                 loadFromFile(name, d_resourceGroup);
00243         }
00244 
00245 }
00246 
00247 } // End of  CEGUI namespace section

Generated on Wed Feb 16 12:41:08 2005 for Crazy Eddies GUI System by  doxygen 1.3.9.1