"L. Spiro Engine"
|
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__