Crystal Space: ivideo/graph3d.h Source File (Crystal Space Public API Reference)

| ## Public API Reference

- Main Page
- Modules
- Namespaces
- Classes
- Files
- Related Pages

- File List
- File Members

# 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
    00059 struct csCoreRenderMesh;
    00060 struct csRenderMeshModes;
    00061 class csRenderBufferHolder;
    00062
    00063
    00066
    00067 #define CSDRAW_2DGRAPHICS   0x00000001
    00069 #define CSDRAW_3DGRAPHICS   0x00000002
    00071 #define CSDRAW_CLEARZBUFFER 0x00000010
    00073 #define CSDRAW_CLEARSCREEN  0x00000020
    00074
    00081 #define CS_CLIPPER_NONE -1
    00082
    00085 #define CS_CLIPPER_OPTIONAL 0
    00086
    00089 #define CS_CLIPPER_TOPLEVEL 1
    00090
    00093 #define CS_CLIPPER_REQUIRED 2
    00094
    00102 #define CS_CLIP_NOT 0
    00103
    00108 #define CS_CLIP_NEEDED 1
    00109
    00111
    00112 enum csZBufMode
    00113 {
    00115   CS_ZBUF_NONE     = 0x00000000,
    00117   CS_ZBUF_FILL     = 0x00000001,
    00119   CS_ZBUF_TEST     = 0x00000002,
    00121   CS_ZBUF_USE      = 0x00000003,
    00123   CS_ZBUF_EQUAL    = 0x00000004,
    00125   CS_ZBUF_INVERT   = 0x00000005,
    00126
    00128   CS_ZBUF_MESH     = 0x80000000,
    00137   CS_ZBUF_MESH2    = 0x80000001
    00138 };
    00139
    00140 // @@@ Keep in sync with values below
    00141 // \todo Document me!
    00142 #define CS_VATTRIB_SPECIFIC_FIRST    0
    00143 #define CS_VATTRIB_SPECIFIC_LAST    15
    00144 #define CS_VATTRIB_GENERIC_FIRST   100
    00145 #define CS_VATTRIB_GENERIC_LAST    (CS_VATTRIB_GENERIC_FIRST + 15)
    00146
    00147 #define CS_VATTRIB_IS_GENERIC(va)   \
    00148   ((va >= CS_VATTRIB_GENERIC_FIRST) && (va <=CS_VATTRIB_GENERIC_LAST))
    00149 #define CS_VATTRIB_IS_SPECIFIC(va)   \
    00150   ((va >= CS_VATTRIB_SPECIFIC_FIRST) && (va <=CS_VATTRIB_SPECIFIC_LAST))
    00151
    00155 enum csVertexAttrib
    00156 {
    00160   CS_VATTRIB_UNUSED           = -2,
    00162   CS_VATTRIB_INVALID          = -1,
    00164   CS_VATTRIB_POSITION         = CS_VATTRIB_SPECIFIC_FIRST + 0,
    00166   CS_VATTRIB_WEIGHT           = CS_VATTRIB_SPECIFIC_FIRST + 1,
    00168   CS_VATTRIB_NORMAL           = CS_VATTRIB_SPECIFIC_FIRST + 2,
    00170   CS_VATTRIB_COLOR            = CS_VATTRIB_SPECIFIC_FIRST + 3,
    00172   CS_VATTRIB_PRIMARY_COLOR    = CS_VATTRIB_SPECIFIC_FIRST + 3,
    00174   CS_VATTRIB_SECONDARY_COLOR  = CS_VATTRIB_SPECIFIC_FIRST + 4,
    00176   CS_VATTRIB_FOGCOORD         = CS_VATTRIB_SPECIFIC_FIRST + 5,
    00178   CS_VATTRIB_TEXCOORD         = CS_VATTRIB_SPECIFIC_FIRST + 8,
    00180   CS_VATTRIB_TEXCOORD0        = CS_VATTRIB_SPECIFIC_FIRST + 8,
    00182   CS_VATTRIB_TEXCOORD1        = CS_VATTRIB_SPECIFIC_FIRST + 9,
    00184   CS_VATTRIB_TEXCOORD2        = CS_VATTRIB_SPECIFIC_FIRST + 10,
    00186   CS_VATTRIB_TEXCOORD3        = CS_VATTRIB_SPECIFIC_FIRST + 11,
    00188   CS_VATTRIB_TEXCOORD4        = CS_VATTRIB_SPECIFIC_FIRST + 12,
    00190   CS_VATTRIB_TEXCOORD5        = CS_VATTRIB_SPECIFIC_FIRST + 13,
    00192   CS_VATTRIB_TEXCOORD6        = CS_VATTRIB_SPECIFIC_FIRST + 14,
    00194   CS_VATTRIB_TEXCOORD7        = CS_VATTRIB_SPECIFIC_FIRST + 15,
    00196
    00199   CS_VATTRIB_0  = CS_VATTRIB_GENERIC_FIRST + 0,
    00200   CS_VATTRIB_1  = CS_VATTRIB_GENERIC_FIRST + 1,
    00201   CS_VATTRIB_2  = CS_VATTRIB_GENERIC_FIRST + 2,
    00202   CS_VATTRIB_3  = CS_VATTRIB_GENERIC_FIRST + 3,
    00203   CS_VATTRIB_4  = CS_VATTRIB_GENERIC_FIRST + 4,
    00204   CS_VATTRIB_5  = CS_VATTRIB_GENERIC_FIRST + 5,
    00205   CS_VATTRIB_6  = CS_VATTRIB_GENERIC_FIRST + 6,
    00206   CS_VATTRIB_7  = CS_VATTRIB_GENERIC_FIRST + 7,
    00207   CS_VATTRIB_8  = CS_VATTRIB_GENERIC_FIRST + 8,
    00208   CS_VATTRIB_9  = CS_VATTRIB_GENERIC_FIRST + 9,
    00209   CS_VATTRIB_10 = CS_VATTRIB_GENERIC_FIRST + 10,
    00210   CS_VATTRIB_11 = CS_VATTRIB_GENERIC_FIRST + 11,
    00211   CS_VATTRIB_12 = CS_VATTRIB_GENERIC_FIRST + 12,
    00212   CS_VATTRIB_13 = CS_VATTRIB_GENERIC_FIRST + 13,
    00213   CS_VATTRIB_14 = CS_VATTRIB_GENERIC_FIRST + 14,
    00214   CS_VATTRIB_15 = CS_VATTRIB_GENERIC_FIRST + 15
    00216 };
    00217
    00227 #define CS_MIXMODE_TYPE_AUTO (0x00000000)
    00228
    00236 #define CS_MIXMODE_TYPE_BLENDOP (0x40000000)
    00237
    00241 #define CS_MIXMODE_TYPE_MESH (0x80000000)
    00242
    00244 #define CS_MIXMODE_TYPE_MASK (0xc0000000)
    00245
    00247
    00248 enum
    00249 {
    00251   CS_MIXMODE_FACT_ZERO          = 0x0,
    00253   CS_MIXMODE_FACT_ONE           = 0x1,
    00255   CS_MIXMODE_FACT_SRCCOLOR      = 0x2,
    00257   CS_MIXMODE_FACT_SRCCOLOR_INV  = 0x3,
    00259   CS_MIXMODE_FACT_DSTCOLOR      = 0x4,
    00261   CS_MIXMODE_FACT_DSTCOLOR_INV  = 0x5,
    00263   CS_MIXMODE_FACT_SRCALPHA      = 0x6,
    00265   CS_MIXMODE_FACT_SRCALPHA_INV  = 0x7,
    00267   CS_MIXMODE_FACT_DSTALPHA      = 0x8,
    00269   CS_MIXMODE_FACT_DSTALPHA_INV  = 0x9,
    00270
    00272   CS_MIXMODE_FACT_COUNT         = 0xa,
    00273
    00275   CS_MIXMODE_FACT_MASK          = 0xf
    00276 };
    00277
    00288 #define CS_MIXMODE_ALPHATEST_AUTO (0x00000000)
    00290 #define CS_MIXMODE_ALPHATEST_ENABLE (0x10000000)
    00292 #define CS_MIXMODE_ALPHATEST_DISABLE (0x20000000)
    00293
    00295 #define CS_MIXMODE_ALPHATEST_MASK (0x30000000)
    00296
    00310 #define CS_MIXMODE_BLEND(Src, Dst)                                      \
    00311   (CS_MIXMODE_TYPE_BLENDOP                                              \
    00312   | (CS_MIXMODE_FACT_ ## Src << 20) | (CS_MIXMODE_FACT_ ## Dst << 16))
    00314 #define CS_MIXMODE_BLENDOP_SRC(mode)    ((mode >> 20) & CS_MIXMODE_FACT_MASK)
    00316 #define CS_MIXMODE_BLENDOP_DST(mode)    ((mode >> 16) & CS_MIXMODE_FACT_MASK)
    00317
    00332 #define CS_FX_COPY (CS_MIXMODE_TYPE_AUTO | CS_MIXMODE_ALPHATEST_AUTO)
    00334 #define CS_FX_MULTIPLY \
    00335     (CS_MIXMODE_BLEND(DSTCOLOR, ZERO) | CS_MIXMODE_ALPHATEST_DISABLE)
    00337 #define CS_FX_MULTIPLY2 \
    00338     (CS_MIXMODE_BLEND(DSTCOLOR, SRCCOLOR) | CS_MIXMODE_ALPHATEST_DISABLE)
    00340 #define CS_FX_ADD \
    00341     (CS_MIXMODE_BLEND(ONE, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
    00342
    00347 #define CS_FX_ALPHA \
    00348     (CS_MIXMODE_BLEND(SRCALPHA, SRCALPHA_INV) | CS_MIXMODE_ALPHATEST_DISABLE)
    00349
    00354 #define CS_FX_TRANSPARENT \
    00355     (CS_MIXMODE_BLEND(ZERO, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
    00356
    00360 #define CS_FX_DESTALPHAADD \
    00361     (CS_MIXMODE_BLEND(DSTALPHA, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
    00362
    00366 #define CS_FX_SRCALPHAADD \
    00367     (CS_MIXMODE_BLEND(SRCALPHA, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
    00368
    00377 #define CS_FX_PREMULTALPHA \
    00378     (CS_MIXMODE_BLEND(ONE, SRCALPHA_INV) | CS_MIXMODE_ALPHATEST_DISABLE)
    00379
    00383 #define CS_FX_MESH (CS_MIXMODE_TYPE_MESH)
    00384
    00386 #define CS_FX_FLAT (0x04000000)
    00387
    00396 #define CS_FX_MASK_ALPHA (0x000000FF)
    00397
    00402 #define CS_FX_MASK_MIXMODE (0xf0ff0000)
    00403
    00407
    00408 #define CS_FX_SETALPHA(alpha) \
    00409   (CS_FX_ALPHA | uint ((alpha) * CS_FX_MASK_ALPHA))
    00411 #define CS_FX_SETALPHA_INT(alpha) \
    00412   (CS_FX_ALPHA | uint ((alpha) & CS_FX_MASK_ALPHA))
    00413
    00418 struct csAlphaMode
    00419 {
    00421   enum AlphaType
    00422   {
    00424     alphaNone = 1,
    00426     alphaBinary,
    00428     alphaSmooth
    00429   };
    00431   bool autoAlphaMode;
    00432   union
    00433   {
    00435     AlphaType alphaType;
    00437     csStringID autoModeTexture;
    00438   };
    00439 };
    00444
    00445 #define CS_LIGHTPARAM_POSITION 0
    00447 #define CS_LIGHTPARAM_DIFFUSE 1
    00449 #define CS_LIGHTPARAM_SPECULAR 2
    00451 #define CS_LIGHTPARAM_ATTENUATION 3
    00452
    00456
    00457 #define CS_SHADOW_VOLUME_BEGIN 1
    00459 #define CS_SHADOW_VOLUME_PASS1 2
    00461 #define CS_SHADOW_VOLUME_PASS2 3
    00463 #define CS_SHADOW_VOLUME_FAIL1 4
    00465 #define CS_SHADOW_VOLUME_FAIL2 5
    00467 #define CS_SHADOW_VOLUME_USE 6
    00469 #define CS_SHADOW_VOLUME_FINISH 7
    00470
    00472
    00473 enum G3D_RENDERSTATEOPTION
    00474 {
    00476   G3DRENDERSTATE_ZBUFFERMODE,
    00478   G3DRENDERSTATE_DITHERENABLE,
    00480   G3DRENDERSTATE_BILINEARMAPPINGENABLE,
    00482   G3DRENDERSTATE_TRILINEARMAPPINGENABLE,
    00484   G3DRENDERSTATE_TRANSPARENCYENABLE,
    00486   G3DRENDERSTATE_MIPMAPENABLE,
    00488   G3DRENDERSTATE_TEXTUREMAPPINGENABLE,
    00490   G3DRENDERSTATE_LIGHTINGENABLE,
    00492   G3DRENDERSTATE_INTERLACINGENABLE,
    00494   G3DRENDERSTATE_MMXENABLE,
    00496   G3DRENDERSTATE_INTERPOLATIONSTEP,
    00498   G3DRENDERSTATE_MAXPOLYGONSTODRAW,
    00500   G3DRENDERSTATE_GOURAUDENABLE,
    00502   G3DRENDERSTATE_EDGES
    00503 };
    00504
    00506 struct csGraphics3DCaps
    00507 {
    00509   int minTexHeight, minTexWidth;
    00511   int maxTexHeight, maxTexWidth;
    00516   bool SupportsPointSprites;
    00520   bool DestinationAlpha;
    00524   bool StencilShadows;
    00525 };
    00526
    00528 enum csRenderMeshType
    00529 {
    00531   CS_MESHTYPE_TRIANGLES,
    00533   CS_MESHTYPE_QUADS,
    00543   CS_MESHTYPE_TRIANGLESTRIP,
    00549   CS_MESHTYPE_TRIANGLEFAN,
    00553   CS_MESHTYPE_POINTS,
    00559   CS_MESHTYPE_POINT_SPRITES,
    00563   CS_MESHTYPE_LINES,
    00568   CS_MESHTYPE_LINESTRIP
    00569 };
    00570
    00574 enum csSimpleMeshFlags
    00575 {
    00582   csSimpleMeshScreenspace = 0x01
    00583 };
    00584
    00589 enum csOpenPortalFlags
    00590 {
    00599   CS_OPENPORTAL_ZFILL = 0x00000004,
    00604   CS_OPENPORTAL_MIRROR = 0x00000010,
    00612   CS_OPENPORTAL_FLOAT = 0x00000040
    00613 };
    00614
    00618 struct csSimpleRenderMesh
    00619 {
    00621   csRenderMeshType meshtype;
    00622
    00624   uint indexCount;
    00632   const uint* indices;
    00633
    00635   uint vertexCount;
    00641   const csVector3* vertices;
    00643   const csVector2* texcoords;
    00649   const csVector4* colors;
    00654   iTextureHandle* texture;
    00655
    00657   iShader* shader;
    00659   iShaderVariableContext* dynDomain;
    00661   csAlphaMode alphaType;
    00663   csZBufMode z_buf_mode;
    00665   uint mixmode;
    00676   csReversibleTransform object2world;
    00677
    00678   csSimpleRenderMesh () : indexCount(0), indices(0), texcoords(0), colors(0),
    00679     texture (0), shader (0), dynDomain (0), z_buf_mode (CS_ZBUF_NONE),
    00680     mixmode (CS_FX_COPY)
    00681   {
    00682     alphaType.autoAlphaMode = true;
    00683     alphaType.autoModeTexture = csInvalidStringID;
    00684   };
    00685 };
    00686
    00701 struct iGraphics3D : public virtual iBase
    00702 {
    00703   SCF_INTERFACE(iGraphics3D, 2, 1, 0);
    00704
    00706   virtual bool Open () = 0;
    00708   virtual void Close () = 0;
    00709
    00717   virtual iGraphics2D *GetDriver2D () = 0;
    00718
    00725   virtual iTextureManager *GetTextureManager () = 0;
    00726
    00728   virtual void SetDimensions (int width, int height) = 0;
    00730   virtual int GetWidth () const = 0;
    00732   virtual int GetHeight () const = 0;
    00733
    00738   virtual const csGraphics3DCaps *GetCaps () const = 0;
    00739
    00746   virtual void SetPerspectiveCenter (int x, int y) = 0;
    00747
    00754   virtual void GetPerspectiveCenter (int& x, int& y) const = 0;
    00755
    00759   virtual void SetPerspectiveAspect (float aspect) = 0;
    00760
    00762   virtual float GetPerspectiveAspect () const = 0;
    00763
    00779   virtual void SetRenderTarget (iTextureHandle* handle,
    00780         bool persistent = false,
    00781         int subtexture = 0) = 0;
    00782
    00786   virtual iTextureHandle* GetRenderTarget () const = 0;
    00787
    00789   virtual bool BeginDraw (int DrawFlags) = 0;
    00790
    00792   virtual void FinishDraw () = 0;
    00793
    00799   virtual void Print (csRect const* area) = 0;
    00800
    00802   virtual void DrawMesh (const csCoreRenderMesh* mymesh,
    00803                          const csRenderMeshModes& modes,
    00804                          const iShaderVarStack* stacks) = 0;
    00821   virtual void DrawSimpleMesh (const csSimpleRenderMesh& mesh,
    00822     uint flags = 0) = 0;
    00823
    00838   virtual void DrawPixmap (iTextureHandle *hTex, int sx, int sy,
    00839     int sw, int sh, int tx, int ty, int tw, int th, uint8 Alpha = 0) = 0;
    00840
    00845   virtual void DrawLine (const csVector3& v1, const csVector3& v2,
    00846     float fov, int color) = 0;
    00847
    00851   virtual bool ActivateBuffers (csRenderBufferHolder* holder,
    00852     csRenderBufferName mapping[CS_VATTRIB_SPECIFIC_LAST+1]) = 0;
    00853
    00857   virtual bool ActivateBuffers (csVertexAttrib *attribs,
    00858     iRenderBuffer **buffers, unsigned int count) = 0;
    00859
    00864   virtual void DeactivateBuffers (csVertexAttrib *attribs, unsigned int count) = 0;
    00865
    00870   virtual void SetTextureState (int* units, iTextureHandle** textures,
    00871     int count) = 0;
    00872
    00873
    00879   virtual void SetClipper (iClipper2D* clipper, int cliptype) = 0;
    00880
    00884   virtual iClipper2D* GetClipper () = 0;
    00885
    00889   virtual int GetClipType () const = 0;
    00890
    00895   virtual void SetNearPlane (const csPlane3& pl) = 0;
    00896
    00900   virtual void ResetNearPlane () = 0;
    00901
    00905   virtual const csPlane3& GetNearPlane () const = 0;
    00906
    00910   virtual bool HasNearPlane () const = 0;
    00911
    00913   virtual bool SetRenderState (G3D_RENDERSTATEOPTION op, long val) = 0;
    00914
    00916   virtual long GetRenderState (G3D_RENDERSTATEOPTION op) const = 0;
    00917
    00922   virtual bool SetOption (const char*, const char*) = 0;
    00923
    00925   virtual void SetWriteMask (bool red, bool green, bool blue, bool alpha) = 0;
    00926
    00928   virtual void GetWriteMask (bool &red, bool &green, bool &blue,
    00929         bool &alpha) const = 0;
    00930
    00932   virtual void SetZMode (csZBufMode mode) = 0;
    00933
    00935   virtual csZBufMode GetZMode () = 0;
    00936
    00938   virtual void EnableZOffset () = 0;
    00939
    00941   virtual void DisableZOffset () = 0;
    00942
    00944   virtual void SetShadowState (int state) = 0;
    00945
    00947   virtual float GetZBuffValue (int x, int y) = 0;
    00948
    00959   virtual void OpenPortal (size_t numVertices, const csVector2* vertices,
    00960     const csPlane3& normal, csFlags flags) = 0;
    00961
    00966   virtual void ClosePortal () = 0;
    00967
    00969   virtual iHalo *CreateHalo (float iR, float iG, float iB,
    00970     unsigned char *iAlpha, int iWidth, int iHeight) = 0;
    00971
    00977   virtual void RemoveFromCache (iRendererLightmap* rlm) = 0;
    00978
    00984   virtual void SetWorldToCamera (const csReversibleTransform& w2c) = 0;
    00985
    00993   virtual bool PerformExtension (char const* command, ...) = 0;
    00994
    01000   virtual bool PerformExtensionV (char const* command, va_list) = 0;
    01001
    01006   virtual const csReversibleTransform& GetWorldToCamera () = 0;
    01007 };
    01008
    01011 #endif // __CS_IVIDEO_GRAPH3D_H__
    01012