-Fixed MESSAGE functions that were thunking down to 16 bits implementation.
[wine] / include / d3d.h
1 #ifndef _WINE_D3D_H
2 #define _WINE_D3D_H
3
4 #include "ddraw.h"
5
6 /* This is needed for GL_LIGHT */
7 #include "wine_gl.h"
8
9 typedef BOOL32 *LPBOOL;
10 typedef BOOL32 BOOL;
11
12 DEFINE_GUID(IID_IDirect3D,              0x3BBA0080,0x2421,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
13 DEFINE_GUID(IID_IDirect3D2,             0x6aae1ec1,0x662a,0x11d0,0x88,0x9d,0x00,0xaa,0x00,0xbb,0xb7,0x6a);
14
15 DEFINE_GUID(IID_IDirect3DRampDevice,    0xF2086B20,0x259F,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
16 DEFINE_GUID(IID_IDirect3DRGBDevice,     0xA4665C60,0x2673,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
17 DEFINE_GUID(IID_IDirect3DHALDevice,     0x84E63dE0,0x46AA,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E );
18 DEFINE_GUID(IID_IDirect3DMMXDevice,     0x881949a1,0xd6f3,0x11d0,0x89,0xab,0x00,0xa0,0xc9,0x05,0x41,0x29 );
19
20 DEFINE_GUID(IID_IDirect3DDevice,        0x64108800,0x957d,0x11D0,0x89,0xAB,0x00,0xA0,0xC9,0x05,0x41,0x29 );
21 DEFINE_GUID(IID_IDirect3DDevice2,       0x93281501,0x8CF8,0x11D0,0x89,0xAB,0x00,0xA0,0xC9,0x05,0x41,0x29);
22 DEFINE_GUID(IID_IDirect3DTexture,       0x2CDCD9E0,0x25A0,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56);
23 DEFINE_GUID(IID_IDirect3DTexture2,      0x93281502,0x8CF8,0x11D0,0x89,0xAB,0x00,0xA0,0xC9,0x05,0x41,0x29);
24 DEFINE_GUID(IID_IDirect3DLight,         0x4417C142,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
25 DEFINE_GUID(IID_IDirect3DMaterial,      0x4417C144,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
26 DEFINE_GUID(IID_IDirect3DMaterial2,     0x93281503,0x8CF8,0x11D0,0x89,0xAB,0x00,0xA0,0xC9,0x05,0x41,0x29);
27 DEFINE_GUID(IID_IDirect3DExecuteBuffer, 0x4417C145,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
28 DEFINE_GUID(IID_IDirect3DViewport,      0x4417C146,0x33AD,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E);
29 DEFINE_GUID(IID_IDirect3DViewport2,     0x93281500,0x8CF8,0x11D0,0x89,0xAB,0x00,0xA0,0xC9,0x05,0x41,0x29);
30
31 typedef struct IDirect3D        IDirect3D ,*LPDIRECT3D ;
32 typedef struct IDirect3D2       IDirect3D2,*LPDIRECT3D2;
33 typedef struct IDirect3DLight   IDirect3DLight,*LPDIRECT3DLIGHT;
34 typedef struct IDirect3DDevice        IDirect3DDevice, *LPDIRECT3DDEVICE;
35 typedef struct IDirect3DDevice2       IDirect3DDevice2, *LPDIRECT3DDEVICE2;
36 typedef struct IDirect3DViewport2     IDirect3DViewport, IDirect3DViewport2, *LPDIRECT3DVIEWPORT2, *LPDIRECT3DVIEWPORT;
37 typedef struct IDirect3DMaterial2     IDirect3DMaterial, *LPDIRECT3DMATERIAL, IDirect3DMaterial2, *LPDIRECT3DMATERIAL2;
38 typedef struct IDirect3DTexture2      IDirect3DTexture, *LPDIRECT3DTEXTURE, IDirect3DTexture2,  *LPDIRECT3DTEXTURE2;
39 typedef struct IDirect3DExecuteBuffer IDirect3DExecuteBuffer, *LPDIRECT3DEXECUTEBUFFER;
40
41 /* ********************************************************************
42    Error Codes
43    ******************************************************************** */
44 #define D3D_OK                          DD_OK
45 #define D3DERR_BADMAJORVERSION          MAKE_DDHRESULT(700)
46 #define D3DERR_BADMINORVERSION          MAKE_DDHRESULT(701)
47 #define D3DERR_INVALID_DEVICE           MAKE_DDHRESULT(705)
48 #define D3DERR_INITFAILED               MAKE_DDHRESULT(706)
49 #define D3DERR_DEVICEAGGREGATED         MAKE_DDHRESULT(707)
50 #define D3DERR_EXECUTE_CREATE_FAILED    MAKE_DDHRESULT(710)
51 #define D3DERR_EXECUTE_DESTROY_FAILED   MAKE_DDHRESULT(711)
52 #define D3DERR_EXECUTE_LOCK_FAILED      MAKE_DDHRESULT(712)
53 #define D3DERR_EXECUTE_UNLOCK_FAILED    MAKE_DDHRESULT(713)
54 #define D3DERR_EXECUTE_LOCKED           MAKE_DDHRESULT(714)
55 #define D3DERR_EXECUTE_NOT_LOCKED       MAKE_DDHRESULT(715)
56 #define D3DERR_EXECUTE_FAILED           MAKE_DDHRESULT(716)
57 #define D3DERR_EXECUTE_CLIPPED_FAILED   MAKE_DDHRESULT(717)
58 #define D3DERR_TEXTURE_NO_SUPPORT       MAKE_DDHRESULT(720)
59 #define D3DERR_TEXTURE_CREATE_FAILED    MAKE_DDHRESULT(721)
60 #define D3DERR_TEXTURE_DESTROY_FAILED   MAKE_DDHRESULT(722)
61 #define D3DERR_TEXTURE_LOCK_FAILED      MAKE_DDHRESULT(723)
62 #define D3DERR_TEXTURE_UNLOCK_FAILED    MAKE_DDHRESULT(724)
63 #define D3DERR_TEXTURE_LOAD_FAILED      MAKE_DDHRESULT(725)
64 #define D3DERR_TEXTURE_SWAP_FAILED      MAKE_DDHRESULT(726)
65 #define D3DERR_TEXTURE_LOCKED           MAKE_DDHRESULT(727)
66 #define D3DERR_TEXTURE_NOT_LOCKED       MAKE_DDHRESULT(728)
67 #define D3DERR_TEXTURE_GETSURF_FAILED   MAKE_DDHRESULT(729)
68 #define D3DERR_MATRIX_CREATE_FAILED     MAKE_DDHRESULT(730)
69 #define D3DERR_MATRIX_DESTROY_FAILED    MAKE_DDHRESULT(731)
70 #define D3DERR_MATRIX_SETDATA_FAILED    MAKE_DDHRESULT(732)
71 #define D3DERR_MATRIX_GETDATA_FAILED    MAKE_DDHRESULT(733)
72 #define D3DERR_SETVIEWPORTDATA_FAILED   MAKE_DDHRESULT(734)
73 #define D3DERR_INVALIDCURRENTVIEWPORT   MAKE_DDHRESULT(735)
74 #define D3DERR_INVALIDPRIMITIVETYPE     MAKE_DDHRESULT(736)
75 #define D3DERR_INVALIDVERTEXTYPE        MAKE_DDHRESULT(737)
76 #define D3DERR_TEXTURE_BADSIZE          MAKE_DDHRESULT(738)
77 #define D3DERR_INVALIDRAMPTEXTURE       MAKE_DDHRESULT(739)
78 #define D3DERR_MATERIAL_CREATE_FAILED   MAKE_DDHRESULT(740)
79 #define D3DERR_MATERIAL_DESTROY_FAILED  MAKE_DDHRESULT(741)
80 #define D3DERR_MATERIAL_SETDATA_FAILED  MAKE_DDHRESULT(742)
81 #define D3DERR_MATERIAL_GETDATA_FAILED  MAKE_DDHRESULT(743)
82 #define D3DERR_INVALIDPALETTE           MAKE_DDHRESULT(744)
83 #define D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY MAKE_DDHRESULT(745)
84 #define D3DERR_ZBUFF_NEEDS_VIDEOMEMORY  MAKE_DDHRESULT(746)
85 #define D3DERR_SURFACENOTINVIDMEM       MAKE_DDHRESULT(747)
86 #define D3DERR_LIGHT_SET_FAILED         MAKE_DDHRESULT(750)
87 #define D3DERR_LIGHTHASVIEWPORT         MAKE_DDHRESULT(751)
88 #define D3DERR_LIGHTNOTINTHISVIEWPORT   MAKE_DDHRESULT(752)
89 #define D3DERR_SCENE_IN_SCENE           MAKE_DDHRESULT(760)
90 #define D3DERR_SCENE_NOT_IN_SCENE       MAKE_DDHRESULT(761)
91 #define D3DERR_SCENE_BEGIN_FAILED       MAKE_DDHRESULT(762)
92 #define D3DERR_SCENE_END_FAILED         MAKE_DDHRESULT(763)
93 #define D3DERR_INBEGIN                  MAKE_DDHRESULT(770)
94 #define D3DERR_NOTINBEGIN               MAKE_DDHRESULT(771)
95 #define D3DERR_NOVIEWPORTS              MAKE_DDHRESULT(772)
96 #define D3DERR_VIEWPORTDATANOTSET       MAKE_DDHRESULT(773)
97 #define D3DERR_VIEWPORTHASNODEVICE      MAKE_DDHRESULT(774)
98 #define D3DERR_NOCURRENTVIEWPORT        MAKE_DDHRESULT(775)
99
100 /* ********************************************************************
101    Enums
102    ******************************************************************** */
103 #define D3DNEXT_NEXT 0x01l
104 #define D3DNEXT_HEAD 0x02l
105 #define D3DNEXT_TAIL 0x04l
106
107 typedef enum {
108   D3DLIGHT_POINT          = 1,
109   D3DLIGHT_SPOT           = 2,
110   D3DLIGHT_DIRECTIONAL    = 3,
111   D3DLIGHT_PARALLELPOINT  = 4,
112   D3DLIGHT_FORCE_DWORD    = 0x7fffffff
113 } D3DLIGHTTYPE;
114
115 typedef enum {
116   D3DPT_POINTLIST     = 1,
117   D3DPT_LINELIST      = 2,
118   D3DPT_LINESTRIP     = 3,
119   D3DPT_TRIANGLELIST  = 4,
120   D3DPT_TRIANGLESTRIP = 5,
121   D3DPT_TRIANGLEFAN   = 6,
122   D3DPT_FORCE_DWORD   = 0x7fffffff
123 } D3DPRIMITIVETYPE;
124
125 typedef enum { 
126   D3DFILL_POINT         = 1, 
127   D3DFILL_WIREFRAME     = 2, 
128   D3DFILL_SOLID         = 3,
129   D3DFILL_FORCE_DWORD   = 0x7fffffff
130 } D3DFILLMODE; 
131
132 typedef enum { 
133   D3DSHADE_FLAT         = 1, 
134   D3DSHADE_GOURAUD      = 2, 
135   D3DSHADE_PHONG        = 3, 
136   D3DSHADE_FORCE_DWORD  = 0x7fffffff
137 } D3DSHADEMODE;
138
139 typedef enum { 
140   D3DCULL_NONE        = 1, 
141   D3DCULL_CW          = 2, 
142   D3DCULL_CCW         = 3, 
143   D3DCULL_FORCE_DWORD = 0x7fffffff 
144 } D3DCULL; 
145
146 typedef enum { 
147   D3DBLEND_ZERO            = 1, 
148   D3DBLEND_ONE             = 2, 
149   D3DBLEND_SRCCOLOR        = 3, 
150   D3DBLEND_INVSRCCOLOR     = 4, 
151   D3DBLEND_SRCALPHA        = 5, 
152   D3DBLEND_INVSRCALPHA     = 6, 
153   D3DBLEND_DESTALPHA       = 7, 
154   D3DBLEND_INVDESTALPHA    = 8, 
155   D3DBLEND_DESTCOLOR       = 9, 
156   D3DBLEND_INVDESTCOLOR    = 10, 
157   D3DBLEND_SRCALPHASAT     = 11, 
158   D3DBLEND_BOTHSRCALPHA    = 12, 
159   D3DBLEND_BOTHINVSRCALPHA = 13, 
160   D3DBLEND_FORCE_DWORD     = 0x7fffffff
161 } D3DBLEND; 
162
163 typedef enum { 
164   D3DTBLEND_DECAL         = 1, 
165   D3DTBLEND_MODULATE      = 2, 
166   D3DTBLEND_DECALALPHA    = 3, 
167   D3DTBLEND_MODULATEALPHA = 4, 
168   D3DTBLEND_DECALMASK     = 5, 
169   D3DTBLEND_MODULATEMASK  = 6, 
170   D3DTBLEND_COPY          = 7, 
171   D3DTBLEND_ADD           = 8, 
172   D3DTBLEND_FORCE_DWORD   = 0x7fffffff
173 } D3DTEXTUREBLEND;
174
175 typedef enum { 
176   D3DFILTER_NEAREST          = 1, 
177   D3DFILTER_LINEAR           = 2, 
178   D3DFILTER_MIPNEAREST       = 3, 
179   D3DFILTER_MIPLINEAR        = 4, 
180   D3DFILTER_LINEARMIPNEAREST = 5, 
181   D3DFILTER_LINEARMIPLINEAR  = 6, 
182   D3DFILTER_FORCE_DWORD      = 0x7fffffff
183 } D3DTEXTUREFILTER;
184
185 typedef enum {
186   D3DRENDERSTATE_TEXTUREHANDLE      = 1,    /* Texture handle */
187   D3DRENDERSTATE_ANTIALIAS          = 2,    /* D3DANTIALIASMODE */
188   D3DRENDERSTATE_TEXTUREADDRESS     = 3,    /* D3DTEXTUREADDRESS      */
189   D3DRENDERSTATE_TEXTUREPERSPECTIVE = 4,    /* TRUE for perspective correction */
190   D3DRENDERSTATE_WRAPU              = 5,    /* TRUE for wrapping in u */
191   D3DRENDERSTATE_WRAPV              = 6,    /* TRUE for wrapping in v */
192   D3DRENDERSTATE_ZENABLE            = 7,    /* TRUE to enable z test */
193   D3DRENDERSTATE_FILLMODE           = 8,    /* D3DFILL_MODE            */
194   D3DRENDERSTATE_SHADEMODE          = 9,    /* D3DSHADEMODE */
195   D3DRENDERSTATE_LINEPATTERN        = 10,   /* D3DLINEPATTERN */
196   D3DRENDERSTATE_MONOENABLE         = 11,   /* TRUE to enable mono rasterization */
197   D3DRENDERSTATE_ROP2               = 12,   /* ROP2 */
198   D3DRENDERSTATE_PLANEMASK          = 13,   /* DWORD physical plane mask */
199   D3DRENDERSTATE_ZWRITEENABLE       = 14,   /* TRUE to enable z writes */
200   D3DRENDERSTATE_ALPHATESTENABLE    = 15,   /* TRUE to enable alpha tests */
201   D3DRENDERSTATE_LASTPIXEL          = 16,   /* TRUE for last-pixel on lines */
202   D3DRENDERSTATE_TEXTUREMAG         = 17,   /* D3DTEXTUREFILTER */
203   D3DRENDERSTATE_TEXTUREMIN         = 18,   /* D3DTEXTUREFILTER */
204   D3DRENDERSTATE_SRCBLEND           = 19,   /* D3DBLEND */
205   D3DRENDERSTATE_DESTBLEND          = 20,   /* D3DBLEND */
206   D3DRENDERSTATE_TEXTUREMAPBLEND    = 21,   /* D3DTEXTUREBLEND */
207   D3DRENDERSTATE_CULLMODE           = 22,   /* D3DCULL */
208   D3DRENDERSTATE_ZFUNC              = 23,   /* D3DCMPFUNC */
209   D3DRENDERSTATE_ALPHAREF           = 24,   /* D3DFIXED */
210   D3DRENDERSTATE_ALPHAFUNC          = 25,   /* D3DCMPFUNC */
211   D3DRENDERSTATE_DITHERENABLE       = 26,   /* TRUE to enable dithering */
212   D3DRENDERSTATE_ALPHABLENDENABLE   = 27,   /* TRUE to enable alpha blending */
213   D3DRENDERSTATE_FOGENABLE          = 28,   /* TRUE to enable fog */
214   D3DRENDERSTATE_SPECULARENABLE     = 29,   /* TRUE to enable specular */
215   D3DRENDERSTATE_ZVISIBLE           = 30,   /* TRUE to enable z checking */
216   D3DRENDERSTATE_SUBPIXEL           = 31,   /* TRUE to enable subpixel correction */
217   D3DRENDERSTATE_SUBPIXELX          = 32,   /* TRUE to enable correction in X only */
218   D3DRENDERSTATE_STIPPLEDALPHA      = 33,   /* TRUE to enable stippled alpha */
219   D3DRENDERSTATE_FOGCOLOR           = 34,   /* D3DCOLOR */
220   D3DRENDERSTATE_FOGTABLEMODE       = 35,   /* D3DFOGMODE */
221   D3DRENDERSTATE_FOGTABLESTART      = 36,   /* Fog table start        */
222   D3DRENDERSTATE_FOGTABLEEND        = 37,   /* Fog table end          */
223   D3DRENDERSTATE_FOGTABLEDENSITY    = 38,   /* Fog table density      */
224   D3DRENDERSTATE_STIPPLEENABLE      = 39,   /* TRUE to enable stippling */
225   D3DRENDERSTATE_EDGEANTIALIAS      = 40,   /* TRUE to enable edge antialiasing */
226   D3DRENDERSTATE_COLORKEYENABLE     = 41,   /* TRUE to enable source colorkeyed textures */
227   D3DRENDERSTATE_BORDERCOLOR        = 43,   /* Border color for texturing w/border */
228   D3DRENDERSTATE_TEXTUREADDRESSU    = 44,   /* Texture addressing mode for U coordinate */
229   D3DRENDERSTATE_TEXTUREADDRESSV    = 45,   /* Texture addressing mode for V coordinate */
230   D3DRENDERSTATE_MIPMAPLODBIAS      = 46,   /* D3DVALUE Mipmap LOD bias */
231   D3DRENDERSTATE_ZBIAS              = 47,   /* LONG Z bias */
232   D3DRENDERSTATE_RANGEFOGENABLE     = 48,   /* Enables range-based fog */
233   D3DRENDERSTATE_ANISOTROPY         = 49,   /* Max. anisotropy. 1 = no anisotropy */
234   D3DRENDERSTATE_FLUSHBATCH         = 50,   /* Explicit flush for DP batching (DX5 Only) */
235   D3DRENDERSTATE_STIPPLEPATTERN00   = 64,   /* Stipple pattern 01...  */
236   D3DRENDERSTATE_STIPPLEPATTERN01   = 65,
237   D3DRENDERSTATE_STIPPLEPATTERN02   = 66,
238   D3DRENDERSTATE_STIPPLEPATTERN03   = 67,
239   D3DRENDERSTATE_STIPPLEPATTERN04   = 68,
240   D3DRENDERSTATE_STIPPLEPATTERN05   = 69,
241   D3DRENDERSTATE_STIPPLEPATTERN06   = 70,
242   D3DRENDERSTATE_STIPPLEPATTERN07   = 71,
243   D3DRENDERSTATE_STIPPLEPATTERN08   = 72,
244   D3DRENDERSTATE_STIPPLEPATTERN09   = 73,
245   D3DRENDERSTATE_STIPPLEPATTERN10   = 74,
246   D3DRENDERSTATE_STIPPLEPATTERN11   = 75,
247   D3DRENDERSTATE_STIPPLEPATTERN12   = 76,
248   D3DRENDERSTATE_STIPPLEPATTERN13   = 77,
249   D3DRENDERSTATE_STIPPLEPATTERN14   = 78,
250   D3DRENDERSTATE_STIPPLEPATTERN15   = 79,
251   D3DRENDERSTATE_STIPPLEPATTERN16   = 80,
252   D3DRENDERSTATE_STIPPLEPATTERN17   = 81,
253   D3DRENDERSTATE_STIPPLEPATTERN18   = 82,
254   D3DRENDERSTATE_STIPPLEPATTERN19   = 83,
255   D3DRENDERSTATE_STIPPLEPATTERN20   = 84,
256   D3DRENDERSTATE_STIPPLEPATTERN21   = 85,
257   D3DRENDERSTATE_STIPPLEPATTERN22   = 86,
258   D3DRENDERSTATE_STIPPLEPATTERN23   = 87,
259   D3DRENDERSTATE_STIPPLEPATTERN24   = 88,
260   D3DRENDERSTATE_STIPPLEPATTERN25   = 89,
261   D3DRENDERSTATE_STIPPLEPATTERN26   = 90,
262   D3DRENDERSTATE_STIPPLEPATTERN27   = 91,
263   D3DRENDERSTATE_STIPPLEPATTERN28   = 92,
264   D3DRENDERSTATE_STIPPLEPATTERN29   = 93,
265   D3DRENDERSTATE_STIPPLEPATTERN30   = 94,
266   D3DRENDERSTATE_STIPPLEPATTERN31   = 95,
267   D3DRENDERSTATE_FORCE_DWORD        = 0x7fffffff, /* force 32-bit size enum */
268 } D3DRENDERSTATETYPE;
269
270 typedef enum { 
271   D3DCMP_NEVER        = 1, 
272   D3DCMP_LESS         = 2, 
273   D3DCMP_EQUAL        = 3, 
274   D3DCMP_LESSEQUAL    = 4, 
275   D3DCMP_GREATER      = 5, 
276   D3DCMP_NOTEQUAL     = 6, 
277   D3DCMP_GREATEREQUAL = 7, 
278   D3DCMP_ALWAYS       = 8, 
279   D3DCMP_FORCE_DWORD  = 0x7fffffff
280 } D3DCMPFUNC; 
281
282 typedef enum {
283   D3DLIGHTSTATE_MATERIAL      = 1,
284   D3DLIGHTSTATE_AMBIENT       = 2,
285   D3DLIGHTSTATE_COLORMODEL    = 3,
286   D3DLIGHTSTATE_FOGMODE       = 4,
287   D3DLIGHTSTATE_FOGSTART      = 5,
288   D3DLIGHTSTATE_FOGEND        = 6,
289   D3DLIGHTSTATE_FOGDENSITY    = 7,
290   D3DLIGHTSTATE_FORCE_DWORD   = 0x7fffffff, /* force 32-bit size enum */
291 } D3DLIGHTSTATETYPE;
292
293 typedef enum {
294   D3DVT_VERTEX        = 1,
295   D3DVT_LVERTEX       = 2,
296   D3DVT_TLVERTEX      = 3,
297   D3DVT_FORCE_DWORD   = 0x7fffffff, /* force 32-bit size enum */
298 } D3DVERTEXTYPE;
299
300 typedef enum {
301   D3DTRANSFORMSTATE_WORLD           = 1,
302   D3DTRANSFORMSTATE_VIEW            = 2,
303   D3DTRANSFORMSTATE_PROJECTION      = 3,
304   D3DTRANSFORMSTATE_FORCE_DWORD     = 0x7fffffff, /* force 32-bit size enum */
305 } D3DTRANSFORMSTATETYPE;
306
307 /* ********************************************************************
308    Types and structures
309    ******************************************************************** */
310 typedef DWORD D3DMATERIALHANDLE, *LPD3DMATERIALHANDLE;
311 typedef DWORD D3DTEXTUREHANDLE,  *LPD3DTEXTUREHANDLE;
312 typedef DWORD D3DVIEWPORTHANDLE, *LPD3DVIEWPORTHANDLE;
313 typedef DWORD D3DMATRIXHANDLE,   *LPD3DMATRIXHANDLE;
314
315 typedef DWORD D3DCOLOR, *LPD3DCOLOR;
316
317 typedef struct {
318         DWORD   dwSize;
319         DWORD   dwCaps;
320 } D3DTRANSFORMCAPS,*LPD3DTRANSFORMCAPS;
321
322 #define D3DTRANSFORMCAPS_CLIP   0x00000001
323
324 typedef struct {
325         DWORD   dwSize;
326         DWORD   dwCaps;
327         DWORD   dwLightingModel;
328         DWORD   dwNumLights;
329 } D3DLIGHTINGCAPS, *LPD3DLIGHTINGCAPS;
330
331 #define D3DLIGHTINGMODEL_RGB            0x00000001
332 #define D3DLIGHTINGMODEL_MONO           0x00000002
333
334 #define D3DLIGHTCAPS_POINT              0x00000001
335 #define D3DLIGHTCAPS_SPOT               0x00000002
336 #define D3DLIGHTCAPS_DIRECTIONAL        0x00000004
337 #define D3DLIGHTCAPS_PARALLELPOINT      0x00000008
338
339
340 #define D3DCOLOR_MONO   1
341 #define D3DCOLOR_RGB    2
342
343 typedef DWORD D3DCOLORMODEL;
344
345 typedef struct {
346     DWORD dwSize;
347     DWORD dwMiscCaps;                 /* Capability flags */
348     DWORD dwRasterCaps;
349     DWORD dwZCmpCaps;
350     DWORD dwSrcBlendCaps;
351     DWORD dwDestBlendCaps;
352     DWORD dwAlphaCmpCaps;
353     DWORD dwShadeCaps;
354     DWORD dwTextureCaps;
355     DWORD dwTextureFilterCaps;
356     DWORD dwTextureBlendCaps;
357     DWORD dwTextureAddressCaps;
358     DWORD dwStippleWidth;             /* maximum width and height of */
359     DWORD dwStippleHeight;            /* of supported stipple (up to 32x32) */
360 } D3DPRIMCAPS, *LPD3DPRIMCAPS;
361
362 /* D3DPRIMCAPS.dwMiscCaps */
363 #define D3DPMISCCAPS_MASKPLANES         0x00000001
364 #define D3DPMISCCAPS_MASKZ              0x00000002
365 #define D3DPMISCCAPS_LINEPATTERNREP     0x00000004
366 #define D3DPMISCCAPS_CONFORMANT         0x00000008
367 #define D3DPMISCCAPS_CULLNONE           0x00000010
368 #define D3DPMISCCAPS_CULLCW             0x00000020
369 #define D3DPMISCCAPS_CULLCCW            0x00000040
370
371 /* D3DPRIMCAPS.dwRasterCaps */
372 #define D3DPRASTERCAPS_DITHER                   0x00000001
373 #define D3DPRASTERCAPS_ROP2                     0x00000002
374 #define D3DPRASTERCAPS_XOR                      0x00000004
375 #define D3DPRASTERCAPS_PAT                      0x00000008
376 #define D3DPRASTERCAPS_ZTEST                    0x00000010
377 #define D3DPRASTERCAPS_SUBPIXEL                 0x00000020
378 #define D3DPRASTERCAPS_SUBPIXELX                0x00000040
379 #define D3DPRASTERCAPS_FOGVERTEX                0x00000080
380 #define D3DPRASTERCAPS_FOGTABLE                 0x00000100
381 #define D3DPRASTERCAPS_STIPPLE                  0x00000200
382 #define D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT   0x00000400
383 #define D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT 0x00000800
384 #define D3DPRASTERCAPS_ANTIALIASEDGES           0x00001000
385 #define D3DPRASTERCAPS_MIPMAPLODBIAS            0x00002000
386 #define D3DPRASTERCAPS_ZBIAS                    0x00004000
387 #define D3DPRASTERCAPS_ZBUFFERLESSHSR           0x00008000
388 #define D3DPRASTERCAPS_FOGRANGE                 0x00010000
389 #define D3DPRASTERCAPS_ANISOTROPY               0x00020000
390
391 /* D3DPRIMCAPS.dwZCmpCaps and dwAlphaCmpCaps */
392 #define D3DPCMPCAPS_NEVER               0x00000001
393 #define D3DPCMPCAPS_LESS                0x00000002
394 #define D3DPCMPCAPS_EQUAL               0x00000004
395 #define D3DPCMPCAPS_LESSEQUAL           0x00000008
396 #define D3DPCMPCAPS_GREATER             0x00000010
397 #define D3DPCMPCAPS_NOTEQUAL            0x00000020
398 #define D3DPCMPCAPS_GREATEREQUAL        0x00000040
399 #define D3DPCMPCAPS_ALWAYS              0x00000080
400
401 /* D3DPRIMCAPS.dwSourceBlendCaps, dwDestBlendCaps */
402 #define D3DPBLENDCAPS_ZERO              0x00000001
403 #define D3DPBLENDCAPS_ONE               0x00000002
404 #define D3DPBLENDCAPS_SRCCOLOR          0x00000004
405 #define D3DPBLENDCAPS_INVSRCCOLOR       0x00000008
406 #define D3DPBLENDCAPS_SRCALPHA          0x00000010
407 #define D3DPBLENDCAPS_INVSRCALPHA       0x00000020
408 #define D3DPBLENDCAPS_DESTALPHA         0x00000040
409 #define D3DPBLENDCAPS_INVDESTALPHA      0x00000080
410 #define D3DPBLENDCAPS_DESTCOLOR         0x00000100
411 #define D3DPBLENDCAPS_INVDESTCOLOR      0x00000200
412 #define D3DPBLENDCAPS_SRCALPHASAT       0x00000400
413 #define D3DPBLENDCAPS_BOTHSRCALPHA      0x00000800
414 #define D3DPBLENDCAPS_BOTHINVSRCALPHA   0x00001000
415
416 /* D3DPRIMCAPS.dwShadeCaps */
417 #define D3DPSHADECAPS_COLORFLATMONO     0x00000001
418 #define D3DPSHADECAPS_COLORFLATRGB      0x00000002
419 #define D3DPSHADECAPS_COLORGOURAUDMONO  0x00000004
420 #define D3DPSHADECAPS_COLORGOURAUDRGB   0x00000008
421 #define D3DPSHADECAPS_COLORPHONGMONO    0x00000010
422 #define D3DPSHADECAPS_COLORPHONGRGB     0x00000020
423
424 #define D3DPSHADECAPS_SPECULARFLATMONO  0x00000040
425 #define D3DPSHADECAPS_SPECULARFLATRGB   0x00000080
426 #define D3DPSHADECAPS_SPECULARGOURAUDMONO       0x00000100
427 #define D3DPSHADECAPS_SPECULARGOURAUDRGB        0x00000200
428 #define D3DPSHADECAPS_SPECULARPHONGMONO 0x00000400
429 #define D3DPSHADECAPS_SPECULARPHONGRGB  0x00000800
430
431 #define D3DPSHADECAPS_ALPHAFLATBLEND    0x00001000
432 #define D3DPSHADECAPS_ALPHAFLATSTIPPLED 0x00002000
433 #define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000
434 #define D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED      0x00008000
435 #define D3DPSHADECAPS_ALPHAPHONGBLEND   0x00010000
436 #define D3DPSHADECAPS_ALPHAPHONGSTIPPLED        0x00020000
437
438 #define D3DPSHADECAPS_FOGFLAT           0x00040000
439 #define D3DPSHADECAPS_FOGGOURAUD        0x00080000
440 #define D3DPSHADECAPS_FOGPHONG          0x00100000
441
442 /* D3DPRIMCAPS.dwTextureCaps */
443 #define D3DPTEXTURECAPS_PERSPECTIVE     0x00000001
444 #define D3DPTEXTURECAPS_POW2            0x00000002
445 #define D3DPTEXTURECAPS_ALPHA           0x00000004
446 #define D3DPTEXTURECAPS_TRANSPARENCY    0x00000008
447 #define D3DPTEXTURECAPS_BORDER          0x00000010
448 #define D3DPTEXTURECAPS_SQUAREONLY      0x00000020
449
450 /* D3DPRIMCAPS.dwTextureFilterCaps */
451 #define D3DPTFILTERCAPS_NEAREST         0x00000001
452 #define D3DPTFILTERCAPS_LINEAR          0x00000002
453 #define D3DPTFILTERCAPS_MIPNEAREST      0x00000004
454 #define D3DPTFILTERCAPS_MIPLINEAR       0x00000008
455 #define D3DPTFILTERCAPS_LINEARMIPNEAREST        0x00000010
456 #define D3DPTFILTERCAPS_LINEARMIPLINEAR 0x00000020
457
458 /* D3DPRIMCAPS.dwTextureBlendCaps */
459 #define D3DPTBLENDCAPS_DECAL            0x00000001
460 #define D3DPTBLENDCAPS_MODULATE         0x00000002
461 #define D3DPTBLENDCAPS_DECALALPHA       0x00000004
462 #define D3DPTBLENDCAPS_MODULATEALPHA    0x00000008
463 #define D3DPTBLENDCAPS_DECALMASK        0x00000010
464 #define D3DPTBLENDCAPS_MODULATEMASK     0x00000020
465 #define D3DPTBLENDCAPS_COPY             0x00000040
466 #define D3DPTBLENDCAPS_ADD              0x00000080
467
468 /* D3DPRIMCAPS.dwTextureAddressCaps */
469 #define D3DPTADDRESSCAPS_WRAP           0x00000001
470 #define D3DPTADDRESSCAPS_MIRROR         0x00000002
471 #define D3DPTADDRESSCAPS_CLAMP          0x00000004
472 #define D3DPTADDRESSCAPS_BORDER         0x00000008
473 #define D3DPTADDRESSCAPS_INDEPENDENTUV  0x00000010
474
475
476 /* D3DDEVICEDESC.dwFlags */
477 #define D3DDD_COLORMODEL                0x00000001
478 #define D3DDD_DEVCAPS                   0x00000002
479 #define D3DDD_TRANSFORMCAPS             0x00000004
480 #define D3DDD_LIGHTINGCAPS              0x00000008
481 #define D3DDD_BCLIPPING                 0x00000010
482 #define D3DDD_LINECAPS                  0x00000020
483 #define D3DDD_TRICAPS                   0x00000040
484 #define D3DDD_DEVICERENDERBITDEPTH      0x00000080
485 #define D3DDD_DEVICEZBUFFERBITDEPTH     0x00000100
486 #define D3DDD_MAXBUFFERSIZE             0x00000200
487 #define D3DDD_MAXVERTEXCOUNT            0x00000400
488
489 /* D3DDEVICEDESC.dwDevCaps */
490 #define D3DDEVCAPS_FLOATTLVERTEX        0x00000001
491 #define D3DDEVCAPS_SORTINCREASINGZ      0x00000002
492 #define D3DDEVCAPS_SORTDECREASINGZ      0X00000004
493 #define D3DDEVCAPS_SORTEXACT            0x00000008
494 #define D3DDEVCAPS_EXECUTESYSTEMMEMORY  0x00000010
495 #define D3DDEVCAPS_EXECUTEVIDEOMEMORY   0x00000020
496 #define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040
497 #define D3DDEVCAPS_TLVERTEXVIDEOMEMORY  0x00000080
498 #define D3DDEVCAPS_TEXTURESYSTEMMEMORY  0x00000100
499 #define D3DDEVCAPS_TEXTUREVIDEOMEMORY   0x00000200
500 #define D3DDEVCAPS_DRAWPRIMTLVERTEX     0x00000400
501 #define D3DDEVCAPS_CANRENDERAFTERFLIP   0x00000800
502 #define D3DDEVCAPS_TEXTURENONLOCALVIDMEM 0x00001000
503
504 typedef struct _D3DDeviceDesc {
505         DWORD           dwSize;
506         DWORD           dwFlags;
507         D3DCOLORMODEL   dcmColorModel;
508         DWORD           dwDevCaps;
509         D3DTRANSFORMCAPS dtcTransformCaps;
510         BOOL32          bClipping;
511         D3DLIGHTINGCAPS dlcLightingCaps;
512         D3DPRIMCAPS     dpcLineCaps;
513         D3DPRIMCAPS     dpcTriCaps;
514         DWORD           dwDeviceRenderBitDepth;
515         DWORD           dwDeviceZBufferBitDepth;
516         DWORD           dwMaxBufferSize;
517         DWORD           dwMaxVertexCount;
518         /* *** New fields for DX5 *** */
519         DWORD           dwMinTextureWidth,dwMinTextureHeight;
520         DWORD           dwMaxTextureWidth,dwMaxTextureHeight;
521         DWORD           dwMinStippleWidth,dwMaxStippleWidth;
522         DWORD           dwMinStippleHeight,dwMaxStippleHeight;
523 } D3DDEVICEDESC,*LPD3DDEVICEDESC;
524  
525 typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK)(LPGUID lpGuid,LPSTR lpDeviceDescription,LPSTR lpDeviceName,LPD3DDEVICEDESC,LPD3DDEVICEDESC,LPVOID);
526 typedef HRESULT (CALLBACK* LPD3DVALIDATECALLBACK)(LPVOID lpUserArg, DWORD dwOffset);
527
528
529 /* dwflags for FindDevice */
530 #define D3DFDS_COLORMODEL               0x00000001
531 #define D3DFDS_GUID                     0x00000002
532 #define D3DFDS_HARDWARE                 0x00000004
533 #define D3DFDS_TRIANGLES                0x00000008
534 #define D3DFDS_LINES                    0x00000010
535 #define D3DFDS_MISCCAPS                 0x00000020
536 #define D3DFDS_RASTERCAPS               0x00000040
537 #define D3DFDS_ZCMPCAPS                 0x00000080
538 #define D3DFDS_ALPHACMPCAPS             0x00000100
539 #define D3DFDS_DSTBLENDCAPS             0x00000400
540 #define D3DFDS_SHADECAPS                0x00000800
541 #define D3DFDS_TEXTURECAPS              0x00001000
542 #define D3DFDS_TEXTUREFILTERCAPS        0x00002000
543 #define D3DFDS_TEXTUREBLENDCAPS         0x00004000
544 #define D3DFDS_TEXTUREADDRESSCAPS       0x00008000
545
546 typedef struct {
547     DWORD               dwSize;
548     DWORD               dwFlags;
549     BOOL32              bHardware;
550     D3DCOLORMODEL       dcmColorModel;
551     GUID                guid;
552     DWORD               dwCaps;
553     D3DPRIMCAPS         dpcPrimCaps;
554 } D3DFINDDEVICESEARCH,*LPD3DFINDDEVICESEARCH;
555
556 typedef struct {
557     DWORD               dwSize;
558     GUID                guid;
559     D3DDEVICEDESC       ddHwDesc;
560     D3DDEVICEDESC       ddSwDesc;
561 } D3DFINDDEVICERESULT,*LPD3DFINDDEVICERESULT;
562
563 #define D3DVALP(val, prec)      ((float)(val))
564 #define D3DVAL(val)             ((float)(val))
565 typedef float D3DVALUE,*LPD3DVALUE;
566 #define D3DDivide(a, b)         (float)((double) (a) / (double) (b))
567 #define D3DMultiply(a, b)       ((a) * (b))
568
569 typedef struct {
570   DWORD         dwFlags;        /* Homogeneous clipping flags */
571         union {
572     D3DVALUE    hx;
573     D3DVALUE    dvHX;
574   } x;
575   union {
576     D3DVALUE    hy;
577     D3DVALUE    dvHY;
578   } y;
579   union {
580     D3DVALUE    hz;
581     D3DVALUE    dvHZ;
582   } z;
583 } D3DHVERTEX, *LPD3DHVERTEX;
584 /*
585  * Transformed/lit vertices
586  */
587 typedef struct {
588   union {
589     D3DVALUE    sx;             /* Screen coordinates */
590     D3DVALUE    dvSX;
591   } x;
592   union {
593     D3DVALUE    sy;
594     D3DVALUE    dvSY;
595   } y;
596   union {
597     D3DVALUE    sz;
598     D3DVALUE    dvSZ;
599   } z;
600   union {
601     D3DVALUE    rhw;            /* Reciprocal of homogeneous w */
602     D3DVALUE    dvRHW;
603   } r;
604   union {
605     D3DCOLOR    color;          /* Vertex color */
606     D3DCOLOR    dcColor;
607   } c;
608   union {
609     D3DCOLOR    specular;       /* Specular component of vertex */
610     D3DCOLOR    dcSpecular;
611   } s;
612   union {
613     D3DVALUE    tu;             /* Texture coordinates */
614     D3DVALUE    dvTU;
615   } u;
616   union {
617     D3DVALUE    tv;
618     D3DVALUE    dvTV;
619   } v;
620 } D3DTLVERTEX, *LPD3DTLVERTEX;
621 typedef struct {
622   union {
623     D3DVALUE     x;             /* Homogeneous coordinates */
624                 D3DVALUE dvX;
625         } x;
626         union {
627                 D3DVALUE y;
628                 D3DVALUE dvY;
629         } y;
630         union {
631                 D3DVALUE z;
632                 D3DVALUE dvZ;
633         } z;
634   DWORD            dwReserved;
635   union {
636     D3DCOLOR     color;         /* Vertex color */
637     D3DCOLOR     dcColor;
638   } c;
639   union {
640     D3DCOLOR     specular;      /* Specular component of vertex */
641     D3DCOLOR     dcSpecular;
642   } s;
643   union {
644     D3DVALUE     tu;            /* Texture coordinates */
645     D3DVALUE     dvTU;
646   } u;
647   union {
648     D3DVALUE     tv;
649     D3DVALUE     dvTV;
650   } v;
651 } D3DLVERTEX, *LPD3DLVERTEX;
652 typedef struct {
653   union {
654     D3DVALUE     x;             /* Homogeneous coordinates */
655     D3DVALUE     dvX;
656   } x;
657   union {
658     D3DVALUE     y;
659     D3DVALUE     dvY;
660   } y;
661   union {
662     D3DVALUE     z;
663     D3DVALUE     dvZ;
664   } z;
665   union {
666     D3DVALUE     nx;            /* Normal */
667     D3DVALUE     dvNX;
668   } nx;
669   union {
670     D3DVALUE     ny;
671     D3DVALUE     dvNY;
672   } ny;
673   union {
674     D3DVALUE     nz;
675     D3DVALUE     dvNZ;
676   } nz;
677   union {
678     D3DVALUE     tu;            /* Texture coordinates */
679     D3DVALUE     dvTU;
680   } u;
681   union {
682     D3DVALUE     tv;
683     D3DVALUE     dvTV;
684   } v;
685 } D3DVERTEX, *LPD3DVERTEX;
686
687 typedef struct {
688   union {
689     LONG x1;
690     LONG lX1;
691   } x1;
692   union {
693     LONG y1;
694     LONG lY1;
695   } y1;
696   union {
697     LONG x2;
698     LONG lX2;
699   } x2;
700   union {
701     LONG y2;
702     LONG lY2;
703   } y2;
704 } D3DRECT, *LPD3DRECT;
705
706 typedef struct {
707   union {
708         D3DVALUE        x;
709     D3DVALUE dvX;
710   } x;
711   union {
712         D3DVALUE        y;
713     D3DVALUE dvY;
714   } y;
715   union {
716         D3DVALUE        z;
717     D3DVALUE dvZ;
718   } z;
719   /* the c++ variant has operator overloads etc. too */
720 } D3DVECTOR,*LPD3DVECTOR;
721
722 typedef struct {
723   D3DVALUE        _11, _12, _13, _14;
724   D3DVALUE        _21, _22, _23, _24;
725   D3DVALUE        _31, _32, _33, _34;
726   D3DVALUE        _41, _42, _43, _44;
727 } D3DMATRIX, *LPD3DMATRIX;
728
729 typedef struct _D3DCOLORVALUE {
730         union {
731                 D3DVALUE r;
732                 D3DVALUE dvR;
733         } r;
734         union {
735                 D3DVALUE g;
736                 D3DVALUE dvG;
737         } g;
738         union {
739                 D3DVALUE b;
740                 D3DVALUE dvB;
741         } b;
742         union {
743                 D3DVALUE a;
744                 D3DVALUE dvA;
745         } a;
746 } D3DCOLORVALUE,*LPD3DCOLORVALUE;
747
748 typedef struct {
749     DWORD           dwSize;
750     D3DLIGHTTYPE    dltType;
751     D3DCOLORVALUE   dcvColor;
752     D3DVECTOR       dvPosition;         /* Position in world space */
753     D3DVECTOR       dvDirection;        /* Direction in world space */
754     D3DVALUE        dvRange;            /* Cutoff range */
755     D3DVALUE        dvFalloff;          /* Falloff */
756     D3DVALUE        dvAttenuation0;     /* Constant attenuation */
757     D3DVALUE        dvAttenuation1;     /* Linear attenuation */
758     D3DVALUE        dvAttenuation2;     /* Quadratic attenuation */
759     D3DVALUE        dvTheta;            /* Inner angle of spotlight cone */
760     D3DVALUE        dvPhi;              /* Outer angle of spotlight cone */
761 } D3DLIGHT,*LPD3DLIGHT;
762
763 /* flags bits */
764 #define D3DLIGHT_ACTIVE         0x00000001
765 #define D3DLIGHT_NO_SPECULAR    0x00000002
766
767 /* Textures */
768 typedef HRESULT (CALLBACK* LPD3DENUMTEXTUREFORMATSCALLBACK)(LPDDSURFACEDESC lpDdsd, LPVOID lpContext);
769
770
771 /* Statistics structure */
772 typedef struct {
773   DWORD        dwSize;
774   DWORD        dwTrianglesDrawn;
775   DWORD        dwLinesDrawn;
776   DWORD        dwPointsDrawn;
777   DWORD        dwSpansDrawn;
778   DWORD        dwVerticesProcessed;
779 } D3DSTATS, *LPD3DSTATS;
780
781 /* Clipping */
782 typedef struct _D3DCLIPSTATUS {
783   DWORD dwFlags; /* Do we set 2d extents, 3D extents or status */
784   DWORD dwStatus; /* Clip status */
785   float minx, maxx; /* X extents */
786   float miny, maxy; /* Y extents */
787   float minz, maxz; /* Z extents */
788 } D3DCLIPSTATUS, *LPD3DCLIPSTATUS;
789
790 typedef struct {
791   DWORD               dwSize;
792   union {
793     D3DCOLORVALUE   diffuse;        /* Diffuse color RGBA */
794     D3DCOLORVALUE   dcvDiffuse;
795   } a;
796   union {
797     D3DCOLORVALUE   ambient;        /* Ambient color RGB */
798     D3DCOLORVALUE   dcvAmbient;
799   } b;
800   union {
801     D3DCOLORVALUE   specular;       /* Specular 'shininess' */
802     D3DCOLORVALUE   dcvSpecular;
803   } c;
804   union {
805     D3DCOLORVALUE   emissive;       /* Emissive color RGB */
806     D3DCOLORVALUE   dcvEmissive;
807   } d;
808   union {
809     D3DVALUE        power;          /* Sharpness if specular highlight */
810     D3DVALUE        dvPower;
811   } e;
812   D3DTEXTUREHANDLE    hTexture;       /* Handle to texture map */
813   DWORD               dwRampSize;
814 } D3DMATERIAL, *LPD3DMATERIAL;
815
816 typedef struct {
817   D3DVECTOR dvPosition;  /* Lightable point in model space */
818   D3DVECTOR dvNormal;    /* Normalised unit vector */
819 } D3DLIGHTINGELEMENT, *LPD3DLIGHTINGELEMENT;
820
821 typedef struct {
822   DWORD       dwSize;
823   DWORD       dwX;
824   DWORD       dwY;            /* Top left */
825   DWORD       dwWidth;
826   DWORD       dwHeight;       /* Dimensions */
827   D3DVALUE    dvScaleX;       /* Scale homogeneous to screen */
828   D3DVALUE    dvScaleY;       /* Scale homogeneous to screen */
829   D3DVALUE    dvMaxX;         /* Min/max homogeneous x coord */
830   D3DVALUE    dvMaxY;         /* Min/max homogeneous y coord */
831   D3DVALUE    dvMinZ;
832   D3DVALUE    dvMaxZ;         /* Min/max homogeneous z coord */
833 } D3DVIEWPORT, *LPD3DVIEWPORT;
834
835 typedef struct {
836   DWORD       dwSize;
837   DWORD       dwX;
838   DWORD       dwY;            /* Viewport Top left */
839   DWORD       dwWidth;
840   DWORD       dwHeight;       /* Viewport Dimensions */
841   D3DVALUE    dvClipX;        /* Top left of clip volume */
842   D3DVALUE    dvClipY;
843   D3DVALUE    dvClipWidth;    /* Clip Volume Dimensions */
844   D3DVALUE    dvClipHeight;
845   D3DVALUE    dvMinZ;         /* Min/max of clip Volume */
846   D3DVALUE    dvMaxZ;
847 } D3DVIEWPORT2, *LPD3DVIEWPORT2;
848
849 #define D3DTRANSFORM_CLIPPED       0x00000001l
850 #define D3DTRANSFORM_UNCLIPPED     0x00000002l
851
852 typedef struct {
853   DWORD           dwSize;
854   LPVOID          lpIn;           /* Input vertices */
855   DWORD           dwInSize;       /* Stride of input vertices */
856   LPVOID          lpOut;          /* Output vertices */
857   DWORD           dwOutSize;      /* Stride of output vertices */
858   LPD3DHVERTEX    lpHOut;         /* Output homogeneous vertices */
859   DWORD           dwClip;         /* Clipping hint */
860   DWORD           dwClipIntersection;
861   DWORD           dwClipUnion;    /* Union of all clip flags */
862   D3DRECT         drExtent;       /* Extent of transformed vertices */
863 } D3DTRANSFORMDATA, *LPD3DTRANSFORMDATA;
864
865 /* flags bits */
866 #define D3DLIGHT_ACTIVE         0x00000001
867 #define D3DLIGHT_NO_SPECULAR    0x00000002
868
869 /* maximum valid light range */
870 #define D3DLIGHT_RANGE_MAX              ((float)sqrt(FLT_MAX))
871
872 typedef struct _D3DLIGHT2 {
873   DWORD           dwSize;
874   D3DLIGHTTYPE    dltType;            /* Type of light source */
875   D3DCOLORVALUE   dcvColor;           /* Color of light */
876   D3DVECTOR       dvPosition;         /* Position in world space */
877   D3DVECTOR       dvDirection;        /* Direction in world space */
878   D3DVALUE        dvRange;            /* Cutoff range */
879   D3DVALUE        dvFalloff;          /* Falloff */
880   D3DVALUE        dvAttenuation0;     /* Constant attenuation */
881   D3DVALUE        dvAttenuation1;     /* Linear attenuation */
882   D3DVALUE        dvAttenuation2;     /* Quadratic attenuation */
883   D3DVALUE        dvTheta;            /* Inner angle of spotlight cone */
884   D3DVALUE        dvPhi;              /* Outer angle of spotlight cone */
885   DWORD           dwFlags;
886 } D3DLIGHT2, *LPD3DLIGHT2;
887
888 typedef struct _D3DLIGHTDATA {
889   DWORD                dwSize;
890   LPD3DLIGHTINGELEMENT lpIn;          /* Input positions and normals */
891   DWORD                dwInSize;      /* Stride of input elements */
892   LPD3DTLVERTEX        lpOut;         /* Output colors */
893   DWORD                dwOutSize;     /* Stride of output colors */
894 } D3DLIGHTDATA, *LPD3DLIGHTDATA;
895
896 typedef struct _D3DPICKRECORD {
897   BYTE     bOpcode;
898   BYTE     bPad;
899   DWORD    dwOffset;
900   D3DVALUE dvZ;
901 } D3DPICKRECORD, *LPD3DPICKRECORD;
902
903
904 typedef struct _D3DExecuteBufferDesc { 
905   DWORD  dwSize; 
906   DWORD  dwFlags; 
907   DWORD  dwCaps; 
908   DWORD  dwBufferSize; 
909   LPVOID lpData; 
910 } D3DEXECUTEBUFFERDESC; 
911 typedef D3DEXECUTEBUFFERDESC *LPD3DEXECUTEBUFFERDESC; 
912
913 #define D3DDEB_BUFSIZE          0x00000001l     /* buffer size valid */
914 #define D3DDEB_CAPS             0x00000002l     /* caps valid */
915 #define D3DDEB_LPDATA           0x00000004l     /* lpData valid */
916
917 #define D3DDEBCAPS_SYSTEMMEMORY 0x00000001l     /* buffer in system memory */
918 #define D3DDEBCAPS_VIDEOMEMORY  0x00000002l     /* buffer in device memory */
919 #define D3DDEBCAPS_MEM (D3DDEBCAPS_SYSTEMMEMORY|D3DDEBCAPS_VIDEOMEMORY)
920
921 /*
922  * Values for d3d status.
923  */
924 #define D3DSTATUS_CLIPUNIONLEFT                 D3DCLIP_LEFT
925 #define D3DSTATUS_CLIPUNIONRIGHT                D3DCLIP_RIGHT
926 #define D3DSTATUS_CLIPUNIONTOP                  D3DCLIP_TOP
927 #define D3DSTATUS_CLIPUNIONBOTTOM               D3DCLIP_BOTTOM
928 #define D3DSTATUS_CLIPUNIONFRONT                D3DCLIP_FRONT
929 #define D3DSTATUS_CLIPUNIONBACK                 D3DCLIP_BACK
930 #define D3DSTATUS_CLIPUNIONGEN0                 D3DCLIP_GEN0
931 #define D3DSTATUS_CLIPUNIONGEN1                 D3DCLIP_GEN1
932 #define D3DSTATUS_CLIPUNIONGEN2                 D3DCLIP_GEN2
933 #define D3DSTATUS_CLIPUNIONGEN3                 D3DCLIP_GEN3
934 #define D3DSTATUS_CLIPUNIONGEN4                 D3DCLIP_GEN4
935 #define D3DSTATUS_CLIPUNIONGEN5                 D3DCLIP_GEN5
936
937 #define D3DSTATUS_CLIPINTERSECTIONLEFT          0x00001000L
938 #define D3DSTATUS_CLIPINTERSECTIONRIGHT         0x00002000L
939 #define D3DSTATUS_CLIPINTERSECTIONTOP           0x00004000L
940 #define D3DSTATUS_CLIPINTERSECTIONBOTTOM        0x00008000L
941 #define D3DSTATUS_CLIPINTERSECTIONFRONT         0x00010000L
942 #define D3DSTATUS_CLIPINTERSECTIONBACK          0x00020000L
943 #define D3DSTATUS_CLIPINTERSECTIONGEN0          0x00040000L
944 #define D3DSTATUS_CLIPINTERSECTIONGEN1          0x00080000L
945 #define D3DSTATUS_CLIPINTERSECTIONGEN2          0x00100000L
946 #define D3DSTATUS_CLIPINTERSECTIONGEN3          0x00200000L
947 #define D3DSTATUS_CLIPINTERSECTIONGEN4          0x00400000L
948 #define D3DSTATUS_CLIPINTERSECTIONGEN5          0x00800000L
949 #define D3DSTATUS_ZNOTVISIBLE                   0x01000000L
950
951 #define D3DSTATUS_CLIPUNIONALL  (               \
952             D3DSTATUS_CLIPUNIONLEFT     |       \
953             D3DSTATUS_CLIPUNIONRIGHT    |       \
954             D3DSTATUS_CLIPUNIONTOP      |       \
955             D3DSTATUS_CLIPUNIONBOTTOM   |       \
956             D3DSTATUS_CLIPUNIONFRONT    |       \
957             D3DSTATUS_CLIPUNIONBACK     |       \
958             D3DSTATUS_CLIPUNIONGEN0     |       \
959             D3DSTATUS_CLIPUNIONGEN1     |       \
960             D3DSTATUS_CLIPUNIONGEN2     |       \
961             D3DSTATUS_CLIPUNIONGEN3     |       \
962             D3DSTATUS_CLIPUNIONGEN4     |       \
963             D3DSTATUS_CLIPUNIONGEN5             \
964             )
965
966 #define D3DSTATUS_CLIPINTERSECTIONALL   (               \
967             D3DSTATUS_CLIPINTERSECTIONLEFT      |       \
968             D3DSTATUS_CLIPINTERSECTIONRIGHT     |       \
969             D3DSTATUS_CLIPINTERSECTIONTOP       |       \
970             D3DSTATUS_CLIPINTERSECTIONBOTTOM    |       \
971             D3DSTATUS_CLIPINTERSECTIONFRONT     |       \
972             D3DSTATUS_CLIPINTERSECTIONBACK      |       \
973             D3DSTATUS_CLIPINTERSECTIONGEN0      |       \
974             D3DSTATUS_CLIPINTERSECTIONGEN1      |       \
975             D3DSTATUS_CLIPINTERSECTIONGEN2      |       \
976             D3DSTATUS_CLIPINTERSECTIONGEN3      |       \
977             D3DSTATUS_CLIPINTERSECTIONGEN4      |       \
978             D3DSTATUS_CLIPINTERSECTIONGEN5              \
979             )
980
981 #define D3DSTATUS_DEFAULT       (                       \
982             D3DSTATUS_CLIPINTERSECTIONALL       |       \
983             D3DSTATUS_ZNOTVISIBLE)
984
985
986 typedef struct _D3DSTATUS { 
987   DWORD   dwFlags; 
988   DWORD   dwStatus; 
989   D3DRECT drExtent; 
990 } D3DSTATUS, *LPD3DSTATUS; 
991  
992
993 typedef struct _D3DEXECUTEDATA { 
994   DWORD     dwSize; 
995   DWORD     dwVertexOffset; 
996   DWORD     dwVertexCount; 
997   DWORD     dwInstructionOffset; 
998   DWORD     dwInstructionLength; 
999   DWORD     dwHVertexOffset; 
1000   D3DSTATUS dsStatus; 
1001 } D3DEXECUTEDATA, *LPD3DEXECUTEDATA; 
1002
1003 typedef enum _D3DOPCODE { 
1004   D3DOP_POINT           = 1, 
1005   D3DOP_LINE            = 2, 
1006   D3DOP_TRIANGLE        = 3, 
1007   D3DOP_MATRIXLOAD      = 4, 
1008   D3DOP_MATRIXMULTIPLY  = 5, 
1009   D3DOP_STATETRANSFORM  = 6, 
1010   D3DOP_STATELIGHT      = 7, 
1011   D3DOP_STATERENDER     = 8, 
1012   D3DOP_PROCESSVERTICES = 9, 
1013   D3DOP_TEXTURELOAD     = 10, 
1014   D3DOP_EXIT            = 11, 
1015   D3DOP_BRANCHFORWARD   = 12, 
1016   D3DOP_SPAN            = 13, 
1017   D3DOP_SETSTATUS       = 14, 
1018   
1019   D3DOP_FORCE_DWORD     = 0x7fffffff, 
1020 } D3DOPCODE; 
1021
1022 typedef struct _D3DPOINT { 
1023   WORD wCount; 
1024   WORD wFirst; 
1025 } D3DPOINT, *LPD3DPOINT; 
1026
1027 typedef struct _D3DLINE { 
1028   union { 
1029     WORD v1; 
1030     WORD wV1; 
1031   } v1; 
1032   union { 
1033     WORD v2; 
1034     WORD wV2; 
1035   } v2; 
1036 } D3DLINE, *LPD3DLINE; 
1037
1038 #define D3DTRIFLAG_START                        0x00000000L
1039 #define D3DTRIFLAG_STARTFLAT(len) (len)         /* 0 < len < 30 */
1040 #define D3DTRIFLAG_ODD                          0x0000001eL
1041 #define D3DTRIFLAG_EVEN                         0x0000001fL
1042
1043 #define D3DTRIFLAG_EDGEENABLE1                  0x00000100L /* v0-v1 edge */
1044 #define D3DTRIFLAG_EDGEENABLE2                  0x00000200L /* v1-v2 edge */
1045 #define D3DTRIFLAG_EDGEENABLE3                  0x00000400L /* v2-v0 edge */
1046 #define D3DTRIFLAG_EDGEENABLETRIANGLE \
1047         (D3DTRIFLAG_EDGEENABLE1 | D3DTRIFLAG_EDGEENABLE2 | D3DTRIFLAG_EDGEENABLE3)
1048
1049 typedef struct _D3DTRIANGLE { 
1050   union { 
1051     WORD v1; 
1052     WORD wV1; 
1053   } v1; 
1054   union { 
1055     WORD v2; 
1056     WORD wV2; 
1057   } v2; 
1058   union { 
1059     WORD v3; 
1060     WORD wV3; 
1061   } v3; 
1062   WORD     wFlags; 
1063 } D3DTRIANGLE, *LPD3DTRIANGLE; 
1064
1065 typedef struct _D3DMATRIXLOAD { 
1066   D3DMATRIXHANDLE hDestMatrix; 
1067   D3DMATRIXHANDLE hSrcMatrix; 
1068 } D3DMATRIXLOAD, *LPD3DMATRIXLOAD; 
1069
1070 typedef struct _D3DMATRIXMULTIPLY { 
1071   D3DMATRIXHANDLE hDestMatrix; 
1072   D3DMATRIXHANDLE hSrcMatrix1; 
1073   D3DMATRIXHANDLE hSrcMatrix2; 
1074 } D3DMATRIXMULTIPLY, *LPD3DMATRIXMULTIPLY; 
1075
1076 typedef struct _D3DSTATE { 
1077   union { 
1078     D3DTRANSFORMSTATETYPE dtstTransformStateType; 
1079     D3DLIGHTSTATETYPE     dlstLightStateType; 
1080     D3DRENDERSTATETYPE    drstRenderStateType; 
1081   } t; 
1082   union { 
1083     DWORD                 dwArg[1]; 
1084     D3DVALUE              dvArg[1]; 
1085   } v; 
1086 } D3DSTATE, *LPD3DSTATE; 
1087
1088 #define D3DPROCESSVERTICES_TRANSFORMLIGHT       0x00000000L
1089 #define D3DPROCESSVERTICES_TRANSFORM            0x00000001L
1090 #define D3DPROCESSVERTICES_COPY                 0x00000002L
1091 #define D3DPROCESSVERTICES_OPMASK               0x00000007L
1092
1093 #define D3DPROCESSVERTICES_UPDATEEXTENTS        0x00000008L
1094 #define D3DPROCESSVERTICES_NOCOLOR              0x00000010L
1095
1096 typedef struct _D3DPROCESSVERTICES { 
1097   DWORD dwFlags; 
1098   WORD  wStart; 
1099   WORD  wDest; 
1100   DWORD dwCount; 
1101   DWORD dwReserved; 
1102 } D3DPROCESSVERTICES, *LPD3DPROCESSVERTICES; 
1103
1104 typedef struct _D3DTEXTURELOAD { 
1105   D3DTEXTUREHANDLE hDestTexture; 
1106   D3DTEXTUREHANDLE hSrcTexture; 
1107 } D3DTEXTURELOAD, *LPD3DTEXTURELOAD; 
1108
1109 typedef struct _D3DBRANCH { 
1110   DWORD dwMask; 
1111   DWORD dwValue; 
1112   BOOL  bNegate; 
1113   DWORD dwOffset; 
1114 } D3DBRANCH, *LPD3DBRANCH; 
1115
1116 typedef struct _D3DSPAN { 
1117   WORD wCount; 
1118   WORD wFirst; 
1119 } D3DSPAN, *LPD3DSPAN; 
1120
1121 typedef struct _D3DINSTRUCTION { 
1122   BYTE bOpcode; 
1123   BYTE bSize; 
1124   WORD wCount; 
1125 } D3DINSTRUCTION, *LPD3DINSTRUCTION; 
1126
1127
1128 /* ********************************************************************
1129    Direct3D
1130    ******************************************************************** */
1131 #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
1132 #define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
1133 #define PURE
1134 #define FAR
1135 #define THIS_ THIS ,
1136
1137 #define THIS LPDIRECT3D this
1138 typedef struct IDirect3D_VTable {
1139         /*** IUnknown methods ***/
1140         STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1141         STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1142         STDMETHOD_(ULONG, Release) (THIS) PURE;
1143         /*** IDirect3D methods ***/
1144         STDMETHOD(Initialize) (THIS_ REFIID) PURE;
1145         STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK, LPVOID) PURE;
1146         STDMETHOD(CreateLight) (THIS_ LPDIRECT3DLIGHT*, IUnknown*) PURE;
1147         STDMETHOD(CreateMaterial) (THIS_ LPDIRECT3DMATERIAL*, IUnknown*) PURE;
1148         STDMETHOD(CreateViewport) (THIS_ LPDIRECT3DVIEWPORT*, IUnknown*) PURE;
1149         STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT) PURE;
1150 } *LPDIRECT3D_VTABLE,IDirect3D_VTable;
1151
1152 struct IDirect3D {
1153         LPDIRECT3D_VTABLE       lpvtbl;
1154         DWORD                   ref;
1155         LPDIRECTDRAW            ddraw;
1156 };
1157 #undef THIS
1158
1159 /* ********************************************************************
1160    Direct3D2
1161    ******************************************************************** */
1162 #define THIS LPDIRECT3D2 this
1163 typedef struct IDirect3D2_VTable {
1164         /*** IUnknown methods ***/
1165         STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1166         STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1167         STDMETHOD_(ULONG, Release) (THIS) PURE;
1168         /*** IDirect3D2 methods ***/
1169         STDMETHOD(EnumDevices)(THIS_ LPD3DENUMDEVICESCALLBACK, LPVOID) PURE;
1170         STDMETHOD(CreateLight) (THIS_ LPDIRECT3DLIGHT*, IUnknown*) PURE;
1171         STDMETHOD(CreateMaterial) (THIS_ LPDIRECT3DMATERIAL2*, IUnknown*) PURE;
1172         STDMETHOD(CreateViewport) (THIS_ LPDIRECT3DVIEWPORT2*, IUnknown*) PURE;
1173         STDMETHOD(FindDevice)(THIS_ LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT) PURE;
1174         STDMETHOD(CreateDevice)(THIS_ REFCLSID, LPDIRECTDRAWSURFACE, LPDIRECT3DDEVICE2 *) PURE;
1175 } *LPDIRECT3D2_VTABLE,IDirect3D2_VTable;
1176
1177 struct IDirect3D2 {
1178         LPDIRECT3D2_VTABLE      lpvtbl;
1179         DWORD                   ref;
1180         LPDIRECTDRAW            ddraw;
1181 };
1182 #undef THIS
1183
1184 /* ********************************************************************
1185    Direct3DLight
1186    ******************************************************************** */
1187 #define THIS LPDIRECT3DLIGHT this
1188 typedef struct IDirect3DLight_VTable {
1189         /*** IUnknown methods ***/
1190         STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1191         STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1192         STDMETHOD_(ULONG, Release) (THIS) PURE;
1193         /*** IDirect3DLight methods ***/
1194         STDMETHOD(Initialize) (THIS_ LPDIRECT3D) PURE;
1195         STDMETHOD(SetLight) (THIS_ LPD3DLIGHT) PURE;
1196         STDMETHOD(GetLight) (THIS_ LPD3DLIGHT) PURE;
1197 } IDirect3DLight_VTable,*LPDIRECT3DLIGHT_VTABLE;
1198
1199 struct IDirect3DLight {
1200         LPDIRECT3DLIGHT_VTABLE  lpvtbl;
1201         DWORD                   ref;
1202
1203   union {
1204     LPDIRECT3D            d3d;
1205     LPDIRECT3D2           d3d2;
1206   } d3d;
1207   int type;
1208   
1209   D3DLIGHT2               light;
1210
1211   /* Chained list used for adding / removing from viewports */
1212   LPDIRECT3DLIGHT next, prev;
1213
1214   /* Activation function */
1215   void (*activate)(THIS);
1216   int is_active;
1217   
1218   /* Awful OpenGL code !!! */
1219 #ifdef HAVE_MESAGL
1220   GLenum light_num;
1221 #endif
1222 };
1223
1224 #undef THIS
1225
1226 /* ********************************************************************
1227    Direct3DMaterial
1228    ******************************************************************** */
1229 #define THIS LPDIRECT3DMATERIAL this
1230 typedef struct IDirect3DMaterial_VTable {
1231   /*** IUnknown methods ***/
1232   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1233   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1234   STDMETHOD_(ULONG, Release) (THIS) PURE;
1235   /*** IDirect3DMaterial2 methods ***/
1236   STDMETHOD(Initialize) (THIS_ LPDIRECT3D) PURE;
1237   STDMETHOD(SetMaterial) (THIS_ LPD3DMATERIAL) PURE;
1238   STDMETHOD(GetMaterial) (THIS_ LPD3DMATERIAL) PURE;
1239   STDMETHOD(GetHandle) (THIS_ LPDIRECT3DDEVICE2, LPD3DMATERIALHANDLE) PURE;
1240   STDMETHOD_(HRESULT, Reserve) (THIS) PURE;
1241   STDMETHOD_(HRESULT, Unreserve) (THIS) PURE;
1242 } IDirect3DMaterial_VTable,*LPDIRECT3DMATERIAL_VTABLE;
1243
1244 #undef THIS
1245
1246
1247 /* ********************************************************************
1248    Direct3DMaterial2
1249    ******************************************************************** */
1250 #define THIS LPDIRECT3DMATERIAL2 this
1251 typedef struct IDirect3DMaterial2_VTable {
1252   /*** IUnknown methods ***/
1253   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1254   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1255   STDMETHOD_(ULONG, Release) (THIS) PURE;
1256   /*** IDirect3DMaterial2 methods ***/
1257   STDMETHOD(SetMaterial) (THIS_ LPD3DMATERIAL) PURE;
1258   STDMETHOD(GetMaterial) (THIS_ LPD3DMATERIAL) PURE;
1259   STDMETHOD(GetHandle) (THIS_ LPDIRECT3DDEVICE2, LPD3DMATERIALHANDLE) PURE;
1260 } IDirect3DMaterial2_VTable,*LPDIRECT3DMATERIAL2_VTABLE;
1261
1262 struct IDirect3DMaterial2 {
1263   LPDIRECT3DMATERIAL2_VTABLE  lpvtbl;
1264   DWORD                       ref;
1265
1266   union {
1267     LPDIRECT3D                d3d1;
1268     LPDIRECT3D2               d3d2;
1269   } d3d;
1270   union {
1271     LPDIRECT3DDEVICE  active_device1;
1272     LPDIRECT3DDEVICE2 active_device2;
1273   } device;
1274   int use_d3d2;
1275   
1276   D3DMATERIAL                 mat;
1277   
1278   void (*activate)(LPDIRECT3DMATERIAL2 this);
1279 };
1280
1281 #undef THIS
1282
1283 /* ********************************************************************
1284    Direct3DTexture
1285    ******************************************************************** */
1286 #define THIS LPDIRECT3DTEXTURE this
1287 typedef struct IDirect3DTexture_VTable {
1288   /*** IUnknown methods ***/
1289   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1290   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1291   STDMETHOD_(ULONG, Release) (THIS) PURE;
1292   /*** IDirect3DTexture methods ***/
1293   STDMETHOD(Initialize) (THIS_ LPDIRECT3DDEVICE, LPDIRECTDRAWSURFACE) PURE;
1294   STDMETHOD(GetHandle) (THIS_ LPDIRECT3DDEVICE, LPD3DTEXTUREHANDLE) PURE;
1295   STDMETHOD(PaletteChanged) (THIS_ DWORD, DWORD) PURE;
1296   STDMETHOD(Load) (THIS_ LPDIRECT3DTEXTURE) PURE;
1297   STDMETHOD_(HRESULT, Unload) (THIS) PURE;
1298 } IDirect3DTexture_VTable,*LPDIRECT3DTEXTURE_VTABLE;
1299
1300 /* The structure is the same as for Direct3DTexture2 */
1301
1302 #undef THIS
1303
1304 /* ********************************************************************
1305    Direct3DTexture2
1306    ******************************************************************** */
1307 #define THIS LPDIRECT3DTEXTURE2 this
1308 typedef struct IDirect3DTexture2_VTable {
1309   /*** IUnknown methods ***/
1310   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1311   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1312   STDMETHOD_(ULONG, Release) (THIS) PURE;
1313   /*** IDirect3DTexture2 methods ***/
1314   STDMETHOD(GetHandle) (THIS_ LPDIRECT3DDEVICE2, LPD3DTEXTUREHANDLE) PURE;
1315   STDMETHOD(PaletteChanged) (THIS_ DWORD, DWORD) PURE;
1316   STDMETHOD(Load) (THIS_ LPDIRECT3DTEXTURE2) PURE;  
1317 } IDirect3DTexture2_VTable,*LPDIRECT3DTEXTURE2_VTABLE;
1318
1319 struct IDirect3DTexture2 {
1320   LPDIRECT3DTEXTURE2_VTABLE  lpvtbl;
1321   DWORD                      ref;
1322
1323   void *D3Ddevice; /* I put (void *) to use the same pointer for both
1324                       Direct3D and Direct3D2 */
1325 #ifdef HAVE_MESAGL
1326   GLuint tex_name;
1327 #endif  
1328   LPDIRECTDRAWSURFACE4       surface;
1329 };
1330
1331 #undef THIS
1332
1333
1334 /* ********************************************************************
1335    Direct3DViewport
1336    ******************************************************************** */
1337 #define THIS LPDIRECT3DVIEWPORT this
1338 typedef struct IDirect3Viewport_VTable {
1339   /*** IUnknown methods ***/
1340   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1341   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1342   STDMETHOD_(ULONG, Release) (THIS) PURE;
1343   /*** IDirect3DViewport methods ***/
1344   STDMETHOD(Initialize) (THIS_ LPDIRECT3D) PURE;
1345   STDMETHOD(GetViewport) (THIS_ LPD3DVIEWPORT) PURE;
1346   STDMETHOD(SetViewport) (THIS_ LPD3DVIEWPORT) PURE;
1347   STDMETHOD(TransformVertices) (THIS_ DWORD, LPD3DTRANSFORMDATA, DWORD, LPDWORD) PURE;
1348   STDMETHOD(LightElements) (THIS_ DWORD, LPD3DLIGHTDATA) PURE;
1349   STDMETHOD(SetBackground) (THIS_ D3DMATERIALHANDLE) PURE;
1350   STDMETHOD(GetBackground) (THIS_ LPD3DMATERIALHANDLE, LPBOOL) PURE;
1351   STDMETHOD(SetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE) PURE;
1352   STDMETHOD(GetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE*, LPBOOL) PURE;
1353   STDMETHOD(Clear) (THIS_ DWORD, LPD3DRECT, DWORD) PURE;
1354   STDMETHOD(AddLight) (THIS_ LPDIRECT3DLIGHT) PURE;
1355   STDMETHOD(DeleteLight) (THIS_ LPDIRECT3DLIGHT) PURE;
1356   STDMETHOD(NextLight) (THIS_ LPDIRECT3DLIGHT, LPDIRECT3DLIGHT*, DWORD) PURE;
1357 } IDirect3DViewport_VTable,*LPDIRECT3DVIEWPORT_VTABLE;
1358
1359 #undef THIS
1360
1361
1362 /* ********************************************************************
1363    Direct3DViewport2
1364    ******************************************************************** */
1365 #define THIS LPDIRECT3DVIEWPORT2 this
1366 typedef struct IDirect3Viewport2_VTable {
1367   /*** IUnknown methods ***/
1368   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1369   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1370   STDMETHOD_(ULONG, Release) (THIS) PURE;
1371   /*** IDirect3DViewport methods ***/
1372   STDMETHOD(Initialize) (THIS_ LPDIRECT3D) PURE;
1373   STDMETHOD(GetViewport) (THIS_ LPD3DVIEWPORT) PURE;
1374   STDMETHOD(SetViewport) (THIS_ LPD3DVIEWPORT) PURE;
1375   STDMETHOD(TransformVertices) (THIS_ DWORD, LPD3DTRANSFORMDATA, DWORD, LPDWORD) PURE;
1376   STDMETHOD(LightElements) (THIS_ DWORD, LPD3DLIGHTDATA) PURE;
1377   STDMETHOD(SetBackground) (THIS_ D3DMATERIALHANDLE) PURE;
1378   STDMETHOD(GetBackground) (THIS_ LPD3DMATERIALHANDLE, LPBOOL) PURE;
1379   STDMETHOD(SetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE) PURE;
1380   STDMETHOD(GetBackgroundDepth) (THIS_ LPDIRECTDRAWSURFACE*, LPBOOL) PURE;
1381   STDMETHOD(Clear) (THIS_ DWORD, LPD3DRECT, DWORD) PURE;
1382   STDMETHOD(AddLight) (THIS_ LPDIRECT3DLIGHT) PURE;
1383   STDMETHOD(DeleteLight) (THIS_ LPDIRECT3DLIGHT) PURE;
1384   STDMETHOD(NextLight) (THIS_ LPDIRECT3DLIGHT, LPDIRECT3DLIGHT*, DWORD) PURE;
1385   /*** IDirect3DViewport2 methods ***/
1386   STDMETHOD(GetViewport2) (THIS_ LPD3DVIEWPORT2) PURE;
1387   STDMETHOD(SetViewport2) (THIS_ LPD3DVIEWPORT2) PURE;
1388 } IDirect3DViewport2_VTable,*LPDIRECT3DVIEWPORT2_VTABLE;
1389
1390 struct IDirect3DViewport2 {
1391   LPDIRECT3DVIEWPORT2_VTABLE  lpvtbl;
1392   DWORD                       ref;
1393
1394   union {
1395     LPDIRECT3D                d3d1;
1396     LPDIRECT3D2               d3d2;
1397   } d3d;
1398   /* If this viewport is active for one device, put the device here */
1399   union {
1400     LPDIRECT3DDEVICE  active_device1;
1401     LPDIRECT3DDEVICE2 active_device2;
1402   } device;
1403   int use_d3d2;
1404
1405   union {
1406     D3DVIEWPORT              vp1;
1407     D3DVIEWPORT2             vp2;
1408   } viewport;
1409   int use_vp2;
1410
1411   /* Activation function */
1412   void (*activate)(THIS);
1413   
1414   /* Field used to chain viewports together */
1415   LPDIRECT3DVIEWPORT2 next;
1416
1417   /* Lights list */
1418   LPDIRECT3DLIGHT lights;
1419
1420   /* OpenGL code */
1421 #ifdef HAVE_MESAGL
1422   GLenum nextlight;
1423 #endif
1424 };
1425
1426 #undef THIS
1427
1428 /* ********************************************************************
1429    Direct3DExecuteBuffer
1430    ******************************************************************** */
1431 #define THIS LPDIRECT3DEXECUTEBUFFER this
1432 typedef struct IDirect3DExecuteBuffer_VTable {
1433   /*** IUnknown methods ***/
1434   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1435   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1436   STDMETHOD_(ULONG, Release) (THIS) PURE;
1437   /*** IDirect3DExecuteBuffer methods ***/
1438   STDMETHOD(Initialize) (THIS_ LPDIRECT3DDEVICE, LPD3DEXECUTEBUFFERDESC) PURE;
1439   STDMETHOD(Lock) (THIS_ LPD3DEXECUTEBUFFERDESC) PURE;
1440   STDMETHOD_(HRESULT, Unlock) (THIS) PURE;
1441   STDMETHOD(SetExecuteData) (THIS_ LPD3DEXECUTEDATA) PURE;
1442   STDMETHOD(GetExecuteData) (THIS_ LPD3DEXECUTEDATA) PURE;
1443   STDMETHOD(Validate) (THIS_ LPDWORD, LPD3DVALIDATECALLBACK, LPVOID, DWORD) PURE;
1444   STDMETHOD(Optimize) (THIS_ DWORD) PURE;
1445 } *LPDIRECT3DEXECUTEBUFFER_VTABLE,IDirect3DExecuteBuffer_VTable;
1446
1447 struct IDirect3DExecuteBuffer {
1448   LPDIRECT3DEXECUTEBUFFER_VTABLE lpvtbl;
1449   DWORD ref;
1450   
1451   LPDIRECT3DDEVICE d3ddev;
1452
1453   D3DEXECUTEBUFFERDESC desc;
1454   D3DEXECUTEDATA data;
1455
1456   /* This buffer will store the transformed vertices */
1457   void *vertex_data;
1458   D3DVERTEXTYPE vertex_type;
1459
1460   /* This flags is set to TRUE if we allocated ourselves the
1461      data buffer */
1462   BOOL need_free;
1463
1464   void (*execute)(LPDIRECT3DEXECUTEBUFFER this,
1465                   LPDIRECT3DDEVICE dev,
1466                   LPDIRECT3DVIEWPORT vp);
1467 };
1468
1469 #undef THIS
1470
1471 /* ********************************************************************
1472    Direct3DDevice
1473    ******************************************************************** */
1474 #define THIS LPDIRECT3DDEVICE this
1475 typedef struct IDirect3DDevice_VTable {
1476   /*** IUnknown methods ***/
1477   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1478   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1479   STDMETHOD_(ULONG, Release) (THIS) PURE;
1480   /*** IDirect3DDevice methods ***/
1481   STDMETHOD(Initialize) (THIS_ LPDIRECT3D, LPGUID, LPD3DDEVICEDESC) PURE;
1482   STDMETHOD(GetCaps) (THIS_ LPD3DDEVICEDESC, LPD3DDEVICEDESC) PURE;
1483   STDMETHOD(SwapTextureHandles) (THIS_ LPDIRECT3DTEXTURE, LPDIRECT3DTEXTURE) PURE;
1484   STDMETHOD(CreateExecuteBuffer) (THIS_ LPD3DEXECUTEBUFFERDESC, LPDIRECT3DEXECUTEBUFFER*, IUnknown*) PURE;
1485   STDMETHOD(GetStats) (THIS_ LPD3DSTATS) PURE;
1486   STDMETHOD(Execute) (THIS_ LPDIRECT3DEXECUTEBUFFER, LPDIRECT3DVIEWPORT, DWORD) PURE;
1487   STDMETHOD(AddViewport) (THIS_ LPDIRECT3DVIEWPORT) PURE;
1488   STDMETHOD(DeleteViewport) (THIS_ LPDIRECT3DVIEWPORT) PURE;
1489   STDMETHOD(NextViewport) (THIS_ LPDIRECT3DVIEWPORT, LPDIRECT3DVIEWPORT*, DWORD) PURE;
1490   STDMETHOD(Pick) (THIS_ LPDIRECT3DEXECUTEBUFFER, LPDIRECT3DVIEWPORT, DWORD, LPD3DRECT) PURE;
1491   STDMETHOD(GetPickRecords)(THIS_ LPDWORD, LPD3DPICKRECORD) PURE;
1492   STDMETHOD(EnumTextureFormats) (THIS_ LPD3DENUMTEXTUREFORMATSCALLBACK, LPVOID) PURE;
1493   STDMETHOD(CreateMatrix) (THIS_ LPD3DMATRIXHANDLE) PURE;
1494   STDMETHOD(SetMatrix) (THIS_ D3DMATRIXHANDLE, const LPD3DMATRIX) PURE;
1495   STDMETHOD(GetMatrix) (THIS_ D3DMATRIXHANDLE, LPD3DMATRIX) PURE;
1496   STDMETHOD(DeleteMatrix) (THIS_ D3DMATRIXHANDLE) PURE;
1497   STDMETHOD_(HRESULT, BeginScene) (THIS) PURE;
1498   STDMETHOD_(HRESULT, EndScene) (THIS) PURE;
1499   STDMETHOD(GetDirect3D) (THIS_ LPDIRECT3D*) PURE;
1500 } *LPDIRECT3DDEVICE_VTABLE,IDirect3DDevice_VTable;
1501
1502 struct IDirect3DDevice {
1503   /* This are the fields common to all Direct3DDevice implementations */
1504   LPDIRECT3DDEVICE_VTABLE lpvtbl;
1505   DWORD ref;
1506   
1507   LPDIRECT3D d3d;
1508   LPDIRECTDRAWSURFACE surface;
1509
1510   LPDIRECT3DVIEWPORT viewport_list;
1511   LPDIRECT3DVIEWPORT current_viewport;
1512
1513   void (*set_context)(THIS) ;
1514 };
1515
1516 #undef THIS
1517
1518 /* ********************************************************************
1519    Direct3DDevice2
1520    ******************************************************************** */
1521 #define THIS LPDIRECT3DDEVICE2 this
1522 typedef struct IDirect3DDevice2_VTable {
1523   /*** IUnknown methods ***/
1524   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID* ppvObj) PURE;
1525   STDMETHOD_(ULONG, AddRef) (THIS) PURE;
1526   STDMETHOD_(ULONG, Release) (THIS) PURE;
1527   /*** IDirect3DDevice2 methods ***/
1528   STDMETHOD(GetCaps) (THIS_ LPD3DDEVICEDESC, LPD3DDEVICEDESC) PURE;
1529   STDMETHOD(SwapTextureHandles) (THIS_ LPDIRECT3DTEXTURE2, LPDIRECT3DTEXTURE2) PURE;
1530   STDMETHOD(GetStats) (THIS_ LPD3DSTATS) PURE;
1531   STDMETHOD(AddViewport) (THIS_ LPDIRECT3DVIEWPORT2) PURE;
1532   STDMETHOD(DeleteViewport) (THIS_ LPDIRECT3DVIEWPORT2) PURE;
1533   STDMETHOD(NextViewport) (THIS_ LPDIRECT3DVIEWPORT2, LPDIRECT3DVIEWPORT2*, DWORD) PURE;
1534   STDMETHOD(EnumTextureFormats) (THIS_ LPD3DENUMTEXTUREFORMATSCALLBACK, LPVOID) PURE;
1535   STDMETHOD_(HRESULT, BeginScene) (THIS) PURE;
1536   STDMETHOD_(HRESULT, EndScene) (THIS) PURE;
1537   STDMETHOD(GetDirect3D) (THIS_ LPDIRECT3D2*) PURE;
1538   
1539   /*** DrawPrimitive API ***/
1540   STDMETHOD(SetCurrentViewport) (THIS_ LPDIRECT3DVIEWPORT2) PURE;
1541   STDMETHOD(GetCurrentViewport) (THIS_ LPDIRECT3DVIEWPORT2 *) PURE;
1542   
1543   STDMETHOD(SetRenderTarget) (THIS_ LPDIRECTDRAWSURFACE, DWORD) PURE;
1544   STDMETHOD(GetRenderTarget) (THIS_ LPDIRECTDRAWSURFACE *) PURE;
1545   
1546   STDMETHOD(Begin) (THIS_ D3DPRIMITIVETYPE, D3DVERTEXTYPE, DWORD) PURE;
1547   STDMETHOD(BeginIndexed) (THIS_ D3DPRIMITIVETYPE, D3DVERTEXTYPE, LPVOID, DWORD, DWORD) PURE;
1548   STDMETHOD(Vertex) (THIS_ LPVOID) PURE;
1549   STDMETHOD(Index) (THIS_ WORD) PURE;
1550   STDMETHOD(End) (THIS_ DWORD) PURE;
1551   
1552   STDMETHOD(GetRenderState) (THIS_ D3DRENDERSTATETYPE, LPDWORD) PURE;
1553   STDMETHOD(SetRenderState) (THIS_ D3DRENDERSTATETYPE, DWORD) PURE;
1554   STDMETHOD(GetLightState) (THIS_ D3DLIGHTSTATETYPE, LPDWORD) PURE;
1555   STDMETHOD(SetLightState) (THIS_ D3DLIGHTSTATETYPE, DWORD) PURE;
1556   STDMETHOD(SetTransform) (THIS_ D3DTRANSFORMSTATETYPE, LPD3DMATRIX) PURE;
1557   STDMETHOD(GetTransform) (THIS_ D3DTRANSFORMSTATETYPE, LPD3DMATRIX) PURE;
1558   STDMETHOD(MultiplyTransform) (THIS_ D3DTRANSFORMSTATETYPE, LPD3DMATRIX) PURE;
1559   
1560   STDMETHOD(DrawPrimitive) (THIS_ D3DPRIMITIVETYPE, D3DVERTEXTYPE, LPVOID, DWORD, DWORD) PURE;
1561   STDMETHOD(DrawIndexedPrimitive) (THIS_ D3DPRIMITIVETYPE, D3DVERTEXTYPE, LPVOID, DWORD, LPWORD, DWORD, DWORD) PURE;
1562   
1563   STDMETHOD(SetClipStatus) (THIS_ LPD3DCLIPSTATUS) PURE;
1564   STDMETHOD(GetClipStatus) (THIS_ LPD3DCLIPSTATUS) PURE;
1565 } *LPDIRECT3DDEVICE2_VTABLE,IDirect3DDevice2_VTable;
1566
1567 struct IDirect3DDevice2 {
1568   /* This are the fields common to all Direct3DDevice2 implementations */
1569   LPDIRECT3DDEVICE2_VTABLE lpvtbl;
1570   DWORD ref;
1571   
1572   LPDIRECT3D2 d3d;
1573   LPDIRECTDRAWSURFACE surface;
1574
1575   LPDIRECT3DVIEWPORT2 viewport_list;
1576   LPDIRECT3DVIEWPORT2 current_viewport;
1577
1578   void (*set_context)(THIS) ;
1579 };
1580 #undef THIS
1581
1582
1583 #undef THIS_
1584 #undef STDMETHOD
1585 #undef STDMETHOD_
1586 #undef PURE
1587 #undef FAR
1588 #endif