Added mappings for a few messages.
[wine] / dlls / ddraw / direct3d / main.c
1 #include "config.h"
2
3 #include <assert.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <string.h>
7 #include <stdio.h>
8
9 #include "winerror.h"
10 #include "ddraw.h"
11 #include "d3d.h"
12 #include "debugtools.h"
13
14 #include "d3d_private.h"
15
16 DEFAULT_DEBUG_CHANNEL(ddraw);
17
18 static ICOM_VTABLE(IDirect3D) d3dvt;
19 static ICOM_VTABLE(IDirect3D2) d3d2vt;
20
21 /*******************************************************************************
22  *                              IDirect3D
23  */
24 HRESULT WINAPI IDirect3DImpl_QueryInterface(
25     LPDIRECT3D iface,REFIID refiid,LPVOID *obj
26 ) {
27     ICOM_THIS(IDirect3DImpl,iface);
28     /* FIXME: Not sure if this is correct */
29
30     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
31     if (( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
32         ( IsEqualGUID (&IID_IDirectDraw2, refiid ) ) ||
33         ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
34     ) {
35         *obj = This->ddraw;
36         IDirect3D_AddRef(iface);
37         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
38         return S_OK;
39     }
40     if (( IsEqualGUID( &IID_IDirect3D, refiid ) ) ||
41         ( IsEqualGUID( &IID_IUnknown,  refiid ) ) ) {
42         *obj = This;
43         IDirect3D_AddRef(iface);
44         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
45         return S_OK;
46     }
47     if ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) {
48         IDirect3D2Impl*  d3d;
49
50         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
51         d3d->ref = 1;
52         d3d->ddraw = This->ddraw;
53         IDirect3D_AddRef(iface);
54         ICOM_VTBL(d3d) = &d3d2vt;
55         *obj = d3d;
56         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
57         return S_OK;
58     }
59     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
60     return OLE_E_ENUM_NOMORE;
61 }
62
63 ULONG WINAPI IDirect3DImpl_AddRef(LPDIRECT3D iface) {
64     ICOM_THIS(IDirect3DImpl,iface);
65     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
66
67     return ++(This->ref);
68 }
69
70 ULONG WINAPI IDirect3DImpl_Release(LPDIRECT3D iface)
71 {
72     ICOM_THIS(IDirect3DImpl,iface);
73     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
74
75     if (!--(This->ref)) {
76         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
77         HeapFree(GetProcessHeap(),0,This);
78         return S_OK;
79     }
80     return This->ref;
81 }
82
83 HRESULT WINAPI IDirect3DImpl_Initialize(LPDIRECT3D iface,REFIID refiid) {
84     ICOM_THIS(IDirect3DImpl,iface);
85     /* FIXME: Not sure if this is correct */
86     FIXME("(%p)->(%s):stub.\n",This,debugstr_guid(refiid));
87     return DDERR_ALREADYINITIALIZED;
88 }
89
90 HRESULT WINAPI IDirect3DImpl_EnumDevices(
91     LPDIRECT3D iface, LPD3DENUMDEVICESCALLBACK cb, LPVOID context
92 ) {
93     ICOM_THIS(IDirect3DImpl,iface);
94     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
95     return DD_OK;
96 }
97
98 HRESULT WINAPI IDirect3DImpl_CreateLight(
99     LPDIRECT3D iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
100 ) {
101     ICOM_THIS(IDirect3DImpl,iface);
102     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
103     return E_FAIL;
104 }
105
106 HRESULT WINAPI IDirect3DImpl_CreateMaterial(
107     LPDIRECT3D iface, LPDIRECT3DMATERIAL *lpmaterial, IUnknown *lpunk
108 ) {
109     ICOM_THIS(IDirect3DImpl,iface);
110     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
111     return E_FAIL;
112 }
113
114 HRESULT WINAPI IDirect3DImpl_CreateViewport(
115     LPDIRECT3D iface, LPDIRECT3DVIEWPORT *lpviewport, IUnknown *lpunk
116 ) {
117     ICOM_THIS(IDirect3DImpl,iface);
118     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
119
120     return E_FAIL;
121 }
122
123 HRESULT WINAPI IDirect3DImpl_FindDevice(
124     LPDIRECT3D iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
125     LPD3DFINDDEVICERESULT lpfinddevrst)
126 {
127     ICOM_THIS(IDirect3DImpl,iface);
128     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
129     return DD_OK;
130 }
131
132 /* This is for checking the correctness of the prototypes/functions.
133  * Do not remove.
134  */
135 static ICOM_VTABLE(IDirect3D) WINE_UNUSED d3dvt = {
136     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
137     IDirect3DImpl_QueryInterface,
138     IDirect3DImpl_AddRef,
139     IDirect3DImpl_Release,
140     IDirect3DImpl_Initialize,
141     IDirect3DImpl_EnumDevices,
142     IDirect3DImpl_CreateLight,
143     IDirect3DImpl_CreateMaterial,
144     IDirect3DImpl_CreateViewport,
145     IDirect3DImpl_FindDevice
146 };
147
148 /*******************************************************************************
149  *                              IDirect3D2
150  */
151 HRESULT WINAPI IDirect3D2Impl_QueryInterface(
152     LPDIRECT3D2 iface,REFIID refiid,LPVOID *obj) {  
153     ICOM_THIS(IDirect3D2Impl,iface);
154
155     /* FIXME: Not sure if this is correct */
156
157     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj);
158     if ( ( IsEqualGUID( &IID_IDirectDraw,  refiid ) ) ||
159          ( IsEqualGUID( &IID_IDirectDraw2, refiid ) ) ||
160          ( IsEqualGUID( &IID_IDirectDraw4, refiid ) ) ) {
161         *obj = This->ddraw;
162         IDirect3D2_AddRef(iface);
163
164         TRACE("  Creating IDirectDrawX interface (%p)\n", *obj);
165         
166         return S_OK;
167     }
168     if ( ( IsEqualGUID( &IID_IDirect3D2, refiid ) ) ||
169          ( IsEqualGUID( &IID_IUnknown,   refiid ) ) ) {
170         *obj = This;
171         IDirect3D2_AddRef(iface);
172
173         TRACE("  Creating IDirect3D2 interface (%p)\n", *obj);
174
175         return S_OK;
176     }
177     if ( IsEqualGUID( &IID_IDirect3D, refiid ) ) {
178         IDirect3DImpl*  d3d;
179
180         d3d = HeapAlloc(GetProcessHeap(),0,sizeof(*d3d));
181         d3d->ref = 1;
182         d3d->ddraw = This->ddraw;
183         IDirect3D2_AddRef(iface);
184         ICOM_VTBL(d3d) = &d3dvt;
185         *obj = d3d;
186         TRACE("  Creating IDirect3D interface (%p)\n", *obj);
187         return S_OK;
188     }
189     FIXME("(%p):interface for IID %s NOT found!\n",This,debugstr_guid(refiid));
190     return OLE_E_ENUM_NOMORE;
191 }
192
193 ULONG WINAPI IDirect3D2Impl_AddRef(LPDIRECT3D2 iface) {
194     ICOM_THIS(IDirect3D2Impl,iface);
195     TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
196
197     return ++(This->ref);
198 }
199
200 ULONG WINAPI IDirect3D2Impl_Release(LPDIRECT3D2 iface) {
201     ICOM_THIS(IDirect3D2Impl,iface);
202     TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
203
204     if (!--(This->ref)) {
205         IDirectDraw2_Release((IDirectDraw2*)This->ddraw);
206         HeapFree(GetProcessHeap(),0,This);
207         return S_OK;
208     }
209     return This->ref;
210 }
211
212 HRESULT WINAPI IDirect3D2Impl_EnumDevices(
213     LPDIRECT3D2 iface,LPD3DENUMDEVICESCALLBACK cb, LPVOID context
214 ) {
215     ICOM_THIS(IDirect3D2Impl,iface);
216     FIXME("(%p)->(%p,%p),stub!\n",This,cb,context);
217     return DD_OK;
218 }
219
220 HRESULT WINAPI IDirect3D2Impl_CreateLight(
221     LPDIRECT3D2 iface, LPDIRECT3DLIGHT *lplight, IUnknown *lpunk
222 ) {
223     ICOM_THIS(IDirect3D2Impl,iface);
224     FIXME("(%p)->(%p,%p): stub\n", This, lplight, lpunk);
225     return E_FAIL;
226 }
227
228 HRESULT WINAPI IDirect3D2Impl_CreateMaterial(
229     LPDIRECT3D2 iface, LPDIRECT3DMATERIAL2 *lpmaterial, IUnknown *lpunk
230 ) {
231     ICOM_THIS(IDirect3D2Impl,iface);
232     FIXME("(%p)->(%p,%p): stub\n", This, lpmaterial, lpunk);
233     return E_FAIL;
234 }
235
236 HRESULT WINAPI IDirect3D2Impl_CreateViewport(
237     LPDIRECT3D2 iface, LPDIRECT3DVIEWPORT2 *lpviewport, IUnknown *lpunk
238 ) {
239     ICOM_THIS(IDirect3D2Impl,iface);
240     FIXME("(%p)->(%p,%p): stub\n", This, lpviewport, lpunk);
241     return E_FAIL;
242 }
243
244 HRESULT WINAPI IDirect3D2Impl_FindDevice(
245     LPDIRECT3D2 iface, LPD3DFINDDEVICESEARCH lpfinddevsrc,
246     LPD3DFINDDEVICERESULT lpfinddevrst)
247 {
248     ICOM_THIS(IDirect3D2Impl,iface);
249     FIXME("(%p)->(%p,%p): stub\n", This, lpfinddevsrc, lpfinddevrst);
250     return DD_OK;
251 }
252
253 HRESULT WINAPI IDirect3D2Impl_CreateDevice(
254     LPDIRECT3D2 iface, REFCLSID rguid, LPDIRECTDRAWSURFACE surface,
255     LPDIRECT3DDEVICE2 *device)
256 {
257     ICOM_THIS(IDirect3D2Impl,iface);
258     FIXME("(%p)->(%s,%p,%p): stub\n",This,debugstr_guid(rguid),surface,device);
259     return DDERR_INVALIDPARAMS;
260 }
261
262 /* This is for checking the correctness of the prototypes/functions.
263  * Do not remove.
264  */
265 static ICOM_VTABLE(IDirect3D2) WINE_UNUSED d3d2vt = 
266 {
267     ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
268     IDirect3D2Impl_QueryInterface,
269     IDirect3D2Impl_AddRef,
270     IDirect3D2Impl_Release,
271     IDirect3D2Impl_EnumDevices,
272     IDirect3D2Impl_CreateLight,
273     IDirect3D2Impl_CreateMaterial,
274     IDirect3D2Impl_CreateViewport,
275     IDirect3D2Impl_FindDevice,
276     IDirect3D2Impl_CreateDevice
277 };