d3drm: Implement IDirect3DRMFrameX_AddVisual.
[wine] / dlls / d3drm / frame.c
1 /*
2  * Implementation of IDirect3DRMFrame Interface
3  *
4  * Copyright 2011, 2012 AndrĂ© Hentschel
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include <assert.h>
22 #include "wine/debug.h"
23
24 #define COBJMACROS
25
26 #include "winbase.h"
27 #include "wingdi.h"
28
29 #include "d3drm_private.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
32
33 typedef struct {
34     IDirect3DRMFrame2 IDirect3DRMFrame2_iface;
35     IDirect3DRMFrame3 IDirect3DRMFrame3_iface;
36     LONG ref;
37     ULONG nb_children;
38     ULONG children_capacity;
39     IDirect3DRMFrame3** children;
40     ULONG nb_visuals;
41     ULONG visuals_capacity;
42     IDirect3DRMVisual** visuals;
43 } IDirect3DRMFrameImpl;
44
45 static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface)
46 {
47     return CONTAINING_RECORD(iface, IDirect3DRMFrameImpl, IDirect3DRMFrame2_iface);
48 }
49
50 static inline IDirect3DRMFrameImpl *impl_from_IDirect3DRMFrame3(IDirect3DRMFrame3 *iface)
51 {
52     return CONTAINING_RECORD(iface, IDirect3DRMFrameImpl, IDirect3DRMFrame3_iface);
53 }
54
55 static inline IDirect3DRMFrameImpl *unsafe_impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface);
56
57 /*** IUnknown methods ***/
58 static HRESULT WINAPI IDirect3DRMFrame2Impl_QueryInterface(IDirect3DRMFrame2* iface,
59                                                            REFIID riid, void** object)
60 {
61     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
62
63     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
64
65     *object = NULL;
66
67     if(IsEqualGUID(riid, &IID_IUnknown) ||
68        IsEqualGUID(riid, &IID_IDirect3DRMFrame) ||
69        IsEqualGUID(riid, &IID_IDirect3DRMFrame2))
70     {
71         *object = &This->IDirect3DRMFrame2_iface;
72     }
73     else if(IsEqualGUID(riid, &IID_IDirect3DRMFrame3))
74     {
75         *object = &This->IDirect3DRMFrame3_iface;
76     }
77     else
78     {
79         FIXME("interface %s not implemented\n", debugstr_guid(riid));
80         return E_NOINTERFACE;
81     }
82
83     IDirect3DRMFrame2_AddRef(iface);
84     return S_OK;
85 }
86
87 static ULONG WINAPI IDirect3DRMFrame2Impl_AddRef(IDirect3DRMFrame2* iface)
88 {
89     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
90     ULONG ref = InterlockedIncrement(&This->ref);
91
92     TRACE("(%p)->(): new ref = %d\n", This, ref);
93
94     return ref;
95 }
96
97 static ULONG WINAPI IDirect3DRMFrame2Impl_Release(IDirect3DRMFrame2* iface)
98 {
99     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
100     ULONG ref = InterlockedDecrement(&This->ref);
101     ULONG i;
102
103     TRACE("(%p)->(): new ref = %d\n", This, ref);
104
105     if (!ref)
106     {
107         for (i = 0; i < This->nb_children; i++)
108             IDirect3DRMFrame3_Release(This->children[i]);
109         HeapFree(GetProcessHeap(), 0, This->children);
110         HeapFree(GetProcessHeap(), 0, This);
111     }
112
113     return ref;
114 }
115
116 /*** IDirect3DRMObject methods ***/
117 static HRESULT WINAPI IDirect3DRMFrame2Impl_Clone(IDirect3DRMFrame2* iface,
118                                                   LPUNKNOWN unkwn, REFIID riid,
119                                                   LPVOID* object)
120 {
121     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
122
123     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
124
125     return E_NOTIMPL;
126 }
127
128 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddDestroyCallback(IDirect3DRMFrame2* iface,
129                                                                D3DRMOBJECTCALLBACK cb,
130                                                                LPVOID argument)
131 {
132     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
133
134     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
135
136     return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteDestroyCallback(IDirect3DRMFrame2* iface,
140                                                                   D3DRMOBJECTCALLBACK cb,
141                                                                   LPVOID argument)
142 {
143     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
144
145     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
146
147     return E_NOTIMPL;
148 }
149
150 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetAppData(IDirect3DRMFrame2* iface,
151                                                        DWORD data)
152 {
153     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
154
155     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
156
157     return E_NOTIMPL;
158 }
159
160 static DWORD WINAPI IDirect3DRMFrame2Impl_GetAppData(IDirect3DRMFrame2* iface)
161 {
162     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
163
164     FIXME("(%p/%p)->(): stub\n", iface, This);
165
166     return 0;
167 }
168
169 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetName(IDirect3DRMFrame2* iface, LPCSTR name)
170 {
171     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
172
173     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
174
175     return E_NOTIMPL;
176 }
177
178 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetName(IDirect3DRMFrame2* iface,
179                                                     LPDWORD size, LPSTR name)
180 {
181     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
182
183     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
184
185     return E_NOTIMPL;
186 }
187
188 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetClassName(IDirect3DRMFrame2* iface,
189                                                          LPDWORD size, LPSTR name)
190 {
191     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
192
193     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
194
195     return E_NOTIMPL;
196 }
197
198 /*** IDirect3DRMFrame methods ***/
199 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddChild(IDirect3DRMFrame2* iface,
200                                                      LPDIRECT3DRMFRAME child)
201 {
202     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
203     IDirect3DRMFrameImpl *frame;
204
205     TRACE("(%p/%p)->(%p)\n", iface, This, child);
206
207     frame = unsafe_impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)child);
208
209     if (!frame)
210         return D3DRMERR_BADOBJECT;
211
212     return IDirect3DRMFrame3_AddChild(&This->IDirect3DRMFrame3_iface, &frame->IDirect3DRMFrame3_iface);
213 }
214
215 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddLight(IDirect3DRMFrame2* iface,
216                                                      LPDIRECT3DRMLIGHT light)
217 {
218     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
219
220     FIXME("(%p/%p)->(%p): stub\n", iface, This, light);
221
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddMoveCallback(IDirect3DRMFrame2* iface,
226                                                             D3DRMFRAMEMOVECALLBACK cb, VOID *arg)
227 {
228     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
229
230     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, arg);
231
232     return E_NOTIMPL;
233 }
234
235 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddTransform(IDirect3DRMFrame2* iface,
236                                                          D3DRMCOMBINETYPE type,
237                                                          D3DRMMATRIX4D matrix)
238 {
239     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
240
241     FIXME("(%p/%p)->(%u,%p): stub\n", iface, This, type, matrix);
242
243     return E_NOTIMPL;
244 }
245
246 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddTranslation(IDirect3DRMFrame2* iface,
247                                                            D3DRMCOMBINETYPE type,
248                                                            D3DVALUE x, D3DVALUE y, D3DVALUE z)
249 {
250     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
251
252     FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, x, y, z);
253
254     return E_NOTIMPL;
255 }
256
257 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddScale(IDirect3DRMFrame2* iface,
258                                                      D3DRMCOMBINETYPE type,
259                                                      D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
260 {
261     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
262
263     FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, sx, sy, sz);
264
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddRotation(IDirect3DRMFrame2* iface,
269                                                         D3DRMCOMBINETYPE type,
270                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z,
271                                                         D3DVALUE theta)
272 {
273     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
274
275     FIXME("(%p/%p)->(%u,%f,%f,%f,%f): stub\n", iface, This, type, x, y, z, theta);
276
277     return E_NOTIMPL;
278 }
279
280 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddVisual(IDirect3DRMFrame2* iface,
281                                                       LPDIRECT3DRMVISUAL vis)
282 {
283     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
284
285     TRACE("(%p/%p)->(%p)\n", iface, This, vis);
286
287     return IDirect3DRMFrame3_AddVisual(&This->IDirect3DRMFrame3_iface, (LPUNKNOWN)vis);
288 }
289
290 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetChildren(IDirect3DRMFrame2* iface,
291                                                         LPDIRECT3DRMFRAMEARRAY *children)
292 {
293     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
294
295     FIXME("(%p/%p)->(%p): stub\n", iface, This, children);
296
297     return E_NOTIMPL;
298 }
299
300 static D3DCOLOR WINAPI IDirect3DRMFrame2Impl_GetColor(IDirect3DRMFrame2* iface)
301 {
302     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
303
304     FIXME("(%p/%p)->(): stub\n", iface, This);
305
306     return 0;
307 }
308
309 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetLights(IDirect3DRMFrame2* iface,
310                                                       LPDIRECT3DRMLIGHTARRAY *lights)
311 {
312     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
313
314     FIXME("(%p/%p)->(%p): stub\n", iface, This, lights);
315
316     return E_NOTIMPL;
317 }
318
319 static D3DRMMATERIALMODE WINAPI IDirect3DRMFrame2Impl_GetMaterialMode(IDirect3DRMFrame2* iface)
320 {
321     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
322
323     FIXME("(%p/%p)->(): stub\n", iface, This);
324
325     return D3DRMMATERIAL_FROMPARENT;
326 }
327
328 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetParent(IDirect3DRMFrame2* iface,
329                                                       LPDIRECT3DRMFRAME * frame)
330 {
331     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
332
333     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
334
335     return E_NOTIMPL;
336 }
337
338 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetPosition(IDirect3DRMFrame2* iface,
339                                                         LPDIRECT3DRMFRAME reference,
340                                                         LPD3DVECTOR return_position)
341 {
342     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
343
344     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, reference, return_position);
345
346     return E_NOTIMPL;
347 }
348
349 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetRotation(IDirect3DRMFrame2* iface,
350                                                         LPDIRECT3DRMFRAME reference,
351                                                         LPD3DVECTOR axis, LPD3DVALUE return_theta)
352 {
353     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
354
355     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, axis, return_theta);
356
357     return E_NOTIMPL;
358 }
359
360 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetScene(IDirect3DRMFrame2* iface,
361                                                      LPDIRECT3DRMFRAME * frame)
362 {
363     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
364
365     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
366
367     return E_NOTIMPL;
368 }
369
370 static D3DRMSORTMODE WINAPI IDirect3DRMFrame2Impl_GetSortMode(IDirect3DRMFrame2* iface)
371 {
372     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
373
374     FIXME("(%p/%p)->(): stub\n", iface, This);
375
376     return D3DRMSORT_FROMPARENT;
377 }
378
379 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTexture(IDirect3DRMFrame2* iface,
380                                                        LPDIRECT3DRMTEXTURE * tex)
381 {
382     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
383
384     FIXME("(%p/%p)->(%p): stub\n", iface, This, tex);
385
386     return E_NOTIMPL;
387 }
388
389 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTransform(IDirect3DRMFrame2* iface,
390                                                          D3DRMMATRIX4D return_matrix)
391 {
392     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
393
394     FIXME("(%p/%p)->(%p): stub\n", iface, This, return_matrix);
395
396     return E_NOTIMPL;
397 }
398
399 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetVelocity(IDirect3DRMFrame2* iface,
400                                                         LPDIRECT3DRMFRAME reference,
401                                                         LPD3DVECTOR return_velocity,
402                                                         BOOL with_rotation)
403 {
404     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
405
406     FIXME("(%p/%p)->(%p,%p,%d): stub\n", iface, This, reference, return_velocity, with_rotation);
407
408     return E_NOTIMPL;
409 }
410
411 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetOrientation(IDirect3DRMFrame2* iface,
412                                                            LPDIRECT3DRMFRAME reference,
413                                                            LPD3DVECTOR dir, LPD3DVECTOR up)
414 {
415     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
416
417     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, dir, up);
418
419     return E_NOTIMPL;
420 }
421
422 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetVisuals(IDirect3DRMFrame2* iface,
423                                                        LPDIRECT3DRMVISUALARRAY *visuals)
424 {
425     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
426
427     FIXME("(%p/%p)->(%p): stub\n", iface, This, visuals);
428
429     return E_NOTIMPL;
430 }
431
432 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetTextureTopology(IDirect3DRMFrame2* iface,
433                                                                BOOL *wrap_u, BOOL *wrap_v)
434 {
435     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
436
437     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, wrap_u, wrap_v);
438
439     return E_NOTIMPL;
440 }
441
442 static HRESULT WINAPI IDirect3DRMFrame2Impl_InverseTransform(IDirect3DRMFrame2* iface,
443                                                              D3DVECTOR *d, D3DVECTOR *s)
444 {
445     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
446
447     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, d, s);
448
449     return E_NOTIMPL;
450 }
451
452 static HRESULT WINAPI IDirect3DRMFrame2Impl_Load(IDirect3DRMFrame2* iface, LPVOID filename,
453                                                  LPVOID name, D3DRMLOADOPTIONS loadflags,
454                                                  D3DRMLOADTEXTURECALLBACK cb, LPVOID lpArg)
455 {
456     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
457
458     FIXME("(%p/%p)->(%p,%p,%u,%p,%p): stub\n", iface, This, filename, name, loadflags, cb, lpArg);
459
460     return E_NOTIMPL;
461 }
462
463 static HRESULT WINAPI IDirect3DRMFrame2Impl_LookAt(IDirect3DRMFrame2* iface,
464                                                    LPDIRECT3DRMFRAME target,
465                                                    LPDIRECT3DRMFRAME reference,
466                                                    D3DRMFRAMECONSTRAINT constraint)
467 {
468     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
469
470     FIXME("(%p/%p)->(%p,%p,%u): stub\n", iface, This, target, reference, constraint);
471
472     return E_NOTIMPL;
473 }
474
475 static HRESULT WINAPI IDirect3DRMFrame2Impl_Move(IDirect3DRMFrame2* iface, D3DVALUE delta)
476 {
477     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
478
479     FIXME("(%p/%p)->(%f): stub\n", iface, This, delta);
480
481     return E_NOTIMPL;
482 }
483
484 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteChild(IDirect3DRMFrame2* iface,
485                                                         LPDIRECT3DRMFRAME frame)
486 {
487     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
488     IDirect3DRMFrameImpl *child;
489
490     TRACE("(%p/%p)->(%p)\n", iface, This, frame);
491
492     child = unsafe_impl_from_IDirect3DRMFrame2((LPDIRECT3DRMFRAME2)frame);
493
494     if (!child)
495         return D3DRMERR_BADOBJECT;
496
497     return IDirect3DRMFrame3_DeleteChild(&This->IDirect3DRMFrame3_iface, &child->IDirect3DRMFrame3_iface);
498 }
499
500 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteLight(IDirect3DRMFrame2* iface,
501                                                         LPDIRECT3DRMLIGHT light)
502 {
503     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
504
505     FIXME("(%p/%p)->(%p): stub\n", iface, This, light);
506
507     return E_NOTIMPL;
508 }
509
510 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteMoveCallback(IDirect3DRMFrame2* iface,
511                                                                D3DRMFRAMEMOVECALLBACK cb, VOID *arg)
512 {
513     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
514
515     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, arg);
516
517     return E_NOTIMPL;
518 }
519
520 static HRESULT WINAPI IDirect3DRMFrame2Impl_DeleteVisual(IDirect3DRMFrame2* iface,
521                                                          LPDIRECT3DRMVISUAL vis)
522 {
523     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
524
525     FIXME("(%p/%p)->(%p): stub\n", iface, This, vis);
526
527     return E_NOTIMPL;
528 }
529
530 static D3DCOLOR WINAPI IDirect3DRMFrame2Impl_GetSceneBackground(IDirect3DRMFrame2* iface)
531 {
532     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
533
534     FIXME("(%p/%p)->(): stub\n", iface, This);
535
536     return 0;
537 }
538
539 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetSceneBackgroundDepth(IDirect3DRMFrame2* iface,
540                                                                     LPDIRECTDRAWSURFACE * surface)
541 {
542     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
543
544     FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);
545
546     return E_NOTIMPL;
547 }
548
549 static D3DCOLOR WINAPI IDirect3DRMFrame2Impl_GetSceneFogColor(IDirect3DRMFrame2* iface)
550 {
551     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
552
553     FIXME("(%p/%p)->(): stub\n", iface, This);
554
555     return 0;
556 }
557
558 static BOOL WINAPI IDirect3DRMFrame2Impl_GetSceneFogEnable(IDirect3DRMFrame2* iface)
559 {
560     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
561
562     FIXME("(%p/%p)->(): stub\n", iface, This);
563
564     return FALSE;
565 }
566
567 static D3DRMFOGMODE WINAPI IDirect3DRMFrame2Impl_GetSceneFogMode(IDirect3DRMFrame2* iface)
568 {
569     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
570
571     FIXME("(%p/%p)->(): stub\n", iface, This);
572
573     return D3DRMFOG_LINEAR;
574 }
575
576 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetSceneFogParams(IDirect3DRMFrame2* iface,
577                                                               D3DVALUE *return_start,
578                                                               D3DVALUE *return_end,
579                                                               D3DVALUE *return_density)
580 {
581     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
582
583     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, return_start, return_end, return_density);
584
585     return E_NOTIMPL;
586 }
587
588 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneBackground(IDirect3DRMFrame2* iface,
589                                                                D3DCOLOR color)
590 {
591     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
592
593     FIXME("(%p/%p)->(%u): stub\n", iface, This, color);
594
595     return E_NOTIMPL;
596 }
597
598 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneBackgroundRGB(IDirect3DRMFrame2* iface,
599                                                                   D3DVALUE red, D3DVALUE green,
600                                                                   D3DVALUE blue)
601 {
602     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
603
604     FIXME("(%p/%p)->(%f,%f,%f): stub\n", iface, This, red, green, blue);
605
606     return E_NOTIMPL;
607 }
608
609 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneBackgroundDepth(IDirect3DRMFrame2* iface,
610                                                                     LPDIRECTDRAWSURFACE surface)
611 {
612     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
613
614     FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);
615
616     return E_NOTIMPL;
617 }
618
619 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneBackgroundImage(IDirect3DRMFrame2* iface,
620                                                                     LPDIRECT3DRMTEXTURE texture)
621 {
622     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
623
624     FIXME("(%p/%p)->(%p): stub\n", iface, This, texture);
625
626     return E_NOTIMPL;
627 }
628
629 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneFogEnable(IDirect3DRMFrame2* iface, BOOL enable)
630 {
631     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
632
633     FIXME("(%p/%p)->(%d): stub\n", iface, This, enable);
634
635     return E_NOTIMPL;
636 }
637
638 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneFogColor(IDirect3DRMFrame2* iface,
639                                                              D3DCOLOR color)
640 {
641     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
642
643     FIXME("(%p/%p)->(%u): stub\n", iface, This, color);
644
645     return E_NOTIMPL;
646 }
647
648 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneFogMode(IDirect3DRMFrame2* iface,
649                                                             D3DRMFOGMODE mode)
650 {
651     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
652
653     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
654
655     return E_NOTIMPL;
656 }
657
658 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSceneFogParams(IDirect3DRMFrame2* iface,
659                                                               D3DVALUE start, D3DVALUE end,
660                                                               D3DVALUE density)
661 {
662     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
663
664     FIXME("(%p/%p)->(%f,%f,%f): stub\n", iface, This, start, end, density);
665
666     return E_NOTIMPL;
667 }
668
669 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetColor(IDirect3DRMFrame2* iface, D3DCOLOR color)
670 {
671     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
672
673     FIXME("(%p/%p)->(%u): stub\n", iface, This, color);
674
675     return E_NOTIMPL;
676 }
677
678 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetColorRGB(IDirect3DRMFrame2* iface, D3DVALUE red,
679                                                         D3DVALUE green, D3DVALUE blue)
680 {
681     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
682
683     FIXME("(%p/%p)->(%f,%f,%f): stub\n", iface, This, red, green, blue);
684
685     return E_NOTIMPL;
686 }
687
688 static D3DRMZBUFFERMODE WINAPI IDirect3DRMFrame2Impl_GetZbufferMode(IDirect3DRMFrame2* iface)
689 {
690     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
691
692     FIXME("(%p/%p)->(): stub\n", iface, This);
693
694     return D3DRMZBUFFER_FROMPARENT;
695 }
696
697 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetMaterialMode(IDirect3DRMFrame2* iface,
698                                                             D3DRMMATERIALMODE mode)
699 {
700     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
701
702     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
703
704     return E_NOTIMPL;
705 }
706
707 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetOrientation(IDirect3DRMFrame2* iface,
708                                                            LPDIRECT3DRMFRAME reference,
709                                                            D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
710                                                            D3DVALUE ux, D3DVALUE uy, D3DVALUE uz )
711 {
712     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
713
714     FIXME("(%p/%p)->(%p,%f,%f,%f,%f,%f,%f): stub\n", iface, This, reference,
715           dx, dy, dz, ux, uy, uz);
716
717     return E_NOTIMPL;
718 }
719
720 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetPosition(IDirect3DRMFrame2* iface,
721                                                         LPDIRECT3DRMFRAME reference,
722                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z)
723 {
724     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
725
726     FIXME("(%p/%p)->(%p,%f,%f,%f): stub\n", iface, This, reference, x, y, z);
727
728     return E_NOTIMPL;
729 }
730
731 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetRotation(IDirect3DRMFrame2* iface,
732                                                         LPDIRECT3DRMFRAME reference,
733                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z,
734                                                         D3DVALUE theta)
735 {
736     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
737
738     FIXME("(%p/%p)->(%p,%f,%f,%f,%f): stub\n", iface, This, reference, x, y, z, theta);
739
740     return E_NOTIMPL;
741 }
742
743 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetSortMode(IDirect3DRMFrame2* iface,
744                                                         D3DRMSORTMODE mode)
745 {
746     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
747
748     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
749
750     return E_NOTIMPL;
751 }
752
753 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetTexture(IDirect3DRMFrame2* iface,
754                                                        LPDIRECT3DRMTEXTURE texture)
755 {
756     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
757
758     FIXME("(%p/%p)->(%p): stub\n", iface, This, texture);
759
760     return E_NOTIMPL;
761 }
762
763 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetTextureTopology(IDirect3DRMFrame2* iface,
764                                                                BOOL wrap_u, BOOL wrap_v)
765 {
766     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
767
768     FIXME("(%p/%p)->(%d,%d): stub\n", iface, This, wrap_u, wrap_v);
769
770     return E_NOTIMPL;
771 }
772
773 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetVelocity(IDirect3DRMFrame2* iface,
774                                                         LPDIRECT3DRMFRAME reference,
775                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z,
776                                                         BOOL with_rotation)
777 {
778     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
779
780     FIXME("(%p/%p)->(%p,%f,%f,%f,%d): stub\n", iface, This, reference, x, y, z, with_rotation);
781
782     return E_NOTIMPL;
783 }
784
785 static HRESULT WINAPI IDirect3DRMFrame2Impl_SetZbufferMode(IDirect3DRMFrame2* iface,
786                                                            D3DRMZBUFFERMODE mode)
787 {
788     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
789
790     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
791
792     return E_NOTIMPL;
793 }
794
795 static HRESULT WINAPI IDirect3DRMFrame2Impl_Transform(IDirect3DRMFrame2* iface, D3DVECTOR *d,
796                                                       D3DVECTOR *s)
797 {
798     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
799
800     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, d, s);
801
802     return E_NOTIMPL;
803 }
804
805 /*** IDirect3DRMFrame2 methods ***/
806 static HRESULT WINAPI IDirect3DRMFrame2Impl_AddMoveCallback2(IDirect3DRMFrame2* iface,
807                                                              D3DRMFRAMEMOVECALLBACK cb, VOID *arg,
808                                                              DWORD flags)
809 {
810     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
811
812     FIXME("(%p/%p)->(%p,%p,%u): stub\n", iface, This, cb, arg, flags);
813
814     return E_NOTIMPL;
815 }
816
817 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetBox(IDirect3DRMFrame2* iface, LPD3DRMBOX box)
818 {
819     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
820
821     FIXME("(%p/%p)->(%p): stub\n", iface, This, box);
822
823     return E_NOTIMPL;
824 }
825
826 static BOOL WINAPI IDirect3DRMFrame2Impl_GetBoxEnable(IDirect3DRMFrame2* iface)
827 {
828     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
829
830     FIXME("(%p/%p)->(): stub\n", iface, This);
831
832     return E_NOTIMPL;
833 }
834
835 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetAxes(IDirect3DRMFrame2* iface,
836                                                     LPD3DVECTOR dir, LPD3DVECTOR up)
837 {
838     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
839
840     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, dir, up);
841
842     return E_NOTIMPL;
843 }
844
845 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetMaterial(IDirect3DRMFrame2* iface,
846                                                         LPDIRECT3DRMMATERIAL *material)
847 {
848     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
849
850     FIXME("(%p/%p)->(%p): stub\n", iface, This, material);
851
852     return E_NOTIMPL;
853 }
854
855 static BOOL WINAPI IDirect3DRMFrame2Impl_GetInheritAxes(IDirect3DRMFrame2* iface)
856 {
857     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
858
859     FIXME("(%p/%p)->(): stub\n", iface, This);
860
861     return E_NOTIMPL;
862 }
863
864 static HRESULT WINAPI IDirect3DRMFrame2Impl_GetHierarchyBox(IDirect3DRMFrame2* iface,
865                                                             LPD3DRMBOX box)
866 {
867     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame2(iface);
868
869     FIXME("(%p/%p)->(%p): stub\n", iface, This, box);
870
871     return E_NOTIMPL;
872 }
873
874 static const struct IDirect3DRMFrame2Vtbl Direct3DRMFrame2_Vtbl =
875 {
876     /*** IUnknown methods ***/
877     IDirect3DRMFrame2Impl_QueryInterface,
878     IDirect3DRMFrame2Impl_AddRef,
879     IDirect3DRMFrame2Impl_Release,
880     /*** IDirect3DRMObject methods ***/
881     IDirect3DRMFrame2Impl_Clone,
882     IDirect3DRMFrame2Impl_AddDestroyCallback,
883     IDirect3DRMFrame2Impl_DeleteDestroyCallback,
884     IDirect3DRMFrame2Impl_SetAppData,
885     IDirect3DRMFrame2Impl_GetAppData,
886     IDirect3DRMFrame2Impl_SetName,
887     IDirect3DRMFrame2Impl_GetName,
888     IDirect3DRMFrame2Impl_GetClassName,
889     /*** IDirect3DRMFrame methods ***/
890     IDirect3DRMFrame2Impl_AddChild,
891     IDirect3DRMFrame2Impl_AddLight,
892     IDirect3DRMFrame2Impl_AddMoveCallback,
893     IDirect3DRMFrame2Impl_AddTransform,
894     IDirect3DRMFrame2Impl_AddTranslation,
895     IDirect3DRMFrame2Impl_AddScale,
896     IDirect3DRMFrame2Impl_AddRotation,
897     IDirect3DRMFrame2Impl_AddVisual,
898     IDirect3DRMFrame2Impl_GetChildren,
899     IDirect3DRMFrame2Impl_GetColor,
900     IDirect3DRMFrame2Impl_GetLights,
901     IDirect3DRMFrame2Impl_GetMaterialMode,
902     IDirect3DRMFrame2Impl_GetParent,
903     IDirect3DRMFrame2Impl_GetPosition,
904     IDirect3DRMFrame2Impl_GetRotation,
905     IDirect3DRMFrame2Impl_GetScene,
906     IDirect3DRMFrame2Impl_GetSortMode,
907     IDirect3DRMFrame2Impl_GetTexture,
908     IDirect3DRMFrame2Impl_GetTransform,
909     IDirect3DRMFrame2Impl_GetVelocity,
910     IDirect3DRMFrame2Impl_GetOrientation,
911     IDirect3DRMFrame2Impl_GetVisuals,
912     IDirect3DRMFrame2Impl_GetTextureTopology,
913     IDirect3DRMFrame2Impl_InverseTransform,
914     IDirect3DRMFrame2Impl_Load,
915     IDirect3DRMFrame2Impl_LookAt,
916     IDirect3DRMFrame2Impl_Move,
917     IDirect3DRMFrame2Impl_DeleteChild,
918     IDirect3DRMFrame2Impl_DeleteLight,
919     IDirect3DRMFrame2Impl_DeleteMoveCallback,
920     IDirect3DRMFrame2Impl_DeleteVisual,
921     IDirect3DRMFrame2Impl_GetSceneBackground,
922     IDirect3DRMFrame2Impl_GetSceneBackgroundDepth,
923     IDirect3DRMFrame2Impl_GetSceneFogColor,
924     IDirect3DRMFrame2Impl_GetSceneFogEnable,
925     IDirect3DRMFrame2Impl_GetSceneFogMode,
926     IDirect3DRMFrame2Impl_GetSceneFogParams,
927     IDirect3DRMFrame2Impl_SetSceneBackground,
928     IDirect3DRMFrame2Impl_SetSceneBackgroundRGB,
929     IDirect3DRMFrame2Impl_SetSceneBackgroundDepth,
930     IDirect3DRMFrame2Impl_SetSceneBackgroundImage,
931     IDirect3DRMFrame2Impl_SetSceneFogEnable,
932     IDirect3DRMFrame2Impl_SetSceneFogColor,
933     IDirect3DRMFrame2Impl_SetSceneFogMode,
934     IDirect3DRMFrame2Impl_SetSceneFogParams,
935     IDirect3DRMFrame2Impl_SetColor,
936     IDirect3DRMFrame2Impl_SetColorRGB,
937     IDirect3DRMFrame2Impl_GetZbufferMode,
938     IDirect3DRMFrame2Impl_SetMaterialMode,
939     IDirect3DRMFrame2Impl_SetOrientation,
940     IDirect3DRMFrame2Impl_SetPosition,
941     IDirect3DRMFrame2Impl_SetRotation,
942     IDirect3DRMFrame2Impl_SetSortMode,
943     IDirect3DRMFrame2Impl_SetTexture,
944     IDirect3DRMFrame2Impl_SetTextureTopology,
945     IDirect3DRMFrame2Impl_SetVelocity,
946     IDirect3DRMFrame2Impl_SetZbufferMode,
947     IDirect3DRMFrame2Impl_Transform,
948     /*** IDirect3DRMFrame2 methods ***/
949     IDirect3DRMFrame2Impl_AddMoveCallback2,
950     IDirect3DRMFrame2Impl_GetBox,
951     IDirect3DRMFrame2Impl_GetBoxEnable,
952     IDirect3DRMFrame2Impl_GetAxes,
953     IDirect3DRMFrame2Impl_GetMaterial,
954     IDirect3DRMFrame2Impl_GetInheritAxes,
955     IDirect3DRMFrame2Impl_GetHierarchyBox
956 };
957
958 /*** IUnknown methods ***/
959 static HRESULT WINAPI IDirect3DRMFrame3Impl_QueryInterface(IDirect3DRMFrame3* iface,
960                                                            REFIID riid, void** object)
961 {
962     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
963     return IDirect3DRMFrame_QueryInterface(&This->IDirect3DRMFrame2_iface, riid, object);
964 }
965
966 static ULONG WINAPI IDirect3DRMFrame3Impl_AddRef(IDirect3DRMFrame3* iface)
967 {
968     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
969     return IDirect3DRMFrame2_AddRef(&This->IDirect3DRMFrame2_iface);
970 }
971
972 static ULONG WINAPI IDirect3DRMFrame3Impl_Release(IDirect3DRMFrame3* iface)
973 {
974     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
975     return IDirect3DRMFrame2_Release(&This->IDirect3DRMFrame2_iface);
976 }
977
978 /*** IDirect3DRMObject methods ***/
979 static HRESULT WINAPI IDirect3DRMFrame3Impl_Clone(IDirect3DRMFrame3* iface,
980                                                   LPUNKNOWN unkwn, REFIID riid,
981                                                   LPVOID* object)
982 {
983     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
984
985     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
986
987     return E_NOTIMPL;
988 }
989
990 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddDestroyCallback(IDirect3DRMFrame3* iface,
991                                                                D3DRMOBJECTCALLBACK cb,
992                                                                LPVOID argument)
993 {
994     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
995
996     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
997
998     return E_NOTIMPL;
999 }
1000
1001 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteDestroyCallback(IDirect3DRMFrame3* iface,
1002                                                                   D3DRMOBJECTCALLBACK cb,
1003                                                                   LPVOID argument)
1004 {
1005     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1006
1007     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
1008
1009     return E_NOTIMPL;
1010 }
1011
1012 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetAppData(IDirect3DRMFrame3* iface,
1013                                                        DWORD data)
1014 {
1015     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1016
1017     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
1018
1019     return E_NOTIMPL;
1020 }
1021
1022 static DWORD WINAPI IDirect3DRMFrame3Impl_GetAppData(IDirect3DRMFrame3* iface)
1023 {
1024     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1025
1026     FIXME("(%p/%p)->(): stub\n", iface, This);
1027
1028     return 0;
1029 }
1030
1031 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetName(IDirect3DRMFrame3* iface, LPCSTR name)
1032 {
1033     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1034
1035     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
1036
1037     return E_NOTIMPL;
1038 }
1039
1040 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetName(IDirect3DRMFrame3* iface,
1041                                                     LPDWORD size, LPSTR name)
1042 {
1043     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1044
1045     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
1046
1047     return E_NOTIMPL;
1048 }
1049
1050 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetClassName(IDirect3DRMFrame3* iface,
1051                                                          LPDWORD size, LPSTR name)
1052 {
1053     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1054
1055     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
1056
1057     return E_NOTIMPL;
1058 }
1059
1060 /*** IDirect3DRMFrame methods ***/
1061 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddChild(IDirect3DRMFrame3* iface,
1062                                                      LPDIRECT3DRMFRAME3 child)
1063 {
1064     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1065     ULONG i;
1066     IDirect3DRMFrame3** children;
1067
1068     TRACE("(%p/%p)->(%p)\n", iface, This, child);
1069
1070     if (!child)
1071         return D3DRMERR_BADOBJECT;
1072
1073     /* Check if already existing and return gracefully without increasing ref count */
1074     for (i = 0; i < This->nb_children; i++)
1075         if (This->children[i] == child)
1076             return D3DRM_OK;
1077
1078     if ((This->nb_children + 1) > This->children_capacity)
1079     {
1080         ULONG new_capacity;
1081
1082         if (!This->children_capacity)
1083         {
1084             new_capacity = 16;
1085             children = HeapAlloc(GetProcessHeap(), 0, new_capacity * sizeof(IDirect3DRMFrame3*));
1086         }
1087         else
1088         {
1089             new_capacity = This->children_capacity * 2;
1090             children = HeapReAlloc(GetProcessHeap(), 0, This->children, new_capacity * sizeof(IDirect3DRMFrame3*));
1091         }
1092
1093         if (!children)
1094             return E_OUTOFMEMORY;
1095
1096         This->children_capacity = new_capacity;
1097         This->children = children;
1098     }
1099
1100     This->children[This->nb_children++] = child;
1101     IDirect3DRMFrame3_AddRef(child);
1102
1103     return D3DRM_OK;
1104 }
1105
1106 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddLight(IDirect3DRMFrame3* iface,
1107                                                      LPDIRECT3DRMLIGHT light)
1108 {
1109     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1110
1111     FIXME("(%p/%p)->(%p): stub\n", iface, This, light);
1112
1113     return E_NOTIMPL;
1114 }
1115
1116 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddMoveCallback(IDirect3DRMFrame3* iface,
1117                                                             D3DRMFRAME3MOVECALLBACK cb, VOID *arg,
1118                                                             DWORD flags)
1119 {
1120     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1121
1122     FIXME("(%p/%p)->(%p,%p,%u): stub\n", iface, This, cb, arg, flags);
1123
1124     return E_NOTIMPL;
1125 }
1126
1127 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddTransform(IDirect3DRMFrame3* iface,
1128                                                          D3DRMCOMBINETYPE type,
1129                                                          D3DRMMATRIX4D matrix)
1130 {
1131     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1132
1133     FIXME("(%p/%p)->(%u,%p): stub\n", iface, This, type, matrix);
1134
1135     return E_NOTIMPL;
1136 }
1137
1138 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddTranslation(IDirect3DRMFrame3* iface,
1139                                                            D3DRMCOMBINETYPE type,
1140                                                            D3DVALUE x, D3DVALUE y, D3DVALUE z)
1141 {
1142     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1143
1144     FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, x, y, z);
1145
1146     return E_NOTIMPL;
1147 }
1148
1149 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddScale(IDirect3DRMFrame3* iface,
1150                                                      D3DRMCOMBINETYPE type,
1151                                                      D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
1152 {
1153     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1154
1155     FIXME("(%p/%p)->(%u,%f,%f,%f): stub\n", iface, This, type, sx, sy, sz);
1156
1157     return E_NOTIMPL;
1158 }
1159
1160 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddRotation(IDirect3DRMFrame3* iface,
1161                                                         D3DRMCOMBINETYPE type,
1162                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z,
1163                                                         D3DVALUE theta)
1164 {
1165     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1166
1167     FIXME("(%p/%p)->(%u,%f,%f,%f,%f): stub\n", iface, This, type, x, y, z, theta);
1168
1169     return E_NOTIMPL;
1170 }
1171
1172 static HRESULT WINAPI IDirect3DRMFrame3Impl_AddVisual(IDirect3DRMFrame3* iface, LPUNKNOWN vis)
1173 {
1174     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1175     ULONG i;
1176     IDirect3DRMVisual** visuals;
1177
1178     TRACE("(%p/%p)->(%p)\n", iface, This, vis);
1179
1180     if (!vis)
1181         return D3DRMERR_BADOBJECT;
1182
1183     /* Check if already existing and return gracefully without increasing ref count */
1184     for (i = 0; i < This->nb_visuals; i++)
1185         if (This->visuals[i] == (IDirect3DRMVisual*)vis)
1186             return D3DRM_OK;
1187
1188     if ((This->nb_visuals + 1) > This->visuals_capacity)
1189     {
1190         ULONG new_capacity;
1191
1192         if (!This->visuals_capacity)
1193         {
1194             new_capacity = 16;
1195             visuals = HeapAlloc(GetProcessHeap(), 0, new_capacity * sizeof(IDirect3DRMVisual*));
1196         }
1197         else
1198         {
1199             new_capacity = This->visuals_capacity * 2;
1200             visuals = HeapReAlloc(GetProcessHeap(), 0, This->visuals, new_capacity * sizeof(IDirect3DRMVisual*));
1201         }
1202
1203         if (!visuals)
1204             return E_OUTOFMEMORY;
1205
1206         This->visuals_capacity = new_capacity;
1207         This->visuals = visuals;
1208     }
1209
1210     This->visuals[This->nb_visuals++] = (IDirect3DRMVisual*)vis;
1211     IDirect3DRMVisual_AddRef(vis);
1212
1213     return D3DRM_OK;
1214 }
1215
1216 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetChildren(IDirect3DRMFrame3* iface,
1217                                                         LPDIRECT3DRMFRAMEARRAY *children)
1218 {
1219     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1220
1221     FIXME("(%p/%p)->(%p): stub\n", iface, This, children);
1222
1223     return E_NOTIMPL;
1224 }
1225
1226 static D3DCOLOR WINAPI IDirect3DRMFrame3Impl_GetColor(IDirect3DRMFrame3* iface)
1227 {
1228     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1229
1230     FIXME("(%p/%p)->(): stub\n", iface, This);
1231
1232     return 0;
1233 }
1234
1235 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetLights(IDirect3DRMFrame3* iface,
1236                                                       LPDIRECT3DRMLIGHTARRAY *lights)
1237 {
1238     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1239
1240     FIXME("(%p/%p)->(%p): stub\n", iface, This, lights);
1241
1242     return E_NOTIMPL;
1243 }
1244
1245 static D3DRMMATERIALMODE WINAPI IDirect3DRMFrame3Impl_GetMaterialMode(IDirect3DRMFrame3* iface)
1246 {
1247     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1248
1249     FIXME("(%p/%p)->(): stub\n", iface, This);
1250
1251     return D3DRMMATERIAL_FROMPARENT;
1252 }
1253
1254 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetParent(IDirect3DRMFrame3* iface,
1255                                                       LPDIRECT3DRMFRAME3 * frame)
1256 {
1257     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1258
1259     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
1260
1261     return E_NOTIMPL;
1262 }
1263
1264 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetPosition(IDirect3DRMFrame3* iface,
1265                                                         LPDIRECT3DRMFRAME3 reference,
1266                                                         LPD3DVECTOR return_position)
1267 {
1268     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1269
1270     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, reference, return_position);
1271
1272     return E_NOTIMPL;
1273 }
1274
1275 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetRotation(IDirect3DRMFrame3* iface,
1276                                                         LPDIRECT3DRMFRAME3 reference,
1277                                                         LPD3DVECTOR axis, LPD3DVALUE return_theta)
1278 {
1279     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1280
1281     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, axis, return_theta);
1282
1283     return E_NOTIMPL;
1284 }
1285
1286 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetScene(IDirect3DRMFrame3* iface,
1287                                                      LPDIRECT3DRMFRAME3 * frame)
1288 {
1289     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1290
1291     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
1292
1293     return E_NOTIMPL;
1294 }
1295
1296 static D3DRMSORTMODE WINAPI IDirect3DRMFrame3Impl_GetSortMode(IDirect3DRMFrame3* iface)
1297 {
1298     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1299
1300     FIXME("(%p/%p)->(): stub\n", iface, This);
1301
1302     return D3DRMSORT_FROMPARENT;
1303 }
1304
1305 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetTexture(IDirect3DRMFrame3* iface,
1306                                                        LPDIRECT3DRMTEXTURE3 * tex)
1307 {
1308     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1309
1310     FIXME("(%p/%p)->(%p): stub\n", iface, This, tex);
1311
1312     return E_NOTIMPL;
1313 }
1314
1315 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetTransform(IDirect3DRMFrame3* iface,
1316                                                          LPDIRECT3DRMFRAME3 reference,
1317                                                          D3DRMMATRIX4D return_matrix)
1318 {
1319     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1320
1321     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, reference, return_matrix);
1322
1323     return E_NOTIMPL;
1324 }
1325
1326 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetVelocity(IDirect3DRMFrame3* iface,
1327                                                         LPDIRECT3DRMFRAME3 reference,
1328                                                         LPD3DVECTOR return_velocity,
1329                                                         BOOL with_rotation)
1330 {
1331     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1332
1333     FIXME("(%p/%p)->(%p,%p,%d): stub\n", iface, This, reference, return_velocity, with_rotation);
1334
1335     return E_NOTIMPL;
1336 }
1337
1338 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetOrientation(IDirect3DRMFrame3* iface,
1339                                                            LPDIRECT3DRMFRAME3 reference,
1340                                                            LPD3DVECTOR dir, LPD3DVECTOR up)
1341 {
1342     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1343
1344     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, reference, dir, up);
1345
1346     return E_NOTIMPL;
1347 }
1348
1349 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetVisuals(IDirect3DRMFrame3* iface, LPDWORD num,
1350                                                        LPUNKNOWN *visuals)
1351 {
1352     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1353
1354     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, num, visuals);
1355
1356     return E_NOTIMPL;
1357 }
1358
1359 static HRESULT WINAPI IDirect3DRMFrame3Impl_InverseTransform(IDirect3DRMFrame3* iface,
1360                                                              D3DVECTOR *d, D3DVECTOR *s)
1361 {
1362     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1363
1364     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, d, s);
1365
1366     return E_NOTIMPL;
1367 }
1368
1369 static HRESULT WINAPI IDirect3DRMFrame3Impl_Load(IDirect3DRMFrame3* iface, LPVOID filename,
1370                                                  LPVOID name, D3DRMLOADOPTIONS loadflags,
1371                                                  D3DRMLOADTEXTURE3CALLBACK cb, LPVOID lpArg)
1372 {
1373     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1374
1375     FIXME("(%p/%p)->(%p,%p,%u,%p,%p): stub\n", iface, This, filename, name, loadflags, cb, lpArg);
1376
1377     return E_NOTIMPL;
1378 }
1379
1380 static HRESULT WINAPI IDirect3DRMFrame3Impl_LookAt(IDirect3DRMFrame3* iface,
1381                                                    LPDIRECT3DRMFRAME3 target,
1382                                                    LPDIRECT3DRMFRAME3 reference,
1383                                                    D3DRMFRAMECONSTRAINT constraint)
1384 {
1385     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1386
1387     FIXME("(%p/%p)->(%p,%p,%u): stub\n", iface, This, target, reference, constraint);
1388
1389     return E_NOTIMPL;
1390 }
1391
1392 static HRESULT WINAPI IDirect3DRMFrame3Impl_Move(IDirect3DRMFrame3* iface, D3DVALUE delta)
1393 {
1394     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1395
1396     FIXME("(%p/%p)->(%f): stub\n", iface, This, delta);
1397
1398     return E_NOTIMPL;
1399 }
1400
1401 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteChild(IDirect3DRMFrame3* iface,
1402                                                         LPDIRECT3DRMFRAME3 frame)
1403 {
1404     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1405     ULONG i;
1406
1407     TRACE("(%p/%p)->(%p)\n", iface, This, frame);
1408
1409     if (!frame)
1410         return D3DRMERR_BADOBJECT;
1411
1412     /* Check if child exists */
1413     for (i = 0; i < This->nb_children; i++)
1414         if (This->children[i] == frame)
1415             break;
1416
1417     if (i == This->nb_children)
1418         return D3DRMERR_BADVALUE;
1419
1420     memmove(This->children + i, This->children + i + 1, sizeof(IDirect3DRMFrame3*) * (This->nb_children - 1 - i));
1421     IDirect3DRMFrame3_Release(frame);
1422     This->nb_children--;
1423
1424     return D3DRM_OK;
1425 }
1426
1427 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteLight(IDirect3DRMFrame3* iface,
1428                                                         LPDIRECT3DRMLIGHT light)
1429 {
1430     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1431
1432     FIXME("(%p/%p)->(%p): stub\n", iface, This, light);
1433
1434     return E_NOTIMPL;
1435 }
1436
1437 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteMoveCallback(IDirect3DRMFrame3* iface,
1438                                                                D3DRMFRAME3MOVECALLBACK cb,
1439                                                                VOID *arg)
1440 {
1441     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1442
1443     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, cb, arg);
1444
1445     return E_NOTIMPL;
1446 }
1447
1448 static HRESULT WINAPI IDirect3DRMFrame3Impl_DeleteVisual(IDirect3DRMFrame3* iface, LPUNKNOWN vis)
1449 {
1450     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1451
1452     FIXME("(%p/%p)->(%p): stub\n", iface, This, vis);
1453
1454     return E_NOTIMPL;
1455 }
1456
1457 static D3DCOLOR WINAPI IDirect3DRMFrame3Impl_GetSceneBackground(IDirect3DRMFrame3* iface)
1458 {
1459     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1460
1461     FIXME("(%p/%p)->(): stub\n", iface, This);
1462
1463     return 0;
1464 }
1465
1466 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetSceneBackgroundDepth(IDirect3DRMFrame3* iface,
1467                                                                     LPDIRECTDRAWSURFACE * surface)
1468 {
1469     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1470
1471     FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);
1472
1473     return E_NOTIMPL;
1474 }
1475
1476 static D3DCOLOR WINAPI IDirect3DRMFrame3Impl_GetSceneFogColor(IDirect3DRMFrame3* iface)
1477 {
1478     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1479
1480     FIXME("(%p/%p)->(): stub\n", iface, This);
1481
1482     return 0;
1483 }
1484
1485 static BOOL WINAPI IDirect3DRMFrame3Impl_GetSceneFogEnable(IDirect3DRMFrame3* iface)
1486 {
1487     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1488
1489     FIXME("(%p/%p)->(): stub\n", iface, This);
1490
1491     return FALSE;
1492 }
1493
1494 static D3DRMFOGMODE WINAPI IDirect3DRMFrame3Impl_GetSceneFogMode(IDirect3DRMFrame3* iface)
1495 {
1496     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1497
1498     FIXME("(%p/%p)->(): stub\n", iface, This);
1499
1500     return D3DRMFOG_LINEAR;
1501 }
1502
1503 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetSceneFogParams(IDirect3DRMFrame3* iface,
1504                                                               D3DVALUE *return_start,
1505                                                               D3DVALUE *return_end,
1506                                                               D3DVALUE *return_density)
1507 {
1508     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1509
1510     FIXME("(%p/%p)->(%p,%p,%p): stub\n", iface, This, return_start, return_end, return_density);
1511
1512     return E_NOTIMPL;
1513 }
1514
1515 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneBackground(IDirect3DRMFrame3* iface,
1516                                                                D3DCOLOR color)
1517 {
1518     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1519
1520     FIXME("(%p/%p)->(%u): stub\n", iface, This, color);
1521
1522     return E_NOTIMPL;
1523 }
1524
1525 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneBackgroundRGB(IDirect3DRMFrame3* iface,
1526                                                                   D3DVALUE red, D3DVALUE green,
1527                                                                   D3DVALUE blue)
1528 {
1529     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1530
1531     FIXME("(%p/%p)->(%f,%f,%f): stub\n", iface, This, red, green, blue);
1532
1533     return E_NOTIMPL;
1534 }
1535
1536 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneBackgroundDepth(IDirect3DRMFrame3* iface,
1537                                                                     LPDIRECTDRAWSURFACE surface)
1538 {
1539     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1540
1541     FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);
1542
1543     return E_NOTIMPL;
1544 }
1545
1546 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneBackgroundImage(IDirect3DRMFrame3* iface,
1547                                                                     LPDIRECT3DRMTEXTURE3 texture)
1548 {
1549     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1550
1551     FIXME("(%p/%p)->(%p): stub\n", iface, This, texture);
1552
1553     return E_NOTIMPL;
1554 }
1555
1556 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneFogEnable(IDirect3DRMFrame3* iface, BOOL enable)
1557 {
1558     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1559
1560     FIXME("(%p/%p)->(%d): stub\n", iface, This, enable);
1561
1562     return E_NOTIMPL;
1563 }
1564
1565 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneFogColor(IDirect3DRMFrame3* iface,
1566                                                              D3DCOLOR color)
1567 {
1568     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1569
1570     FIXME("(%p/%p)->(%u): stub\n", iface, This, color);
1571
1572     return E_NOTIMPL;
1573 }
1574
1575 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneFogMode(IDirect3DRMFrame3* iface,
1576                                                             D3DRMFOGMODE mode)
1577 {
1578     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1579
1580     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
1581
1582     return E_NOTIMPL;
1583 }
1584
1585 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneFogParams(IDirect3DRMFrame3* iface,
1586                                                               D3DVALUE start, D3DVALUE end,
1587                                                               D3DVALUE density)
1588 {
1589     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1590
1591     FIXME("(%p/%p)->(%f,%f,%f): stub\n", iface, This, start, end, density);
1592
1593     return E_NOTIMPL;
1594 }
1595
1596 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetColor(IDirect3DRMFrame3* iface, D3DCOLOR color)
1597 {
1598     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1599
1600     FIXME("(%p/%p)->(%u): stub\n", iface, This, color);
1601
1602     return E_NOTIMPL;
1603 }
1604
1605 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetColorRGB(IDirect3DRMFrame3* iface, D3DVALUE red,
1606                                                         D3DVALUE green, D3DVALUE blue)
1607 {
1608     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1609
1610     FIXME("(%p/%p)->(%f,%f,%f): stub\n", iface, This, red, green, blue);
1611
1612     return E_NOTIMPL;
1613 }
1614
1615 static D3DRMZBUFFERMODE WINAPI IDirect3DRMFrame3Impl_GetZbufferMode(IDirect3DRMFrame3* iface)
1616 {
1617     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1618
1619     FIXME("(%p/%p)->(): stub\n", iface, This);
1620
1621     return D3DRMZBUFFER_FROMPARENT;
1622 }
1623
1624 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetMaterialMode(IDirect3DRMFrame3* iface,
1625                                                             D3DRMMATERIALMODE mode)
1626 {
1627     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1628
1629     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
1630
1631     return E_NOTIMPL;
1632 }
1633
1634 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetOrientation(IDirect3DRMFrame3* iface,
1635                                                            LPDIRECT3DRMFRAME3 reference,
1636                                                            D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1637                                                            D3DVALUE ux, D3DVALUE uy, D3DVALUE uz )
1638 {
1639     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1640
1641     FIXME("(%p/%p)->(%p,%f,%f,%f,%f,%f,%f): stub\n", iface, This, reference,
1642           dx, dy, dz, ux, uy, uz);
1643
1644     return E_NOTIMPL;
1645 }
1646
1647 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetPosition(IDirect3DRMFrame3* iface,
1648                                                         LPDIRECT3DRMFRAME3 reference,
1649                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z)
1650 {
1651     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1652
1653     FIXME("(%p/%p)->(%p,%f,%f,%f): stub\n", iface, This, reference, x, y, z);
1654
1655     return E_NOTIMPL;
1656 }
1657
1658 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetRotation(IDirect3DRMFrame3* iface,
1659                                                         LPDIRECT3DRMFRAME3 reference,
1660                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z,
1661                                                         D3DVALUE theta)
1662 {
1663     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1664
1665     FIXME("(%p/%p)->(%p,%f,%f,%f,%f): stub\n", iface, This, reference, x, y, z, theta);
1666
1667     return E_NOTIMPL;
1668 }
1669
1670 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSortMode(IDirect3DRMFrame3* iface,
1671                                                         D3DRMSORTMODE mode)
1672 {
1673     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1674
1675     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
1676
1677     return E_NOTIMPL;
1678 }
1679
1680 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetTexture(IDirect3DRMFrame3* iface,
1681                                                        LPDIRECT3DRMTEXTURE3 texture)
1682 {
1683     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1684
1685     FIXME("(%p/%p)->(%p): stub\n", iface, This, texture);
1686
1687     return E_NOTIMPL;
1688 }
1689
1690 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetVelocity(IDirect3DRMFrame3* iface,
1691                                                         LPDIRECT3DRMFRAME3 reference,
1692                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z,
1693                                                         BOOL with_rotation)
1694 {
1695     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1696
1697     FIXME("(%p/%p)->(%p,%f,%f,%f,%d): stub\n", iface, This, reference, x, y, z, with_rotation);
1698
1699     return E_NOTIMPL;
1700 }
1701
1702 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetZbufferMode(IDirect3DRMFrame3* iface,
1703                                                            D3DRMZBUFFERMODE mode)
1704 {
1705     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1706
1707     FIXME("(%p/%p)->(%u): stub\n", iface, This, mode);
1708
1709     return E_NOTIMPL;
1710 }
1711
1712 static HRESULT WINAPI IDirect3DRMFrame3Impl_Transform(IDirect3DRMFrame3* iface, D3DVECTOR *d,
1713                                                       D3DVECTOR *s)
1714 {
1715     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1716
1717     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, d, s);
1718
1719     return E_NOTIMPL;
1720 }
1721
1722 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetBox(IDirect3DRMFrame3* iface, LPD3DRMBOX box)
1723 {
1724     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1725
1726     FIXME("(%p/%p)->(%p): stub\n", iface, This, box);
1727
1728     return E_NOTIMPL;
1729 }
1730
1731 static BOOL WINAPI IDirect3DRMFrame3Impl_GetBoxEnable(IDirect3DRMFrame3* iface)
1732 {
1733     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1734
1735     FIXME("(%p/%p)->(): stub\n", iface, This);
1736
1737     return E_NOTIMPL;
1738 }
1739
1740 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetAxes(IDirect3DRMFrame3* iface,
1741                                                     LPD3DVECTOR dir, LPD3DVECTOR up)
1742 {
1743     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1744
1745     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, dir, up);
1746
1747     return E_NOTIMPL;
1748 }
1749
1750 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetMaterial(IDirect3DRMFrame3* iface,
1751                                                         LPDIRECT3DRMMATERIAL2 *material)
1752 {
1753     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1754
1755     FIXME("(%p/%p)->(%p): stub\n", iface, This, material);
1756
1757     return E_NOTIMPL;
1758 }
1759
1760 static BOOL WINAPI IDirect3DRMFrame3Impl_GetInheritAxes(IDirect3DRMFrame3* iface)
1761 {
1762     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1763
1764     FIXME("(%p/%p)->(): stub\n", iface, This);
1765
1766     return E_NOTIMPL;
1767 }
1768
1769 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetHierarchyBox(IDirect3DRMFrame3* iface,
1770                                                             LPD3DRMBOX box)
1771 {
1772     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1773
1774     FIXME("(%p/%p)->(%p): stub\n", iface, This, box);
1775
1776     return E_NOTIMPL;
1777 }
1778
1779 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetBox(IDirect3DRMFrame3* iface, LPD3DRMBOX box)
1780 {
1781     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1782
1783     FIXME("(%p/%p)->(%p): stub\n", iface, This, box);
1784
1785     return E_NOTIMPL;
1786 }
1787
1788 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetBoxEnable(IDirect3DRMFrame3* iface, BOOL enable)
1789 {
1790     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1791
1792     FIXME("(%p/%p)->(%u): stub\n", iface, This, enable);
1793
1794     return E_NOTIMPL;
1795 }
1796
1797 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetAxes(IDirect3DRMFrame3* iface,
1798                                                     D3DVALUE dx, D3DVALUE dy, D3DVALUE dz,
1799                                                     D3DVALUE ux, D3DVALUE uy, D3DVALUE uz)
1800 {
1801     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1802
1803     FIXME("(%p/%p)->(%f,%f,%f,%f,%f,%f): stub\n", iface, This, dx, dy, dz, ux, uy, uz);
1804
1805     return E_NOTIMPL;
1806 }
1807
1808 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetInheritAxes(IDirect3DRMFrame3* iface,
1809                                                            BOOL inherit_from_parent)
1810 {
1811     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1812
1813     FIXME("(%p/%p)->(%u): stub\n", iface, This, inherit_from_parent);
1814
1815     return E_NOTIMPL;
1816 }
1817
1818 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetMaterial(IDirect3DRMFrame3* iface,
1819                                                         LPDIRECT3DRMMATERIAL2 material)
1820 {
1821     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1822
1823     FIXME("(%p/%p)->(%p): stub\n", iface, This, material);
1824
1825     return E_NOTIMPL;
1826 }
1827
1828 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetQuaternion(IDirect3DRMFrame3* iface,
1829                                                           LPDIRECT3DRMFRAME3 reference,
1830                                                           D3DRMQUATERNION *q)
1831 {
1832     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1833
1834     FIXME("(%p/%p)->(%p,%p): stub\n", iface, This, reference, q);
1835
1836     return E_NOTIMPL;
1837 }
1838
1839 static HRESULT WINAPI IDirect3DRMFrame3Impl_RayPick(IDirect3DRMFrame3* iface,
1840                                                     LPDIRECT3DRMFRAME3 reference, LPD3DRMRAY ray,
1841                                                     DWORD flags,
1842                                                     LPDIRECT3DRMPICKED2ARRAY *return_visuals)
1843 {
1844     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1845
1846     FIXME("(%p/%p)->(%p,%p,%u,%p): stub\n", iface, This, reference, ray, flags, return_visuals);
1847
1848     return E_NOTIMPL;
1849 }
1850
1851 static HRESULT WINAPI IDirect3DRMFrame3Impl_Save(IDirect3DRMFrame3* iface, LPCSTR filename,
1852                                                  D3DRMXOFFORMAT d3dFormat,
1853                                                  D3DRMSAVEOPTIONS d3dSaveFlags)
1854 {
1855     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1856
1857     FIXME("(%p/%p)->(%p,%u,%u): stub\n", iface, This, filename, d3dFormat, d3dSaveFlags);
1858
1859     return E_NOTIMPL;
1860 }
1861
1862 static HRESULT WINAPI IDirect3DRMFrame3Impl_TransformVectors(IDirect3DRMFrame3* iface,
1863                                                              LPDIRECT3DRMFRAME3 reference,
1864                                                              DWORD num, LPD3DVECTOR dst,
1865                                                              LPD3DVECTOR src)
1866 {
1867     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1868
1869     FIXME("(%p/%p)->(%p,%u,%p,%p): stub\n", iface, This, reference, num, dst, src);
1870
1871     return E_NOTIMPL;
1872 }
1873
1874 static HRESULT WINAPI IDirect3DRMFrame3Impl_InverseTransformVectors(IDirect3DRMFrame3* iface,
1875                                                                     LPDIRECT3DRMFRAME3 reference,
1876                                                                     DWORD num, LPD3DVECTOR dst,
1877                                                                     LPD3DVECTOR src)
1878 {
1879     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1880
1881     FIXME("(%p/%p)->(%p,%u,%p,%p): stub\n", iface, This, reference, num, dst, src);
1882
1883     return E_NOTIMPL;
1884 }
1885
1886 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetTraversalOptions(IDirect3DRMFrame3* iface,
1887                                                                 DWORD flags)
1888 {
1889     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1890
1891     FIXME("(%p/%p)->(%u): stub\n", iface, This, flags);
1892
1893     return E_NOTIMPL;
1894 }
1895
1896 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetTraversalOptions(IDirect3DRMFrame3* iface,
1897                                                                 LPDWORD flags)
1898 {
1899     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1900
1901     FIXME("(%p/%p)->(%p): stub\n", iface, This, flags);
1902
1903     return E_NOTIMPL;
1904 }
1905
1906 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetSceneFogMethod(IDirect3DRMFrame3* iface,
1907                                                               DWORD flags)
1908 {
1909     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1910
1911     FIXME("(%p/%p)->(%u): stub\n", iface, This, flags);
1912
1913     return E_NOTIMPL;
1914 }
1915
1916 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetSceneFogMethod(IDirect3DRMFrame3* iface,
1917                                                               LPDWORD flags)
1918 {
1919     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1920
1921     FIXME("(%p/%p)->(%p): stub\n", iface, This, flags);
1922
1923     return E_NOTIMPL;
1924 }
1925
1926 static HRESULT WINAPI IDirect3DRMFrame3Impl_SetMaterialOverride(IDirect3DRMFrame3* iface,
1927                                                                 LPD3DRMMATERIALOVERRIDE override)
1928 {
1929     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1930
1931     FIXME("(%p/%p)->(%p): stub\n", iface, This, override);
1932
1933     return E_NOTIMPL;
1934 }
1935
1936 static HRESULT WINAPI IDirect3DRMFrame3Impl_GetMaterialOverride(IDirect3DRMFrame3* iface,
1937                                                                 LPD3DRMMATERIALOVERRIDE override)
1938 {
1939     IDirect3DRMFrameImpl *This = impl_from_IDirect3DRMFrame3(iface);
1940
1941     FIXME("(%p/%p)->(%p): stub\n", iface, This, override);
1942
1943     return E_NOTIMPL;
1944 }
1945
1946 static const struct IDirect3DRMFrame3Vtbl Direct3DRMFrame3_Vtbl =
1947 {
1948     /*** IUnknown methods ***/
1949     IDirect3DRMFrame3Impl_QueryInterface,
1950     IDirect3DRMFrame3Impl_AddRef,
1951     IDirect3DRMFrame3Impl_Release,
1952     /*** IDirect3DRMObject methods ***/
1953     IDirect3DRMFrame3Impl_Clone,
1954     IDirect3DRMFrame3Impl_AddDestroyCallback,
1955     IDirect3DRMFrame3Impl_DeleteDestroyCallback,
1956     IDirect3DRMFrame3Impl_SetAppData,
1957     IDirect3DRMFrame3Impl_GetAppData,
1958     IDirect3DRMFrame3Impl_SetName,
1959     IDirect3DRMFrame3Impl_GetName,
1960     IDirect3DRMFrame3Impl_GetClassName,
1961     /*** IDirect3DRMFrame3 methods ***/
1962     IDirect3DRMFrame3Impl_AddChild,
1963     IDirect3DRMFrame3Impl_AddLight,
1964     IDirect3DRMFrame3Impl_AddMoveCallback,
1965     IDirect3DRMFrame3Impl_AddTransform,
1966     IDirect3DRMFrame3Impl_AddTranslation,
1967     IDirect3DRMFrame3Impl_AddScale,
1968     IDirect3DRMFrame3Impl_AddRotation,
1969     IDirect3DRMFrame3Impl_AddVisual,
1970     IDirect3DRMFrame3Impl_GetChildren,
1971     IDirect3DRMFrame3Impl_GetColor,
1972     IDirect3DRMFrame3Impl_GetLights,
1973     IDirect3DRMFrame3Impl_GetMaterialMode,
1974     IDirect3DRMFrame3Impl_GetParent,
1975     IDirect3DRMFrame3Impl_GetPosition,
1976     IDirect3DRMFrame3Impl_GetRotation,
1977     IDirect3DRMFrame3Impl_GetScene,
1978     IDirect3DRMFrame3Impl_GetSortMode,
1979     IDirect3DRMFrame3Impl_GetTexture,
1980     IDirect3DRMFrame3Impl_GetTransform,
1981     IDirect3DRMFrame3Impl_GetVelocity,
1982     IDirect3DRMFrame3Impl_GetOrientation,
1983     IDirect3DRMFrame3Impl_GetVisuals,
1984     IDirect3DRMFrame3Impl_InverseTransform,
1985     IDirect3DRMFrame3Impl_Load,
1986     IDirect3DRMFrame3Impl_LookAt,
1987     IDirect3DRMFrame3Impl_Move,
1988     IDirect3DRMFrame3Impl_DeleteChild,
1989     IDirect3DRMFrame3Impl_DeleteLight,
1990     IDirect3DRMFrame3Impl_DeleteMoveCallback,
1991     IDirect3DRMFrame3Impl_DeleteVisual,
1992     IDirect3DRMFrame3Impl_GetSceneBackground,
1993     IDirect3DRMFrame3Impl_GetSceneBackgroundDepth,
1994     IDirect3DRMFrame3Impl_GetSceneFogColor,
1995     IDirect3DRMFrame3Impl_GetSceneFogEnable,
1996     IDirect3DRMFrame3Impl_GetSceneFogMode,
1997     IDirect3DRMFrame3Impl_GetSceneFogParams,
1998     IDirect3DRMFrame3Impl_SetSceneBackground,
1999     IDirect3DRMFrame3Impl_SetSceneBackgroundRGB,
2000     IDirect3DRMFrame3Impl_SetSceneBackgroundDepth,
2001     IDirect3DRMFrame3Impl_SetSceneBackgroundImage,
2002     IDirect3DRMFrame3Impl_SetSceneFogEnable,
2003     IDirect3DRMFrame3Impl_SetSceneFogColor,
2004     IDirect3DRMFrame3Impl_SetSceneFogMode,
2005     IDirect3DRMFrame3Impl_SetSceneFogParams,
2006     IDirect3DRMFrame3Impl_SetColor,
2007     IDirect3DRMFrame3Impl_SetColorRGB,
2008     IDirect3DRMFrame3Impl_GetZbufferMode,
2009     IDirect3DRMFrame3Impl_SetMaterialMode,
2010     IDirect3DRMFrame3Impl_SetOrientation,
2011     IDirect3DRMFrame3Impl_SetPosition,
2012     IDirect3DRMFrame3Impl_SetRotation,
2013     IDirect3DRMFrame3Impl_SetSortMode,
2014     IDirect3DRMFrame3Impl_SetTexture,
2015     IDirect3DRMFrame3Impl_SetVelocity,
2016     IDirect3DRMFrame3Impl_SetZbufferMode,
2017     IDirect3DRMFrame3Impl_Transform,
2018     IDirect3DRMFrame3Impl_GetBox,
2019     IDirect3DRMFrame3Impl_GetBoxEnable,
2020     IDirect3DRMFrame3Impl_GetAxes,
2021     IDirect3DRMFrame3Impl_GetMaterial,
2022     IDirect3DRMFrame3Impl_GetInheritAxes,
2023     IDirect3DRMFrame3Impl_GetHierarchyBox,
2024     IDirect3DRMFrame3Impl_SetBox,
2025     IDirect3DRMFrame3Impl_SetBoxEnable,
2026     IDirect3DRMFrame3Impl_SetAxes,
2027     IDirect3DRMFrame3Impl_SetInheritAxes,
2028     IDirect3DRMFrame3Impl_SetMaterial,
2029     IDirect3DRMFrame3Impl_SetQuaternion,
2030     IDirect3DRMFrame3Impl_RayPick,
2031     IDirect3DRMFrame3Impl_Save,
2032     IDirect3DRMFrame3Impl_TransformVectors,
2033     IDirect3DRMFrame3Impl_InverseTransformVectors,
2034     IDirect3DRMFrame3Impl_SetTraversalOptions,
2035     IDirect3DRMFrame3Impl_GetTraversalOptions,
2036     IDirect3DRMFrame3Impl_SetSceneFogMethod,
2037     IDirect3DRMFrame3Impl_GetSceneFogMethod,
2038     IDirect3DRMFrame3Impl_SetMaterialOverride,
2039     IDirect3DRMFrame3Impl_GetMaterialOverride
2040 };
2041
2042 static inline IDirect3DRMFrameImpl *unsafe_impl_from_IDirect3DRMFrame2(IDirect3DRMFrame2 *iface)
2043 {
2044     if (!iface)
2045         return NULL;
2046     assert(iface->lpVtbl == &Direct3DRMFrame2_Vtbl);
2047
2048     return impl_from_IDirect3DRMFrame2(iface);
2049 }
2050
2051 HRESULT Direct3DRMFrame_create(REFIID riid, IUnknown** ppObj)
2052 {
2053     IDirect3DRMFrameImpl* object;
2054
2055     TRACE("(%p)\n", ppObj);
2056
2057     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMFrameImpl));
2058     if (!object)
2059     {
2060         ERR("Out of memory\n");
2061         return E_OUTOFMEMORY;
2062     }
2063
2064     object->IDirect3DRMFrame2_iface.lpVtbl = &Direct3DRMFrame2_Vtbl;
2065     object->IDirect3DRMFrame3_iface.lpVtbl = &Direct3DRMFrame3_Vtbl;
2066     object->ref = 1;
2067
2068     if (IsEqualGUID(riid, &IID_IDirect3DRMFrame3))
2069         *ppObj = (IUnknown*)&object->IDirect3DRMFrame3_iface;
2070     else
2071         *ppObj = (IUnknown*)&object->IDirect3DRMFrame2_iface;
2072
2073     return S_OK;
2074 }