ivideo/graph3d.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 1998-2001 by Jorrit Tyberghein 00003 2004 by Marten Svanfeldt 00004 Written by Jorrit Tyberghein, Dan Ogles, and Gary Clark. 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Library General Public 00008 License as published by the Free Software Foundation; either 00009 version 2 of the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Library General Public License for more details. 00015 00016 You should have received a copy of the GNU Library General Public 00017 License along with this library; if not, write to the Free 00018 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00019 */ 00020 00021 #ifndef __CS_IVIDEO_GRAPH3D_H__ 00022 #define __CS_IVIDEO_GRAPH3D_H__ 00023 00032 #include "csutil/scf.h" 00033 00034 #include "csgeom/transfrm.h" 00035 #include "csutil/flags.h" 00036 #include "csutil/strset.h" 00037 00038 #include "ivideo/rndbuf.h" 00039 00040 struct iClipper2D; 00041 struct iGraphics2D; 00042 struct iHalo; 00043 struct iRenderBuffer; 00044 struct iRendererLightmap; 00045 struct iShader; 00046 struct iShaderVariableContext; 00047 struct iShaderVarStack; 00048 struct iTextureHandle; 00049 struct iTextureManager; 00050 00051 class csRect; 00052 class csPlane3; 00053 class csShaderVariable; 00054 class csVector2; 00055 class csVector3; 00056 class csVector4; 00057 00058 namespace CS 00059 { 00060 namespace Graphics 00061 { 00062 struct CoreRenderMesh; 00063 struct RenderMeshModes; 00064 } // namespace Graphics 00065 } // namespace CS 00066 class csRenderBufferHolder; 00067 00068 00071 00072 #define CSDRAW_2DGRAPHICS 0x00000001 00074 #define CSDRAW_3DGRAPHICS 0x00000002 00076 #define CSDRAW_CLEARZBUFFER 0x00000010 00078 #define CSDRAW_CLEARSCREEN 0x00000020 00079 00086 #define CS_CLIPPER_NONE -1 00087 00090 #define CS_CLIPPER_OPTIONAL 0 00091 00094 #define CS_CLIPPER_TOPLEVEL 1 00095 00098 #define CS_CLIPPER_REQUIRED 2 00099 00107 #define CS_CLIP_NOT 0 00108 00113 #define CS_CLIP_NEEDED 1 00114 00116 00117 enum csZBufMode 00118 { 00120 CS_ZBUF_NONE = 0x00000000, 00122 CS_ZBUF_FILL = 0x00000001, 00124 CS_ZBUF_TEST = 0x00000002, 00126 CS_ZBUF_USE = 0x00000003, 00128 CS_ZBUF_EQUAL = 0x00000004, 00130 CS_ZBUF_INVERT = 0x00000005, 00131 00133 CS_ZBUF_MESH = 0x80000000, 00142 CS_ZBUF_MESH2 = 0x80000001 00143 }; 00144 00145 // @@@ Keep in sync with values below 00146 // \todo Document me! 00147 #define CS_VATTRIB_SPECIFIC_FIRST 0 00148 #define CS_VATTRIB_SPECIFIC_LAST 15 00149 #define CS_VATTRIB_GENERIC_FIRST 100 00150 #define CS_VATTRIB_GENERIC_LAST (CS_VATTRIB_GENERIC_FIRST + 15) 00151 00152 #define CS_VATTRIB_IS_GENERIC(va) \ 00153 ((va >= CS_VATTRIB_GENERIC_FIRST) && (va <=CS_VATTRIB_GENERIC_LAST)) 00154 #define CS_VATTRIB_IS_SPECIFIC(va) \ 00155 ((va >= CS_VATTRIB_SPECIFIC_FIRST) && (va <=CS_VATTRIB_SPECIFIC_LAST)) 00156 00160 enum csVertexAttrib 00161 { 00165 CS_VATTRIB_UNUSED = -2, 00167 CS_VATTRIB_INVALID = -1, 00169 CS_VATTRIB_POSITION = CS_VATTRIB_SPECIFIC_FIRST + 0, 00171 CS_VATTRIB_WEIGHT = CS_VATTRIB_SPECIFIC_FIRST + 1, 00173 CS_VATTRIB_NORMAL = CS_VATTRIB_SPECIFIC_FIRST + 2, 00175 CS_VATTRIB_COLOR = CS_VATTRIB_SPECIFIC_FIRST + 3, 00177 CS_VATTRIB_PRIMARY_COLOR = CS_VATTRIB_SPECIFIC_FIRST + 3, 00179 CS_VATTRIB_SECONDARY_COLOR = CS_VATTRIB_SPECIFIC_FIRST + 4, 00181 CS_VATTRIB_FOGCOORD = CS_VATTRIB_SPECIFIC_FIRST + 5, 00183 CS_VATTRIB_TEXCOORD = CS_VATTRIB_SPECIFIC_FIRST + 8, 00185 CS_VATTRIB_TEXCOORD0 = CS_VATTRIB_SPECIFIC_FIRST + 8, 00187 CS_VATTRIB_TEXCOORD1 = CS_VATTRIB_SPECIFIC_FIRST + 9, 00189 CS_VATTRIB_TEXCOORD2 = CS_VATTRIB_SPECIFIC_FIRST + 10, 00191 CS_VATTRIB_TEXCOORD3 = CS_VATTRIB_SPECIFIC_FIRST + 11, 00193 CS_VATTRIB_TEXCOORD4 = CS_VATTRIB_SPECIFIC_FIRST + 12, 00195 CS_VATTRIB_TEXCOORD5 = CS_VATTRIB_SPECIFIC_FIRST + 13, 00197 CS_VATTRIB_TEXCOORD6 = CS_VATTRIB_SPECIFIC_FIRST + 14, 00199 CS_VATTRIB_TEXCOORD7 = CS_VATTRIB_SPECIFIC_FIRST + 15, 00201 00204 CS_VATTRIB_0 = CS_VATTRIB_GENERIC_FIRST + 0, 00205 CS_VATTRIB_1 = CS_VATTRIB_GENERIC_FIRST + 1, 00206 CS_VATTRIB_2 = CS_VATTRIB_GENERIC_FIRST + 2, 00207 CS_VATTRIB_3 = CS_VATTRIB_GENERIC_FIRST + 3, 00208 CS_VATTRIB_4 = CS_VATTRIB_GENERIC_FIRST + 4, 00209 CS_VATTRIB_5 = CS_VATTRIB_GENERIC_FIRST + 5, 00210 CS_VATTRIB_6 = CS_VATTRIB_GENERIC_FIRST + 6, 00211 CS_VATTRIB_7 = CS_VATTRIB_GENERIC_FIRST + 7, 00212 CS_VATTRIB_8 = CS_VATTRIB_GENERIC_FIRST + 8, 00213 CS_VATTRIB_9 = CS_VATTRIB_GENERIC_FIRST + 9, 00214 CS_VATTRIB_10 = CS_VATTRIB_GENERIC_FIRST + 10, 00215 CS_VATTRIB_11 = CS_VATTRIB_GENERIC_FIRST + 11, 00216 CS_VATTRIB_12 = CS_VATTRIB_GENERIC_FIRST + 12, 00217 CS_VATTRIB_13 = CS_VATTRIB_GENERIC_FIRST + 13, 00218 CS_VATTRIB_14 = CS_VATTRIB_GENERIC_FIRST + 14, 00219 CS_VATTRIB_15 = CS_VATTRIB_GENERIC_FIRST + 15 00221 }; 00222 00232 #define CS_MIXMODE_TYPE_AUTO (0x00000000) 00233 00241 #define CS_MIXMODE_TYPE_BLENDOP (0x40000000) 00242 00246 #define CS_MIXMODE_FLAG_BLENDOP_ALPHA (0x08000000) 00247 00251 #define CS_MIXMODE_TYPE_MESH (0x80000000) 00252 00254 #define CS_MIXMODE_TYPE_MASK (0xc0000000) 00255 00257 00258 enum 00259 { 00261 CS_MIXMODE_FACT_ZERO = 0x0, 00263 CS_MIXMODE_FACT_ONE = 0x1, 00265 CS_MIXMODE_FACT_SRCCOLOR = 0x2, 00267 CS_MIXMODE_FACT_SRCCOLOR_INV = 0x3, 00269 CS_MIXMODE_FACT_DSTCOLOR = 0x4, 00271 CS_MIXMODE_FACT_DSTCOLOR_INV = 0x5, 00273 CS_MIXMODE_FACT_SRCALPHA = 0x6, 00275 CS_MIXMODE_FACT_SRCALPHA_INV = 0x7, 00277 CS_MIXMODE_FACT_DSTALPHA = 0x8, 00279 CS_MIXMODE_FACT_DSTALPHA_INV = 0x9, 00280 00282 CS_MIXMODE_FACT_COUNT = 0xa, 00283 00285 CS_MIXMODE_FACT_MASK = 0xf 00286 }; 00287 00298 #define CS_MIXMODE_ALPHATEST_AUTO (0x00000000) 00300 #define CS_MIXMODE_ALPHATEST_ENABLE (0x10000000) 00302 #define CS_MIXMODE_ALPHATEST_DISABLE (0x20000000) 00303 00305 #define CS_MIXMODE_ALPHATEST_MASK (0x30000000) 00306 00320 #define CS_MIXMODE_BLEND(Src, Dst) \ 00321 (CS_MIXMODE_TYPE_BLENDOP \ 00322 | (CS_MIXMODE_FACT_ ## Src << 20) | (CS_MIXMODE_FACT_ ## Dst << 16)) 00324 #define CS_MIXMODE_BLENDOP_SRC(mode) ((mode >> 20) & CS_MIXMODE_FACT_MASK) 00326 #define CS_MIXMODE_BLENDOP_DST(mode) ((mode >> 16) & CS_MIXMODE_FACT_MASK) 00327 00340 #define CS_MIXMODE_BLEND_ALPHA(Src, Dst) \ 00341 (CS_MIXMODE_FLAG_BLENDOP_ALPHA \ 00342 | (CS_MIXMODE_FACT_ ## Src << 12) | (CS_MIXMODE_FACT_ ## Dst << 8)) 00344 #define CS_MIXMODE_BLENDOP_ALPHA_SRC(mode) ((mode >> 12) & CS_MIXMODE_FACT_MASK) 00346 #define CS_MIXMODE_BLENDOP_ALPHA_DST(mode) ((mode >> 8) & CS_MIXMODE_FACT_MASK) 00347 00362 #define CS_FX_COPY (CS_MIXMODE_TYPE_AUTO | CS_MIXMODE_ALPHATEST_AUTO) 00364 #define CS_FX_MULTIPLY \ 00365 (CS_MIXMODE_BLEND(DSTCOLOR, ZERO) | CS_MIXMODE_ALPHATEST_DISABLE) 00367 #define CS_FX_MULTIPLY2 \ 00368 (CS_MIXMODE_BLEND(DSTCOLOR, SRCCOLOR) | CS_MIXMODE_ALPHATEST_DISABLE) 00370 #define CS_FX_ADD \ 00371 (CS_MIXMODE_BLEND(ONE, ONE) | CS_MIXMODE_ALPHATEST_DISABLE) 00372 00377 #define CS_FX_ALPHA \ 00378 (CS_MIXMODE_BLEND(SRCALPHA, SRCALPHA_INV) \ 00379 | CS_MIXMODE_BLEND_ALPHA(ONE, SRCALPHA_INV) | CS_MIXMODE_ALPHATEST_DISABLE) 00380 00385 #define CS_FX_TRANSPARENT \ 00386 (CS_MIXMODE_BLEND(ZERO, ONE) | CS_MIXMODE_ALPHATEST_DISABLE) 00387 00391 #define CS_FX_DESTALPHAADD \ 00392 (CS_MIXMODE_BLEND(DSTALPHA, ONE) | CS_MIXMODE_ALPHATEST_DISABLE) 00393 00397 #define CS_FX_SRCALPHAADD \ 00398 (CS_MIXMODE_BLEND(SRCALPHA, ONE) | CS_MIXMODE_ALPHATEST_DISABLE) 00399 00408 #define CS_FX_PREMULTALPHA \ 00409 (CS_MIXMODE_BLEND(ONE, SRCALPHA_INV) | \ 00410 CS_MIXMODE_BLEND_ALPHA(ONE, SRCALPHA_INV) | CS_MIXMODE_ALPHATEST_DISABLE) 00411 00415 #define CS_FX_MESH (CS_MIXMODE_TYPE_MESH) 00416 00418 #define CS_FX_FLAT (0x04000000) 00419 00428 #define CS_FX_MASK_ALPHA (0x000000FF) 00429 00434 #define CS_FX_MASK_MIXMODE (0xf8ffff00) 00435 00439 00440 #define CS_FX_SETALPHA(alpha) \ 00441 (CS_FX_ALPHA | uint ((alpha) * CS_FX_MASK_ALPHA)) 00443 #define CS_FX_SETALPHA_INT(alpha) \ 00444 (CS_FX_ALPHA | uint ((alpha) & CS_FX_MASK_ALPHA)) 00445 00450 struct csAlphaMode 00451 { 00453 enum AlphaType 00454 { 00456 alphaNone = 1, 00458 alphaBinary, 00460 alphaSmooth 00461 }; 00463 bool autoAlphaMode; 00464 union 00465 { 00467 AlphaType alphaType; 00469 csStringID autoModeTexture; 00470 }; 00471 }; 00476 00477 #define CS_LIGHTPARAM_POSITION 0 00479 #define CS_LIGHTPARAM_DIFFUSE 1 00481 #define CS_LIGHTPARAM_SPECULAR 2 00483 #define CS_LIGHTPARAM_ATTENUATION 3 00484 00488 00489 #define CS_SHADOW_VOLUME_BEGIN 1 00491 #define CS_SHADOW_VOLUME_PASS1 2 00493 #define CS_SHADOW_VOLUME_PASS2 3 00495 #define CS_SHADOW_VOLUME_FAIL1 4 00497 #define CS_SHADOW_VOLUME_FAIL2 5 00499 #define CS_SHADOW_VOLUME_USE 6 00501 #define CS_SHADOW_VOLUME_FINISH 7 00502 00504 00505 enum G3D_RENDERSTATEOPTION 00506 { 00508 G3DRENDERSTATE_ZBUFFERMODE, 00510 G3DRENDERSTATE_DITHERENABLE, 00512 G3DRENDERSTATE_BILINEARMAPPINGENABLE, 00514 G3DRENDERSTATE_TRILINEARMAPPINGENABLE, 00516 G3DRENDERSTATE_TRANSPARENCYENABLE, 00518 G3DRENDERSTATE_MIPMAPENABLE, 00520 G3DRENDERSTATE_TEXTUREMAPPINGENABLE, 00522 G3DRENDERSTATE_LIGHTINGENABLE, 00524 G3DRENDERSTATE_INTERLACINGENABLE, 00526 G3DRENDERSTATE_MMXENABLE, 00528 G3DRENDERSTATE_INTERPOLATIONSTEP, 00530 G3DRENDERSTATE_MAXPOLYGONSTODRAW, 00532 G3DRENDERSTATE_GOURAUDENABLE, 00534 G3DRENDERSTATE_EDGES 00535 }; 00536 00538 struct csGraphics3DCaps 00539 { 00541 int minTexHeight, minTexWidth; 00543 int maxTexHeight, maxTexWidth; 00548 bool SupportsPointSprites; 00552 bool DestinationAlpha; 00556 bool StencilShadows; 00557 }; 00558 00560 enum csRenderMeshType 00561 { 00563 CS_MESHTYPE_TRIANGLES, 00565 CS_MESHTYPE_QUADS, 00575 CS_MESHTYPE_TRIANGLESTRIP, 00581 CS_MESHTYPE_TRIANGLEFAN, 00585 CS_MESHTYPE_POINTS, 00591 CS_MESHTYPE_POINT_SPRITES, 00595 CS_MESHTYPE_LINES, 00600 CS_MESHTYPE_LINESTRIP 00601 }; 00602 00606 enum csSimpleMeshFlags 00607 { 00614 csSimpleMeshScreenspace = 0x01 00615 }; 00616 00621 enum csOpenPortalFlags 00622 { 00631 CS_OPENPORTAL_ZFILL = 0x00000004, 00636 CS_OPENPORTAL_MIRROR = 0x00000010, 00644 CS_OPENPORTAL_FLOAT = 0x00000040 00645 }; 00646 00650 struct csSimpleRenderMesh 00651 { 00653 csRenderMeshType meshtype; 00654 00656 uint indexCount; 00664 const uint* indices; 00665 00667 uint vertexCount; 00673 const csVector3* vertices; 00675 const csVector2* texcoords; 00681 const csVector4* colors; 00686 iTextureHandle* texture; 00687 00689 iShader* shader; 00691 iShaderVariableContext* dynDomain; 00693 csAlphaMode alphaType; 00695 csZBufMode z_buf_mode; 00697 uint mixmode; 00708 csReversibleTransform object2world; 00709 00710 csSimpleRenderMesh () : indexCount(0), indices(0), texcoords(0), colors(0), 00711 texture (0), shader (0), dynDomain (0), z_buf_mode (CS_ZBUF_NONE), 00712 mixmode (CS_FX_COPY) 00713 { 00714 alphaType.autoAlphaMode = true; 00715 alphaType.autoModeTexture = csInvalidStringID; 00716 }; 00717 }; 00718 00723 enum csRenderTargetAttachment 00724 { 00726 rtaDepth, 00728 rtaColor0, 00729 00731 rtaNumAttachments 00732 }; 00733 00748 struct iGraphics3D : public virtual iBase 00749 { 00750 SCF_INTERFACE(iGraphics3D, 3, 0, 0); 00751 00753 virtual bool Open () = 0; 00755 virtual void Close () = 0; 00756 00764 virtual iGraphics2D *GetDriver2D () = 0; 00765 00772 virtual iTextureManager *GetTextureManager () = 0; 00773 00778 CS_DEPRECATED_METHOD 00779 virtual void SetDimensions (int width, int height) = 0; 00781 virtual int GetWidth () const = 0; 00783 virtual int GetHeight () const = 0; 00784 00789 virtual const csGraphics3DCaps *GetCaps () const = 0; 00790 00797 virtual void SetPerspectiveCenter (int x, int y) = 0; 00798 00805 virtual void GetPerspectiveCenter (int& x, int& y) const = 0; 00806 00810 virtual void SetPerspectiveAspect (float aspect) = 0; 00811 00813 virtual float GetPerspectiveAspect () const = 0; 00814 00842 virtual bool SetRenderTarget (iTextureHandle* handle, 00843 bool persistent = false, 00844 int subtexture = 0, 00845 csRenderTargetAttachment attachment = rtaColor0) = 0; 00846 00855 virtual bool ValidateRenderTargets () = 0; 00856 00863 virtual bool CanSetRenderTarget (const char* format, 00864 csRenderTargetAttachment attachment = rtaColor0) = 0; 00865 00871 virtual iTextureHandle* GetRenderTarget ( 00872 csRenderTargetAttachment attachment = rtaColor0, 00873 int* subtexture = 0) const = 0; 00874 00876 virtual void UnsetRenderTargets() = 0; 00877 00879 virtual bool BeginDraw (int DrawFlags) = 0; 00880 00882 virtual void FinishDraw () = 0; 00883 00889 virtual void Print (csRect const* area) = 0; 00890 00892 virtual void DrawMesh (const CS::Graphics::CoreRenderMesh* mymesh, 00893 const CS::Graphics::RenderMeshModes& modes, 00894 const iShaderVarStack* stacks) = 0; 00911 virtual void DrawSimpleMesh (const csSimpleRenderMesh& mesh, 00912 uint flags = 0) = 0; 00913 00928 virtual void DrawPixmap (iTextureHandle *hTex, int sx, int sy, 00929 int sw, int sh, int tx, int ty, int tw, int th, uint8 Alpha = 0) = 0; 00930 00935 virtual void DrawLine (const csVector3& v1, const csVector3& v2, 00936 float fov, int color) = 0; 00937 00941 virtual bool ActivateBuffers (csRenderBufferHolder* holder, 00942 csRenderBufferName mapping[CS_VATTRIB_SPECIFIC_LAST+1]) = 0; 00943 00947 virtual bool ActivateBuffers (csVertexAttrib *attribs, 00948 iRenderBuffer **buffers, unsigned int count) = 0; 00949 00954 virtual void DeactivateBuffers (csVertexAttrib *attribs, unsigned int count) = 0; 00955 00960 virtual void SetTextureState (int* units, iTextureHandle** textures, 00961 int count) = 0; 00962 00963 00969 virtual void SetClipper (iClipper2D* clipper, int cliptype) = 0; 00970 00974 virtual iClipper2D* GetClipper () = 0; 00975 00979 virtual int GetClipType () const = 0; 00980 00985 virtual void SetNearPlane (const csPlane3& pl) = 0; 00986 00990 virtual void ResetNearPlane () = 0; 00991 00995 virtual const csPlane3& GetNearPlane () const = 0; 00996 01000 virtual bool HasNearPlane () const = 0; 01001 01003 virtual bool SetRenderState (G3D_RENDERSTATEOPTION op, long val) = 0; 01004 01006 virtual long GetRenderState (G3D_RENDERSTATEOPTION op) const = 0; 01007 01012 virtual bool SetOption (const char*, const char*) = 0; 01013 01015 virtual void SetWriteMask (bool red, bool green, bool blue, bool alpha) = 0; 01016 01018 virtual void GetWriteMask (bool &red, bool &green, bool &blue, 01019 bool &alpha) const = 0; 01020 01022 virtual void SetZMode (csZBufMode mode) = 0; 01023 01025 virtual csZBufMode GetZMode () = 0; 01026 01028 virtual void EnableZOffset () = 0; 01029 01031 virtual void DisableZOffset () = 0; 01032 01034 virtual void SetShadowState (int state) = 0; 01035 01037 virtual float GetZBuffValue (int x, int y) = 0; 01038 01049 virtual void OpenPortal (size_t numVertices, const csVector2* vertices, 01050 const csPlane3& normal, csFlags flags) = 0; 01051 01056 virtual void ClosePortal () = 0; 01057 01059 virtual iHalo *CreateHalo (float iR, float iG, float iB, 01060 unsigned char *iAlpha, int iWidth, int iHeight) = 0; 01061 01067 virtual void RemoveFromCache (iRendererLightmap* rlm) = 0; 01068 01074 virtual void SetWorldToCamera (const csReversibleTransform& w2c) = 0; 01075 01083 virtual bool PerformExtension (char const* command, ...) = 0; 01084 01090 virtual bool PerformExtensionV (char const* command, va_list) = 0; 01091 01096 virtual const csReversibleTransform& GetWorldToCamera () = 0; 01100 virtual int GetCurrentDrawFlags() const = 0; 01101 }; 01102 01105 #endif // __CS_IVIDEO_GRAPH3D_H__ 01106
Generated for Crystal Space 1.4.0 by doxygen 1.5.8