"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/DirectX/LSGDirectX10.h

00001 
00016 #ifndef __LSG_DIRECTX10_H__
00017 #define __LSG_DIRECTX10_H__
00018 
00019 #ifdef LSG_DX10
00020 
00021 #include "../Fnd/LSGFndBase.h"
00022 #include "../Fnd/LSGFndConstants.h"
00023 #include "Windows/LSSTDWindows.h"
00024 
00025 #include <d3d10.h>
00026 #include <d3dx10.h>
00027 
00028 namespace lsg {
00029 
00030         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00031         // CONSTANTS
00032         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00036         enum LSG_BUFFERS {
00037                 LSG_B_COLOR_BUFFER                                                      = (1UL << 16UL),
00038                 LSG_B_STENCIL_BUFFER                                            = D3D10_CLEAR_STENCIL,
00039                 LSG_B_DEPTH_BUFFER                                                      = D3D10_CLEAR_DEPTH,
00040                 LSG_B_ALL                                                                       = LSG_B_COLOR_BUFFER | LSG_B_STENCIL_BUFFER | LSG_B_DEPTH_BUFFER,
00041         };
00042 
00043 
00044 
00045         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00046         // TYPES
00047         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00051         typedef class CDirectX10ShaderManager                   CShaderManager;
00052         class CShader;
00053 
00054 
00055 
00056         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00057         // INTERFACE
00058         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00065         class CDirectX10 {
00066         public :
00067                 // == Types.
00071                 typedef struct LSG_DIRECTX10_INIT {
00075                         HWND                                                                    hWnd;
00076 
00080                         LSBOOL                                                                  bWindowed;
00081                 } * LPLSG_DIRECTX10_INIT, * const LPCLSG_DIRECTX10_INIT;
00082 
00083                 // == Functions.
00090                 static LSBOOL LSE_CALL                                          InitDirectX10( LPCLSG_DIRECTX10_INIT _lpdiInit );
00091 
00095                 static LSVOID LSE_CALL                                          PostInitDirectX10();
00096 
00100                 static LSVOID LSE_CALL                                          DestroyDirectX10();
00101 
00105                 static LSVOID LSE_CALL                                          LoseDevice();
00106 
00112                 static LSBOOL LSE_CALL                                          ResetDevice();
00113 
00117                 static LSVOID LSE_CALL                                          SetInitialValues();
00118 
00124                 static LSE_INLINE ID3D10Device * LSE_CALL       GetDirectX10Device();
00125 
00139                 static CMatrix4x4 LSE_CALL                                      OffsetOrtho( LSREAL _fLeft, LSREAL _fRight, LSREAL _fBottom, LSREAL _fTop, LSREAL _fNear, LSREAL _fFar );
00140 
00141 
00142                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00143                 // INTERFACE
00144                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00148                 static LSE_INLINE LSVOID LSE_FCALL                      AssertError();
00149 
00153                 static LSE_INLINE LSVOID LSE_FCALL                      Present();
00154 
00160                 static LSE_INLINE LSVOID LSE_FCALL                      Clear( LSUINT32 _ui32Mask );
00161 
00165                 static LSE_INLINE LSVOID LSE_FCALL                      ClearAll();
00166 
00175                 static LSVOID LSE_CALL                                          SetClearColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSREAL _fA );
00176 
00182                 static LSE_INLINE LSVOID LSE_FCALL                      SetClearDepth( LSREAL _fValue );
00183 
00192                 static LSE_INLINE LSVOID LSE_FCALL                      SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height );
00193 
00199                 static LSE_INLINE LSVOID LSE_FCALL                      SetDepthTest( LSBOOL _bVal );
00200 
00206                 static LSE_INLINE LSVOID LSE_FCALL                      SetDepthFunc( LSG_DEPTH_TEST _dtFunc );
00207 
00213                 static LSE_INLINE LSVOID LSE_FCALL                      SetDepthWrite( LSBOOL _bVal );
00214 
00220                 static LSE_INLINE LSVOID LSE_FCALL                      SetCulling( LSBOOL _bVal );
00221 
00227                 static LSE_INLINE LSVOID LSE_FCALL                      SetCullMode( LSG_CULL_MODES _cmMode );
00228 
00234                 static LSE_INLINE LSG_CULL_MODES LSE_CALL       GetCullMode();
00235 
00241                 static LSE_INLINE LSVOID LSE_FCALL                      SetBlendEnabled( LSBOOL _bVal );
00242 
00249                 static LSE_INLINE LSVOID LSE_FCALL                      SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst );
00250 
00256                 static LSE_INLINE LSVOID LSE_FCALL                      SetFillMode( LSG_FILL_MODES _fmMode );
00257 
00263                 static LSE_INLINE LSBOOL LSE_FCALL                      BeginRender();
00264 
00268                 static LSE_INLINE LSVOID LSE_FCALL                      EndRender();
00269 
00275                 static LSE_INLINE CShaderManager * LSE_FCALL
00276                                                                                                         GetShaderManager();
00277 
00284                 static LSVOID LSE_FCALL                                         SetShader( CShader * _psShader );
00285 
00291                 static CShader * LSE_FCALL                                      GetShader();
00292 
00296                 static LSVOID LSE_CALL                                          PreRender();
00297 
00298 
00299 
00300                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00301                 // METRICS
00302                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00308                 static LSE_INLINE LSBOOL LSE_CALL                       NonPo2();
00309 
00315                 template <typename tnType>
00316                 static LSE_INLINE LSVOID LSE_CALL                       SafeRelease( tnType &_tObj );
00317 
00318 
00319                 // == Members.
00323                 static const void *                                                     m_pvShaderSignature;
00324 
00328                 static SIZE_T                                                           m_stShaderSize;
00329 
00333                 static ID3D10ShaderResourceView *                       m_psrvActiveTextures[LSG_MAX_TEXTURE_UNITS];
00334 
00335 
00336         protected :
00337                 // == Members.
00341                 static ID3D10Device *                                           m_pdDevice;
00342 
00346                 static IDXGISwapChain *                                         m_pscSwapChain;
00347 
00351                 static D3D10_DRIVER_TYPE                                        m_dtDriver;
00352 
00356                 static ID3D10RenderTargetView *                         m_prtvRenderTarget;
00357 
00361                 static ID3D10DepthStencilState *                        m_pdssDepthStencil;
00362 
00366                 static ID3D10RasterizerState  *                         m_prsRasterizerState;
00367 
00371                 static ID3D10DepthStencilView *                         m_pdsvDepthStencilView;
00372 
00376                 static ID3D10BlendState *                                       m_pbsBlendState;
00377 
00381                 static ID3D10Texture2D *                                        m_pt2dDepthStencilBuffer;
00382 
00386                 static CShaderManager *                                         m_psmShaderMan;
00387 
00391                 static ID3D10ShaderResourceView *                       m_psrvLastActiveTextures[LSG_MAX_TEXTURE_UNITS];
00392 
00396                 static D3D10_DEPTH_STENCIL_DESC                         m_dsdDepthStencilDesc;
00397 
00401                 static D3D10_RASTERIZER_DESC                            m_rdRasterizerDesc;
00402 
00406                 static D3D10_BLEND_DESC                                         m_bdBlendDesc;
00407 
00411                 static LSUINT32                                                         m_ui32ClearColor;
00412 
00416                 static LSFLOAT                                                          m_fDepthClear;
00417 
00421                 static D3D10_CULL_MODE                                          m_cmLastCull;
00422 
00423 
00424                 // == Functions.
00428                 static LSVOID LSE_CALL                                          ResetInternal();
00429 
00430         };
00431 
00432 
00433         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00434         // DEFINITIONS
00435         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00436         // == Functions.
00442         LSE_INLINE ID3D10Device * LSE_CALL CDirectX10::GetDirectX10Device() {
00443                 return m_pdDevice;
00444         }
00445 
00449         LSE_INLINE LSVOID LSE_FCALL CDirectX10::AssertError() {
00450         }
00451 
00455         LSE_INLINE LSVOID LSE_FCALL CDirectX10::Present() {
00456                 m_pscSwapChain->Present( 0UL, 0UL );
00457         }
00458 
00464         LSE_INLINE LSVOID LSE_FCALL CDirectX10::Clear( LSUINT32 _ui32Mask ) {
00465                 if ( _ui32Mask & LSG_B_COLOR_BUFFER ) {
00466                         // Clearing color.
00467                         const FLOAT fColor[4] = {
00468                                 (m_ui32ClearColor >> 24) * (1.0f / 255.0f),                             // Red.
00469                                 ((m_ui32ClearColor >> 16) & 0xFF) * (1.0f / 255.0f),    // Green.
00470                                 ((m_ui32ClearColor >> 8) & 0xFF) * (1.0f / 255.0f),             // Blue.
00471                                 (m_ui32ClearColor & 0xFF) * (1.0f / 255.0f),                    // Alpha.
00472                         };
00473                         m_pdDevice->ClearRenderTargetView( m_prtvRenderTarget, fColor );
00474                 }
00475                 m_pdDevice->ClearDepthStencilView( m_pdsvDepthStencilView, _ui32Mask & (LSG_B_DEPTH_BUFFER | LSG_B_STENCIL_BUFFER),
00476                         m_fDepthClear, 0 );
00477         }
00478 
00482         LSE_INLINE LSVOID LSE_FCALL CDirectX10::ClearAll() {
00483                 Clear( LSG_B_ALL );
00484         }
00485 
00491         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetClearDepth( LSREAL _fValue ) {
00492                 m_fDepthClear = static_cast<LSFLOAT>(_fValue);
00493         }
00494 
00503         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ) {
00504                 if ( m_pdDevice ) {
00505                         D3D10_VIEWPORT vpViewPort = {
00506                                 _i32X,
00507                                 _i32Y,
00508                                 _i32Width,
00509                                 _i32Height,
00510                                 D3D10_MIN_DEPTH,
00511                                 D3D10_MAX_DEPTH
00512                         };
00513                         m_pdDevice->RSSetViewports( 1UL, &vpViewPort );
00514                 }
00515         }
00516 
00522         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetDepthTest( LSBOOL _bVal ) {
00523                 _bVal = _bVal != false;
00524                 if ( m_dsdDepthStencilDesc.DepthEnable != _bVal ) {
00525                         m_dsdDepthStencilDesc.DepthEnable = _bVal;
00526                         SafeRelease( m_pdssDepthStencil );
00527                         m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil );
00528                         m_pdDevice->OMSetDepthStencilState( m_pdssDepthStencil, 1UL );
00529                 }
00530         }
00531 
00537         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetDepthFunc( LSG_DEPTH_TEST _dtFunc ) {
00538                 if ( CFndBase::m_dtDepthTestFunc != _dtFunc ) {
00539                         CFndBase::m_dtDepthTestFunc = _dtFunc;
00540                         static const D3D10_COMPARISON_FUNC dcfFuncs[] = {
00541                                 D3D10_COMPARISON_NEVER,                                 // LSG_DT_NEVER
00542                                 D3D10_COMPARISON_ALWAYS,                                // LSG_DT_ALWAYS
00543                                 D3D10_COMPARISON_LESS,                                  // LSG_DT_LESS
00544                                 D3D10_COMPARISON_EQUAL,                                 // LSG_DT_EQUAL
00545                                 D3D10_COMPARISON_NOT_EQUAL,                             // LSG_DT_NOTEQUAL
00546                                 D3D10_COMPARISON_LESS_EQUAL,                    // LSG_DT_LESSEQUAL
00547                                 D3D10_COMPARISON_GREATER,                               // LSG_DT_GREATER
00548                                 D3D10_COMPARISON_GREATER_EQUAL,                 // LSG_DT_GREATEREQUAL
00549                         };
00550                         m_dsdDepthStencilDesc.DepthFunc = dcfFuncs[_dtFunc];
00551                         SafeRelease( m_pdssDepthStencil );
00552                         m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil );
00553                         m_pdDevice->OMSetDepthStencilState( m_pdssDepthStencil, 1UL );
00554                 }
00555         }
00556 
00562         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetDepthWrite( LSBOOL _bVal ) {
00563                 _bVal = _bVal != false;
00564                 if ( m_dsdDepthStencilDesc.DepthWriteMask != _bVal ) {
00565                         m_dsdDepthStencilDesc.DepthWriteMask = static_cast<D3D10_DEPTH_WRITE_MASK>(_bVal);
00566                         SafeRelease( m_pdssDepthStencil );
00567                         m_pdDevice->CreateDepthStencilState( &m_dsdDepthStencilDesc, &m_pdssDepthStencil );
00568                         m_pdDevice->OMSetDepthStencilState( m_pdssDepthStencil, 1UL );
00569                 }
00570         }
00571 
00577         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetCulling( LSBOOL _bVal ) {
00578                 _bVal = _bVal != false;
00579                 if ( _bVal && m_rdRasterizerDesc.CullMode == D3D10_CULL_NONE ) {
00580                         // Turning on culling.
00581                         m_rdRasterizerDesc.CullMode = m_cmLastCull;
00582                         SafeRelease( m_prsRasterizerState );
00583                         m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState );
00584                         m_pdDevice->RSSetState( m_prsRasterizerState );
00585                 }
00586                 else if ( !_bVal && m_rdRasterizerDesc.CullMode != D3D10_CULL_NONE ) {
00587                         // Turning off culling.
00588                         m_cmLastCull = m_rdRasterizerDesc.CullMode;
00589                         m_rdRasterizerDesc.CullMode = D3D10_CULL_NONE;
00590                         SafeRelease( m_prsRasterizerState );
00591                         m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState );
00592                         m_pdDevice->RSSetState( m_prsRasterizerState );
00593                 }
00594         }
00595 
00601         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetCullMode( LSG_CULL_MODES _cmMode ) {
00602                 static const D3D10_CULL_MODE cmModes[] = {
00603                         D3D10_CULL_FRONT,
00604                         D3D10_CULL_BACK,
00605                 };
00606                 assert( _cmMode == LSG_CM_CW || _cmMode == LSG_CM_CCW );
00607                 if ( m_rdRasterizerDesc.CullMode == D3D10_CULL_NONE ) {
00608                         // Just set the last cull mode.
00609                         m_cmLastCull = cmModes[_cmMode];
00610                 }
00611                 else if ( m_rdRasterizerDesc.CullMode != cmModes[_cmMode] ) {
00612                         // Culling is on and not equal to the current mode.
00613                         m_rdRasterizerDesc.CullMode = cmModes[_cmMode];
00614 
00615                         SafeRelease( m_prsRasterizerState );
00616                         m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState );
00617                         m_pdDevice->RSSetState( m_prsRasterizerState );
00618                 }
00619         }
00620 
00626         LSE_INLINE LSG_CULL_MODES LSE_CALL CDirectX10::GetCullMode() {
00627                 if ( m_rdRasterizerDesc.CullMode == D3D10_CULL_FRONT ) { return LSG_CM_CCW; }
00628                 return LSG_CM_CW;
00629         }
00630 
00636         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetBlendEnabled( LSBOOL _bVal ) {
00637                 _bVal = (_bVal != false);
00638                 if ( _bVal != m_bdBlendDesc.BlendEnable[0] ) {
00639                         m_bdBlendDesc.BlendEnable[0] = _bVal;
00640 
00641                         SafeRelease( m_pbsBlendState );
00642                         m_pdDevice->CreateBlendState( &m_bdBlendDesc, &m_pbsBlendState );
00643                         m_pdDevice->OMSetBlendState( m_pbsBlendState, 0, 0xFFFFFFFF );
00644                 }
00645         }
00646 
00653         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ) {
00654                 static const D3D10_BLEND bModes[] = {
00655                         D3D10_BLEND_ZERO,                                               // LSG_BM_ZERO
00656                         D3D10_BLEND_ONE,                                                // LSG_BM_ONE
00657                         D3D10_BLEND_SRC_COLOR,                                  // LSG_BM_SRC_COLOR
00658                         D3D10_BLEND_INV_SRC_COLOR,                              // LSG_BM_INV_SRC_COLOR
00659                         D3D10_BLEND_DEST_COLOR,                                 // LSG_BM_DST_COLOR
00660                         D3D10_BLEND_INV_DEST_COLOR,                             // LSG_BM_INV_DST_COLOR
00661                         D3D10_BLEND_SRC_ALPHA,                                  // LSG_BM_SRC_ALPHA
00662                         D3D10_BLEND_INV_SRC_ALPHA,                              // LSG_BM_INV_SRC_ALPHA
00663                         D3D10_BLEND_DEST_ALPHA,                                 // LSG_BM_DST_ALPHA
00664                         D3D10_BLEND_INV_DEST_ALPHA,                             // LSG_BM_INV_DEST_ALPHA
00665                         D3D10_BLEND_SRC_ALPHA_SAT,                              // LSG_BM_SRC_ALPHA_SAT
00666                 };
00667                 if ( m_bdBlendDesc.SrcBlend != bModes[_bmSrc] || m_bdBlendDesc.DestBlend != bModes[_bmDst] ) {
00668                         m_bdBlendDesc.SrcBlend = bModes[_bmSrc];
00669                         m_bdBlendDesc.DestBlend = bModes[_bmDst];
00670 
00671                         SafeRelease( m_pbsBlendState );
00672                         m_pdDevice->CreateBlendState( &m_bdBlendDesc, &m_pbsBlendState );
00673                         m_pdDevice->OMSetBlendState( m_pbsBlendState, 0, 0xFFFFFFFF );
00674                 }
00675         }
00676 
00682         LSE_INLINE LSVOID LSE_FCALL CDirectX10::SetFillMode( LSG_FILL_MODES _fmMode ) {
00683                 static const D3D10_FILL_MODE fmValue[] = {
00684                         D3D10_FILL_SOLID,
00685                         D3D10_FILL_WIREFRAME,
00686                 };
00687                 if ( m_rdRasterizerDesc.FillMode != fmValue[_fmMode] ) {
00688                         m_rdRasterizerDesc.FillMode = fmValue[_fmMode];
00689 
00690                         SafeRelease( m_prsRasterizerState );
00691                         m_pdDevice->CreateRasterizerState( &m_rdRasterizerDesc, &m_prsRasterizerState );
00692                         m_pdDevice->RSSetState( m_prsRasterizerState );
00693                 }
00694         }
00695 
00701         LSE_INLINE LSBOOL LSE_FCALL CDirectX10::BeginRender() {
00702                 return true;
00703         }
00704 
00708         LSE_INLINE LSVOID LSE_FCALL CDirectX10::EndRender() {
00709         }
00710 
00716         LSE_INLINE CShaderManager * LSE_FCALL CDirectX10::GetShaderManager() {
00717                 return m_psmShaderMan;
00718         }
00719 
00725         LSE_INLINE LSBOOL LSE_CALL CDirectX10::NonPo2() {
00726                 return true;
00727         }
00728 
00734         template <typename tnType>
00735         LSE_INLINE LSVOID LSE_CALL CDirectX10::SafeRelease( tnType &_tObj ) {
00736                 if ( _tObj ) {
00737                         _tObj->Release();
00738                         _tObj = NULL;
00739                 }
00740         }
00741 
00742 }       // namespace lsg
00743 
00744 #endif  // #ifdef LSG_DX10
00745 
00746 #endif  // __LSG_DIRECTX10_H__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator