- implement the TFACTOR texture stage state
[wine] / dlls / ddraw / d3d_private.h
1 /* Direct3D private include file
2  * Copyright (c) 1998 Lionel ULMER
3  *
4  * This file contains all the structure that are not exported
5  * through d3d.h and all common macros.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  */
21
22 #ifndef __GRAPHICS_WINE_D3D_PRIVATE_H
23 #define __GRAPHICS_WINE_D3D_PRIVATE_H
24
25 /* THIS FILE MUST NOT CONTAIN X11 or MESA DEFINES */
26
27 #include "d3d.h"
28
29 #define MAX_TEXTURES 8
30 #define MAX_LIGHTS  16
31
32 #define HIGHEST_RENDER_STATE         152
33 #define HIGHEST_TEXTURE_STAGE_STATE   24
34
35 /*****************************************************************************
36  * Predeclare the interface implementation structures
37  */
38 typedef struct IDirect3DImpl IDirect3DImpl;
39 typedef struct IDirect3DLightImpl IDirect3DLightImpl;
40 typedef struct IDirect3DMaterialImpl IDirect3DMaterialImpl;
41 typedef struct IDirect3DViewportImpl IDirect3DViewportImpl;
42 typedef struct IDirect3DExecuteBufferImpl IDirect3DExecuteBufferImpl;
43 typedef struct IDirect3DDeviceImpl IDirect3DDeviceImpl;
44 typedef struct IDirect3DVertexBufferImpl IDirect3DVertexBufferImpl;
45
46 #include "ddraw_private.h"
47
48 typedef struct STATEBLOCKFLAGS {
49    BOOL render_state[HIGHEST_RENDER_STATE];
50    BOOL texture_stage_state[MAX_TEXTURES][HIGHEST_TEXTURE_STAGE_STATE];
51 } STATEBLOCKFLAGS;
52
53 typedef struct STATEBLOCK {
54    STATEBLOCKFLAGS set_flags; 
55    DWORD render_state[HIGHEST_RENDER_STATE];
56    DWORD texture_stage_state[MAX_TEXTURES][HIGHEST_TEXTURE_STAGE_STATE];
57 } STATEBLOCK;
58
59 /*****************************************************************************
60  * IDirect3D implementation structure.
61  * This is common for interfaces 1, 2, 3 and 7.
62  */
63 struct IDirect3DImpl
64 {
65     ICOM_VFIELD_MULTI(IDirect3D7);
66     ICOM_VFIELD_MULTI(IDirect3D3);
67     ICOM_VFIELD_MULTI(IDirect3D2);
68     ICOM_VFIELD_MULTI(IDirect3D);
69     DWORD                   ref;
70     /* IDirect3D fields */
71     IDirectDrawImpl*    ddraw;
72
73     /* Used as a callback function to create a texture */
74     HRESULT (*create_texture)(IDirect3DImpl *d3d, IDirectDrawSurfaceImpl *tex, BOOLEAN at_creation, IDirectDrawSurfaceImpl *main);
75
76     /* Used as a callback for Devices to tell to the D3D object it's been created */
77     HRESULT (*added_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device);
78     HRESULT (*removed_device)(IDirect3DImpl *d3d, IDirect3DDeviceImpl *device);
79
80     /* This is needed for delayed texture creation and Z buffer blits */
81     IDirect3DDeviceImpl *current_device;
82 };
83
84 /*****************************************************************************
85  * IDirect3DLight implementation structure
86  */
87 struct IDirect3DLightImpl
88 {
89     ICOM_VFIELD_MULTI(IDirect3DLight);
90     DWORD ref;
91     /* IDirect3DLight fields */
92     IDirect3DImpl *d3d;
93     /* If this light is active for one viewport, put the viewport here */
94     IDirect3DViewportImpl *active_viewport;
95
96     D3DLIGHT2 light;
97     D3DLIGHT7 light7;
98
99     DWORD dwLightIndex;
100
101     /* Chained list used for adding / removing from viewports */
102     IDirect3DLightImpl *next;
103
104     /* Activation function */
105     void (*activate)(IDirect3DLightImpl*);
106     void (*desactivate)(IDirect3DLightImpl*);
107     void (*update)(IDirect3DLightImpl*);
108 };
109
110 /*****************************************************************************
111  * IDirect3DMaterial implementation structure
112  */
113 struct IDirect3DMaterialImpl
114 {
115     ICOM_VFIELD_MULTI(IDirect3DMaterial3);
116     ICOM_VFIELD_MULTI(IDirect3DMaterial2);
117     ICOM_VFIELD_MULTI(IDirect3DMaterial);
118     DWORD  ref;
119     /* IDirect3DMaterial2 fields */
120     IDirect3DImpl *d3d;
121     IDirect3DDeviceImpl *active_device;
122
123     D3DMATERIAL mat;
124
125     void (*activate)(IDirect3DMaterialImpl* this);
126 };
127
128 /*****************************************************************************
129  * IDirect3DViewport implementation structure
130  */
131 struct IDirect3DViewportImpl
132 {
133     ICOM_VFIELD_MULTI(IDirect3DViewport3);
134     DWORD ref;
135     /* IDirect3DViewport fields */
136     IDirect3DImpl *d3d;
137     /* If this viewport is active for one device, put the device here */
138     IDirect3DDeviceImpl *active_device;
139
140     DWORD num_lights;
141     DWORD map_lights;
142
143     int use_vp2;
144     union {
145         D3DVIEWPORT vp1;
146         D3DVIEWPORT2 vp2;
147     } viewports;
148
149     /* Activation function */
150     void (*activate)(IDirect3DViewportImpl*);
151
152     /* Field used to chain viewports together */
153     IDirect3DViewportImpl *next;
154
155     /* Lights list */
156     IDirect3DLightImpl *lights;
157
158     /* Background material */
159     IDirect3DMaterialImpl *background;
160 };
161
162 /*****************************************************************************
163  * IDirect3DExecuteBuffer implementation structure
164  */
165 struct IDirect3DExecuteBufferImpl
166 {
167     ICOM_VFIELD_MULTI(IDirect3DExecuteBuffer);
168     DWORD ref;
169     /* IDirect3DExecuteBuffer fields */
170     IDirect3DImpl *d3d;
171     IDirect3DDeviceImpl* d3ddev;
172
173     D3DEXECUTEBUFFERDESC desc;
174     D3DEXECUTEDATA data;
175
176     /* This buffer will store the transformed vertices */
177     void* vertex_data;
178     D3DVERTEXTYPE vertex_type;
179
180     /* This flags is set to TRUE if we allocated ourselves the
181        data buffer */
182     BOOL need_free;
183
184     void (*execute)(IDirect3DExecuteBufferImpl* this,
185                     IDirect3DDeviceImpl* dev,
186                     IDirect3DViewportImpl* vp);
187 };
188
189 /* Internal structure to store the state of the clipping planes */
190 typedef struct d3d7clippingplane 
191 {
192     D3DVALUE plane[4];
193 } d3d7clippingplane;
194
195 /*****************************************************************************
196  * IDirect3DDevice implementation structure
197  */
198
199 #define WORLDMAT_CHANGED (0x00000001 <<  0)
200 #define VIEWMAT_CHANGED  (0x00000001 <<  1)
201 #define PROJMAT_CHANGED  (0x00000001 <<  2)
202 #define TEXMAT0_CHANGED  (0x00000001 <<  3)
203 #define TEXMAT1_CHANGED  (0x00000001 <<  4)
204 #define TEXMAT2_CHANGED  (0x00000001 <<  5)
205 #define TEXMAT3_CHANGED  (0x00000001 <<  6)
206 #define TEXMAT4_CHANGED  (0x00000001 <<  7)
207 #define TEXMAT5_CHANGED  (0x00000001 <<  8)
208 #define TEXMAT6_CHANGED  (0x00000001 <<  9)
209 #define TEXMAT7_CHANGED  (0x00000001 << 10)
210
211 struct IDirect3DDeviceImpl
212 {
213     ICOM_VFIELD_MULTI(IDirect3DDevice7);
214     ICOM_VFIELD_MULTI(IDirect3DDevice3);
215     ICOM_VFIELD_MULTI(IDirect3DDevice2);
216     ICOM_VFIELD_MULTI(IDirect3DDevice);
217     DWORD  ref;
218     /* IDirect3DDevice fields */
219     IDirect3DImpl *d3d;
220     IDirectDrawSurfaceImpl *surface;
221
222     IDirect3DViewportImpl *viewport_list;
223     IDirect3DViewportImpl *current_viewport;
224     D3DVIEWPORT7 active_viewport;
225
226     IDirectDrawSurfaceImpl *current_texture[MAX_TEXTURES];
227
228     /* Current transformation matrices */
229     D3DMATRIX *world_mat;
230     D3DMATRIX *view_mat;
231     D3DMATRIX *proj_mat;
232     D3DMATRIX *tex_mat[MAX_TEXTURES];
233     
234     /* Current material used in D3D7 mode */
235     D3DMATERIAL7 current_material;
236
237     /* Light parameters */
238     DWORD active_lights, set_lights;
239     D3DLIGHT7 light_parameters[MAX_LIGHTS];
240
241     /* clipping planes */
242     DWORD max_clipping_planes;
243     d3d7clippingplane *clipping_planes;
244     
245     void (*set_context)(IDirect3DDeviceImpl*);
246     HRESULT (*clear)(IDirect3DDeviceImpl *This,
247                      DWORD dwCount,
248                      LPD3DRECT lpRects,
249                      DWORD dwFlags,
250                      DWORD dwColor,
251                      D3DVALUE dvZ,
252                      DWORD dwStencil);
253     void (*matrices_updated)(IDirect3DDeviceImpl *This, DWORD matrices);
254     void (*set_matrices)(IDirect3DDeviceImpl *This, DWORD matrices,
255                          D3DMATRIX *world_mat, D3DMATRIX *view_mat, D3DMATRIX *proj_mat);
256     void (*flush_to_framebuffer)(IDirect3DDeviceImpl *This, LPCRECT pRect);
257
258     STATEBLOCK state_block;
259
260     /* Used to prevent locks and rendering to overlap */
261     CRITICAL_SECTION crit;
262 };
263
264 /*****************************************************************************
265  * IDirect3DVertexBuffer implementation structure
266  */
267 struct IDirect3DVertexBufferImpl
268 {
269     ICOM_VFIELD_MULTI(IDirect3DVertexBuffer7);
270     ICOM_VFIELD_MULTI(IDirect3DVertexBuffer);
271     DWORD ref;
272     IDirect3DImpl *d3d;
273     D3DVERTEXBUFFERDESC desc;
274     LPVOID *vertices;
275     DWORD vertex_buffer_size;
276
277     BOOLEAN processed;
278 };
279
280 /* Various dump and helper functions */
281 extern const char *_get_renderstate(D3DRENDERSTATETYPE type);
282 extern void dump_D3DMATERIAL7(LPD3DMATERIAL7 lpMat);
283 extern void dump_D3DCOLORVALUE(D3DCOLORVALUE *lpCol);
284 extern void dump_D3DLIGHT7(LPD3DLIGHT7 lpLight);
285 extern void dump_DPFLAGS(DWORD dwFlags);
286 extern void dump_D3DMATRIX(D3DMATRIX *mat);
287 extern void dump_D3DVECTOR(D3DVECTOR *lpVec);
288 extern void dump_flexible_vertex(DWORD d3dvtVertexType);
289 extern DWORD get_flexible_vertex_size(DWORD d3dvtVertexType);
290 extern void convert_FVF_to_strided_data(DWORD d3dvtVertexType, LPVOID lpvVertices, D3DDRAWPRIMITIVESTRIDEDDATA *strided, DWORD dwStartVertex);
291 extern void dump_D3DVOP(DWORD dwVertexOp);
292 extern void dump_D3DPV(DWORD dwFlags);
293
294 extern const float id_mat[16];
295
296 #endif /* __GRAPHICS_WINE_D3D_PRIVATE_H */