absence_thelab

annotate src/3deng/3dengine.h @ 0:1cffe3409164

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 23 Oct 2014 01:46:07 +0300
parents
children
rev   line source
nuclear@0 1 #ifndef _3DENGINE_H_
nuclear@0 2 #define _3DENGINE_H_
nuclear@0 3
nuclear@0 4 // standard includes
nuclear@0 5 #include <vector>
nuclear@0 6 // system includes
nuclear@0 7 #include "d3d8.h"
nuclear@0 8 // includes from my codebase
nuclear@0 9 #include "typedefs.h"
nuclear@0 10 #include "linkedlist.h"
nuclear@0 11 #include "color.h"
nuclear@0 12 // 3d engine includes
nuclear@0 13 #include "n3dmath.h"
nuclear@0 14 #include "switches.h"
nuclear@0 15 #include "3dengtypes.h"
nuclear@0 16 #include "material.h"
nuclear@0 17 #include "textureman.h"
nuclear@0 18 #include "3dgeom.h"
nuclear@0 19
nuclear@0 20 enum DeviceType {DeviceHardware = D3DDEVTYPE_HAL, DeviceReference = D3DDEVTYPE_REF};
nuclear@0 21 enum TnLMode {HardwareTnL = D3DCREATE_HARDWARE_VERTEXPROCESSING, SoftwareTnL = D3DCREATE_SOFTWARE_VERTEXPROCESSING};
nuclear@0 22 enum BufferChainMode {DoubleBuffering = 1, TripleBuffering = 2};
nuclear@0 23 enum UsageFlags {UsageStatic = 0, UsageDynamic = D3DUSAGE_DYNAMIC};
nuclear@0 24 enum ShadeMode {FlatShading = D3DSHADE_FLAT, GouraudShading = D3DSHADE_GOURAUD};
nuclear@0 25 enum FaceOrder {Clockwise = D3DCULL_CW, CounterClockwise = D3DCULL_CCW};
nuclear@0 26
nuclear@0 27 enum PhongComponent {Ambient, Diffuse, Specular};
nuclear@0 28
nuclear@0 29 enum PrimitiveType {
nuclear@0 30 TriangleList = D3DPT_TRIANGLELIST,
nuclear@0 31 TriangleStrip = D3DPT_TRIANGLESTRIP,
nuclear@0 32 TriangleFan = D3DPT_TRIANGLEFAN,
nuclear@0 33 LineList = D3DPT_LINELIST,
nuclear@0 34 LineStrip = D3DPT_LINESTRIP,
nuclear@0 35 PointList = D3DPT_POINTLIST
nuclear@0 36 };
nuclear@0 37
nuclear@0 38 enum BlendingFactor {
nuclear@0 39 BLEND_ZERO = D3DBLEND_ZERO,
nuclear@0 40 BLEND_ONE = D3DBLEND_ONE,
nuclear@0 41 BLEND_SRCCOLOR = D3DBLEND_SRCCOLOR,
nuclear@0 42 BLEND_INVSRCCOLOR = D3DBLEND_INVSRCCOLOR,
nuclear@0 43 BLEND_SRCALPHA = D3DBLEND_SRCALPHA,
nuclear@0 44 BLEND_INVSRCALPHA = D3DBLEND_INVSRCALPHA,
nuclear@0 45 BLEND_DESTCOLOR = D3DBLEND_DESTCOLOR,
nuclear@0 46 BLEND_INVDESTCOLOR = D3DBLEND_INVDESTCOLOR,
nuclear@0 47 BLEND_DESTALPHA = D3DBLEND_DESTALPHA,
nuclear@0 48 BLEND_INVDESTALPHA = D3DBLEND_INVDESTALPHA,
nuclear@0 49 BLEND_SRCALPHASAT = D3DBLEND_SRCALPHASAT
nuclear@0 50 };
nuclear@0 51
nuclear@0 52 enum CmpFunc {
nuclear@0 53 CMP_NEVER = D3DCMP_NEVER,
nuclear@0 54 CMP_LESS = D3DCMP_LESS,
nuclear@0 55 CMP_EQUAL = D3DCMP_EQUAL,
nuclear@0 56 CMP_LEQUAL = D3DCMP_LESSEQUAL,
nuclear@0 57 CMP_GREATER = D3DCMP_GREATER,
nuclear@0 58 CMP_NOTEQUAL = D3DCMP_NOTEQUAL,
nuclear@0 59 CMP_GEQUAL = D3DCMP_GREATEREQUAL,
nuclear@0 60 CMP_ALWAYS = D3DCMP_ALWAYS
nuclear@0 61 };
nuclear@0 62
nuclear@0 63 enum StencilOp {
nuclear@0 64 SOP_KEEP = D3DSTENCILOP_KEEP,
nuclear@0 65 SOP_ZERO = D3DSTENCILOP_ZERO,
nuclear@0 66 SOP_REPLACE = D3DSTENCILOP_REPLACE,
nuclear@0 67 SOP_INCSAT = D3DSTENCILOP_INCRSAT,
nuclear@0 68 SOP_DECSAT = D3DSTENCILOP_DECRSAT,
nuclear@0 69 SOP_INVERT = D3DSTENCILOP_INVERT,
nuclear@0 70 SOP_INC = D3DSTENCILOP_INCR,
nuclear@0 71 SOP_DEC = D3DSTENCILOP_DECR
nuclear@0 72 };
nuclear@0 73
nuclear@0 74 enum TextureBlendFunction {
nuclear@0 75 TexBlendSelectArg1 = D3DTOP_SELECTARG1, // S[rgba] = Arg1
nuclear@0 76 TexBlendSelectArg2 = D3DTOP_SELECTARG2, // S[rgba] = Arg2
nuclear@0 77 TexBlendAdd = D3DTOP_ADD, // S[rgba] = Arg1 + Arg2
nuclear@0 78 TexBlendAddSigned = D3DTOP_ADDSIGNED, // S[rgba] = Arg1 + Arg2 - 0.5
nuclear@0 79 TexBlendAddSigned2x = D3DTOP_ADDSIGNED2X, // S[rgba] = (Arg1 + Arg2 - 0.5) << 1
nuclear@0 80 TexBlendSubtract = D3DTOP_SUBTRACT, // S[rgba] = Arg1 - Arg2
nuclear@0 81 TexBlendAddSmooth = D3DTOP_ADDSMOOTH, // S[rgba] = (Arg1 + Arg2) - (Arg1 * Arg2)
nuclear@0 82 TexBlendModulate = D3DTOP_MODULATE, // S[rgba] = Arg1 * Arg2
nuclear@0 83 TexBlendModulate2x = D3DTOP_MODULATE2X, // S[rgba] = (Arg1 * Arg2) << 1
nuclear@0 84 TexBlendModulate4x = D3DTOP_MODULATE4X, // S[rgba] = (Arg1 * Arg2) << 2
nuclear@0 85 TexBlendVertexAlpha = D3DTOP_BLENDDIFFUSEALPHA, // S[rgba] = Arg1*Alpha + Arg2*(1-Alpha)
nuclear@0 86 TexBlendTextureAlpha = D3DTOP_BLENDTEXTUREALPHA, // S[rgba] = Arg1*Alpha + Arg2*(1-Alpha)
nuclear@0 87 TexBlendFactorAlpha = D3DTOP_BLENDFACTORALPHA, // S[rgba] = Arg1*Alpha + Arg2*(1-Alpha)
nuclear@0 88 TexBlendPrevAlpha = D3DTOP_BLENDFACTORALPHA, // S[rgba] = Arg1*Alpha + Arg2*(1-Alpha)
nuclear@0 89 TexBlendPreMulAlpha = D3DTOP_BLENDTEXTUREALPHAPM, // S[rgba] = Arg1 + Arg2*(1-Alpha)
nuclear@0 90 TexBlendPreModulate = D3DTOP_PREMODULATE,
nuclear@0 91 TexBlendModAlphaAddColor = D3DTOP_MODULATEALPHA_ADDCOLOR,// S[rgba] = Arg1[rgb] + Arg1[a] * Arg2[rgb]
nuclear@0 92 TexBlendModulateAddAlpha = D3DTOP_MODULATECOLOR_ADDALPHA,// S[rgba] = Arg1[rgb] * Arg2[rgb] + Arg1[a]
nuclear@0 93 TexBlendModInvAlphaAddColor = D3DTOP_MODULATEINVALPHA_ADDCOLOR, // S[rgba] = Arg1[rgb] + (1-Arg1[a]) * Arg2[rgb]
nuclear@0 94 TexBlendModulateInvAddAlpha = D3DTOP_MODULATEINVCOLOR_ADDALPHA, // S[rgba] = (1-Arg1[rgb]) * Arg2[rgb] + Arg1[a]
nuclear@0 95 TexBlendBumpEnv = D3DTOP_BUMPENVMAP, // bump mapping with next stage's env map
nuclear@0 96 TexBlendBumpEnvLuminance = D3DTOP_BUMPENVMAPLUMINANCE, // bump mapping with next stage's env map with luminance
nuclear@0 97 TexBlendDotProduct = D3DTOP_DOTPRODUCT3, // S[rgba] = Arg1[rgb] (dot) Arg2[rgb]
nuclear@0 98 TexBlendMultiplyAdd = D3DTOP_MULTIPLYADD, // S[rgba] = Arg1 + Arg2 * Arg3
nuclear@0 99 TexBlendLerp = D3DTOP_LERP // S[rgba] = Arg2 + (Arg3 - Arg2) * Arg1
nuclear@0 100 };
nuclear@0 101
nuclear@0 102 enum TextureBlendArgument {
nuclear@0 103 TexArgNone = 0, // valid only for arg3
nuclear@0 104 TexArgCurrent = D3DTA_CURRENT, // the color from the previous stage output (diffuse for 1st)
nuclear@0 105 TexArgDiffuseColor = D3DTA_DIFFUSE, // the diffuse interpolated color
nuclear@0 106 TexArgSpecularColor = D3DTA_SPECULAR, // the specular interpolated color
nuclear@0 107 TexArgTexture = D3DTA_TEXTURE, // the texture bound to this stage
nuclear@0 108 TexArgFactor = D3DTA_TFACTOR, // a user defined factor
nuclear@0 109 TexArgTemp = D3DTA_TEMP // temp register
nuclear@0 110 };
nuclear@0 111
nuclear@0 112 enum TextureFilteringType {
nuclear@0 113 PointSampling,
nuclear@0 114 BilinearFiltering,
nuclear@0 115 TrilinearFiltering,
nuclear@0 116 AnisotropicFiltering
nuclear@0 117 };
nuclear@0 118
nuclear@0 119 enum TextureAddressing {
nuclear@0 120 TexAddrWrap = D3DTADDRESS_WRAP,
nuclear@0 121 TexAddrMirror = D3DTADDRESS_MIRROR,
nuclear@0 122 TexAddrClamp = D3DTADDRESS_CLAMP,
nuclear@0 123 TexAddrBorder = D3DTADDRESS_BORDER,
nuclear@0 124 TexAddrMirrorOnce = D3DTADDRESS_MIRRORONCE
nuclear@0 125 };
nuclear@0 126
nuclear@0 127 enum TexTransformState {
nuclear@0 128 TexTransformDisable = D3DTTFF_DISABLE,
nuclear@0 129 TexTransform1D = D3DTTFF_COUNT1,
nuclear@0 130 TexTransform2D = D3DTTFF_COUNT2,
nuclear@0 131 TexTransform3D = D3DTTFF_COUNT3,
nuclear@0 132 TexTransform4D = D3DTTFF_COUNT4,
nuclear@0 133 TexTransformProjected = D3DTTFF_PROJECTED
nuclear@0 134 };
nuclear@0 135
nuclear@0 136 // don't care flags for context creation
nuclear@0 137 const unsigned short GCPDONTCARE_NONE = 0; // 0000000000000000
nuclear@0 138 const unsigned short GCPDONTCARE_BPP = 1; // 0000000000000001
nuclear@0 139 const unsigned short GCPDONTCARE_REFRESH = 2; // 0000000000000010
nuclear@0 140 const unsigned short GCPDONTCARE_ALPHA = 4; // 0000000000000100
nuclear@0 141 const unsigned short GCPDONTCARE_DEPTH = 8; // 0000000000001000
nuclear@0 142 const unsigned short GCPDONTCARE_TNL = 16; // 0000000000010000
nuclear@0 143 const unsigned short GCPDONTCARE_BUFFERS = 32; // 0000000000100000
nuclear@0 144 const unsigned short GCPDONTCARE_AA = 64; // 0000000001000000
nuclear@0 145 const unsigned short GCPDONTCARE_VSYNC = 128; // 0000000010000000
nuclear@0 146
nuclear@0 147 // fullscreen / windowed flags
nuclear@0 148 const unsigned short GCCREATE_WINDOWED = 0;
nuclear@0 149 const unsigned short GCCREATE_FULLSCREEN = 1;
nuclear@0 150
nuclear@0 151
nuclear@0 152
nuclear@0 153 class Vertex;
nuclear@0 154
nuclear@0 155 struct ColorDepth {
nuclear@0 156 int bpp, colorbits, alpha;
nuclear@0 157
nuclear@0 158 ColorDepth(int bits=0, int c=0, int a=0) {colorbits = c; alpha = a; bpp = bits; }
nuclear@0 159 };
nuclear@0 160
nuclear@0 161 struct DisplayMode {
nuclear@0 162 unsigned int XRes, YRes, RefreshRate;
nuclear@0 163 ColorDepth ColorFormat;
nuclear@0 164 };
nuclear@0 165
nuclear@0 166 enum DisplayModeItem {ModeItemSize, ModeItemBpp, ModeItemAlpha, ModeItemRefresh};
nuclear@0 167
nuclear@0 168 struct Adapter {
nuclear@0 169 char *Driver, *Description;
nuclear@0 170 int64 DriverVersion;
nuclear@0 171 dword VentorID, DeviceID, SubSysID, Revision;
nuclear@0 172 GUID DeviceGUID;
nuclear@0 173
nuclear@0 174 unsigned int ModeCount;
nuclear@0 175 DisplayMode *Modes;
nuclear@0 176 D3DCAPS8 Capabilities;
nuclear@0 177 };
nuclear@0 178
nuclear@0 179 struct RenderTarget {
nuclear@0 180 Surface *ColorSurface, *DepthStencilSurface;
nuclear@0 181 };
nuclear@0 182
nuclear@0 183 struct RenderParams {
nuclear@0 184 ShadeMode Shading;
nuclear@0 185 bool Billboarded;
nuclear@0 186 dword VertexProgram;
nuclear@0 187 dword PixelProgram;
nuclear@0 188 bool ZWrite;
nuclear@0 189 BlendingFactor SourceBlendFactor, DestBlendFactor;
nuclear@0 190 };
nuclear@0 191
nuclear@0 192 struct ContextInitParameters {
nuclear@0 193 int x, y;
nuclear@0 194 int bpp;
nuclear@0 195 int RefreshRate;
nuclear@0 196 bool AlphaChannel;
nuclear@0 197 int DepthBits;
nuclear@0 198 DeviceType DevType;
nuclear@0 199 bool HardwareTnL;
nuclear@0 200 bool FullScreen;
nuclear@0 201 bool Antialiasing;
nuclear@0 202 bool BestAA;
nuclear@0 203 bool VSync;
nuclear@0 204 BufferChainMode Buffers;
nuclear@0 205 unsigned short DontCareFlags;
nuclear@0 206 };
nuclear@0 207
nuclear@0 208
nuclear@0 209 class GraphicsContext {
nuclear@0 210 private:
nuclear@0 211 PrimitiveType ptype;
nuclear@0 212 FaceOrder CullOrder;
nuclear@0 213 bool BackfaceCulling;
nuclear@0 214 bool MipMapEnabled;
nuclear@0 215 bool BillBoardingEnabled;
nuclear@0 216 dword MipFilter;
nuclear@0 217
nuclear@0 218 // cache of current transformation matrices
nuclear@0 219 Matrix4x4 WorldMat[256], ViewMat, ProjMat, TexMat[8];
nuclear@0 220
nuclear@0 221 // disable copying contexts by making copy constructor and assignment private
nuclear@0 222 GraphicsContext(const GraphicsContext &gc);
nuclear@0 223 const GraphicsContext &operator =(const GraphicsContext &gc);
nuclear@0 224
nuclear@0 225 public:
nuclear@0 226 HWND WindowHandle;
nuclear@0 227 RenderTarget MainRenderTarget;
nuclear@0 228 IDirect3DDevice8 *D3DDevice;
nuclear@0 229 ContextInitParameters ContextParams;
nuclear@0 230 D3DFORMAT ColorFormat, ZFormat;
nuclear@0 231 int AASamples;
nuclear@0 232 int MaxTextureStages;
nuclear@0 233
nuclear@0 234 TextureManager *texman; // texture manager
nuclear@0 235
nuclear@0 236 GraphicsContext();
nuclear@0 237
nuclear@0 238 void SetDefaultStates();
nuclear@0 239
nuclear@0 240 bool CreateVertexBuffer(uint32 VertexCount, UsageFlags usage, VertexBuffer **vb) const;
nuclear@0 241 bool CreateIndexBuffer(uint32 IndexCount, UsageFlags usage, IndexBuffer **ib) const;
nuclear@0 242
nuclear@0 243 bool CreateSurface(uint32 Width, uint32 Height, Surface **surf) const;
nuclear@0 244 bool CreateDepthStencil(uint32 Width, uint32 Height, Surface **zsurf) const;
nuclear@0 245
nuclear@0 246 void Clear(dword color) const;
nuclear@0 247 void ClearZBuffer(float zval) const;
nuclear@0 248 void ClearStencil(byte sval) const;
nuclear@0 249 void ClearZBufferStencil(float zval, byte sval) const;
nuclear@0 250
nuclear@0 251 void Flip() const;
nuclear@0 252
nuclear@0 253 bool Draw(VertexBuffer *vb);
nuclear@0 254 bool Draw(Vertex *varray, unsigned int VertexCount);
nuclear@0 255 bool Draw(VertexBuffer *vb, IndexBuffer *ib);
nuclear@0 256 bool Draw(Vertex *varray, Index *iarray, unsigned int VertexCount, unsigned int IndexCount);
nuclear@0 257 bool Draw(Vertex *varray, Triangle *triarray, unsigned int VertexCount, unsigned int TriCount);
nuclear@0 258
nuclear@0 259 IDirect3DDevice8 *GetDevice() const;
nuclear@0 260 int GetTextureStageNumber() const {return MaxTextureStages;}
nuclear@0 261
nuclear@0 262 ////// render states //////
nuclear@0 263 void SetPrimitiveType(PrimitiveType pt);
nuclear@0 264 void SetBackfaceCulling(bool enable);
nuclear@0 265 void SetFrontFace(FaceOrder order);
nuclear@0 266 void SetAutoNormalize(bool enable);
nuclear@0 267 void SetBillboarding(bool enable);
nuclear@0 268 void SetColorWrite(bool red, bool green, bool blue, bool alpha);
nuclear@0 269
nuclear@0 270 // blending states
nuclear@0 271 void SetAlphaBlending(bool enable);
nuclear@0 272 void SetBlendFunc(BlendingFactor src, BlendingFactor dest);
nuclear@0 273
nuclear@0 274 // zbuffer states
nuclear@0 275 void SetZBuffering(bool enable);
nuclear@0 276 void SetZWrite(bool enable);
nuclear@0 277 void SetZFunc(CmpFunc func);
nuclear@0 278
nuclear@0 279 // set stencil buffer states
nuclear@0 280 void SetStencilBuffering(bool enable);
nuclear@0 281 void SetStencilPassOp(StencilOp sop);
nuclear@0 282 void SetStencilFailOp(StencilOp sop);
nuclear@0 283 void SetStencilPassZFailOp(StencilOp sop);
nuclear@0 284 void SetStencilOp(StencilOp Fail, StencilOp StencilPassZFail, StencilOp Pass);
nuclear@0 285 void SetStencilFunc(CmpFunc func);
nuclear@0 286 void SetStencilReference(dword value);
nuclear@0 287
nuclear@0 288 // texture & material states
nuclear@0 289 void SetTextureFiltering(TextureFilteringType texfilter, int TextureStage = 0xa11);
nuclear@0 290 void SetTextureAddressing(TextureAddressing uaddr, TextureAddressing vaddr, int TextureStage = 0xa11);
nuclear@0 291 void SetTextureBorderColor(dword color, int TextureStage = 0xa11);
nuclear@0 292 void SetTexture(int index, Texture *tex);
nuclear@0 293 void SetTextureFactor(dword factor);
nuclear@0 294 void SetMipMapping(bool enable, int TextureStage = 0xa11);
nuclear@0 295 void SetMaterial(const Material &mat);
nuclear@0 296
nuclear@0 297 void BlitTexture(const Texture *texture, RECT *rect, const Color &col = Color(1.0f));
nuclear@0 298
nuclear@0 299 // multitexturing interface
nuclear@0 300 void EnableTextureStage(int stage);
nuclear@0 301 void DisableTextureStage(int stage);
nuclear@0 302 void SetTextureStageColor(int stage, TextureBlendFunction op, TextureBlendArgument arg1, TextureBlendArgument arg2, TextureBlendArgument arg3 = TexArgNone);
nuclear@0 303 void SetTextureStageAlpha(int stage, TextureBlendFunction op, TextureBlendArgument arg1, TextureBlendArgument arg2, TextureBlendArgument arg3 = TexArgNone);
nuclear@0 304 void SetTextureCoordIndex(int stage, int index);
nuclear@0 305 void SetTextureTransformState(int stage, TexTransformState TexXForm);
nuclear@0 306 //void SetTextureCoordGenerator(int stage, TexGen tgen);
nuclear@0 307
nuclear@0 308 // programmable interface
nuclear@0 309 void SetVertexProgram(dword vs);
nuclear@0 310 void SetPixelProgram(dword ps);
nuclear@0 311
nuclear@0 312 dword CreateVertexProgram(const char *fname);
nuclear@0 313 void DestroyVertexProgram(dword vprog);
nuclear@0 314 void SetVertexProgramConstant(dword creg, float val);
nuclear@0 315 void SetVertexProgramConstant(dword creg, const Vector3 &val);
nuclear@0 316 void SetVertexProgramConstant(dword creg, const Vector4 &val);
nuclear@0 317 void SetVertexProgramConstant(dword creg, const Color &val);
nuclear@0 318 void SetVertexProgramConstant(dword creg, const Matrix4x4 &val);
nuclear@0 319 void SetVertexProgramConstant(dword creg, const void *data, dword size);
nuclear@0 320
nuclear@0 321
nuclear@0 322 // lighting states
nuclear@0 323 void SetLighting(bool enable);
nuclear@0 324 void SetColorVertex(bool enable);
nuclear@0 325 void SetAmbientLight(Color AmbientColor);
nuclear@0 326 void SetShadingMode(ShadeMode mode);
nuclear@0 327 void SetSpecular(bool enable);
nuclear@0 328
nuclear@0 329 // Transformation Matrices
nuclear@0 330 void SetWorldMatrix(const Matrix4x4 &WorldMat, unsigned int BlendIndex = 0);
nuclear@0 331 void SetViewMatrix(const Matrix4x4 &ViewMat);
nuclear@0 332 void SetProjectionMatrix(const Matrix4x4 &ProjMat);
nuclear@0 333 void SetTextureMatrix(const Matrix4x4 &TexMat, unsigned int TextureStage = 0);
nuclear@0 334 void SetViewport(unsigned int x, unsigned int y, unsigned int xsize, unsigned int ysize, float MinZ = 0.0f, float MaxZ = 1.0f);
nuclear@0 335
nuclear@0 336 const Matrix4x4 &GetWorldMatrix(unsigned int BlendIndex = 0);
nuclear@0 337 const Matrix4x4 &GetViewMatrix();
nuclear@0 338 const Matrix4x4 &GetProjectionMatrix();
nuclear@0 339 const Matrix4x4 &GetTextureMatrix(unsigned int TextureStage = 0);
nuclear@0 340
nuclear@0 341 // render target
nuclear@0 342 void ResetRenderTarget();
nuclear@0 343 void SetRenderTarget(RenderTarget &rtarg);
nuclear@0 344 void SetRenderTarget(Texture *rtarg, Texture *ztarg);
nuclear@0 345 void SetRenderTarget(Texture *rtarg, Surface *ztarg);
nuclear@0 346 //RenderTarget GetRenderTarget() const;
nuclear@0 347 };
nuclear@0 348
nuclear@0 349
nuclear@0 350
nuclear@0 351 class Engine3D {
nuclear@0 352 private:
nuclear@0 353 IDirect3D8 *d3d;
nuclear@0 354 unsigned int AdapterCount;
nuclear@0 355 Adapter *adapters; // array of adapters (filled in at the constructor)
nuclear@0 356 std::vector<GraphicsContext*> GraphicsContexts; // a list of active graphics contexts
nuclear@0 357
nuclear@0 358 void RetrieveAdapterInfo();
nuclear@0 359 LinkedList<DisplayMode> *CreateModesList(unsigned int AdapterID) const;
nuclear@0 360 void NarrowModesList(LinkedList<DisplayMode> *list, DisplayModeItem item, long value, long value2=0) const;
nuclear@0 361 DisplayMode ChooseBestMode(LinkedList<DisplayMode> *modes) const;
nuclear@0 362 int MaxAntialiasingSamples() const;
nuclear@0 363
nuclear@0 364 public:
nuclear@0 365
nuclear@0 366 Engine3D();
nuclear@0 367 ~Engine3D();
nuclear@0 368
nuclear@0 369 int GetAdapterCount() const;
nuclear@0 370 const Adapter *GetAdapterInfo(int adapter) const;
nuclear@0 371
nuclear@0 372 GraphicsContext *CreateGraphicsContext(HWND WindowHandle, int x, int y, int bpp, word flags);
nuclear@0 373 GraphicsContext *CreateGraphicsContext(HWND WindowHandle, unsigned int AdapterID, ContextInitParameters *GCParams);
nuclear@0 374 ContextInitParameters LoadContextParamsConfigFile(const char *cfgfilename);
nuclear@0 375
nuclear@0 376 void DestroyGraphicsContext(GraphicsContext *gc);
nuclear@0 377 };
nuclear@0 378
nuclear@0 379 class Light;
nuclear@0 380
nuclear@0 381 // helper functions
nuclear@0 382 bool Lock(VertexBuffer *vb, Vertex **data);
nuclear@0 383 bool Lock(IndexBuffer *ib, Index **data);
nuclear@0 384 void Unlock(VertexBuffer *vb);
nuclear@0 385 void Unlock(IndexBuffer *ib);
nuclear@0 386 void CreateProjectionMatrix(Matrix4x4 *mat, float yFOV, float Aspect, float NearClip, float FarClip);
nuclear@0 387 void NormalMapFromHeightField(Texture *tex);
nuclear@0 388 void UpdateMipmapChain(Texture *tex);
nuclear@0 389 TriMesh *CreateShadowVolume(const TriMesh &mesh, const Light *light, const Matrix4x4 &MeshXForm, bool WorldCoords = false);
nuclear@0 390
nuclear@0 391 #endif // _3DENGINE_H_