00001
00009
00010
00011
00012
00013
00014 #if GFXSYS_OPENGL
00015 #ifndef GFX_OPENGL_HH
00016 #define GFX_OPENGL_HH 1
00017
00018 namespace gfx {
00019
00141 class GFX : public NonThreadable
00142 {
00143 ;
00144 GFX( void );
00145 ~GFX();
00146 public:
00147 CLASS_CONST uint MATRIX_ELEMS = 16;
00148 #define DEFAULT_PERSPECTIVE_FOV (8.0)
00149 #define DEFAULT_PERSPECTIVE_FRUSTUM_NEAR (125.0)
00150 #define DEFAULT_PERSPECTIVE_FRUSTUM_FAR (100000.0)
00151
00153 enum ePrim
00154 {
00155 ePrim_POINTS = GL_POINTS,
00156 ePrim_LINES = GL_LINES,
00157 ePrim_LINE_LOOP = GL_LINE_LOOP,
00158 ePrim_TRIANGLES = GL_TRIANGLES,
00159 ePrim_TRIANGLE_STRIP = GL_TRIANGLE_STRIP,
00160 ePrim_QUADS = GL_QUADS,
00161 ePrim_QUAD_STRIP = GL_QUAD_STRIP,
00162 ePrim_POLYGON = GL_POLYGON,
00163 };
00164
00165 enum ePolygonMode
00166 {
00167 ePolygonMode_POINT = GL_POINT,
00168 ePolygonMode_LINE = GL_LINE,
00169 ePolygonMode_FILL = GL_FILL,
00170 ePolygonMode_DEFAULT = GL_FILL
00171 };
00172
00174 enum eBlend
00175 {
00176
00177 eBlend_SRC_ALPHA = GL_SRC_ALPHA,
00178 eBlend_SRC_COLOR = GL_SRC_COLOR,
00179 eBlend_ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA,
00180
00181 eBlend_DST_ALPHA = GL_DST_ALPHA,
00182 eBlend_DST_COLOR = GL_DST_COLOR,
00183 eBlend_ONE_MINUS_DST_ALPHA = GL_ONE_MINUS_DST_ALPHA,
00184 eBlend_DST_ONE = GL_ONE
00185 };
00186
00188 enum eColorFormat
00189 {
00190 eColorFormat_RGBA = GL_RGBA,
00191 eColorFormat_RGBA8 = GL_RGBA8,
00192 eColorFormat_BGRA = GL_BGRA,
00193 };
00194
00196 enum eDepthTest
00197 {
00198 eDepthTest_DISABLE,
00199 eDepthTest_ENABLE,
00200 };
00201
00203 enum eShadeModel
00204 {
00205 eShadeModel_FLAT = GL_FLAT,
00206 eShadeModel_NORMAL = GL_FLAT,
00207 eShadeModel_SMOOTH = GL_SMOOTH,
00208 };
00209
00210 enum eAntialias
00211 {
00212
00213 eAntialias_OFF = 0,
00214 eAntialias_1 = 1,
00215 eAntialias_2 = 2,
00216 eAntialias_3 = 3,
00217 eAntialias_DEFAULT = eAntialias_OFF,
00218 };
00219
00221 enum eKey
00222 {
00223 eKey_ENTER = 0xd,
00224 eKey_ESC = 27,
00225 eKey_TAB = 0x9,
00226 eKey_BACKSPACE = 0x8,
00227 eKey_DELETE = 0x7f,
00228 eKey_CTRL_C = 0x3,
00229 eKey_CTRL_P = 0x10,
00230 eKey_CTRL_S = 0x13,
00231 eKey_CTRL_X = 0x18,
00232 eKey_CTRL_Z = 0x1a,
00233 eKey_1 = 0x31,
00234 eKey_PLUS = 0x2b,
00235 eKey_MINUS = 0x2d,
00236
00237
00238 eKey_LEFT = 0x64,
00239 eKey_RIGHT = 0x66,
00240 eKey_UP = 0x65,
00241 eKey_DOWN = 0x67,
00242 eKey_HOME = 0x6a,
00243 eKey_END = 0x6b,
00244 eKey_F1 = 0x1,
00245 eKey_F2 = 0x2,
00246 eKey_F3 = 0x3,
00247 eKey_F4 = 0x4,
00248 eKey_F5 = 0x5,
00249 eKey_F6 = 0x6,
00250 eKey_F7 = 0x7,
00251 eKey_F8 = 0x8,
00252 eKey_F9 = 0x9,
00253 eKey_F10 = 0xa,
00254 eKey_F11 = 0xb,
00255 eKey_F12 = 0xc,
00256 };
00257
00258
00259
00260
00261 public:
00265 class Modes
00266 {
00267 ;
00268 friend class GFX;
00269 public:
00270 Modes( void );
00271 ~Modes();
00272
00273 public:
00274 CLASS_CONST ePolygonMode DEFAULT_POLYGON_MODE = ePolygonMode_DEFAULT;
00275 CLASS_CONST bool DEFAULT_DEPTH_MASK = true;
00276 CLASS_CONST bool DEFAULT_DEPTH_TEST = true;
00277 CLASS_CONST bool DEFAULT_BLEND = false;
00278 CLASS_CONST eBlend DEFAULT_BLEND_SRC = eBlend_SRC_ALPHA;
00279 CLASS_CONST eBlend DEFAULT_BLEND_DST = eBlend_ONE_MINUS_SRC_ALPHA;
00280 CLASS_CONST bool DEFAULT_TEXTURE2 = false;
00281 CLASS_CONST bool DEFAULT_LIGHTING = false;
00282
00283
00284 CLASS_CONST eAntialias DEFAULT_ANTIALIAS = eAntialias_DEFAULT;
00285 CLASS_CONST bool DEFAULT_LINE_SMOOTH = false;
00286 CLASS_CONST bool DEFAULT_FOG = false;
00287 private:
00288
00289 ePolygonMode mPolygonMode;
00290 bool mDepthMask;
00291 bool mDepthTest;
00292 bool mBlend;
00293 eBlend mBlendSrc;
00294 eBlend mBlendDst;
00295 bool mTexture2;
00296 bool mLighting;
00297 eAntialias mAntialias;
00298 bool mLineSmooth;
00299 bool mFog;
00300
00301 };
00302
00303
00304
00305
00306 public:
00311 CLASS_METHOD
00312 void
00313 Begin( ePrim prim )
00314 {
00315 ASSERT2( IfReady() );
00316 ASSERT( msBlockNest == 0 );
00317
00318
00319 glBegin( prim );
00320 }
00321
00322 CLASS_METHOD
00323 void
00324 End( void )
00325 {
00326 ASSERT2( IfReady() );
00327 ASSERT( msBlockNest == 1 );
00328
00329
00330 glEnd();
00331 }
00332
00341 CLASS_METHOD
00342 void
00343 Begin2D( const Rect<int>& rect );
00344
00345 CLASS_METHOD
00346 void
00347 End2D( void );
00348
00352 CLASS_METHOD
00353 void
00354 BeginAux( void );
00355
00356 CLASS_METHOD
00357 void
00358 EndAux( void );
00359
00367 CLASS_METHOD
00368 void
00369 Vertex( const EyeVertex* v )
00370 {
00371 ASSERT2( IfReady() );
00372
00373 #if PORTABLE_VERTEX
00374 glVertex3f( v->x, v->y, v->z );
00375 #else
00376 glVertex3fv( reinterpret_cast<const GLfloat*>( v ) );
00377 #endif
00378 }
00379
00380 CLASS_METHOD
00381 void
00382 Vertex( const EyeVertex& v )
00383 {
00384 ASSERT2( IfReady() );
00385
00386 #if PORTABLE_VERTEX
00387 glVertex3f( v.x, v.y, v.z );
00388 #else
00389 glVertex3fv( reinterpret_cast<const GLfloat*>( &v ) );
00390 #endif
00391 }
00392
00396 CLASS_METHOD
00397 void
00398 Vertex2D( fp x, fp y )
00399 {
00400 ASSERT2( IfReady() );
00401
00402
00403
00404
00405
00406 glVertex3f( x, y, 1.0 );
00407 }
00408
00412 CLASS_METHOD
00413 void
00414 Normal( const NormalVertex& n )
00415 {
00416 ASSERT2( IfReady() );
00417
00418 glNormal3f( n.x, n.y, n.z );
00419 }
00420
00424 CLASS_METHOD
00425 void
00426 Color( const RGBA rgba )
00427 {
00428 ASSERT2( IfReady() );
00429
00430 glColor4ubv( const_cast<uint8*>( rgba.Get() ) );
00431 }
00432
00436 CLASS_METHOD
00437 void
00438 DrawRect2D( const Rect<int>& rect, const RGBA rgba );
00439
00440
00441
00442
00443 private:
00444
00445
00446 CLASS_METHOD bool
00447 Enable( const bool enable, bool& var, const GLenum mode )
00448 {
00449 ASSERT2( IfReady() );
00450
00451 const bool prev = var;
00452
00453 if ( enable and (not var) )
00454 {
00455 glEnable( mode );
00456 var = enable;
00457 }
00458 else if ( (not enable) and var )
00459 {
00460 glDisable( mode );
00461 var = enable;
00462 }
00463
00464 return prev;
00465
00466
00467 }
00468
00469 public:
00470 CLASS_METHOD Modes
00471 GetModes( void )
00472 {
00473 return msModes;
00474 }
00475
00476 CLASS_METHOD void
00477 SetModes( const Modes& modes );
00478
00479 CLASS_METHOD
00480 void
00481 SetPolygonMode( const ePolygonMode polygonMode );
00482
00483 CLASS_METHOD bool
00484 EnableDepthMask( const bool enable );
00485
00486 CLASS_METHOD bool
00487 EnableDepthTest( const bool enable );
00488
00489 CLASS_METHOD bool
00490 EnableTexture2( const bool enable )
00491 {
00492 return Enable( enable, msModes.mTexture2, GL_TEXTURE_2D );
00493 }
00494
00499 CLASS_METHOD
00500 ePrim
00501 Polygon2Prim( const uint vertexCnt )
00502 {
00503 ASSERT2( IfReady() );
00504 ASSERT( vertexCnt < sizeof(msPrimTable) );
00505
00506 return msPrimTable[vertexCnt];
00507 }
00508
00509 CLASS_METHOD
00510 void
00511 SetShadeModel( const eShadeModel shade );
00512
00513 CLASS_METHOD
00514 void
00515 SetLineWidth( const fp lineWidth, const bool lineSmooth = false );
00516
00517 CLASS_METHOD
00518 void
00519 SetPointSize( const fp pointSize );
00520
00521
00522
00523
00524 public:
00530 class Light
00531 {
00532 friend class GFX;
00533
00534 public:
00537 enum eLightId
00538 {
00539 eLightId_0 = GL_LIGHT0,
00540 eLightId_1 = GL_LIGHT1,
00541 eLightId_2 = GL_LIGHT2,
00542 eLightId_3 = GL_LIGHT3,
00543 eLightId_4 = GL_LIGHT4,
00544 eLightId_6 = GL_LIGHT6,
00545 eLightId_7 = GL_LIGHT7
00546 };
00547
00548 public:
00549 Light( const eLightId lightId = eLightId_0 );
00550 void SetAmbient( const RGBA color );
00551 void SetDiffuse( const RGBA color );
00552 void SetSpecular( const RGBA color );
00553 void SetPosition( const WorldVertex& position, const fp w );
00554 pair<WorldVertex,fp> GetPosition( void ) const;
00555
00556 private:
00557 eLightId mId;
00558 bool mSetAmbient; TinyArray<4,GLfloat> mAmbient;
00559 bool mSetDiffuse; TinyArray<4,GLfloat> mDiffuse;
00560 bool mSetSpecular; TinyArray<4,GLfloat> mSpecular;
00561 bool mSetPosition; TinyArray<4,GLfloat> mPosition;
00562 };
00563
00567 CLASS_METHOD
00568 void
00569 EnableLighting( const bool enable = true )
00570 {
00571 if ( enable )
00572 glEnable( GL_LIGHTING );
00573 else
00574 glDisable( GL_LIGHTING );
00575
00576 msModes.mLighting = enable;
00577 }
00578
00579 CLASS_METHOD
00580 bool IfLighting( void )
00581 {
00582 return msModes.mLighting;
00583 }
00584
00588 CLASS_METHOD
00589 void
00590 SetLight( Light& light, const bool enable = true );
00591
00592
00593
00594
00600 class Material
00601 {
00602 friend class GFX;
00603
00604 public:
00605 Material( void );
00606 void SetAmbient( const RGBA rgba );
00607 void SetDiffuse( const RGBA rgba );
00608 void SetSpecular( const RGBA rgba );
00609 void SetShininess( const fp shininess );
00610 friend inline bool operator<( const Material& a, const Material& b )
00611 {
00612 RETURN_LT_TRUE_GT_FALSE( int(a.mSetAmbient), int(b.mSetAmbient) )
00613 RETURN_LT_TRUE_GT_FALSE( int(a.mSetDiffuse), int(b.mSetDiffuse) )
00614 RETURN_LT_TRUE_GT_FALSE( int(a.mSetSpecular), int(b.mSetSpecular) )
00615 RETURN_LT_TRUE_GT_FALSE( int(a.mSetShininess), int(b.mSetShininess) )
00616 RETURN_LT_TRUE_GT_FALSE( a.mAmbient, b.mAmbient )
00617 RETURN_LT_TRUE_GT_FALSE( a.mDiffuse, b.mDiffuse )
00618 RETURN_LT_TRUE_GT_FALSE( a.mSpecular, b.mSpecular )
00619 RETURN_LT_TRUE_GT_FALSE( a.mShininess, b.mShininess )
00620 return false;
00621 }
00622
00623 private:
00624 bool mSetAmbient; TinyArray<4,GLfloat> mAmbient;
00625 bool mSetDiffuse; TinyArray<4,GLfloat> mDiffuse;
00626 bool mSetSpecular; TinyArray<4,GLfloat> mSpecular;
00627 bool mSetShininess; TinyArray<1,GLfloat> mShininess;
00628 };
00629
00633 CLASS_METHOD
00634 void
00635 SetMaterial( Material& material );
00636
00637
00638
00639
00640 CLASS_METHOD
00641 void
00642 IdentityTextureMatrix( void );
00643
00644
00645 CLASS_METHOD
00646 void
00647 SetTextureMatrix( const Matrix& m );
00648
00649 CLASS_METHOD
00650 void
00651 SetTextureMatrix( const fp[16] );
00652
00653 CLASS_METHOD
00654 void
00655 GetTextureMatrix( fp[16] );
00656
00657 CLASS_METHOD
00658 void
00659 TranslateTextureMatrix( fp x, fp y, fp z );
00660
00661 CLASS_METHOD
00662 void
00663 RotateTextureMatrix( const Degree deg, fp x, fp y, fp z );
00664
00665
00666
00667
00671 CLASS_METHOD
00672 void
00673 EnableTranslucent( void );
00674
00675 CLASS_METHOD
00676 void
00677 DisableTranslucent( void );
00678
00679
00680
00681
00686 CLASS_METHOD
00687 void
00688 EnableBlend( const eBlend src = eBlend_SRC_ALPHA,
00689 const eBlend dst = eBlend_ONE_MINUS_SRC_ALPHA,
00690 const eDepthTest depthTest = eDepthTest_ENABLE );
00691
00692 CLASS_METHOD
00693 void
00694 DisableBlend( void );
00695
00696 CLASS_METHOD
00697 void
00698 SetBlendFunc( const eBlend src, const eBlend dst )
00699 {
00700 if ( (src != msModes.mBlendSrc)
00701 || (dst != msModes.mBlendDst) )
00702 {
00703 msModes.mBlendSrc = src;
00704 msModes.mBlendDst = dst;
00705 glBlendFunc( src, dst );
00706 }
00707 }
00708
00709
00710
00711
00722 CLASS_METHOD
00723 void
00724 BeginBlendImage( const uint width, const eColorFormat colorFormat = eColorFormat_RGBA );
00725
00726 CLASS_METHOD
00727 void
00728 BlendImage( const void* img, const uint imgLen );
00729
00730 CLASS_METHOD
00731 void
00732 GetBlendImage( void* img, const uint imgLen );
00733
00734 CLASS_METHOD
00735 void
00736 EndBlendImage( void );
00737
00738
00739
00740
00744 CLASS_METHOD void
00745 EnableAntialias( const eAntialias antialias );
00746
00747
00748
00749
00753 CLASS_METHOD bool
00754 EnableFog( const bool enable );
00755
00756 CLASS_METHOD bool
00757 EnableFog( const bool enable, const float fogDensity, const RGBA fogRgba );
00758
00759 CLASS_METHOD
00760 void
00761 SetFogColor( const RGBA rgba );
00762
00763 CLASS_METHOD
00764 RGBA
00765 GetFogColor( void );
00766
00767 CLASS_METHOD
00768 void
00769 SetFogDensity( const fp fogDensity );
00770
00771 CLASS_METHOD
00772 void
00773 SetBaseFogDensity( const fp baseFogDensity );
00774
00775 CLASS_METHOD
00776 fp
00777 GetFogDensity( void );
00778
00779
00780
00781
00783 struct Perspective
00784 {
00785 Perspective( void );
00786 Perspective( Degree fov, fp frustumNear, fp frustumFar );
00787
00788 Degree mFov;
00789 fp mFrustumNear;
00790 fp mFrustumFar;
00791 };
00792
00793 CLASS_METHOD void
00794 SetViewport( const Rect<int>& rect, bool force = false );
00795
00796 CLASS_METHOD void
00797 ClearViewport( void );
00798
00799 CLASS_METHOD Rect<int>
00800 GetViewport( void );
00801
00802 CLASS_METHOD WidthHeight<int>
00803 GetWindow( void );
00804
00805 CLASS_METHOD Rect<int>
00806 GetWindowRect( void );
00807
00808 CLASS_METHOD void
00809 SetPerspective( const Perspective& perspective );
00810
00811 CLASS_METHOD void
00812 SetPerspective( const Perspective& perspective, const WidthHeight<int>& widthHeight );
00813
00814 CLASS_METHOD Perspective
00815 GetPerspective( void )
00816 {
00817 return msPerspective;
00818 }
00819
00820 CLASS_METHOD fp
00821 GetPerspectiveFov( void )
00822 {
00823 return msPerspective.mFov;
00824 }
00825
00829 CLASS_METHOD Vector2 Project( const EyeVertex& ev );
00830
00831 CLASS_METHOD bool
00832 IfVisible( const Vector3& v );
00833
00834 CLASS_METHOD bool
00835 IfVisibleSphere( const Vector3& v, const fp radius );
00836
00837 private:
00838 CLASS_METHOD void
00839 ComputeFrustum( void );
00840
00841
00842
00843
00844 public:
00848 CLASS_METHOD
00849 void
00850 PostRedisplay( void )
00851 {
00852 ASSERT2( IfReady() );
00853
00854 glutPostRedisplay();
00855 }
00856
00860 CLASS_METHOD
00861 void
00862 ClearError( void );
00863
00864 CLASS_METHOD
00865 void
00866 CheckError( const string funcName = string(), bool dumpcore = false );
00867
00868
00869
00870
00874 CLASS_METHOD Milliseconds GetTick( void );
00875 CLASS_METHOD Milliseconds GetTickDelta( void );
00876 CLASS_METHOD Milliseconds GetTickFreq( void );
00877 CLASS_METHOD void SetTickFreq( const Milliseconds freq );
00878
00879
00880
00881
00882 CLASS_METHOD
00883 void
00884 SetBackgroundColor( const RGBA rgba );
00885
00886
00887
00888
00892 CLASS_METHOD void Init( int argc, char** argv );
00893
00894 CLASS_METHOD void Start( void );
00895
00897 CLASS_METHOD bool IfReady( void ) { return msReady; }
00898
00899
00900
00901 private:
00902
00903 CLASS_METHOD void Cmdargs( int argc, char** argv );
00904
00905 CLASS_METHOD void CheckCapabilities( void );
00906
00907 CLASS_METHOD void ConfigureSettingsBeforeReady( void );
00908
00909 CLASS_METHOD void ConfigureSettingsAfterReady( void );
00910
00911 CLASS_METHOD void Idle( void );
00912
00913 CLASS_METHOD void Reshape( int w, int h );
00914
00915 CLASS_METHOD void Display( void );
00916
00917 CLASS_METHOD void Timer( int unused );
00918
00919 CLASS_METHOD void MouseButtonHandler( int button, int state, int x, int y );
00920
00921 CLASS_METHOD void MouseMotionPassiveHandler( int x, int y );
00922
00923 CLASS_METHOD void MouseMotionHandler( int x, int y );
00924
00925 CLASS_METHOD void ResetModelViewMatrix( void );
00926
00927 CLASS_METHOD void UpdatePerspective( void );
00928
00929 CLASS_METHOD fp PerspectiveAngle( const fp size, const fp dist );
00930
00931
00932
00933 private:
00934 CLASS_VAR bool msReady;
00935 CLASS_VAR WidthHeight<int> msWindow;
00936 CLASS_VAR Rect<int> msViewport;
00937 CLASS_VAR Perspective msPerspective;
00938 CLASS_VAR fp msFrustum[6][4];
00939 CLASS_VAR GLfloat msProjectionMatrix[GFX::MATRIX_ELEMS];
00940 CLASS_VAR Milliseconds msTick;
00941 CLASS_VAR Milliseconds msTickFreq;
00942 CLASS_CONST uint DEFAULT_TICK_FREQ_MILLISEC = 20;
00943
00944
00945
00946 private:
00947 CLASS_VAR Modes msModes;
00948 CLASS_VAR Modes msModesSaved2D;
00949 CLASS_VAR GLint msIfAuxBuffer;
00950 CLASS_CONST ePrim msPrimTable[5];
00951 CLASS_VAR RGBA msFogColor;
00952 CLASS_VAR GLint msFogMode;
00953 CLASS_VAR fp msFogDensity;
00954 CLASS_VAR fp msBaseFogDensity;
00955 CLASS_VAR int msBlockNest;
00956 #if DEBUG
00957 CLASS_VAR int msAuxBlockNest;
00958 CLASS_VAR bool msComputedFrustum;
00959 #endif
00960 };
00961
00962
00963
00964 #if OLD_OPENGL
00965 const fp MIN_OPENGL_VERSION_FLOAT = 1.2;
00966 #else
00967 #ifndef GL_VERSION_1_4 // equal or at least
00968 #error "Below minimum requirement: OpenGL 1.4"
00969 #endif
00970 const fp MIN_OPENGL_VERSION_FLOAT = 1.4;
00971 #endif
00972
00973
00974 }
00975
00976 #endif // GFX_OPENGL_HH
00977 #endif // GFXSYS_OPENGL