renderer.h

00001 /************************************************************************
00002         filename:       renderer.h
00003         created:        15/3/2004
00004         author:         Paul D Turner
00005         
00006         purpose:        Interface for DirectX 8.1 Renderer class
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 /*************************************************************************
00027         This file contains code that is specific to Win32 and DirectX
00028 *************************************************************************/
00029 #ifndef _DirectX81GUIRenderer_h_
00030 #define _DirectX81GUIRenderer_h_
00031 
00032 #ifdef DIRECTX81_GUIRENDERER_EXPORTS
00033 #define DIRECTX81_GUIRENDERER_API __declspec(dllexport)
00034 #else
00035 #define DIRECTX81_GUIRENDERER_API __declspec(dllimport)
00036 #endif
00037 
00038 #include "CEGUIBase.h"
00039 #include "CEGUIRenderer.h"
00040 #include "CEGUITexture.h"
00041 #include <d3d8.h>
00042 #include <list>
00043 #include <set>
00044 
00045 
00046 #if defined(_MSC_VER)
00047 #       pragma warning(push)
00048 #       pragma warning(disable : 4251)
00049 #endif
00050 
00051 
00052 // Start of CEGUI namespace section
00053 namespace CEGUI
00054 {
00055 /*************************************************************************
00056         Forward refs
00057 *************************************************************************/
00058 class DirectX81Texture;
00059 
00064 class DIRECTX81_GUIRENDERER_API DirectX81Renderer : public Renderer
00065 {
00066 public:
00077         DirectX81Renderer(LPDIRECT3DDEVICE8 device, uint max_quads = 0);
00078 
00079 
00090         DirectX81Renderer(LPDIRECT3DDEVICE8 device, const Size& sz);
00091 
00092 
00097         virtual ~DirectX81Renderer(void);
00098 
00099         // add's a quad to the list to be rendered
00100         virtual void    addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode);
00101 
00102         // perform final rendering for all queued renderable quads.
00103         virtual void    doRender(void);
00104 
00105         // clear the queue
00106         virtual void    clearRenderList(void);
00107 
00108 
00124         virtual void    setQueueingEnabled(bool setting)                {d_queueing = setting;}
00125 
00126 
00127         // create an empty texture
00128         virtual Texture*        createTexture(void);
00129 
00130         // create a texture and load it with the specified file.
00131         virtual Texture*        createTexture(const String& filename, const String& resourceGroup);
00132 
00133         // create a texture and set it to the specified size
00134         virtual Texture*        createTexture(float size);
00135 
00136         // destroy the given texture
00137         virtual void            destroyTexture(Texture* texture);
00138 
00139         // destroy all textures still active
00140         virtual void            destroyAllTextures(void);
00141 
00142         // return ptr to device
00143         LPDIRECT3DDEVICE8       getDevice(void) const           {return d_device;}
00144 
00145 
00153         virtual bool    isQueueingEnabled(void) const   {return d_queueing;}
00154 
00155 
00163         virtual float   getWidth(void) const            {return d_display_area.getWidth();}
00164 
00165 
00173         virtual float   getHeight(void) const           {return d_display_area.getHeight();}
00174 
00175 
00183         virtual Size    getSize(void) const                     {return d_display_area.getSize();}
00184 
00185 
00194         virtual Rect    getRect(void) const                     {return d_display_area;}
00195 
00196 
00204         virtual uint    getMaxTextureSize(void) const           {return d_maxTextureSize;}
00205 
00206 
00214         virtual uint    getHorzScreenDPI(void) const    {return 96;}
00215 
00216 
00224         virtual uint    getVertScreenDPI(void) const    {return 96;}
00225 
00226 
00233         virtual void    preD3DReset(void);
00234 
00235 
00242         virtual void    postD3DReset(void);
00243 
00244 
00263         void    setDisplaySize(const Size& sz);
00264 
00265 
00266 private:
00267         /************************************************************************
00268                 Implementation Constants
00269         ************************************************************************/
00270         static const int                        VERTEX_PER_QUAD;                                                        
00271         static const int                        VERTEX_PER_TRIANGLE;                                            
00272         static const int                        VERTEXBUFFER_CAPACITY;                                          
00273         static const ulong                      VERTEX_FVF;                                                                     
00274 
00275         /*************************************************************************
00276             Implementation Structs & classes
00277         *************************************************************************/
00282         struct QuadVertex {
00283                 FLOAT x, y, z, rhw;             
00284                 DWORD diffuse;                  
00285                 float tu1, tv1;                 
00286         };
00287 
00292         struct QuadInfo
00293         {
00294                 LPDIRECT3DTEXTURE8      texture;
00295                 Rect                            position;
00296                 float                           z;
00297                 Rect                            texPosition;
00298                 ulong                           topLeftCol;
00299                 ulong                           topRightCol;
00300                 ulong                           bottomLeftCol;
00301                 ulong                           bottomRightCol;
00302 
00303         QuadSplitMode       splitMode;
00304 
00305                 bool operator<(const QuadInfo& other) const
00306                 {
00307                         // this is intentionally reversed.
00308                         return z > other.z;
00309                 }
00310         };
00311 
00312 
00313         /*************************************************************************
00314             Implementation Methods
00315         *************************************************************************/
00316         // setup states etc
00317         void    initPerFrameStates(void);
00318 
00319         // renders whatever is in the vertex buffer
00320         void    renderVBuffer(void);
00321 
00322         // sort quads list according to texture
00323         void    sortQuads(void);
00324 
00325         // render a quad directly to the display
00326         void    renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode);
00327 
00328         // return size of device view port (if possible)
00329         Size    getViewportSize(void);
00330 
00331         // method to do work of constructor
00332         void    constructor_impl(LPDIRECT3DDEVICE8 device, const Size& display_size);
00333 
00334 
00335         /*************************************************************************
00336             Implementation Data
00337         *************************************************************************/
00338         Rect                            d_display_area;
00339 
00340         typedef std::multiset<QuadInfo>         QuadList;
00341         QuadList d_quadlist;
00342         bool    d_queueing;             
00343 
00344         LPDIRECT3DDEVICE8               d_device;                       
00345         LPDIRECT3DTEXTURE8              d_currTexture;          
00346         LPDIRECT3DVERTEXBUFFER8 d_buffer;                       
00347         int                                             d_bufferPos;            
00348 
00349         std::list<DirectX81Texture*>    d_texturelist;          
00350 
00351         uint    d_maxTextureSize;               
00352         bool    d_canGetVPSize;                 
00353 };
00354 
00355 } // End of  CEGUI namespace section
00356 
00357 
00358 #if defined(_MSC_VER)
00359 #       pragma warning(pop)
00360 #endif
00361 
00362 #endif  // end of guard _DirectX81GUIRenderer_h_

Generated on Sat Nov 26 10:09:55 2005 for Crazy Eddies GUI System by  doxygen 1.4.5