"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSGraphicsLib/Src/OpenGLES/LSGOpenGlEs.h

00001 
00016 #ifndef __LSG_OPENGLES_H__
00017 #define __LSG_OPENGLES_H__
00018 
00019 #ifdef LSG_OGLES
00020 
00021 #include "../Fnd/LSGFndBase.h"
00022 #include "../Fnd/LSGFndConstants.h"
00023 #include "CriticalSection/LSHCriticalSection.h"
00024 #include "Windows/LSSTDWindows.h"
00025 
00026 #ifndef APIENTRY
00027 #define APIENTRY
00028 #endif  // #ifndef APIENTRY
00029 
00030 #ifdef LSE_IPHONE
00031 #include <OpenGLES/ES2/gl.h>
00032 #include <OpenGLES/ES2/glext.h>
00033 #else
00034 #error "Unrecognized OpenGL ES platform."
00035 #endif  // #ifdef LSE_IPHONE
00036 
00037 
00038 #include <cassert>
00039 
00040 namespace lsg {
00041 
00042         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00043         // CONSTANTS
00044         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00048         enum LSG_BUFFERS {
00049                 LSG_B_COLOR_BUFFER                                                      = GL_COLOR_BUFFER_BIT,
00050                 LSG_B_STENCIL_BUFFER                                            = GL_STENCIL_BUFFER_BIT,
00051                 LSG_B_DEPTH_BUFFER                                                      = GL_DEPTH_BUFFER_BIT,
00052                 LSG_B_ALL                                                                       = LSG_B_COLOR_BUFFER | LSG_B_STENCIL_BUFFER | LSG_B_DEPTH_BUFFER,
00053         };
00054 
00055 
00056 
00057         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00058         // TYPES
00059         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00063         typedef class COpenGlEsShaderManager                    CShaderManager;
00064         class CShader;
00065 
00066 
00067 
00068         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00069         // INTERFACE
00070         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00077         class COpenGlEs {
00078         public :
00079                 // == Types.
00083                 typedef struct LSG_OPENGLES_METRICS {
00087                         LSUINT32                                                                ui32MaxRenderTargetSize;
00088 
00092                         LSUINT32                                                                ui32MaxTexture;
00093 
00097                         LSUINT32                                                                ui32MaxAniso;
00098                 } * LPLSG_OPENGLES_METRICS, * const LPCLSG_OPENGLES_METRICS;
00099 
00100 
00101                 // == Functions.
00107                 static LSBOOL LSE_CALL                                          InitOpenGlEs( LSVOID * _pvParm );
00108 
00112                 static LSVOID LSE_CALL                                          PostInitOpenGlEs();
00113 
00117                 static LSVOID LSE_CALL                                          DestroyOpenGlEs();
00118 
00122                 static LSVOID LSE_CALL                                          LoseDevice();
00123 
00129                 static LSBOOL LSE_CALL                                          ResetDevice();
00130 
00134                 static LSVOID LSE_CALL                                          SetInitialValues();
00135 
00139                 static LSVOID LSE_CALL                                          MakeCurrent();
00140 
00144                 static LSVOID LSE_CALL                                          FreeTmpResources();
00145                 
00151                 static LSVOID LSE_CALL                                          SetGlkView( LSVOID * _pvView );
00152                 
00156                 static LSVOID LSE_CALL                                          RestoreGlkViewBuffer();
00157 
00171                 static CMatrix4x4 LSE_CALL                                      OffsetOrtho( LSREAL _fLeft, LSREAL _fRight, LSREAL _fBottom, LSREAL _fTop, LSREAL _fNear, LSREAL _fFar );
00172 
00173 
00174 
00175                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00176                 // INTERFACE
00177                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00181                 static LSE_INLINE LSVOID LSE_FCALL                      AssertError();
00182                 
00188                 static LSBOOL LSE_CALL                                          CheckFramebufferError();
00189                 
00196                 static LSE_INLINE LSBOOL LSE_FCALL                      DoNothing();
00197 
00206                 static LSBOOL LSE_CALL                                          WarnErrorEx( const LSCHAR * _pcHeader, const LSCHAR * _pcFile, LSUINT32 _ui32Line );
00207 #ifdef _DEBUG
00208 #define glWarnError( _pcHeader )                                        COpenGlEs::WarnErrorEx( _pcHeader, __FILE__, __LINE__ )
00209 #else
00210 #define glWarnError( _pcHeader )                                        COpenGlEs::DoNothing()
00211 #endif  // #ifdef _DEBUG
00212 #define glWarnErrorAlways( _pcHeader )                          COpenGlEs::WarnErrorEx( _pcHeader, __FILE__, __LINE__ )
00213 
00217                 static LSE_INLINE LSVOID LSE_FCALL                      Present();
00218 
00224                 static LSE_INLINE LSVOID LSE_FCALL                      Clear( LSUINT32 _ui32Mask );
00225 
00229                 static LSE_INLINE LSVOID LSE_FCALL                      ClearAll();
00230 
00239                 static LSVOID LSE_CALL                                          SetClearColor( LSREAL _fR, LSREAL _fG, LSREAL _fB, LSREAL _fA );
00240 
00246                 static LSE_INLINE LSVOID LSE_FCALL                      SetClearDepth( LSREAL _fValue );
00247 
00256                 static LSE_INLINE LSVOID LSE_FCALL                      SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height );
00257 
00263                 static LSE_INLINE LSVOID LSE_FCALL                      SetDepthTest( LSBOOL _bVal );
00264 
00270                 static LSE_INLINE LSVOID LSE_FCALL                      SetDepthFunc( LSG_DEPTH_TEST _dtFunc );
00271 
00277                 static LSE_INLINE LSVOID LSE_FCALL                      SetDepthWrite( LSBOOL _bVal );
00278 
00284                 static LSE_INLINE LSVOID LSE_FCALL                      SetCulling( LSBOOL _bVal );
00285 
00291                 static LSE_INLINE LSVOID LSE_FCALL                      SetCullMode( LSG_CULL_MODES _cmMode );
00292 
00298                 static LSE_INLINE LSG_CULL_MODES LSE_CALL       GetCullMode();
00299 
00305                 static LSE_INLINE LSVOID LSE_FCALL                      SetBlendEnabled( LSBOOL _bVal );
00306 
00313                 static LSE_INLINE LSVOID LSE_FCALL                      SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst );
00314 
00320                 static LSE_INLINE LSVOID LSE_FCALL                      SetFillMode( LSG_FILL_MODES _fmMode );
00321 
00327                 static LSE_INLINE LSBOOL LSE_FCALL                      BeginRender();
00328 
00332                 static LSE_INLINE LSVOID LSE_FCALL                      EndRender();
00333 
00339                 static LSE_INLINE CShaderManager * LSE_FCALL
00340                                                                                                         GetShaderManager();
00341 
00348                 static LSVOID LSE_FCALL                                         SetShader( CShader * _psShader );
00349 
00355                 static CShader * LSE_FCALL                                      GetShader();            
00356 
00360                 static LSVOID LSE_CALL                                          PreRender();
00361 
00367                 static LSE_INLINE LSVOID LSE_CALL                       ActivateTexture( LSUINT32 _ui32Unit );
00368 
00369 
00370 
00371                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00372                 // METRICS
00373                 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00379                 static LSE_INLINE LSBOOL LSE_CALL                       NonPo2();
00380 
00386                 static LSE_INLINE LSBOOL LSE_CALL                       FbosSupported();
00387 
00393                 static LSE_INLINE LSUINT32 LSE_CALL                     MaxRenderTargetSize();
00394 
00400                 static LSE_INLINE LSUINT32 LSE_CALL                     MaxTextureSize();
00401 
00402                 
00403                 // == Members.
00407                 static CCriticalSection                                         m_csCrit;
00408 
00409         protected :
00410                 // == Types.
00414                 static CShaderManager *                                         m_psmShaderMan;
00415 
00419                 static LSG_CULL_MODES                                           m_cmCullMode;
00420 
00424                 static LSUINT32                                                         m_ui32ClearColor;
00425 
00429                 static GLclampf                                                         m_fDepthClear;
00430 
00434                 static LSBOOL                                                           m_bDepthTest;
00435 
00439                 static LSBOOL                                                           m_bCulling;
00440 
00444                 static LSUINT32                                                         m_ui32LastActiveTexture;
00445 
00449                 static LSBOOL                                                           m_bFbos;
00450                 
00454                  static LSVOID *                                                        m_pvView;
00455 
00456 
00457                 // == Functions.
00464                 static LSBOOL LSE_CALL                                          HasExtension( const LSCHAR * _pcExt );
00465         };
00466 
00467 
00468         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00469         // DEFINITIONS
00470         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00474         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::AssertError() {
00475 #ifdef _DEBUG
00476                 assert( !glWarnError( "COpenGlEs::AssertError()" ) );
00477 #endif  // #ifdef _DEBUG
00478         }
00479         
00484         LSE_INLINE LSBOOL LSE_FCALL COpenGlEs::DoNothing() {
00485                 return false;
00486         }
00487 
00491         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::Present() {
00492 #ifdef LSE_WINDOWS
00493                 ::SwapBuffers( m_hDc );
00494 #endif  // #ifdef LSE_WINDOWS
00495         }
00496 
00502         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::Clear( LSUINT32 _ui32Mask ) {
00503                 if ( _ui32Mask & LSG_B_DEPTH_BUFFER ) {
00504                         static const GLenum eVal[] = {
00505                                 GL_COLOR_ATTACHMENT0 + 0,
00506                                 GL_COLOR_ATTACHMENT0 + 1,
00507                                 GL_COLOR_ATTACHMENT0 + 2,
00508                                 GL_COLOR_ATTACHMENT0 + 3,
00509                         };
00510                         ::glDiscardFramebufferEXT( GL_FRAMEBUFFER, 1, eVal );
00511                 }
00512                 if ( _ui32Mask & LSG_B_DEPTH_BUFFER ) {
00513                         static const GLenum eVal[] = {
00514                                 GL_DEPTH_ATTACHMENT,
00515                         };
00516                         ::glDiscardFramebufferEXT( GL_FRAMEBUFFER, 1, eVal );
00517                 }
00518                 if ( _ui32Mask & LSG_B_STENCIL_BUFFER ) {
00519                         static const GLenum eVal[] = {
00520                                 GL_STENCIL_BUFFER_BIT,
00521                         };
00522                         ::glDiscardFramebufferEXT( GL_FRAMEBUFFER, 1, eVal );
00523                 }
00524                 ::glClear( _ui32Mask );
00525         }
00526 
00530         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::ClearAll() {
00531                 Clear( LSG_B_ALL );
00532         }
00533 
00539         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetClearDepth( LSREAL _fValue ) {
00540                 if ( m_fDepthClear != static_cast<GLclampf>(_fValue) ) {
00541                         m_fDepthClear = static_cast<GLclampf>(_fValue);
00542 
00543                         ::glClearDepthf( m_fDepthClear );
00544                 }
00545         }
00546 
00555         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetViewport( LSINT32 _i32X, LSINT32 _i32Y, LSINT32 _i32Width, LSINT32 _i32Height ) {
00556                 ::glViewport(_i32X,
00557                         _i32Y,
00558                         _i32Width,
00559                         _i32Height );
00560         }
00561 
00567         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetDepthTest( LSBOOL _bVal ) {
00568                 _bVal = _bVal != false;
00569                 if ( m_bDepthTest != _bVal ) {
00570                         m_bDepthTest = _bVal;
00571                         if ( _bVal ) { ::glEnable( GL_DEPTH_TEST ); }
00572                         else { ::glDisable( GL_DEPTH_TEST ); }
00573                 }
00574         }
00575 
00581         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetDepthFunc( LSG_DEPTH_TEST _dtFunc ) {
00582                 if ( CFndBase::m_dtDepthTestFunc != _dtFunc ) {
00583                         CFndBase::m_dtDepthTestFunc = _dtFunc;
00584                         static const GLenum eFuncs[] = {
00585                                 GL_NEVER,                                                       // LSG_DT_NEVER
00586                                 GL_ALWAYS,                                                      // LSG_DT_ALWAYS
00587                                 GL_LESS,                                                        // LSG_DT_LESS
00588                                 GL_EQUAL,                                                       // LSG_DT_EQUAL
00589                                 GL_NOTEQUAL,                                            // LSG_DT_NOTEQUAL
00590                                 GL_LEQUAL,                                                      // LSG_DT_LESSEQUAL
00591                                 GL_GREATER,                                                     // LSG_DT_GREATER
00592                                 GL_GEQUAL,                                                      // LSG_DT_GREATEREQUAL
00593                         };
00594                         ::glDepthFunc( eFuncs[_dtFunc] );
00595                 }
00596         }
00597 
00603         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetDepthWrite( LSBOOL _bVal ) {
00604                 _bVal = _bVal != false;
00605                 if ( CFndBase::m_bDepthWrite != _bVal ) {
00606                         CFndBase::m_bDepthWrite = _bVal;
00607                         ::glDepthMask( _bVal ? GL_TRUE : GL_FALSE );
00608                 }
00609         }
00610 
00616         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetCulling( LSBOOL _bVal ) {
00617                 _bVal = _bVal != false;
00618                 if ( m_bCulling != _bVal ) {
00619                         m_bCulling = _bVal;
00620                         if ( _bVal ) { ::glEnable( GL_CULL_FACE ); }
00621                         else { ::glDisable( GL_CULL_FACE ); }
00622                 }
00623         }
00624 
00630         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetCullMode( LSG_CULL_MODES _cmMode ) {
00631                 assert( _cmMode == LSG_CM_CW || _cmMode == LSG_CM_CCW );
00632                 if ( m_cmCullMode != _cmMode ) {
00633                         m_cmCullMode = _cmMode;
00634                         static const GLenum eModes[] = {
00635                                 GL_CW,
00636                                 GL_CCW
00637                         };
00638                         ::glFrontFace( eModes[_cmMode] );
00639                 }
00640         }
00641 
00647         LSE_INLINE LSG_CULL_MODES LSE_CALL COpenGlEs::GetCullMode() {
00648                 return m_cmCullMode;
00649         }
00650 
00656         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetBlendEnabled( LSBOOL _bVal ) {
00657                 if ( CFndBase::m_bBlending != (_bVal != false) ) {
00658                         CFndBase::m_bBlending = (_bVal != false);
00659                         if ( CFndBase::m_bBlending ) { ::glEnable( GL_BLEND ); }
00660                         else { ::glDisable( GL_BLEND ); }
00661                 }
00662         }
00663 
00670         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetBlendFunc( LSG_BLEND_MODES _bmSrc, LSG_BLEND_MODES _bmDst ) {
00671                 static const GLenum eModes[] = {
00672                         GL_ZERO,                                                        // LSG_BM_ZERO
00673                         GL_ONE,                                                         // LSG_BM_ONE
00674                         GL_SRC_COLOR,                                           // LSG_BM_SRC_COLOR
00675                         GL_ONE_MINUS_SRC_COLOR,                         // LSG_BM_INV_SRC_COLOR
00676                         GL_DST_COLOR,                                           // LSG_BM_DST_COLOR
00677                         GL_ONE_MINUS_DST_COLOR,                         // LSG_BM_INV_DST_COLOR
00678                         GL_SRC_ALPHA,                                           // LSG_BM_SRC_ALPHA
00679                         GL_ONE_MINUS_SRC_ALPHA,                         // LSG_BM_INV_SRC_ALPHA
00680                         GL_DST_ALPHA,                                           // LSG_BM_DST_ALPHA
00681                         GL_ONE_MINUS_DST_ALPHA,                         // LSG_BM_INV_DEST_ALPHA
00682                         GL_SRC_ALPHA_SATURATE,                          // LSG_BM_SRC_ALPHA_SAT
00683                 };
00684 
00685                 if ( CFndBase::m_bmSrcBlend != _bmSrc || CFndBase::m_bmDstBlend != _bmDst ) {
00686                         CFndBase::m_bmSrcBlend = _bmSrc;
00687                         CFndBase::m_bmDstBlend = _bmDst;
00688                         ::glBlendFunc( eModes[_bmSrc], eModes[_bmDst] );
00689                 }
00690         }
00691 
00697         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::SetFillMode( LSG_FILL_MODES /*_fmMode*/ ) {
00698                 /*static const GLenum eModes[] = {
00699                         GL_FILL,
00700                         GL_LINE
00701                 };
00702                 ::glPolygonMode( GL_FRONT_AND_BACK, eModes[_fmMode] );*/
00703         }
00704 
00710         LSE_INLINE LSBOOL LSE_FCALL COpenGlEs::BeginRender() {
00711                 return true;
00712         }
00713 
00717         LSE_INLINE LSVOID LSE_FCALL COpenGlEs::EndRender() {
00718         };
00719 
00725         LSE_INLINE CShaderManager * LSE_FCALL COpenGlEs::GetShaderManager() {
00726                 return m_psmShaderMan;
00727         }
00728 
00734         LSE_INLINE LSVOID LSE_CALL COpenGlEs::ActivateTexture( LSUINT32 _ui32Unit ) {
00735                 if ( m_ui32LastActiveTexture == _ui32Unit ) { return; }
00736                 m_ui32LastActiveTexture = _ui32Unit;
00737                 ::glActiveTexture( GL_TEXTURE0 + m_ui32LastActiveTexture );
00738         }
00739 
00745         LSE_INLINE LSBOOL LSE_CALL COpenGlEs::NonPo2() {
00746                 return CFndBase::m_mMetrics.bNonPo2;
00747         }
00748 
00754         LSE_INLINE LSBOOL LSE_CALL COpenGlEs::FbosSupported() {
00755                 return m_bFbos;
00756         }
00757 
00763         LSE_INLINE LSUINT32 LSE_CALL COpenGlEs::MaxRenderTargetSize() {
00764                 return CFndBase::m_mMetrics.ui32MaxRenderTargetSize;
00765         }
00766 
00772         LSE_INLINE LSUINT32 LSE_CALL COpenGlEs::MaxTextureSize() {
00773                 return CFndBase::m_mMetrics.ui32MaxTextureHeight;
00774         }
00775 
00776 }       // namespace lsg
00777 
00778 #endif  // #ifdef LSG_OGLES
00779 
00780 #endif  // __LSG_OPENGLES_H__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator