00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_OPENGL_H
00027 #define NL_OPENGL_H
00028
00029
00030 #include "nel/misc/types_nl.h"
00031
00032 #ifdef NL_OS_WINDOWS
00033
00034 #define WIN32_LEAN_AND_MEAN
00035 #include <windows.h>
00036 # ifdef min
00037 # undef min
00038 # endif
00039 # ifdef max
00040 # undef max
00041 # endif
00042
00043 #else // NL_OS_UNIX
00044
00045 #define GLX_GLXEXT_PROTOTYPES
00046
00047 #include <GL/glx.h>
00048
00049 #ifdef XF86VIDMODE
00050 #include <X11/extensions/xf86vmode.h>
00051 #endif //XF86VIDMODE
00052
00053 #endif // NL_OS_UNIX
00054
00055 #include <GL/gl.h>
00056 #include "driver_opengl_extension.h"
00057
00058 #include "3d/driver.h"
00059 #include "3d/material.h"
00060 #include "3d/shader.h"
00061 #include "3d/vertex_buffer.h"
00062 #include "nel/misc/matrix.h"
00063 #include "nel/misc/smart_ptr.h"
00064 #include "nel/misc/rgba.h"
00065 #include "nel/misc/event_emitter.h"
00066 #include "nel/misc/bit_set.h"
00067 #include "3d/ptr_set.h"
00068 #include "nel/misc/heap_memory.h"
00069 #include "nel/misc/event_emitter_multi.h"
00070 #include "driver_opengl_states.h"
00071 #include "3d/texture_cube.h"
00072 #include "3d/vertex_program_parse.h"
00073
00074
00075 #ifdef NL_OS_WINDOWS
00076 #include "nel/misc/win_event_emitter.h"
00077 #elif defined (NL_OS_UNIX)
00078 #include "unix_event_emitter.h"
00079 #endif // NL_OS_UNIX
00080
00081
00082
00083 #define NL3D_DRV_MAX_LIGHTMAP 256
00084
00085
00086 namespace NL3D {
00087
00088 using NLMISC::CMatrix;
00089 using NLMISC::CVector;
00090
00091
00092 class CDriverGL;
00093 class IVertexArrayRange;
00094 class IVertexBufferHardGL;
00095
00096
00097
00098 class CTextureDrvInfosGL : public ITextureDrvInfos
00099 {
00100 public:
00101
00102
00103
00104
00105
00106 GLuint ID;
00107
00108 bool Compressed;
00109
00110
00111 uint32 TextureMemory;
00112
00113 CDriverGL *_Driver;
00114
00115
00116
00117 ITexture::TWrapMode WrapS;
00118 ITexture::TWrapMode WrapT;
00119 ITexture::TMagFilter MagFilter;
00120 ITexture::TMinFilter MinFilter;
00121
00122
00123 CTextureDrvInfosGL(IDriver *drv, ItTexDrvInfoPtrMap it, CDriverGL *drvGl);
00124
00125 ~CTextureDrvInfosGL();
00126 };
00127
00128
00129
00130 class CVBDrvInfosGL : public IVBDrvInfos
00131 {
00132 public:
00133 CVBDrvInfosGL(IDriver *drv, ItVBDrvInfoPtrList it) : IVBDrvInfos(drv, it) {}
00134 };
00135
00136
00137
00138 class CShaderGL : public IShader
00139 {
00140 public:
00141 GLenum SrcBlend;
00142 GLenum DstBlend;
00143 GLenum ZComp;
00144
00145 GLfloat Emissive[4];
00146 GLfloat Ambient[4];
00147 GLfloat Diffuse[4];
00148 GLfloat Specular[4];
00149
00150 uint32 PackedEmissive;
00151 uint32 PackedAmbient;
00152 uint32 PackedDiffuse;
00153 uint32 PackedSpecular;
00154
00155
00156 CMaterial::TShader SupportedShader;
00157
00158 CShaderGL(IDriver *drv, ItShaderPtrList it) : IShader(drv, it) {}
00159 };
00160
00161
00162
00164
00165 {
00166 public:
00167 uint16 VertexFormat;
00168 uint16 VertexSize;
00169 uint32 NumVertices;
00170 uint32 NumWeight;
00171 CVertexBuffer::TType Type[CVertexBuffer::NumValue];
00172
00173
00174 void *ValuePtr[CVertexBuffer::NumValue];
00175
00176
00177
00178 bool ATIVBHardMode;
00179
00180 uint ATIVertexObjectId;
00181
00182 uint ATIValueOffset[CVertexBuffer::NumValue];
00183
00184
00185 void setupVertexBuffer(CVertexBuffer &vb);
00186 void setupVertexBufferHard(IVertexBufferHardGL &vb);
00187 };
00188
00189
00190
00191
00192 class CDriverGL : public IDriver
00193 {
00194 public:
00195
00196
00197 enum { MaxLight=8 };
00198
00199
00200 uint32 getHwnd ()
00201 {
00202 #ifdef NL_OS_WINDOWS
00203 return (uint32)_hWnd;
00204 #else // NL_OS_WINDOWS
00205 return 0;
00206 #endif // NL_OS_WINDOWS
00207 }
00208
00209 CDriverGL();
00210 virtual ~CDriverGL();
00211
00212 virtual bool init();
00213
00214 virtual ModeList enumModes();
00215
00216 virtual void disableHardwareVertexProgram();
00217 virtual void disableHardwareVertexArrayAGP();
00218 virtual void disableHardwareTextureShader();
00219
00220 virtual bool setDisplay(void* wnd, const GfxMode& mode) throw(EBadDisplay);
00221
00222 virtual void* getDisplay()
00223 {
00224 #ifdef NL_OS_WINDOWS
00225 return (void*)_hWnd;
00226 #else // NL_OS_WINDOWS
00227 return NULL;
00228 #endif // NL_OS_WINDOWS
00229 }
00230
00231 virtual emptyProc getWindowProc();
00232
00233 virtual bool activate();
00234
00235 virtual sint getNbTextureStages() const;
00236
00237 virtual bool isTextureExist(const ITexture&tex);
00238
00239 virtual NLMISC::IEventEmitter *getEventEmitter() { return&_EventEmitter; };
00240
00241 virtual bool clear2D(CRGBA rgba);
00242
00243 virtual bool clearZBuffer(float zval=1);
00244 virtual void setColorMask (bool bRed, bool bGreen, bool bBlue, bool bAlpha);
00245
00246 virtual bool setupTexture (ITexture& tex);
00247
00248 virtual bool setupTextureEx (ITexture& tex, bool bUpload, bool &bAllUploaded, bool bMustRecreateSharedTexture= false);
00249 virtual bool uploadTexture (ITexture& tex, NLMISC::CRect& rect, uint8 nNumMipMap);
00250 virtual bool uploadTextureCube (ITexture& tex, NLMISC::CRect& rect, uint8 nNumMipMap, uint8 nNumFace);
00251
00252 virtual void forceDXTCCompression(bool dxtcComp);
00253
00254 virtual void forceTextureResize(uint divisor);
00255
00257 void setTextureEnvFunction(uint stage, CMaterial& mat);
00258
00260 void setupUserTextureMatrix(uint numStages, CMaterial& mat);
00261
00263 void disableUserTextureMatrix();
00264
00266
00267
00269
00270
00271 virtual bool setupMaterial(CMaterial& mat);
00272
00273 virtual void setFrustum(float left, float right, float bottom, float top, float znear, float zfar, bool perspective = true);
00274
00275 virtual void setupViewMatrix(const CMatrix& mtx);
00276
00277 virtual void setupViewMatrixEx(const CMatrix& mtx, const CVector &cameraPos);
00278
00279 virtual void setupModelMatrix(const CMatrix& mtx);
00280
00281 virtual void multiplyModelMatrix(const CMatrix& mtx);
00282
00283 virtual CMatrix getViewMatrix() const;
00284
00285 virtual void forceNormalize(bool normalize)
00286 {
00287 _ForceNormalize= normalize;
00288
00289 if(normalize)
00290 enableGlNormalize(true);
00291 }
00292
00293 virtual bool isForceNormalize() const
00294 {
00295 return _ForceNormalize;
00296 }
00297
00298
00299 virtual bool supportVertexBufferHard() const;
00300
00301 virtual bool slowUnlockVertexBufferHard() const;
00302
00303 virtual uint getMaxVerticesByVertexBufferHard() const;
00304
00305 virtual bool initVertexArrayRange(uint agpMem, uint vramMem);
00306
00307 virtual IVertexBufferHard *createVertexBufferHard(uint16 vertexFormat, const uint8 *typeArray, uint32 numVertices,
00308 IDriver::TVBHardType vbType);
00309
00310 virtual void deleteVertexBufferHard(IVertexBufferHard *VB);
00311
00312 virtual void activeVertexBufferHard(IVertexBufferHard *VB);
00313
00314
00315 virtual bool activeVertexBuffer(CVertexBuffer& VB);
00316
00317 virtual bool activeVertexBuffer(CVertexBuffer& VB, uint first, uint end);
00318
00319 virtual void mapTextureStageToUV(uint stage, uint uv);
00320
00321 virtual bool render(CPrimitiveBlock& PB, CMaterial& Mat);
00322
00323 virtual void renderTriangles(CMaterial& Mat, uint32 *tri, uint32 ntris);
00324
00325 virtual void renderSimpleTriangles(uint32 *tri, uint32 ntris);
00326
00327 virtual void renderPoints(CMaterial& Mat, uint32 numPoints) ;
00328
00329 virtual void renderQuads(CMaterial& Mat, uint32 startIndex, uint32 numQuads) ;
00330
00331 virtual bool swapBuffers();
00332
00333 virtual void profileRenderedPrimitives(CPrimitiveProfile &pIn, CPrimitiveProfile &pOut);
00334
00335 virtual uint32 profileAllocatedTextureMemory();
00336
00337 virtual uint32 profileSetupedMaterials() const;
00338
00339 virtual uint32 profileSetupedModelMatrix() const;
00340
00341 void enableUsedTextureMemorySum (bool enable);
00342
00343 uint32 getUsedTextureMemory() const;
00344
00345 virtual bool release();
00346
00347 virtual TMessageBoxId systemMessageBox (const char* message, const char* title, TMessageBoxType type=okType, TMessageBoxIcon icon=noIcon);
00348
00349 virtual void setupScissor (const class CScissor& scissor);
00350
00351 virtual void setupViewport (const class CViewport& viewport);
00352
00353 virtual uint32 getImplementationVersion () const
00354 {
00355 return ReleaseVersion;
00356 }
00357
00358 virtual const char* getDriverInformation ()
00359 {
00360 return "Opengl 1.2 NeL Driver";
00361 }
00362
00363 virtual const char* getVideocardInformation ();
00364
00365 virtual bool isActive ();
00366
00367 virtual uint8 getBitPerPixel ();
00368
00369 virtual void showCursor (bool b);
00370
00371
00372 virtual void setMousePos(float x, float y);
00373
00374 virtual void setCapture (bool b);
00375
00376 virtual NLMISC::IMouseDevice *enableLowLevelMouse(bool enable);
00377
00378 virtual NLMISC::IKeyboardDevice *enableLowLevelKeyboard(bool enable);
00379
00380 virtual NLMISC::IInputDeviceManager *getLowLevelInputDeviceManager();
00381
00382 virtual void getWindowSize (uint32 &width, uint32 &height);
00383
00384 virtual void getBuffer (CBitmap &bitmap);
00385
00386 virtual void getZBuffer (std::vector<float> &zbuffer);
00387
00388 virtual void getBufferPart (CBitmap &bitmap, NLMISC::CRect &rect);
00389
00390 virtual void getZBufferPart (std::vector<float> &zbuffer, NLMISC::CRect &rect);
00391
00392 virtual void copyFrameBufferToTexture(ITexture *tex,
00393 uint32 level,
00394 uint32 offsetx,
00395 uint32 offsety,
00396 uint32 x,
00397 uint32 y,
00398 uint32 width,
00399 uint32 height
00400 );
00401
00402 virtual bool fillBuffer (CBitmap &bitmap);
00403
00404 virtual void setPolygonMode (TPolygonMode mode);
00405
00406 virtual uint getMaxLight () const;
00407
00408 virtual void setLight (uint8 num, const CLight& light);
00409
00410 virtual void enableLight (uint8 num, bool enable=true);
00411
00412 virtual void setPerPixelLightingLight(CRGBA diffuse, CRGBA specular, float shininess);
00413
00414 virtual void setAmbientColor (CRGBA color);
00415
00417
00418 virtual bool fogEnabled();
00419 virtual void enableFog(bool enable);
00421 virtual void setupFog(float start, float end, CRGBA color);
00422
00423
00425
00426 virtual bool supportTextureShaders() const;
00427
00428 virtual bool isTextureAddrModeSupported(CMaterial::TTexAddressingMode mode) const;
00429
00430 virtual void setMatrix2DForTextureOffsetAddrMode(const uint stage, const float mat[4]);
00431
00432
00434
00435 virtual bool supportEMBM() const;
00436 virtual bool isEMBMSupportedAtStage(uint stage) const;
00437 virtual void setEMBMMatrix(const uint stage, const float mat[4]);
00438
00439
00440 virtual bool supportPerPixelLighting(bool specular) const;
00441
00442
00444
00445 virtual bool supportBlendConstantColor() const;
00446 virtual void setBlendConstantColor(NLMISC::CRGBA col);
00447 virtual NLMISC::CRGBA getBlendConstantColor() const;
00448 virtual bool setMonitorColorProperties (const CMonitorColorProperties &properties);
00449
00450
00451
00452 virtual void swapTextureHandle(ITexture &tex0, ITexture &tex1);
00453
00454
00455 private:
00456 friend class CTextureDrvInfosGL;
00457 friend class CVertexProgamDrvInfosGL;
00458
00459
00460 private:
00461
00462 static const uint32 ReleaseVersion;
00463
00464 bool _FullScreen;
00465 bool _OffScreen;
00466
00467 #ifdef NL_OS_WINDOWS
00468
00469 friend static void GlWndProc(CDriverGL *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
00470
00471 HWND _hWnd;
00472 sint32 _WindowWidth, _WindowHeight;
00473 HDC _hDC;
00474 PIXELFORMATDESCRIPTOR _pfd;
00475 HGLRC _hRC;
00476 static uint _Registered;
00477 DEVMODE _OldScreenMode;
00478 NLMISC::CEventEmitterMulti _EventEmitter;
00479 bool _DestroyWindow;
00480
00481
00482 HPBUFFERARB _PBuffer;
00483
00484 #elif defined (NL_OS_UNIX)
00485
00486 Display *dpy;
00487 GLXContext ctx;
00488 Window win;
00489 Cursor cursor;
00490 NLMISC::CUnixEventEmitter _EventEmitter;
00491
00492 #ifdef XF86VIDMODE
00493 int _OldDotClock;
00494 XF86VidModeModeLine _OldScreenMode;
00495 int _OldX, _OldY;
00496 #endif //XF86VIDMODE
00497
00498 #endif // NL_OS_UNIX
00499
00500 bool _Initialized;
00501
00503
00504
00505 CGlExtensions _Extensions;
00506
00507
00508
00509
00510 uint8 _Depth;
00511
00512
00513 bool _ForceNormalize;
00514
00515
00516 bool _LightSetupDirty;
00517
00518
00519 bool _ModelViewMatrixDirty;
00520
00521
00522 bool _ProjMatDirty;
00523
00524
00525 NLMISC::CMatrix _GLProjMat;
00526
00527
00528 bool _RenderSetupDirty;
00529
00530
00531 float _OODeltaZ;
00532
00533
00534 CMatrix _UserViewMtx;
00535
00536
00537 CMatrix _ViewMtx;
00538
00539 CMatrix _TexMtx;
00540
00541 CVector _PZBCameraPos;
00542
00543
00544
00545
00546
00547 CMatrix _ModelViewMatrix;
00548
00549
00550 bool _FogEnabled;
00551 GLfloat _CurrentFogColor[4];
00552
00553
00554
00555 uint _MaxDriverLight;
00556 bool _LightEnable[MaxLight];
00557 uint _LightMode[MaxLight];
00558 CVector _WorldLightPos[MaxLight];
00559 CVector _WorldLightDirection[MaxLight];
00560
00561
00562
00563 void checkForPerPixelLightingSupport();
00564 bool _SupportPerPixelShader;
00565 bool _SupportPerPixelShaderNoSpec;
00566 float _PPLExponent;
00567 NLMISC::CRGBA _PPLightDiffuseColor;
00568 NLMISC::CRGBA _PPLightSpecularColor;
00569
00570
00571
00572
00574
00575
00576
00577 enum CTexEnvSpecial {
00578 TexEnvSpecialDisabled= 0,
00579 TexEnvSpecialLightMap,
00580 TexEnvSpecialSpecularStage0,
00581 TexEnvSpecialSpecularStage1,
00582 TexEnvSpecialSpecularStage1NoText,
00583 TexEnvSpecialPPLStage0,
00584 TexEnvSpecialPPLStage2,
00585 TexEnvSpecialCloudStage0,
00586 TexEnvSpecialCloudStage1,
00587 };
00588
00589
00590 CMaterial* _CurrentMaterial;
00591 CMaterial::TShader _CurrentMaterialSupportedShader;
00592 ITexture* _CurrentTexture[IDRV_MAT_MAXTEXTURES];
00593 CTextureDrvInfosGL* _CurrentTextureInfoGL[IDRV_MAT_MAXTEXTURES];
00594 CMaterial::CTexEnv _CurrentTexEnv[IDRV_MAT_MAXTEXTURES];
00595
00596 CTexEnvSpecial _CurrentTexEnvSpecial[IDRV_MAT_MAXTEXTURES];
00597
00598 GLenum _CurrentTexAddrMode[IDRV_MAT_MAXTEXTURES];
00599
00600 void resetTextureShaders();
00601
00602 bool _NVTextureShaderEnabled;
00603
00604 bool _StageSupportEMBM[IDRV_MAT_MAXTEXTURES];
00605
00606
00607 CDriverGLStates _DriverGLStates;
00608
00609 uint32 _MaterialAllTextureTouchedFlag;
00610
00611
00612
00613 bool _CurrentGlNormalize;
00614
00615 private:
00616
00617 void refreshProjMatrixFromGL();
00618
00619 bool setupVertexBuffer(CVertexBuffer& VB);
00620
00621 bool activateTexture(uint stage, ITexture *tex);
00622
00623 void activateTexEnvMode(uint stage, const CMaterial::CTexEnv &env);
00624 void activateTexEnvColor(uint stage, const CMaterial::CTexEnv &env);
00625
00626 void forceActivateTexEnvMode(uint stage, const CMaterial::CTexEnv &env);
00627 void activateTexEnvColor(uint stage, NLMISC::CRGBA col);
00628 void forceActivateTexEnvColor(uint stage, NLMISC::CRGBA col)
00629 {
00630 static const float OO255= 1.0f/255;
00631 _CurrentTexEnv[stage].ConstantColor= col;
00632
00633 _DriverGLStates.activeTextureARB(stage);
00634 GLfloat glcol[4];
00635 glcol[0]= col.R*OO255;
00636 glcol[1]= col.G*OO255;
00637 glcol[2]= col.B*OO255;
00638 glcol[3]= col.A*OO255;
00639 glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, glcol);
00640 }
00641 void forceActivateTexEnvColor(uint stage, const CMaterial::CTexEnv &env)
00642 {
00643 forceActivateTexEnvColor(stage, env.ConstantColor);
00644 }
00645
00646
00648 void enableNVTextureShader(bool enabled);
00649
00650 void verifyNVTextureShaderConfig();
00651
00652
00653 void cleanLightSetup ();
00654
00655
00656 GLint getGlTextureFormat(ITexture& tex, bool &compressed);
00657
00658
00659
00660 bool clipRect(NLMISC::CRect &rect);
00661
00662
00664
00666
00668
00670
00672
00674
00675
00676
00677
00679 void setupUVPtr(uint stage, CVertexBufferInfo &VB, uint uvId);
00680
00681
00683
00684 void computeLightMapInfos(const CMaterial &mat);
00685 sint beginLightMapMultiPass();
00686 void setupLightMapPass(uint pass);
00687 void endLightMapMultiPass();
00688
00690 uint _NLightMaps;
00691 uint _NLightMapPerPass;
00692 uint _NLightMapPass;
00693
00694 std::vector<uint> _LightMapLUT;
00695
00696
00697 CMaterial::CTexEnv _LightMapLastStageEnv;
00698
00699
00700 bool _LastVertexSetupIsLightMap;
00701 sint8 _LightMapUVMap[IDRV_MAT_MAXTEXTURES];
00702
00703
00704 void resetLightMapVertexSetup();
00705
00706
00707
00709
00710 sint beginSpecularMultiPass();
00711 void setupSpecularPass(uint pass);
00712 void endSpecularMultiPass();
00713
00714
00716
00717
00718 sint beginPPLMultiPass();
00719 void setupPPLPass(uint pass);
00720 void endPPLMultiPass();
00721
00722
00723 sint beginPPLNoSpecMultiPass();
00724 void setupPPLNoSpecPass(uint pass);
00725 void endPPLNoSpecMultiPass();
00726
00727 typedef NLMISC::CSmartPtr<CTextureCube> TSPTextureCube;
00728 typedef std::vector<TSPTextureCube> TTexCubeVect;
00729 TTexCubeVect _SpecularTextureCubes;
00730
00731
00733 CTextureCube *getSpecularCubeMap(uint exp);
00734
00735
00736 CTextureCube *getDiffuseCubeMap() { return getSpecularCubeMap(1); }
00737
00738
00739
00740
00741
00743
00744
00745
00746
00747
00748
00750 sint beginCloudMultiPass ();
00751 void setupCloudPass (uint pass);
00752 void endCloudMultiPass ();
00753
00754
00755
00757 void setupGlArrays(CVertexBufferInfo &vb);
00758
00760 void setupGlArraysStd(CVertexBufferInfo &vb);
00761 void setupGlArraysForNVVertexProgram(CVertexBufferInfo &vb);
00762 void setupGlArraysForEXTVertexShader(CVertexBufferInfo &vb);
00763 void toggleGlArraysForNVVertexProgram();
00764 void toggleGlArraysForEXTVertexShader();
00765
00767 void enableGlNormalize(bool normalize)
00768 {
00769 if(_CurrentGlNormalize!=normalize)
00770 {
00771 _CurrentGlNormalize= normalize;
00772 if(normalize)
00773 glEnable(GL_NORMALIZE);
00774 else
00775 glDisable(GL_NORMALIZE);
00776 }
00777 }
00778
00779
00780 void refreshRenderSetup()
00781 {
00782
00783 if(_RenderSetupDirty)
00784 {
00785 doRefreshRenderSetup();
00786 }
00787 }
00788 void doRefreshRenderSetup();
00789
00790
00792
00793 CPtrSet<IVertexBufferHardGL> _VertexBufferHardSet;
00794 friend class CVertexArrayRangeNVidia;
00795 friend class CVertexBufferHardGLNVidia;
00796 friend class CVertexArrayRangeATI;
00797 friend class CVertexBufferHardGLATI;
00798
00799 IVertexArrayRange *_CurrentVertexArrayRange;
00800
00801 IVertexBufferHardGL *_CurrentVertexBufferHard;
00802
00803 void *_NVCurrentVARPtr;
00804 uint32 _NVCurrentVARSize;
00805
00806
00807 bool _SupportVBHard;
00808 bool _SlowUnlockVBHard;
00809 uint32 _MaxVerticesByVBHard;
00810
00811
00812 IVertexArrayRange *_AGPVertexArrayRange;
00813
00814 IVertexArrayRange *_VRAMVertexArrayRange;
00815
00816
00817 void resetVertexArrayRange();
00818
00819 void fenceOnCurVBHardIfNeeded(IVertexBufferHardGL *newVBHard);
00820
00821
00822
00823
00824
00826
00827 CPrimitiveProfile _PrimitiveProfileIn;
00828 CPrimitiveProfile _PrimitiveProfileOut;
00829 uint32 _AllocatedTextureMemory;
00830 uint32 _NbSetupMaterialCall;
00831 uint32 _NbSetupModelMatrixCall;
00832 bool _SumTextureMemoryUsed;
00833 std::set<CTextureDrvInfosGL*> _TextureUsed;
00834 uint computeMipMapMemoryUsage(uint w, uint h, GLint glfmt) const;
00835
00836
00838
00839
00840 bool isVertexProgramSupported () const;
00841 bool isVertexProgramEmulated () const;
00842 bool activeVertexProgram (CVertexProgram *program);
00843 void setConstant (uint index, float, float, float, float);
00844 void setConstant (uint index, double, double, double, double);
00845 void setConstant (uint indexStart, const NLMISC::CVector& value);
00846 void setConstant (uint indexStart, const NLMISC::CVectorD& value);
00847 void setConstant (uint index, uint num, const float *src);
00848 void setConstant (uint index, uint num, const double *src);
00849 void setConstantMatrix (uint index, IDriver::TMatrix matrix, IDriver::TTransform transform);
00850 void enableVertexProgramDoubleSidedColor(bool doubleSided);
00851 bool supportVertexProgramDoubleSidedColor() const;
00852
00853
00854
00855
00857
00858 bool activeNVVertexProgram (CVertexProgram *program);
00859 bool activeEXTVertexShader (CVertexProgram *program);
00861
00862
00863
00865
00867
00868
00869
00870 bool isVertexProgramEnabled () const
00871 {
00872
00873 return _VertexProgramEnabled;
00874 }
00875
00876
00877 bool _VertexProgramEnabled;
00878
00879 bool _LastSetupGLArrayVertexProgram;
00880
00881
00882 NLMISC::CRefPtr<CVertexProgram> _LastSetuppedVP;
00883
00884 bool _ForceDXTCCompression;
00886 uint _ForceTextureResizePower;
00887
00888
00889
00890 NLMISC::CMatrix _UserTexMat[IDRV_MAT_MAXTEXTURES];
00891 uint _UserTexMatEnabled;
00892
00893
00894
00895 static const uint NumCoordinatesType[CVertexBuffer::NumType];
00896 static const uint GLType[CVertexBuffer::NumType];
00897 static const uint GLVertexAttribIndex[CVertexBuffer::NumValue];
00898 static const uint GLMatrix[IDriver::NumMatrix];
00899 static const uint GLTransform[IDriver::NumTransform];
00900
00902
00903 NLMISC::CSmartPtr<CTextureCube> _CausticCubeMap;
00904 static void initCausticCubeMap();
00905
00906
00908 sint inlGetNumTextStages() const {return _Extensions.NbTextureStages;}
00909
00910
00911 NLMISC::CRGBA _CurrentBlendConstantColor;
00912
00914
00915
00916
00917
00918
00919
00920
00921 public:
00922 enum EEVSVariants { EVSSecondaryColorVariant = 0, EVSFogCoordsVariant = 1, EVSSkinWeightVariant = 2, EVSPaletteSkinVariant = 3, EVSNumVariants };
00923 private:
00924
00925 GLuint _EVSPositionHandle;
00926 GLuint _EVSNormalHandle;
00927 GLuint _EVSColorHandle;
00928 GLuint _EVSTexHandle[8];
00929
00930 GLuint _EVSConstantHandle;
00931
00932 bool setupEXTVertexShader(const CVPParser::TProgram &program, GLuint id, uint variants[EVSNumVariants], uint16 &usedInputRegisters);
00933
00934
00935
00936
00937 void initEMBM();
00938
00939
00940 #ifdef WIN32
00941 bool _NeedToRestaureGammaRamp;
00942 uint16 _GammaRampBackuped[3*256];
00943 #endif
00944 };
00945
00946
00947
00948 class CVertexProgamDrvInfosGL : public IVertexProgramDrvInfos
00949 {
00950 public:
00951
00952 GLuint ID;
00953
00957 GLuint Variants[CDriverGL::EVSNumVariants];
00962 uint16 UsedVertexComponents;
00963
00964
00965
00966 CVertexProgamDrvInfosGL (CDriverGL *drv, ItVtxPrgDrvInfoPtrList it);
00967 };
00968
00969
00970 }
00971
00972 #endif // NL_OPENGL_H