"L. Spiro Engine"

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

00001 
00017 #ifndef __LSG_DIRECTX10VERTEXBUFFER_H__
00018 #define __LSG_DIRECTX10VERTEXBUFFER_H__
00019 
00020 #include "../LSGGraphicsLib.h"
00021 
00022 #ifdef LSG_DX10
00023 
00024 #include "../VertexBuffer/LSGVertexBufferBase.h"
00025 #include "Vector/LSTLVectorPoD.h"
00026 
00027 namespace lsg {
00028 
00036         class CDirectX10VertexBuffer : public CVertexBufferBase {
00037         public :
00038                 // == Various constructors.
00039                 LSE_CALLCTOR                                                                    CDirectX10VertexBuffer();
00040                 LSE_CALLCTOR                                                                    ~CDirectX10VertexBuffer();
00041 
00042 
00043                 // == Functions.
00049                 LSE_INLINE D3D10_PRIMITIVE_TOPOLOGY LSE_CALL    GetDirectX10PrimitiveType() const;
00050 
00051 
00052         protected :
00053                 // == Types.
00057                 typedef struct LSG_DIRECTX10_PREFINED_VERT_ATT {
00061                         LSUINT32                                                                        ui32Mask;
00062 
00066                         LSUINT32                                                                        ui32Size;
00067                 } * LPLSG_DIRECTX10_PREFINED_VERT_ATT, * const LPCLSG_DIRECTX10_PREFINED_VERT_ATT;
00068 
00072                 typedef struct LSG_DIRECTX10_LAST_VERT_DECLS {
00076                         LSUINT32                                                                        ui32StreamIds[LSG_VBM_MAX_STREAMS];
00077 
00081                         ID3D10InputLayout *                                                     pilInputLayout;
00082 
00083 
00084                         // == Various constructors.
00085                         LSE_CALLCTOR                                                            LSG_DIRECTX10_LAST_VERT_DECLS();
00086                         LSE_CALLCTOR                                                            ~LSG_DIRECTX10_LAST_VERT_DECLS();
00087                 } * LPLSG_DIRECTX10_LAST_VERT_DECLS, * const LPCLSG_DIRECTX10_LAST_VERT_DECLS;
00088 
00089 
00090                 // == Members.
00094                 ID3D10Buffer *                                                                  m_pbApiVertexBuffer;
00095 
00099                 LSBOOL                                                                                  m_bFakeAlpha[LSG_VBM_MAX_USAGES];
00100 
00104                 LSUINT32                                                                                m_ui32VertexDeclLength;
00105 
00109                 CVectorPoD<LSG_DIRECTX10_LAST_VERT_DECLS, LSUINT8, 1UL>
00110                                                                                                                 m_vVertDeclRecord;
00111 
00115                 D3D10_INPUT_ELEMENT_DESC *                                              m_piedVertexDeclaration;
00116 
00120                 D3D10_PRIMITIVE_TOPOLOGY                                                m_ptPrimitiveType;
00121 
00125                 static LSG_DIRECTX10_PREFINED_VERT_ATT                  m_dpvaVertices[];
00126 
00127 
00128                 // == Functions.
00134                 LSG_VB_INTERFACE LSBOOL LSE_CALL                                CreateApiVertexBuffer();
00135 
00140                 LSG_VB_INTERFACE LSVOID LSE_CALL                                ResetApi();
00141 
00145                 LSVOID LSE_CALL                                                                 UnLockApi();
00146                 
00156                 LSG_VB_INTERFACE LSVOID LSE_CALL                                AdjustInputsToApi( LSG_VB_CONTENTS &_vcContents, LSUINT16 &_ui16UsageAndAccess );
00157 
00164                 LSG_VB_INTERFACE LSUINT32 LSE_CALL                              GetVertexAttributeSizeApi( const LSG_VB_CONTENTS &_vcContents );
00165 
00174                 LSG_VB_INTERFACE LSBOOL LSE_CALL                                SetStreamApi( LSUINT32 _ui32Stream, LSUINT32 _ui32Offset, LSUINT32 _ui32ElementsSize );
00175 
00184                 LSG_VB_INTERFACE LSBOOL LSE_CALL                                CanBufferBeDestroyedApi( LSUINT32 _ui32Elements, LSUINT32 _ui32ElementsSize, LSUINT32 _ui32UsageAndAccess );
00185 
00195                 LSG_VB_INTERFACE LSUINT32 LSE_CALL                              RawColorToApiColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSVOID * _pvBuffer );
00196 
00207                 LSG_VB_INTERFACE LSUINT32 LSE_CALL                              RawColorToApiColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSREAL _fA, LSVOID * _pvBuffer );
00208 
00217                 LSG_VB_INTERFACE LSVOID LSE_CALL                                SetColorApi( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSVOID * _pvBuffer );
00218 
00225                 LSG_VB_INTERFACE LSVOID LSE_CALL                                SetAlphaApi( LSREAL _fA, LSVOID * _pvBuffer );
00226 
00230                 LSG_VB_INTERFACE LSVOID LSE_CALL                                PrepareToRenderApi();
00231 
00235                 LSG_VB_INTERFACE LSVOID LSE_CALL                                EndRenderApi();
00236 
00243                 LSG_VB_INTERFACE LSVOID LSE_CALL                                RenderApi( LSUINT32 _ui32TotalPrimitives );
00244 
00251                 LSUINT32 LSE_CALL                                                               BestStrideApi( LSUINT32 _ui32Size );
00252 
00253 
00254         private :
00261                 LSBOOL LSE_CALL                                                                 GenerateVertexDeclaration( const LSG_VB_CONTENTS &_vcContents );
00262         };
00263 
00264 
00265         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00266         // DEFINITIONS
00267         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00268         // == Functions.
00274         LSE_INLINE D3D10_PRIMITIVE_TOPOLOGY LSE_CALL CDirectX10VertexBuffer::GetDirectX10PrimitiveType() const {
00275                 return m_ptPrimitiveType;
00276         }
00277 
00287         LSE_INLINE LSUINT32 LSE_CALL CDirectX10VertexBuffer::RawColorToApiColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSVOID * _pvBuffer ) {
00288                 LSUINT32 * pui32Dest = static_cast<LSUINT32 *>(_pvBuffer);
00289                 // 0xAARRGGBB.
00290                 (*pui32Dest) = 0xFF |                                                                                                                                                                                   // Alpha.
00291                         (static_cast<LSUINT32>((CMathLib::Clamp( _fR, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 16) |       // Red.
00292                         (static_cast<LSUINT32>((CMathLib::Clamp( _fG, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 8) |        // Green.
00293                         static_cast<LSUINT32>((CMathLib::Clamp( _fB, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0)));                        // Blue.
00294                 return sizeof( LSUINT32 );
00295         }
00296 
00307         LSE_INLINE LSUINT32 LSE_CALL CDirectX10VertexBuffer::RawColorToApiColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSREAL _fA, LSVOID * _pvBuffer ) {
00308                 LSUINT32 * pui32Dest = static_cast<LSUINT32 *>(_pvBuffer);
00309                 // 0xAARRGGBB.
00310                 (*pui32Dest) =
00311                         (static_cast<LSUINT32>((CMathLib::Clamp( _fA, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 24) |       // Alpha.
00312                         (static_cast<LSUINT32>((CMathLib::Clamp( _fR, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 16) |       // Red.
00313                         (static_cast<LSUINT32>((CMathLib::Clamp( _fG, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 8) |        // Green.
00314                         static_cast<LSUINT32>((CMathLib::Clamp( _fB, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0)));                        // Blue.
00315                 return sizeof( LSUINT32 );
00316         }
00317 
00326         LSE_INLINE LSVOID LSE_CALL CDirectX10VertexBuffer::SetColorApi( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSVOID * _pvBuffer ) {
00327                 LSUINT32 * pui32Dest = static_cast<LSUINT32 *>(_pvBuffer);
00328                 LSUINT32 ui32Temp = 
00329                         (static_cast<LSUINT32>((CMathLib::Clamp( _fR, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 16) |       // Red.
00330                         (static_cast<LSUINT32>((CMathLib::Clamp( _fG, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 8) |        // Green.
00331                         static_cast<LSUINT32>((CMathLib::Clamp( _fB, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0)));                        // Blue.
00332                 ui32Temp |= (*pui32Dest) & 0xFF000000;  // Keep the existing alpha.
00333                 (*pui32Dest) = ui32Temp;
00334         }
00335 
00342         LSE_INLINE LSVOID LSE_CALL CDirectX10VertexBuffer::SetAlphaApi( LSREAL _fA, LSVOID * _pvBuffer ) {
00343                 LSUINT32 * pui32Dest = static_cast<LSUINT32 *>(_pvBuffer);
00344                 LSUINT32 ui32Temp = 
00345                         (static_cast<LSUINT32>((CMathLib::Clamp( _fA, LSM_ZERO, LSM_ONE ) * static_cast<LSREAL>(255.0))) << 24);        // Alpha.
00346                 ui32Temp |= (*pui32Dest) & 0x00FFFFFF;  // Keep the existing color.
00347                 (*pui32Dest) = ui32Temp;
00348         }
00349 
00350 }       // namespace lsg
00351 
00352 #endif  // #ifdef LSG_DX10
00353 
00354 #endif  // __LSG_DIRECTX10VERTEXBUFFER_H__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator