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