CrystalSpace

Public API Reference

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 iTextureHandle;
00048 struct iTextureManager;
00049 
00050 class csRect;
00051 class csPlane3;
00052 class csShaderVariable;
00053 class csVector2;
00054 class csVector3;
00055 class csVector4;
00056 
00057 
00058 struct csCoreRenderMesh;
00059 struct csRenderMeshModes;
00060 class csRenderBufferHolder;
00061 
00062 
00065 
00066 #define CSDRAW_2DGRAPHICS   0x00000001
00067 
00068 #define CSDRAW_3DGRAPHICS   0x00000002
00069 
00070 #define CSDRAW_CLEARZBUFFER 0x00000010
00071 
00072 #define CSDRAW_CLEARSCREEN  0x00000020
00073 
00080 #define CS_CLIPPER_NONE -1
00081 
00084 #define CS_CLIPPER_OPTIONAL 0
00085 
00088 #define CS_CLIPPER_TOPLEVEL 1
00089 
00092 #define CS_CLIPPER_REQUIRED 2
00093 
00101 #define CS_CLIP_NOT 0
00102 
00107 #define CS_CLIP_NEEDED 1
00108 
00110 
00111 enum csZBufMode
00112 {
00114   CS_ZBUF_NONE     = 0x00000000,
00116   CS_ZBUF_FILL     = 0x00000001,
00118   CS_ZBUF_TEST     = 0x00000002,
00120   CS_ZBUF_USE      = 0x00000003,
00122   CS_ZBUF_EQUAL    = 0x00000004,
00124   CS_ZBUF_INVERT   = 0x00000005,
00125   
00127   CS_ZBUF_MESH     = 0x80000000,
00136   CS_ZBUF_MESH2    = 0x80000001
00137 };
00138 
00139 // @@@ Keep in sync with values below
00140 // @@@ Document me better!
00141 #define CS_VATTRIB_SPECIFIC_FIRST    0
00142 #define CS_VATTRIB_SPECIFIC_LAST    15
00143 #define CS_VATTRIB_GENERIC_FIRST   100
00144 #define CS_VATTRIB_GENERIC_LAST    (CS_VATTRIB_GENERIC_FIRST + 15)
00145 
00146 #define CS_VATTRIB_IS_GENERIC(va)   \
00147   ((va >= CS_VATTRIB_GENERIC_FIRST) && (va <=CS_VATTRIB_GENERIC_LAST))
00148 #define CS_VATTRIB_IS_SPECIFIC(va)   \
00149   ((va >= CS_VATTRIB_SPECIFIC_FIRST) && (va <=CS_VATTRIB_SPECIFIC_LAST))
00150 
00154 enum csVertexAttrib
00155 {
00157   CS_VATTRIB_INVALID          = -1,
00159   CS_VATTRIB_POSITION         = CS_VATTRIB_SPECIFIC_FIRST + 0,
00161   CS_VATTRIB_WEIGHT           = CS_VATTRIB_SPECIFIC_FIRST + 1,
00163   CS_VATTRIB_NORMAL           = CS_VATTRIB_SPECIFIC_FIRST + 2,
00165   CS_VATTRIB_COLOR            = CS_VATTRIB_SPECIFIC_FIRST + 3,
00167   CS_VATTRIB_PRIMARY_COLOR    = CS_VATTRIB_SPECIFIC_FIRST + 3,
00169   CS_VATTRIB_SECONDARY_COLOR  = CS_VATTRIB_SPECIFIC_FIRST + 4,
00171   CS_VATTRIB_FOGCOORD         = CS_VATTRIB_SPECIFIC_FIRST + 5,
00173   CS_VATTRIB_TEXCOORD         = CS_VATTRIB_SPECIFIC_FIRST + 8,
00175   CS_VATTRIB_TEXCOORD0        = CS_VATTRIB_SPECIFIC_FIRST + 8,
00177   CS_VATTRIB_TEXCOORD1        = CS_VATTRIB_SPECIFIC_FIRST + 9,
00179   CS_VATTRIB_TEXCOORD2        = CS_VATTRIB_SPECIFIC_FIRST + 10,
00181   CS_VATTRIB_TEXCOORD3        = CS_VATTRIB_SPECIFIC_FIRST + 11,
00183   CS_VATTRIB_TEXCOORD4        = CS_VATTRIB_SPECIFIC_FIRST + 12,
00185   CS_VATTRIB_TEXCOORD5        = CS_VATTRIB_SPECIFIC_FIRST + 13,
00187   CS_VATTRIB_TEXCOORD6        = CS_VATTRIB_SPECIFIC_FIRST + 14,
00189   CS_VATTRIB_TEXCOORD7        = CS_VATTRIB_SPECIFIC_FIRST + 15,
00191 
00194   CS_VATTRIB_0  = CS_VATTRIB_GENERIC_FIRST + 0,
00195   CS_VATTRIB_1  = CS_VATTRIB_GENERIC_FIRST + 1,
00196   CS_VATTRIB_2  = CS_VATTRIB_GENERIC_FIRST + 2,
00197   CS_VATTRIB_3  = CS_VATTRIB_GENERIC_FIRST + 3,
00198   CS_VATTRIB_4  = CS_VATTRIB_GENERIC_FIRST + 4,
00199   CS_VATTRIB_5  = CS_VATTRIB_GENERIC_FIRST + 5,
00200   CS_VATTRIB_6  = CS_VATTRIB_GENERIC_FIRST + 6,
00201   CS_VATTRIB_7  = CS_VATTRIB_GENERIC_FIRST + 7,
00202   CS_VATTRIB_8  = CS_VATTRIB_GENERIC_FIRST + 8,
00203   CS_VATTRIB_9  = CS_VATTRIB_GENERIC_FIRST + 9,
00204   CS_VATTRIB_10 = CS_VATTRIB_GENERIC_FIRST + 10,
00205   CS_VATTRIB_11 = CS_VATTRIB_GENERIC_FIRST + 11,
00206   CS_VATTRIB_12 = CS_VATTRIB_GENERIC_FIRST + 12,
00207   CS_VATTRIB_13 = CS_VATTRIB_GENERIC_FIRST + 13,
00208   CS_VATTRIB_14 = CS_VATTRIB_GENERIC_FIRST + 14,
00209   CS_VATTRIB_15 = CS_VATTRIB_GENERIC_FIRST + 15
00211 };
00212 
00222 #define CS_MIXMODE_TYPE_AUTO (0x00000000)
00223 
00231 #define CS_MIXMODE_TYPE_BLENDOP (0x40000000)
00232 
00236 #define CS_MIXMODE_TYPE_MESH (0x80000000)
00237 
00239 #define CS_MIXMODE_TYPE_MASK (0xc0000000)
00240 
00242 
00243 enum
00244 {
00246   CS_MIXMODE_FACT_ZERO          = 0x0,
00248   CS_MIXMODE_FACT_ONE           = 0x1,
00250   CS_MIXMODE_FACT_SRCCOLOR      = 0x2,
00252   CS_MIXMODE_FACT_SRCCOLOR_INV  = 0x3,
00254   CS_MIXMODE_FACT_DSTCOLOR      = 0x4,
00256   CS_MIXMODE_FACT_DSTCOLOR_INV  = 0x5,
00258   CS_MIXMODE_FACT_SRCALPHA      = 0x6,
00260   CS_MIXMODE_FACT_SRCALPHA_INV  = 0x7,
00262   CS_MIXMODE_FACT_DSTALPHA      = 0x8,
00264   CS_MIXMODE_FACT_DSTALPHA_INV  = 0x9,
00265   
00267   CS_MIXMODE_FACT_COUNT         = 0xa,
00268   
00270   CS_MIXMODE_FACT_MASK          = 0xf
00271 };
00272 
00283 #define CS_MIXMODE_ALPHATEST_AUTO (0x00000000)
00284 
00285 #define CS_MIXMODE_ALPHATEST_ENABLE (0x10000000)
00286 
00287 #define CS_MIXMODE_ALPHATEST_DISABLE (0x20000000)
00288   
00290 #define CS_MIXMODE_ALPHATEST_MASK (0x30000000)
00291 
00305 #define CS_MIXMODE_BLEND(Src, Dst)                                      \
00306   (CS_MIXMODE_TYPE_BLENDOP                                              \
00307   | (CS_MIXMODE_FACT_ ## Src << 20) | (CS_MIXMODE_FACT_ ## Dst << 16))
00308 
00309 #define CS_MIXMODE_BLENDOP_SRC(mode)    ((mode >> 20) & CS_MIXMODE_FACT_MASK)
00310 
00311 #define CS_MIXMODE_BLENDOP_DST(mode)    ((mode >> 16) & CS_MIXMODE_FACT_MASK)
00312 
00327 #define CS_FX_COPY (CS_MIXMODE_TYPE_AUTO | CS_MIXMODE_ALPHATEST_AUTO)
00328 
00329 #define CS_FX_MULTIPLY \
00330     (CS_MIXMODE_BLEND(DSTCOLOR, ZERO) | CS_MIXMODE_ALPHATEST_DISABLE)
00331 
00332 #define CS_FX_MULTIPLY2 \
00333     (CS_MIXMODE_BLEND(DSTCOLOR, SRCCOLOR) | CS_MIXMODE_ALPHATEST_DISABLE)
00334 
00335 #define CS_FX_ADD \
00336     (CS_MIXMODE_BLEND(ONE, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
00337 
00342 #define CS_FX_ALPHA \
00343     (CS_MIXMODE_BLEND(SRCALPHA, SRCALPHA_INV) | CS_MIXMODE_ALPHATEST_DISABLE)
00344 
00349 #define CS_FX_TRANSPARENT \
00350     (CS_MIXMODE_BLEND(ZERO, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
00351 
00355 #define CS_FX_DESTALPHAADD \
00356     (CS_MIXMODE_BLEND(DSTALPHA, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
00357 
00361 #define CS_FX_SRCALPHAADD \
00362     (CS_MIXMODE_BLEND(SRCALPHA, ONE) | CS_MIXMODE_ALPHATEST_DISABLE)
00363 
00372 #define CS_FX_PREMULTALPHA \
00373     (CS_MIXMODE_BLEND(ONE, SRCALPHA_INV) | CS_MIXMODE_ALPHATEST_DISABLE)
00374 
00378 #define CS_FX_MESH (CS_MIXMODE_TYPE_MESH)
00379   
00381 #define CS_FX_FLAT (0x04000000)
00382 
00391 #define CS_FX_MASK_ALPHA (0x000000FF)
00392   
00397 #define CS_FX_MASK_MIXMODE (0xf0ff0000)
00398 
00402 
00403 #define CS_FX_SETALPHA(alpha) \
00404   (CS_FX_ALPHA | uint ((alpha) * CS_FX_MASK_ALPHA))
00405 
00406 #define CS_FX_SETALPHA_INT(alpha) \
00407   (CS_FX_ALPHA | uint ((alpha) & CS_FX_MASK_ALPHA))
00408 
00413 struct csAlphaMode
00414 {
00416   enum AlphaType
00417   {
00419     alphaNone = 1,
00421     alphaBinary,
00423     alphaSmooth
00424   };
00426   bool autoAlphaMode;
00427   union
00428   {
00430     AlphaType alphaType;
00432     csStringID autoModeTexture;
00433   };
00434 };
00439 
00440 #define CS_LIGHTPARAM_POSITION 0
00441 
00442 #define CS_LIGHTPARAM_DIFFUSE 1
00443 
00444 #define CS_LIGHTPARAM_SPECULAR 2
00445 
00446 #define CS_LIGHTPARAM_ATTENUATION 3
00447 
00451 
00452 #define CS_SHADOW_VOLUME_BEGIN 1
00453 
00454 #define CS_SHADOW_VOLUME_PASS1 2
00455 
00456 #define CS_SHADOW_VOLUME_PASS2 3
00457 
00458 #define CS_SHADOW_VOLUME_FAIL1 4
00459 
00460 #define CS_SHADOW_VOLUME_FAIL2 5
00461 
00462 #define CS_SHADOW_VOLUME_USE 6
00463 
00464 #define CS_SHADOW_VOLUME_FINISH 7
00465 
00467 
00468 enum G3D_RENDERSTATEOPTION
00469 {
00471   G3DRENDERSTATE_ZBUFFERMODE,
00473   G3DRENDERSTATE_DITHERENABLE,
00475   G3DRENDERSTATE_BILINEARMAPPINGENABLE,
00477   G3DRENDERSTATE_TRILINEARMAPPINGENABLE,
00479   G3DRENDERSTATE_TRANSPARENCYENABLE,
00481   G3DRENDERSTATE_MIPMAPENABLE,
00483   G3DRENDERSTATE_TEXTUREMAPPINGENABLE,
00485   G3DRENDERSTATE_LIGHTINGENABLE,
00487   G3DRENDERSTATE_INTERLACINGENABLE,
00489   G3DRENDERSTATE_MMXENABLE,
00491   G3DRENDERSTATE_INTERPOLATIONSTEP,
00493   G3DRENDERSTATE_MAXPOLYGONSTODRAW,
00495   G3DRENDERSTATE_GOURAUDENABLE,
00497   G3DRENDERSTATE_EDGES
00498 };
00499 
00501 struct csGraphics3DCaps
00502 {
00503   bool CanClip;
00504   int minTexHeight, minTexWidth;
00505   int maxTexHeight, maxTexWidth;
00506   bool NeedsPO2Maps;
00507   int MaxAspectRatio;
00508 
00509   // The following caps are only used by NR
00510 
00515   bool SupportsPointSprites;
00519   bool DestinationAlpha;
00523   bool StencilShadows;
00524 };
00525 
00527 enum csRenderMeshType
00528 {
00530   CS_MESHTYPE_TRIANGLES,
00532   CS_MESHTYPE_QUADS,
00542   CS_MESHTYPE_TRIANGLESTRIP,
00548   CS_MESHTYPE_TRIANGLEFAN,
00552   CS_MESHTYPE_POINTS,
00558   CS_MESHTYPE_POINT_SPRITES,
00562   CS_MESHTYPE_LINES,
00567   CS_MESHTYPE_LINESTRIP
00568 };
00569 
00573 enum csSimpleMeshFlags
00574 {
00581   csSimpleMeshScreenspace = 0x01
00582 };
00583 
00587 struct csSimpleRenderMesh
00588 {
00590   csRenderMeshType meshtype;
00591 
00593   uint indexCount;
00601   const uint* indices;
00602 
00604   uint vertexCount;
00610   const csVector3* vertices;
00612   const csVector2* texcoords;
00618   const csVector4* colors;
00623   iTextureHandle* texture;
00624 
00626   iShader* shader;
00628   iShaderVariableContext* dynDomain;
00630   csAlphaMode alphaType;
00632   csZBufMode z_buf_mode;
00634   uint mixmode;
00645   csReversibleTransform object2world;
00646 
00647   csSimpleRenderMesh () : indexCount(0), indices(0), texcoords(0), colors(0), 
00648     texture (0), shader (0), dynDomain (0), z_buf_mode (CS_ZBUF_NONE), 
00649     mixmode (CS_FX_COPY)
00650   {  
00651     alphaType.autoAlphaMode = true;
00652     alphaType.autoModeTexture = csInvalidStringID;
00653   };
00654 };
00655 
00670 struct iGraphics3D : public virtual iBase
00671 {
00672   SCF_INTERFACE(iGraphics3D, 2, 0, 0);
00673   
00675   virtual bool Open () = 0;
00677   virtual void Close () = 0;
00678 
00686   virtual iGraphics2D *GetDriver2D () = 0;
00687 
00694   virtual iTextureManager *GetTextureManager () = 0;
00695 
00697   virtual void SetDimensions (int width, int height) = 0;
00699   virtual int GetWidth () const = 0;
00701   virtual int GetHeight () const = 0;
00702 
00707   virtual const csGraphics3DCaps *GetCaps () const = 0;
00708 
00715   virtual void SetPerspectiveCenter (int x, int y) = 0;
00716 
00723   virtual void GetPerspectiveCenter (int& x, int& y) const = 0;
00724 
00728   virtual void SetPerspectiveAspect (float aspect) = 0;
00729 
00731   virtual float GetPerspectiveAspect () const = 0;
00732  
00746   virtual void SetRenderTarget (iTextureHandle* handle,
00747         bool persistent = false) = 0;
00748 
00752   virtual iTextureHandle* GetRenderTarget () const = 0;
00753 
00755   virtual bool BeginDraw (int DrawFlags) = 0;
00756 
00758   virtual void FinishDraw () = 0;
00759 
00765   virtual void Print (csRect const* area) = 0;
00766 
00768   virtual void DrawMesh (const csCoreRenderMesh* mymesh,
00769                          const csRenderMeshModes& modes,
00770                          const csArray<csShaderVariable*> &stacks) = 0;
00787   virtual void DrawSimpleMesh (const csSimpleRenderMesh& mesh,
00788     uint flags = 0) = 0;
00789 
00804   virtual void DrawPixmap (iTextureHandle *hTex, int sx, int sy,
00805     int sw, int sh, int tx, int ty, int tw, int th, uint8 Alpha = 0) = 0;
00806 
00811   virtual void DrawLine (const csVector3& v1, const csVector3& v2,
00812     float fov, int color) = 0;
00813 
00817   virtual bool ActivateBuffers (csRenderBufferHolder* holder, 
00818     csRenderBufferName mapping[CS_VATTRIB_SPECIFIC_LAST+1]) = 0;
00819 
00823   virtual bool ActivateBuffers (csVertexAttrib *attribs,
00824     iRenderBuffer **buffers, unsigned int count) = 0;
00825 
00830   virtual void DeactivateBuffers (csVertexAttrib *attribs, unsigned int count) = 0;
00831 
00836   virtual void SetTextureState (int* units, iTextureHandle** textures,
00837     int count) = 0;
00838 
00839 
00845   virtual void SetClipper (iClipper2D* clipper, int cliptype) = 0;
00846 
00850   virtual iClipper2D* GetClipper () = 0;
00851 
00855   virtual int GetClipType () const = 0;
00856 
00860   virtual void SetNearPlane (const csPlane3& pl) = 0;
00861 
00865   virtual void ResetNearPlane () = 0;
00866 
00870   virtual const csPlane3& GetNearPlane () const = 0;
00871 
00875   virtual bool HasNearPlane () const = 0;
00876 
00878   virtual bool SetRenderState (G3D_RENDERSTATEOPTION op, long val) = 0;
00879 
00881   virtual long GetRenderState (G3D_RENDERSTATEOPTION op) const = 0;
00882 
00887   virtual bool SetOption (const char*, const char*) = 0;
00888   
00890   virtual void SetWriteMask (bool red, bool green, bool blue, bool alpha) = 0;
00891 
00893   virtual void GetWriteMask (bool &red, bool &green, bool &blue,
00894         bool &alpha) const = 0;
00895 
00897   virtual void SetZMode (csZBufMode mode) = 0;
00898 
00900   virtual csZBufMode GetZMode () = 0;
00901 
00903   virtual void EnableZOffset () = 0;
00904 
00906   virtual void DisableZOffset () = 0;
00907 
00909   virtual void SetShadowState (int state) = 0;
00910 
00912   virtual float GetZBuffValue (int x, int y) = 0;
00913 
00924   virtual void OpenPortal (size_t numVertices, const csVector2* vertices,
00925     const csPlane3& normal, csFlags flags) = 0;
00926 
00931   virtual void ClosePortal () = 0;
00932 
00934   virtual iHalo *CreateHalo (float iR, float iG, float iB,
00935     unsigned char *iAlpha, int iWidth, int iHeight) = 0;
00936 
00942   virtual void RemoveFromCache (iRendererLightmap* rlm) = 0;
00943 
00949   virtual void SetWorldToCamera (const csReversibleTransform& w2c) = 0;
00950 };
00951 
00954 #endif // __CS_IVIDEO_GRAPH3D_H__
00955 

Generated for Crystal Space by doxygen 1.4.6