00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _d3d9renderer_h_
00030 #define _d3d9renderer_h_
00031
00032 #include "CEGUIBase.h"
00033 #include "CEGUIRenderer.h"
00034 #include "CEGUITexture.h"
00035 #include <d3d9.h>
00036 #include <list>
00037 #include <set>
00038
00039 #ifdef DIRECTX9_GUIRENDERER_EXPORTS
00040 #define DIRECTX9_GUIRENDERER_API __declspec(dllexport)
00041 #else
00042 #define DIRECTX9_GUIRENDERER_API __declspec(dllimport)
00043 #endif
00044
00045
00046 #if defined(_MSC_VER)
00047 # pragma warning(push)
00048 # pragma warning(disable : 4251)
00049 #endif
00050
00051
00052
00053 namespace CEGUI
00054 {
00055
00056
00057
00058 class DirectX9Texture;
00059
00064 class DIRECTX9_GUIRENDERER_API DirectX9Renderer : public Renderer
00065 {
00066 public:
00077 DirectX9Renderer(LPDIRECT3DDEVICE9 device, uint max_quads);
00078
00083 virtual ~DirectX9Renderer(void);
00084
00085
00086 virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode);
00087
00088
00089 virtual void doRender(void);
00090
00091
00092 virtual void clearRenderList(void);
00093
00094
00110 virtual void setQueueingEnabled(bool setting) {d_queueing = setting;}
00111
00112
00113
00114 virtual Texture* createTexture(void);
00115
00116
00117 virtual Texture* createTexture(const String& filename, const String& resourceGroup);
00118
00119
00120 virtual Texture* createTexture(float size);
00121
00122
00123 virtual void destroyTexture(Texture* texture);
00124
00125
00126 virtual void destroyAllTextures(void);
00127
00128
00129 LPDIRECT3DDEVICE9 getDevice(void) const {return d_device;}
00130
00131
00139 virtual bool isQueueingEnabled(void) const {return d_queueing;}
00140
00141
00149 virtual float getWidth(void) const {return d_display_area.getWidth();}
00150
00151
00159 virtual float getHeight(void) const {return d_display_area.getHeight();}
00160
00161
00169 virtual Size getSize(void) const {return d_display_area.getSize();}
00170
00171
00180 virtual Rect getRect(void) const {return d_display_area;}
00181
00182
00190 virtual uint getMaxTextureSize(void) const {return d_maxTextureSize;}
00191
00192
00200 virtual uint getHorzScreenDPI(void) const {return 96;}
00201
00202
00210 virtual uint getVertScreenDPI(void) const {return 96;}
00211
00212
00219 virtual void preD3DReset(void);
00220
00221
00228 virtual void postD3DReset(void);
00229
00230
00248 void setDisplaySize(const Size& sz);
00249
00250
00251 private:
00252
00253
00254
00255 const static int VERTEX_PER_QUAD;
00256 const static int VERTEX_PER_TRIANGLE;
00257 const static int VERTEXBUFFER_CAPACITY;
00258 const static ulong VERTEX_FVF;
00259
00260
00261
00262
00267 struct QuadVertex {
00268 FLOAT x, y, z, rhw;
00269 DWORD diffuse;
00270 float tu1, tv1;
00271 };
00272
00277 struct QuadInfo
00278 {
00279 LPDIRECT3DTEXTURE9 texture;
00280 Rect position;
00281 float z;
00282 Rect texPosition;
00283 ulong topLeftCol;
00284 ulong topRightCol;
00285 ulong bottomLeftCol;
00286 ulong bottomRightCol;
00287
00288 QuadSplitMode splitMode;
00289
00290 bool operator<(const QuadInfo& other) const
00291 {
00292
00293 return z > other.z;
00294 }
00295 };
00296
00297
00298
00299
00300
00301
00302 void initPerFrameStates(void);
00303
00304
00305 void renderVBuffer(void);
00306
00307
00308 void sortQuads(void);
00309
00310
00311 void renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex, const Rect& texture_rect, const ColourRect& colours, QuadSplitMode quad_split_mode);
00312
00313
00314 Size getViewportSize(void);
00315
00316
00317 void constructor_impl(LPDIRECT3DDEVICE9 device, const Size& display_size);
00318
00319
00320
00321
00322
00323 Rect d_display_area;
00324
00325 typedef std::multiset<QuadInfo> QuadList;
00326 QuadList d_quadlist;
00327 bool d_queueing;
00328
00329 LPDIRECT3DDEVICE9 d_device;
00330 LPDIRECT3DTEXTURE9 d_currTexture;
00331 LPDIRECT3DVERTEXBUFFER9 d_buffer;
00332 int d_bufferPos;
00333
00334 std::list<DirectX9Texture*> d_texturelist;
00335
00336 uint d_maxTextureSize;
00337 };
00338
00339 }
00340
00341 #if defined(_MSC_VER)
00342 # pragma warning(pop)
00343 #endif
00344
00345 #endif // end of guard _d3d9renderer_h_