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
00030
00031
00032
00033
00034 #ifndef _d3d10renderer_h_
00035 #define _d3d10renderer_h_
00036
00037 #include "CEGUIBase.h"
00038 #include "CEGUIRenderer.h"
00039 #include "CEGUITexture.h"
00040
00041
00042
00043 #if _MSC_VER <= 1400 // VC8 and lower
00044
00045
00046 #define WINAPI_INLINE WINAPI
00047
00048 #if _MSC_VER < 1400 // VC7.1 and lower
00049
00050 #define __out
00051 #define __in
00052 #define __inout
00053
00054 #define __in_opt
00055 #define __out_opt
00056 #define __inout_opt
00057
00058 #define __in_ecount(THING)
00059 #define __in_ecount_opt(THING)
00060 #define __out_ecount(THING)
00061 #define __out_ecount_opt(THING)
00062 #define __inout_ecount(THING)
00063 #define __inout_ecount_opt(THING)
00064
00065 #define __in_bcount_opt(THING)
00066 #define __out_bcount_opt(THING)
00067 #define __inout_bcount_opt(THING)
00068
00069 #endif // < 1400
00070
00071 #endif // <= 1400
00072
00073 #include <d3d10.h>
00074 #include <list>
00075 #include <set>
00076
00077 typedef ID3D10Buffer IDirect3DIndexBuffer;
00078 typedef ID3D10Buffer IDirect3DVertexBuffer;
00079 typedef D3D10_VIEWPORT D3DVIEWPORT;
00080 typedef ID3D10VertexShader IDirect3DVertexShader;
00081 typedef ID3D10PixelShader IDirect3DPixelShader;
00082 typedef ID3D10Device* LPDIRECT3DDEVICE;
00083 typedef ID3D10Texture2D* LPDIRECT3DTEXTURE2D;
00084 typedef ID3D10Buffer* LPDIRECT3DBUFFER;
00085
00086 #if !defined(CEGUI_STATIC)
00087 #ifdef DIRECTX10_GUIRENDERER_EXPORTS
00088 #define DIRECTX10_GUIRENDERER_API __declspec(dllexport)
00089 #else
00090 #define DIRECTX10_GUIRENDERER_API __declspec(dllimport)
00091 #endif
00092 #else
00093 #define DIRECTX10_GUIRENDERER_API
00094 #endif
00095
00096 #if defined(_MSC_VER)
00097 # pragma warning(push)
00098 # pragma warning(disable : 4251)
00099 #endif
00100
00101
00102
00103 namespace CEGUI
00104 {
00105
00106
00107
00108 class DirectX10Texture;
00109
00114 class DIRECTX10_GUIRENDERER_API DirectX10Renderer : public Renderer
00115 {
00116 public:
00128 DirectX10Renderer(LPDIRECT3DDEVICE device, uint max_quads);
00129
00134 virtual ~DirectX10Renderer(void);
00135
00136
00137 virtual void addQuad(const Rect& dest_rect, float z, const Texture* tex,
00138 const Rect& texture_rect, const ColourRect& colours,
00139 QuadSplitMode quad_split_mode);
00140
00141
00142 virtual void doRender(void);
00143
00144
00145 virtual void clearRenderList(void);
00146
00166 virtual void setQueueingEnabled(bool setting)
00167 { d_queueing = setting; }
00168
00169
00170 virtual Texture* createTexture(void);
00171
00172
00173 virtual Texture* createTexture(const String& filename,
00174 const String& resourceGroup);
00175
00176
00177 virtual Texture* createTexture(float size);
00178
00179
00180 virtual void destroyTexture(Texture* texture);
00181
00182
00183 virtual void destroyAllTextures(void);
00184
00186 LPDIRECT3DDEVICE getDevice(void) const
00187 { return d_device; }
00188
00197 virtual bool isQueueingEnabled(void) const
00198 { return d_queueing; }
00199
00207 virtual float getWidth(void) const
00208 { return d_display_area.getWidth(); }
00209
00217 virtual float getHeight(void) const
00218 { return d_display_area.getHeight(); }
00219
00227 virtual Size getSize(void) const
00228 { return d_display_area.getSize(); }
00229
00230
00240 virtual Rect getRect(void) const
00241 { return d_display_area; }
00242
00251 virtual uint getMaxTextureSize(void) const
00252 { return d_maxTextureSize; }
00253
00261 virtual uint getHorzScreenDPI(void) const
00262 { return 96; }
00263
00271 virtual uint getVertScreenDPI(void) const
00272 { return 96; }
00273
00291 void setDisplaySize(const Size& sz);
00292
00293 private:
00294
00295
00296
00298 static const int VERTEX_PER_QUAD;
00300 static const int VERTEX_PER_TRIANGLE;
00302 static const int VERTEXBUFFER_CAPACITY;
00303
00304
00305
00306
00308 struct QuadVertex {
00310 FLOAT x, y, z;
00312 DWORD diffuse;
00314 float tu1, tv1;
00315 };
00316
00318 struct QuadInfo
00319 {
00320 LPDIRECT3DTEXTURE2D texture;
00321 ID3D10ShaderResourceView* resview;
00322 Rect position;
00323 float z;
00324 Rect texPosition;
00325 ulong topLeftCol;
00326 ulong topRightCol;
00327 ulong bottomLeftCol;
00328 ulong bottomRightCol;
00329 QuadSplitMode splitMode;
00330
00331 bool operator<(const QuadInfo& other) const
00332 {
00333
00334 return z > other.z;
00335 }
00336 };
00337
00338
00339
00340
00342 void renderVBuffer(ID3D10ShaderResourceView *tex);
00343
00345 void renderQuadDirect(const Rect& dest_rect, float z, const Texture* tex,
00346 const Rect& texture_rect, const ColourRect& colours,
00347 QuadSplitMode quad_split_mode);
00348
00350 Size getViewportSize(void);
00351
00353 void constructor_impl(LPDIRECT3DDEVICE device, const Size& display_size);
00354
00355 HRESULT CreateVertexBuffer();
00356
00357
00358
00359
00361 Rect d_display_area;
00363 typedef std::multiset<QuadInfo> QuadList;
00365 QuadList d_quadlist;
00367 bool d_queueing;
00369 LPDIRECT3DDEVICE d_device;
00371 LPDIRECT3DTEXTURE2D d_currTexture;
00372 ID3D10ShaderResourceView* d_currSRView;
00374 LPDIRECT3DBUFFER d_buffer;
00376 int d_bufferPos;
00377 ID3D10InputLayout* d_InputLayout;
00378
00379 ID3D10Effect* d_Effect;
00380 ID3D10EffectTechnique* d_Technique;
00381 ID3D10EffectShaderResourceVariable* d_DiffuseTexVariable;
00382 ID3D10EffectScalarVariable* d_WindowHeight;
00383 ID3D10EffectScalarVariable* d_WindowWidth;
00385 std::list<DirectX10Texture*> d_texturelist;
00387 uint d_maxTextureSize;
00388 };
00389
00390 }
00391
00392 #if defined(_MSC_VER)
00393 # pragma warning(pop)
00394 #endif
00395
00396 #endif // end of guard _d3d10renderer_h_