00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef NL_DRV_H
00028 #define NL_DRV_H
00029
00030 #include "nel/misc/types_nl.h"
00031 #include "nel/misc/common.h"
00032 #include "nel/misc/smart_ptr.h"
00033 #include "nel/misc/rgba.h"
00034 #include "nel/misc/matrix.h"
00035 #include "nel/misc/stream.h"
00036 #include "nel/misc/uv.h"
00037 #include "3d/texture.h"
00038 #include "3d/shader.h"
00039 #include "3d/vertex_buffer.h"
00040 #include "3d/vertex_buffer_hard.h"
00041 #include "3d/vertex_program.h"
00042 #include "3d/material.h"
00043 #include "nel/misc/mutex.h"
00044 #include "nel/3d/primitive_profile.h"
00045
00046 #include <vector>
00047 #include <list>
00048
00049 namespace NLMISC
00050 {
00051 class IEventEmitter;
00052 struct IMouseDevice;
00053 struct IKeyboardDevice;
00054 struct IInputDeviceManager;
00055 class CRect;
00056 };
00057
00058 namespace NL3D
00059 {
00060
00061 using NLMISC::CRefPtr;
00062 using NLMISC::CRefCount;
00063 using NLMISC::CSmartPtr;
00064 using NLMISC::CRGBA;
00065 using NLMISC::CVector;
00066 using NLMISC::CMatrix;
00067 using NLMISC::CSynchronized;
00068
00069
00070 class CMaterial;
00071 class CPrimitiveBlock;
00072 class CLight;
00073 class CScissor;
00074 class CViewport;
00075 struct CMonitorColorProperties;
00076
00077
00078
00079
00081
00082 {
00083 public:
00084 bool OffScreen;
00085 bool Windowed;
00086 uint16 Width;
00087 uint16 Height;
00088 uint8 Depth;
00089
00090 GfxMode(void)
00091 {
00092 OffScreen=false;
00093 Windowed=false;
00094 Width=0;
00095 Height=0;
00096 Depth=0;
00097 }
00098 GfxMode(uint16 w, uint16 h, uint8 d, bool windowed= true, bool offscreen=false);
00099 };
00100
00101 typedef std::vector<GfxMode> ModeList;
00102
00103
00104
00105
00106 struct EBadDisplay : public NLMISC::Exception
00107 {
00108 EBadDisplay(const std::string &reason) : Exception(reason) { }
00109 };
00110
00111
00112 typedef void (*emptyProc)(void);
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 class IDriver : public NLMISC::CRefCount
00123 {
00124 public:
00126 static const uint32 InterfaceVersion;
00127
00128 public:
00129 enum TMessageBoxId { okId=0, yesId, noId, abortId, retryId, cancelId, ignoreId, idCount };
00130 enum TMessageBoxType { okType=0, okCancelType, yesNoType, abortRetryIgnoreType, yesNoCancelType, retryCancelType, typeCount };
00131 enum TMessageBoxIcon { noIcon=0, handIcon, questionIcon, exclamationIcon, asteriskIcon, warningIcon, errorIcon, informationIcon, stopIcon, iconCount };
00132
00138 enum TPolygonMode { Filled=0, Line, Point };
00139
00140
00146 enum TMatrixCount { MaxModelMatrix= 16 };
00147
00148
00153 enum TVBHardType { VBHardAGP=0, VBHardVRAM, CountVBHard };
00154
00155
00156 protected:
00157
00158 CSynchronized<TTexDrvInfoPtrMap> _SyncTexDrvInfos;
00159
00160 TTexDrvSharePtrList _TexDrvShares;
00161 TShaderPtrList _Shaders;
00162 TVBDrvInfoPtrList _VBDrvInfos;
00163 TPolygonMode _PolygonMode;
00164 TVtxPrgDrvInfoPtrList _VtxPrgDrvInfos;
00165
00166 public:
00167 IDriver(void);
00168 virtual ~IDriver(void);
00169
00170 virtual bool init(void)=0;
00171
00172 virtual ModeList enumModes()=0;
00173
00175
00178
00179 virtual void disableHardwareVertexProgram()=0;
00180 virtual void disableHardwareVertexArrayAGP()=0;
00181 virtual void disableHardwareTextureShader()=0;
00182
00183
00184
00185
00186 virtual bool setDisplay(void* wnd, const GfxMode& mode) throw(EBadDisplay)=0;
00187
00188
00189
00190 virtual void *getDisplay() =0;
00191
00197 virtual bool setMonitorColorProperties (const CMonitorColorProperties &properties) = 0;
00198
00199
00200
00201 virtual emptyProc getWindowProc() =0;
00202
00204 virtual bool activate(void)=0;
00205
00207 virtual sint getNbTextureStages() const =0;
00208
00210 virtual bool isTextureExist(const ITexture&tex)=0;
00211
00212 virtual NLMISC::IEventEmitter* getEventEmitter(void)=0;
00213
00214 virtual bool clear2D(CRGBA rgba)=0;
00215
00216 virtual bool clearZBuffer(float zval=1)=0;
00217
00219 virtual void setColorMask (bool bRed, bool bGreen, bool bBlue, bool bAlpha)=0;
00220
00223 virtual bool setupTexture(ITexture& tex)=0;
00224
00236 virtual bool setupTextureEx (ITexture& tex, bool bUpload, bool& bAllUploaded,
00237 bool bMustRecreateSharedTexture= false)=0;
00238
00242 virtual bool uploadTexture (ITexture& tex, NLMISC::CRect& rect, uint8 nNumMipMap)=0;
00243 virtual bool uploadTextureCube (ITexture& tex, NLMISC::CRect& rect, uint8 nNumMipMap, uint8 nNumFace)=0;
00244
00248 bool invalidateShareTexture (ITexture &);
00249
00253 static void getTextureShareName (const ITexture& tex, std::string &output);
00254
00259 virtual void forceDXTCCompression(bool dxtcComp)=0;
00260
00266 virtual void forceTextureResize(uint divisor)=0;
00267
00268
00269 virtual bool setupMaterial(CMaterial& mat)=0;
00270
00271
00272 virtual void setFrustum(float left, float right, float bottom, float top, float znear, float zfar, bool perspective=true)=0;
00273
00278 virtual void setupViewMatrix(const CMatrix& mtx)=0;
00279
00292 virtual void setupViewMatrixEx(const CMatrix& mtx, const CVector &cameraPos)=0;
00293
00298 virtual void setupModelMatrix(const CMatrix& mtx)=0;
00299
00306 virtual void multiplyModelMatrix(const CMatrix& mtx)=0;
00307
00308
00309 virtual CMatrix getViewMatrix(void)const=0;
00310
00311
00316 virtual void forceNormalize(bool normalize)=0;
00317
00318
00321 virtual bool isForceNormalize() const =0;
00322
00323
00324
00327 virtual bool supportVertexBufferHard() const =0;
00328
00329
00332 virtual bool slowUnlockVertexBufferHard() const =0;
00333
00334
00337 virtual uint getMaxVerticesByVertexBufferHard() const =0;
00338
00339
00349 virtual bool initVertexArrayRange(uint agpMem, uint vramMem=0) =0;
00350
00351
00367 virtual IVertexBufferHard *createVertexBufferHard(uint16 vertexFormat, const uint8 *typeArray, uint32 numVertices,
00368 TVBHardType vbType) =0;
00369
00370
00373 virtual void deleteVertexBufferHard(IVertexBufferHard *VB) =0;
00374
00375
00382 virtual void activeVertexBufferHard(IVertexBufferHard *VB)=0;
00383
00384
00385
00393 virtual bool activeVertexBuffer(CVertexBuffer& VB)=0;
00394
00395
00409 virtual bool activeVertexBuffer(CVertexBuffer& VB, uint first, uint end)=0;
00410
00411
00423 virtual void mapTextureStageToUV(uint stage, uint uv)=0;
00424
00425
00428 virtual bool render(CPrimitiveBlock& PB, CMaterial& Mat)=0;
00429
00433 virtual void renderTriangles(CMaterial& Mat, uint32 *tri, uint32 ntris)=0;
00434
00435
00443 virtual void renderSimpleTriangles(uint32 *tri, uint32 ntris)=0;
00444
00445
00448 virtual void renderPoints(CMaterial& Mat, uint32 numPoints)=0;
00449
00453 virtual void renderQuads(CMaterial& Mat, uint32 startIndex, uint32 numQuads)=0;
00454
00455
00456
00458 virtual bool swapBuffers(void)=0;
00459
00460
00462
00463
00464
00470 virtual void profileRenderedPrimitives(CPrimitiveProfile &pIn, CPrimitiveProfile &pOut) =0;
00471
00472
00476 virtual uint32 profileAllocatedTextureMemory() =0;
00477
00478
00481 virtual uint32 profileSetupedMaterials() const =0;
00482
00483
00486 virtual uint32 profileSetupedModelMatrix() const =0;
00487
00488
00491 virtual void enableUsedTextureMemorySum (bool enable=true) =0;
00492
00493
00497 virtual uint32 getUsedTextureMemory() const =0;
00498
00499
00500
00501
00503
00504 virtual bool fogEnabled()=0;
00505 virtual void enableFog(bool enable)=0;
00507 virtual void setupFog(float start, float end, CRGBA color)=0;
00508
00509
00511 virtual bool release(void);
00512
00514 virtual bool isActive()=0;
00515
00517 virtual uint8 getBitPerPixel ()=0;
00518
00528 virtual TMessageBoxId systemMessageBox (const char* message, const char* title, TMessageBoxType type=okType, TMessageBoxIcon icon=noIcon);
00529
00534 virtual void setupViewport (const class CViewport& viewport)=0;
00535
00536
00540 virtual void setupScissor (const class CScissor& scissor)=0;
00541
00542
00548 virtual uint32 getImplementationVersion () const = 0;
00549
00554 virtual const char* getDriverInformation () = 0;
00555
00560 virtual const char* getVideocardInformation () = 0;
00561
00563
00565
00566
00568 virtual void setMousePos (float x, float y) = 0;
00569
00578 virtual NLMISC::IMouseDevice *enableLowLevelMouse(bool enable) = 0;
00579
00587 virtual NLMISC::IKeyboardDevice *enableLowLevelKeyboard(bool enable) = 0;
00588
00592 virtual void setCapture (bool b) = 0;
00593
00597 virtual NLMISC::IInputDeviceManager *getLowLevelInputDeviceManager() = 0;
00598
00599
00600
00602 virtual void getWindowSize (uint32 &width, uint32 &height) = 0;
00603
00604
00609 virtual void getBuffer (CBitmap &bitmap) = 0;
00610
00615 virtual void getZBuffer (std::vector<float> &zbuffer) = 0;
00616
00623 virtual void getBufferPart (CBitmap &bitmap, NLMISC::CRect &rect) = 0;
00624
00631 virtual void getZBufferPart (std::vector<float> &zbuffer, NLMISC::CRect &rect) = 0;
00632
00633
00650 virtual void copyFrameBufferToTexture(ITexture *tex,
00651 uint32 level,
00652 uint32 offsetx,
00653 uint32 offsety,
00654 uint32 x,
00655 uint32 y,
00656 uint32 width,
00657 uint32 height
00658 ) = 0 ;
00659
00665 virtual bool fillBuffer (CBitmap &bitmap) = 0;
00666
00667
00674 virtual void setPolygonMode (TPolygonMode mode)
00675 {
00676 _PolygonMode=mode;
00677 }
00678
00679
00685 virtual uint getMaxLight () const = 0;
00686
00696 virtual void setLight (uint8 num, const CLight& light) = 0;
00697
00707 virtual void enableLight (uint8 num, bool enable=true) = 0;
00708
00715 virtual void setAmbientColor (CRGBA color) = 0;
00716
00721 virtual void setPerPixelLightingLight(CRGBA diffuse, CRGBA specular, float shininess) = 0;
00722
00728 TPolygonMode getPolygonMode ()
00729 {
00730 return _PolygonMode;
00731 }
00732
00734
00735
00736 enum TMatrix
00737 {
00738 ModelView= 0,
00739 Projection,
00740 ModelViewProjection,
00741 NumMatrix
00742 };
00743
00744 enum TTransform
00745 {
00746 Identity=0,
00747 Inverse,
00748 Transpose,
00749 InverseTranspose,
00750 NumTransform
00751 };
00752
00756 virtual bool isVertexProgramSupported () const =0;
00757
00761 virtual bool isVertexProgramEmulated () const =0;
00762
00763
00764
00772 virtual bool activeVertexProgram (CVertexProgram *program) =0;
00773
00777 virtual void setConstant (uint index, float, float, float, float) =0;
00778 virtual void setConstant (uint index, double, double, double, double) =0;
00779 virtual void setConstant (uint index, const NLMISC::CVector& value) =0;
00780 virtual void setConstant (uint index, const NLMISC::CVectorD& value) =0;
00782 virtual void setConstant (uint index, uint num, const float *src) =0;
00784 virtual void setConstant (uint index, uint num, const double *src) =0;
00785
00786
00798 virtual void setConstantMatrix (uint index, TMatrix matrix, TTransform transform) =0;
00799
00801 virtual bool supportVertexProgramDoubleSidedColor() const = 0;
00802
00803
00810 virtual void enableVertexProgramDoubleSidedColor(bool doubleSided) =0;
00811
00812
00813
00815
00817
00819
00825 virtual void setMatrix2DForTextureOffsetAddrMode(const uint stage, const float mat[4]) = 0;
00827
00828
00836
00837
00838 virtual bool supportEMBM() const = 0;
00839
00840 virtual bool isEMBMSupportedAtStage(uint stage) const = 0;
00841
00842 virtual void setEMBMMatrix(const uint stage, const float mat[4]) = 0;
00843
00844
00845
00846 virtual bool supportPerPixelLighting(bool specular) const = 0;
00847
00848
00850
00851
00855 virtual bool supportBlendConstantColor() const =0;
00856
00859 virtual void setBlendConstantColor(NLMISC::CRGBA col)=0;
00860
00863 virtual NLMISC::CRGBA getBlendConstantColor() const =0;
00864
00865
00866
00867
00873 virtual void swapTextureHandle(ITexture &tex0, ITexture &tex1) =0;
00874
00875
00876 protected:
00877 friend class IVBDrvInfos;
00878 friend class CTextureDrvShare;
00879 friend class ITextureDrvInfos;
00880 friend class IShader;
00881 friend class IVertexProgramDrvInfos;
00882
00884 void removeVBDrvInfoPtr(ItVBDrvInfoPtrList vbDrvInfoIt);
00885 void removeTextureDrvInfoPtr(ItTexDrvInfoPtrMap texDrvInfoIt);
00886 void removeTextureDrvSharePtr(ItTexDrvSharePtrList texDrvShareIt);
00887 void removeShaderPtr(ItShaderPtrList shaderIt);
00888 void removeVtxPrgDrvInfoPtr(ItVtxPrgDrvInfoPtrList vtxPrgDrvInfoIt);
00889 };
00890
00891
00892
00893 }
00894
00895 #endif // NL_DRV_H
00896