winealsa: Fix AudioRenderClient Get/ReleaseBuffer protocol.
[wine] / dlls / d3drm / meshbuilder.c
1 /*
2  * Implementation of IDirect3DRMMeshBuilder2 Interface
3  *
4  * Copyright 2010 Christian Costa
5  * Copyright 2011 AndrĂ© Hentschel
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include "wine/debug.h"
23
24 #define COBJMACROS
25
26 #include "winbase.h"
27 #include "wingdi.h"
28 #include "dxfile.h"
29 #include "rmxfguid.h"
30
31 #include "d3drm_private.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
34
35 typedef struct {
36     D3DVALUE u;
37     D3DVALUE v;
38 } Coords2d;
39
40 typedef struct {
41     IDirect3DRMMeshBuilder2 IDirect3DRMMeshBuilder2_iface;
42     IDirect3DRMMeshBuilder3 IDirect3DRMMeshBuilder3_iface;
43     LONG ref;
44     DWORD nb_vertices;
45     D3DVECTOR* pVertices;
46     DWORD nb_normals;
47     D3DVECTOR* pNormals;
48     DWORD nb_faces;
49     DWORD face_data_size;
50     LPVOID pFaceData;
51     DWORD nb_coords2d;
52     Coords2d* pCoords2d;
53 } IDirect3DRMMeshBuilderImpl;
54
55 typedef struct {
56     WORD major;
57     WORD minor;
58     DWORD flags;
59 } Header;
60
61 static const struct IDirect3DRMMeshBuilder2Vtbl Direct3DRMMeshBuilder2_Vtbl;
62 static const struct IDirect3DRMMeshBuilder3Vtbl Direct3DRMMeshBuilder3_Vtbl;
63
64 static char templates[] = {
65 "xof 0302txt 0064"
66 "template Header"
67 "{"
68 "<3D82AB43-62DA-11CF-AB39-0020AF71E433>"
69 "WORD major;"
70 "WORD minor;"
71 "DWORD flags;"
72 "}"
73 "template Vector"
74 "{"
75 "<3D82AB5E-62DA-11CF-AB39-0020AF71E433>"
76 "FLOAT x;"
77 "FLOAT y;"
78 "FLOAT z;"
79 "}"
80 "template Coords2d"
81 "{"
82 "<F6F23F44-7686-11CF-8F52-0040333594A3>"
83 "FLOAT u;"
84 "FLOAT v;"
85 "}"
86 "template Matrix4x4"
87 "{"
88 "<F6F23F45-7686-11CF-8F52-0040333594A3>"
89 "array FLOAT matrix[16];"
90 "}"
91 "template ColorRGBA"
92 "{"
93 "<35FF44E0-6C7C-11CF-8F52-0040333594A3>"
94 "FLOAT red;"
95 "FLOAT green;"
96 "FLOAT blue;"
97 "FLOAT alpha;"
98 "}"
99 "template ColorRGB"
100 "{"
101 "<D3E16E81-7835-11CF-8F52-0040333594A3>"
102 "FLOAT red;"
103 "FLOAT green;"
104 "FLOAT blue;"
105 "}"
106 "template IndexedColor"
107 "{"
108 "<1630B820-7842-11CF-8F52-0040333594A3>"
109 "DWORD index;"
110 "ColorRGBA indexColor;"
111 "}"
112 "template Boolean"
113 "{"
114 "<537DA6A0-CA37-11D0-941C-0080C80CFA7B>"
115 "DWORD truefalse;"
116 "}"
117 "template Boolean2d"
118 "{"
119 "<4885AE63-78E8-11CF-8F52-0040333594A3>"
120 "Boolean u;"
121 "Boolean v;"
122 "}"
123 "template MaterialWrap"
124 "{"
125 "<4885AE60-78E8-11CF-8F52-0040333594A3>"
126 "Boolean u;"
127 "Boolean v;"
128 "}"
129 "template TextureFilename"
130 "{"
131 "<A42790E1-7810-11CF-8F52-0040333594A3>"
132 "STRING filename;"
133 "}"
134 "template Material"
135 "{"
136 "<3D82AB4D-62DA-11CF-AB39-0020AF71E433>"
137 "ColorRGBA faceColor;"
138 "FLOAT power;"
139 "ColorRGB specularColor;"
140 "ColorRGB emissiveColor;"
141 "[...]"
142 "}"
143 "template MeshFace"
144 "{"
145 "<3D82AB5F-62DA-11CF-AB39-0020AF71E433>"
146 "DWORD nFaceVertexIndices;"
147 "array DWORD faceVertexIndices[nFaceVertexIndices];"
148 "}"
149 "template MeshFaceWraps"
150 "{"
151 "<ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B>"
152 "DWORD nFaceWrapValues;"
153 "array Boolean2d faceWrapValues[nFaceWrapValues];"
154 "}"
155 "template MeshTextureCoords"
156 "{"
157 "<F6F23F40-7686-11CF-8F52-0040333594A3>"
158 "DWORD nTextureCoords;"
159 "array Coords2d textureCoords[nTextureCoords];"
160 "}"
161 "template MeshMaterialList"
162 "{"
163 "<F6F23F42-7686-11CF-8F52-0040333594A3>"
164 "DWORD nMaterials;"
165 "DWORD nFaceIndexes;"
166 "array DWORD faceIndexes[nFaceIndexes];"
167 "[Material]"
168 "}"
169 "template MeshNormals"
170 "{"
171 "<F6F23F43-7686-11CF-8F52-0040333594A3>"
172 "DWORD nNormals;"
173 "array Vector normals[nNormals];"
174 "DWORD nFaceNormals;"
175 "array MeshFace faceNormals[nFaceNormals];"
176 "}"
177 "template MeshVertexColors"
178 "{"
179 "<1630B821-7842-11CF-8F52-0040333594A3>"
180 "DWORD nVertexColors;"
181 "array IndexedColor vertexColors[nVertexColors];"
182 "}"
183 "template Mesh"
184 "{"
185 "<3D82AB44-62DA-11CF-AB39-0020AF71E433>"
186 "DWORD nVertices;"
187 "array Vector vertices[nVertices];"
188 "DWORD nFaces;"
189 "array MeshFace faces[nFaces];"
190 "[...]"
191 "}"
192 "template FrameTransformMatrix"
193 "{"
194 "<F6F23F41-7686-11CF-8F52-0040333594A3>"
195 "Matrix4x4 frameMatrix;"
196 "}"
197 "template Frame"
198 "{"
199 "<3D82AB46-62DA-11CF-AB39-0020AF71E433>"
200 "[...]"
201 "}"
202 "template FloatKeys"
203 "{"
204 "<10DD46A9-775B-11CF-8F52-0040333594A3>"
205 "DWORD nValues;"
206 "array FLOAT values[nValues];"
207 "}"
208 "template TimedFloatKeys"
209 "{"
210 "<F406B180-7B3B-11CF-8F52-0040333594A3>"
211 "DWORD time;"
212 "FloatKeys tfkeys;"
213 "}"
214 "template AnimationKey"
215 "{"
216 "<10DD46A8-775B-11CF-8F52-0040333594A3>"
217 "DWORD keyType;"
218 "DWORD nKeys;"
219 "array TimedFloatKeys keys[nKeys];"
220 "}"
221 "template AnimationOptions"
222 "{"
223 "<E2BF56C0-840F-11CF-8F52-0040333594A3>"
224 "DWORD openclosed;"
225 "DWORD positionquality;"
226 "}"
227 "template Animation"
228 "{"
229 "<3D82AB4F-62DA-11CF-AB39-0020AF71E433>"
230 "[...]"
231 "}"
232 "template AnimationSet"
233 "{"
234 "<3D82AB50-62DA-11CF-AB39-0020AF71E433>"
235 "[Animation]"
236 "}"
237 "template InlineData"
238 "{"
239 "<3A23EEA0-94B1-11D0-AB39-0020AF71E433>"
240 "[BINARY]"
241 "}"
242 "template Url"
243 "{"
244 "<3A23EEA1-94B1-11D0-AB39-0020AF71E433>"
245 "DWORD nUrls;"
246 "array STRING urls[nUrls];"
247 "}"
248 "template ProgressiveMesh"
249 "{"
250 "<8A63C360-997D-11D0-941C-0080C80CFA7B>"
251 "[Url,InlineData]"
252 "}"
253 "template Guid"
254 "{"
255 "<A42790E0-7810-11CF-8F52-0040333594A3>"
256 "DWORD data1;"
257 "WORD data2;"
258 "WORD data3;"
259 "array UCHAR data4[8];"
260 "}"
261 "template StringProperty"
262 "{"
263 "<7F0F21E0-BFE1-11D1-82C0-00A0C9697271>"
264 "STRING key;"
265 "STRING value;"
266 "}"
267 "template PropertyBag"
268 "{"
269 "<7F0F21E1-BFE1-11D1-82C0-00A0C9697271>"
270 "[StringProperty]"
271 "}"
272 "template ExternalVisual"
273 "{"
274 "<98116AA0-BDBA-11D1-82C0-00A0C9697271>"
275 "Guid guidExternalVisual;"
276 "[...]"
277 "}"
278 "template RightHanded"
279 "{"
280 "<7F5D5EA0-D53A-11D1-82C0-00A0C9697271>"
281 "DWORD bRightHanded;"
282 "}"
283 };
284
285 static inline IDirect3DRMMeshBuilderImpl *impl_from_IDirect3DRMMeshBuilder2(IDirect3DRMMeshBuilder2 *iface)
286 {
287     return CONTAINING_RECORD(iface, IDirect3DRMMeshBuilderImpl, IDirect3DRMMeshBuilder2_iface);
288 }
289
290 static inline IDirect3DRMMeshBuilderImpl *impl_from_IDirect3DRMMeshBuilder3(IDirect3DRMMeshBuilder3 *iface)
291 {
292     return CONTAINING_RECORD(iface, IDirect3DRMMeshBuilderImpl, IDirect3DRMMeshBuilder3_iface);
293 }
294
295 HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj)
296 {
297     IDirect3DRMMeshBuilderImpl* object;
298
299     TRACE("(%p)\n", ppObj);
300
301     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMeshBuilderImpl));
302     if (!object)
303     {
304         ERR("Out of memory\n");
305         return E_OUTOFMEMORY;
306     }
307
308     object->IDirect3DRMMeshBuilder2_iface.lpVtbl = &Direct3DRMMeshBuilder2_Vtbl;
309     object->IDirect3DRMMeshBuilder3_iface.lpVtbl = &Direct3DRMMeshBuilder3_Vtbl;
310     object->ref = 1;
311
312     if (IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
313         *ppObj = (IUnknown*)&object->IDirect3DRMMeshBuilder3_iface;
314     else
315         *ppObj = (IUnknown*)&object->IDirect3DRMMeshBuilder2_iface;
316
317     return S_OK;
318 }
319
320 /*** IUnknown methods ***/
321 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_QueryInterface(IDirect3DRMMeshBuilder2* iface,
322                                                                  REFIID riid, void** ppvObject)
323 {
324     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
325
326     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject);
327
328     *ppvObject = NULL;
329
330     if(IsEqualGUID(riid, &IID_IUnknown) ||
331        IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder) ||
332        IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder2))
333     {
334         *ppvObject = &This->IDirect3DRMMeshBuilder2_iface;
335     }
336     else if(IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
337     {
338         *ppvObject = &This->IDirect3DRMMeshBuilder3_iface;
339     }
340     else
341     {
342         FIXME("interface %s not implemented\n", debugstr_guid(riid));
343         return E_NOINTERFACE;
344     }
345
346     IDirect3DRMMeshBuilder_AddRef(iface);
347     return S_OK;
348 }
349
350 static ULONG WINAPI IDirect3DRMMeshBuilder2Impl_AddRef(IDirect3DRMMeshBuilder2* iface)
351 {
352     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
353
354     TRACE("(%p)\n", This);
355
356     return InterlockedIncrement(&This->ref);
357 }
358
359 static ULONG WINAPI IDirect3DRMMeshBuilder2Impl_Release(IDirect3DRMMeshBuilder2* iface)
360 {
361     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
362     ULONG ref = InterlockedDecrement(&This->ref);
363
364     TRACE("(%p)\n", This);
365
366     if (!ref)
367     {
368         HeapFree(GetProcessHeap(), 0, This->pVertices);
369         HeapFree(GetProcessHeap(), 0, This->pNormals);
370         HeapFree(GetProcessHeap(), 0, This->pFaceData);
371         HeapFree(GetProcessHeap(), 0, This);
372     }
373
374     return ref;
375 }
376
377 /*** IDirect3DRMObject methods ***/
378 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Clone(IDirect3DRMMeshBuilder2* iface,
379                                                         LPUNKNOWN pUnkOuter, REFIID riid,
380                                                         LPVOID *ppvObj)
381 {
382     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
383
384     FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
385
386     return E_NOTIMPL;
387 }
388
389 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddDestroyCallback(IDirect3DRMMeshBuilder2* iface,
390                                                                      D3DRMOBJECTCALLBACK cb,
391                                                                      LPVOID argument)
392 {
393     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
394
395     FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
396
397     return E_NOTIMPL;
398 }
399
400 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_DeleteDestroyCallback(IDirect3DRMMeshBuilder2* iface,
401                                                                         D3DRMOBJECTCALLBACK cb,
402                                                                         LPVOID argument)
403 {
404     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
405
406     FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
407
408     return E_NOTIMPL;
409 }
410
411 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetAppData(IDirect3DRMMeshBuilder2* iface,
412                                                              DWORD data)
413 {
414     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
415
416     FIXME("(%p)->(%u): stub\n", This, data);
417
418     return E_NOTIMPL;
419 }
420
421 static DWORD WINAPI IDirect3DRMMeshBuilder2Impl_GetAppData(IDirect3DRMMeshBuilder2* iface)
422 {
423     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
424
425     FIXME("(%p)->(): stub\n", This);
426
427     return 0;
428 }
429
430 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetName(IDirect3DRMMeshBuilder2* iface,
431                                                           LPCSTR pName)
432 {
433     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
434
435     FIXME("(%p)->(%s): stub\n", This, pName);
436
437     return E_NOTIMPL;
438 }
439
440 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetName(IDirect3DRMMeshBuilder2* iface,
441                                                           LPDWORD lpdwSize, LPSTR lpName)
442 {
443     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
444
445     FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
446
447     return E_NOTIMPL;
448 }
449
450 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetClassName(IDirect3DRMMeshBuilder2* iface,
451                                                                LPDWORD lpdwSize, LPSTR lpName)
452 {
453     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
454
455     FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
456
457     return E_NOTIMPL;
458 }
459
460 /*** IDirect3DRMMeshBuilder2 methods ***/
461 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Load(IDirect3DRMMeshBuilder2* iface,
462                                                        LPVOID filename, LPVOID name,
463                                                        D3DRMLOADOPTIONS loadflags,
464                                                        D3DRMLOADTEXTURECALLBACK cb, LPVOID pArg)
465 {
466     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
467     DXFILELOADOPTIONS load_options;
468     LPDIRECTXFILE pDXFile = NULL;
469     LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
470     LPDIRECTXFILEDATA pData = NULL;
471     LPDIRECTXFILEOBJECT pObject = NULL;
472     LPDIRECTXFILEDATA pData2 = NULL;
473     const GUID* pGuid;
474     DWORD size;
475     Header* pHeader;
476     LPBYTE ptr;
477     HRESULT hr;
478     HRESULT ret = D3DRMERR_BADOBJECT;
479
480     FIXME("(%p)->(%p,%p,%x,%p,%p): partial stub\n", This, filename, name, loadflags, cb, pArg);
481
482     /* First free allocated buffers of previous mesh data */
483     HeapFree(GetProcessHeap(), 0, This->pVertices);
484     This->pVertices = NULL;
485     HeapFree(GetProcessHeap(), 0, This->pNormals);
486     This->pNormals = NULL;
487     HeapFree(GetProcessHeap(), 0, This->pFaceData);
488     This->pFaceData = NULL;
489     HeapFree(GetProcessHeap(), 0, This->pCoords2d);
490     This->pCoords2d = NULL;
491
492     if (loadflags == D3DRMLOAD_FROMMEMORY)
493     {
494         load_options = DXFILELOAD_FROMMEMORY;
495     }
496     else
497     {
498         FIXME("Load options %d not supported yet\n", loadflags);
499         return E_NOTIMPL;
500     }
501
502     hr = DirectXFileCreate(&pDXFile);
503     if (hr != DXFILE_OK)
504         goto end;
505
506     hr = IDirectXFile_RegisterTemplates(pDXFile, templates, strlen(templates));
507     if (hr != DXFILE_OK)
508         goto end;
509
510     hr = IDirectXFile_CreateEnumObject(pDXFile, filename, load_options, &pEnumObject);
511     if (hr != DXFILE_OK)
512         goto end;
513
514     hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
515     if (hr != DXFILE_OK)
516         goto end;
517
518     hr = IDirectXFileData_GetType(pData, &pGuid);
519     if (hr != DXFILE_OK)
520         goto end;
521
522     TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
523
524     if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
525     {
526         ret = D3DRMERR_BADFILE;
527         goto end;
528     }
529
530     hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader);
531     if ((hr != DXFILE_OK) || (size != sizeof(Header)))
532         goto end;
533
534     TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags);
535
536     /* Version must be 1.0.x */
537     if ((pHeader->major != 1) || (pHeader->minor != 0))
538     {
539         ret = D3DRMERR_BADFILE;
540         goto end;
541     }
542
543     IDirectXFileData_Release(pData);
544     pData = NULL;
545
546     hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
547     if (hr != DXFILE_OK)
548     {
549         ret = D3DRMERR_NOTFOUND;
550         goto end;
551     }
552
553     hr = IDirectXFileData_GetType(pData, &pGuid);
554     if (hr != DXFILE_OK)
555         goto end;
556
557     TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
558
559     if (!IsEqualGUID(pGuid, &TID_D3DRMMesh))
560     {
561         ret = D3DRMERR_NOTFOUND;
562         goto end;
563     }
564
565     hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
566     if (hr != DXFILE_OK)
567         goto end;
568
569     This->nb_vertices = *(DWORD*)ptr;
570     This->nb_faces = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR));
571     This->face_data_size = size - sizeof(DWORD) - This->nb_vertices * sizeof(D3DVECTOR) - sizeof(DWORD);
572
573     TRACE("Mesh: nb_vertices = %d, nb_faces = %d, face_data_size = %d\n", This->nb_vertices, This->nb_faces, This->face_data_size);
574
575     This->pVertices = HeapAlloc(GetProcessHeap(), 0, This->nb_vertices * sizeof(D3DVECTOR));
576     memcpy(This->pVertices, ptr + sizeof(DWORD), This->nb_vertices * sizeof(D3DVECTOR));
577
578     This->pFaceData = HeapAlloc(GetProcessHeap(), 0, This->face_data_size);
579     memcpy(This->pFaceData, ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD), This->face_data_size);
580
581     while (1)
582     {
583         hr =  IDirectXFileData_GetNextObject(pData, &pObject);
584         if (hr == DXFILEERR_NOMOREOBJECTS)
585         {
586             FIXME("no more object\n");
587             break;
588         }
589         if (hr != DXFILE_OK)
590            goto end;
591
592             hr = IDirectXFileObject_QueryInterface(pObject, &IID_IDirectXFileData, (void**)&pData2);
593         IDirectXFileObject_Release(pObject);
594         if (hr != DXFILE_OK)
595             goto end;
596
597         hr = IDirectXFileData_GetType(pData2, &pGuid);
598         if (hr != DXFILE_OK)
599         {
600             IDirectXFileData_Release(pData2);
601             goto end;
602         }
603
604         FIXME("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
605
606         if (!IsEqualGUID(pGuid, &TID_D3DRMMeshNormals))
607         {
608             DWORD tmp;
609
610             hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
611             if (hr != DXFILE_OK)
612                 goto end;
613
614             This->nb_normals = *(DWORD*)ptr;
615             tmp = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR));
616
617             FIXME("MeshNormals: nb_normals = %d, nb_faces_normals = %d\n", This->nb_normals, tmp);
618
619             This->pNormals = HeapAlloc(GetProcessHeap(), 0, This->nb_normals * sizeof(D3DVECTOR));
620             memcpy(This->pNormals, ptr + sizeof(DWORD), This->nb_normals * sizeof(D3DVECTOR));
621         }
622         else if(!IsEqualGUID(pGuid, &TID_D3DRMMeshTextureCoords))
623         {
624             hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
625             if (hr != DXFILE_OK)
626                 goto end;
627
628             This->nb_coords2d = *(DWORD*)ptr;
629
630             FIXME("MeshTextureCoords: nb_coords2d = %d\n", This->nb_coords2d);
631
632             This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d));
633             memcpy(This->pCoords2d, ptr + sizeof(DWORD), This->nb_coords2d * sizeof(Coords2d));
634
635         }
636         else if(!IsEqualGUID(pGuid, &TID_D3DRMMeshMaterialList))
637         {
638             FIXME("MeshMaterialList not supported yet, ignoring...\n");
639         }
640         else
641         {
642             FIXME("Unknown GUID %s, ignoring...\n", debugstr_guid(pGuid));
643         }
644
645         IDirectXFileData_Release(pData2);
646     }
647
648     ret = D3DRM_OK;
649
650 end:
651     if (pData)
652         IDirectXFileData_Release(pData);
653     if (pEnumObject)
654         IDirectXFileEnumObject_Release(pEnumObject);
655     if (pDXFile)
656         IDirectXFile_Release(pDXFile);
657
658     if (ret != D3DRM_OK)
659     {
660         /* Clean mesh data */
661         This->nb_vertices = 0;
662         This->nb_normals = 0;
663         This->nb_faces = 0;
664         This->face_data_size = 0;
665         This->nb_coords2d = 0;
666         HeapFree(GetProcessHeap(), 0, This->pVertices);
667         This->pVertices = NULL;
668         HeapFree(GetProcessHeap(), 0, This->pNormals);
669         This->pNormals = NULL;
670         HeapFree(GetProcessHeap(), 0, This->pFaceData);
671         This->pFaceData = NULL;
672         HeapFree(GetProcessHeap(), 0, This->pCoords2d);
673         This->pCoords2d = NULL;
674     }
675
676     return ret;
677 }
678
679 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Save(IDirect3DRMMeshBuilder2* iface,
680                                                        const char *filename, D3DRMXOFFORMAT format,
681                                                        D3DRMSAVEOPTIONS save)
682 {
683     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
684
685     FIXME("(%p)->(%s,%d,%d): stub\n", This, filename, format, save);
686
687     return E_NOTIMPL;
688 }
689
690 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Scale(IDirect3DRMMeshBuilder2* iface,
691                                                         D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
692 {
693     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
694
695     FIXME("(%p)->(%f,%f,%f): stub\n", This, sx, sy, sz);
696
697     return E_NOTIMPL;
698 }
699
700 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Translate(IDirect3DRMMeshBuilder2* iface,
701                                                             D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
702 {
703     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
704
705     FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty, tz);
706
707     return E_NOTIMPL;
708 }
709
710 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColorSource(IDirect3DRMMeshBuilder2* iface,
711                                                                  D3DRMCOLORSOURCE color)
712 {
713     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
714
715     FIXME("(%p)->(%x): stub\n", This, color);
716
717     return E_NOTIMPL;
718 }
719
720 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetBox(IDirect3DRMMeshBuilder2* iface,
721                                                          D3DRMBOX *pBox)
722 {
723     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
724
725     FIXME("(%p)->(%p): stub\n", This, pBox);
726
727     return E_NOTIMPL;
728 }
729
730 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GenerateNormals(IDirect3DRMMeshBuilder2* iface)
731 {
732     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
733
734     FIXME("(%p)->(): stub\n", This);
735
736     return E_NOTIMPL;
737 }
738
739 static D3DRMCOLORSOURCE WINAPI IDirect3DRMMeshBuilder2Impl_GetColorSource(IDirect3DRMMeshBuilder2* iface)
740 {
741     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
742
743     FIXME("(%p)->(): stub\n", This);
744
745     return E_NOTIMPL;
746 }
747
748 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddMesh(IDirect3DRMMeshBuilder2* iface,
749                                                           LPDIRECT3DRMMESH pMesh)
750 {
751     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
752
753     FIXME("(%p)->(%p): stub\n", This, pMesh);
754
755     return E_NOTIMPL;
756 }
757
758 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddMeshBuilder(IDirect3DRMMeshBuilder2* iface,
759                                                                  LPDIRECT3DRMMESHBUILDER pMeshBuilder)
760 {
761     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
762
763     FIXME("(%p)->(%p): stub\n", This, pMeshBuilder);
764
765     return E_NOTIMPL;
766 }
767
768 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFrame(IDirect3DRMMeshBuilder2* iface,
769                                                            LPDIRECT3DRMFRAME pFrame)
770 {
771     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
772
773     FIXME("(%p)->(%p): stub\n", This, pFrame);
774
775     return E_NOTIMPL;
776 }
777
778 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFace(IDirect3DRMMeshBuilder2* iface,
779                                                           LPDIRECT3DRMFACE pFace)
780 {
781     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
782
783     FIXME("(%p)->(%p): stub\n", This, pFace);
784
785     return E_NOTIMPL;
786 }
787
788 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFaces(IDirect3DRMMeshBuilder2* iface,
789                                                            DWORD vcount, D3DVECTOR *vertices,
790                                                            DWORD ncount, D3DVECTOR *normals,
791                                                            DWORD *data,
792                                                            LPDIRECT3DRMFACEARRAY* pFaceArray)
793 {
794     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
795
796     FIXME("(%p)->(%d,%p,%d,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals, data, pFaceArray);
797
798     return E_NOTIMPL;
799 }
800
801 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_ReserveSpace(IDirect3DRMMeshBuilder2* iface,
802                                                                DWORD vertex_Count,
803                                                                DWORD normal_count,
804                                                                DWORD face_count)
805 {
806     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
807
808     FIXME("(%p)->(%d,%d,%d): stub\n", This, vertex_Count, normal_count, face_count);
809
810     return E_NOTIMPL;
811 }
812
813 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColorRGB(IDirect3DRMMeshBuilder2* iface,
814                                                               D3DVALUE red, D3DVALUE green,
815                                                               D3DVALUE blue)
816 {
817     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
818
819     FIXME("(%p)->(%f,%f,%f): stub\n", This, red, green, blue);
820
821     return E_NOTIMPL;
822 }
823
824 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColor(IDirect3DRMMeshBuilder2* iface,
825                                                            D3DCOLOR color)
826 {
827     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
828
829     FIXME("(%p)->(%x): stub\n", This, color);
830
831     return E_NOTIMPL;
832 }
833
834 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTexture(IDirect3DRMMeshBuilder2* iface,
835                                                              LPDIRECT3DRMTEXTURE pTexture)
836 {
837     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
838
839     FIXME("(%p)->(%p): stub\n", This, pTexture);
840
841     return E_NOTIMPL;
842 }
843
844 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetMaterial(IDirect3DRMMeshBuilder2* iface,
845                                                               LPDIRECT3DRMMATERIAL pMaterial)
846 {
847     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
848
849     FIXME("(%p)->(%p): stub\n", This, pMaterial);
850
851     return E_NOTIMPL;
852 }
853
854 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTextureTopology(IDirect3DRMMeshBuilder2* iface,
855                                                                      BOOL wrap_u, BOOL wrap_v)
856 {
857     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
858
859     FIXME("(%p)->(%d,%d): stub\n", This, wrap_u, wrap_v);
860
861     return E_NOTIMPL;
862 }
863
864 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetQuality(IDirect3DRMMeshBuilder2* iface,
865                                                              D3DRMRENDERQUALITY quality)
866 {
867     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
868
869     FIXME("(%p)->(%d): stub\n", This, quality);
870
871     return E_NOTIMPL;
872 }
873
874 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetPerspective(IDirect3DRMMeshBuilder2* iface,
875                                                                  BOOL enable)
876 {
877     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
878
879     FIXME("(%p)->(%d): stub\n", This, enable);
880
881     return E_NOTIMPL;
882 }
883
884 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertex(IDirect3DRMMeshBuilder2* iface,
885                                                             DWORD index,
886                                                             D3DVALUE x, D3DVALUE y, D3DVALUE z)
887 {
888     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
889
890     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
891
892     return E_NOTIMPL;
893 }
894
895 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetNormal(IDirect3DRMMeshBuilder2* iface,
896                                                             DWORD index,
897                                                             D3DVALUE x, D3DVALUE y, D3DVALUE z)
898 {
899     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
900
901     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
902
903     return E_NOTIMPL;
904 }
905
906 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTextureCoordinates(IDirect3DRMMeshBuilder2* iface,
907                                                                         DWORD index,
908                                                                         D3DVALUE u, D3DVALUE v)
909 {
910     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
911
912     FIXME("(%p)->(%f,%f): stub\n", This, u, v);
913
914     return E_NOTIMPL;
915 }
916
917 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertexColor(IDirect3DRMMeshBuilder2* iface,
918                                                                  DWORD index, D3DCOLOR color)
919 {
920     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
921
922     FIXME("(%p)->(%d,%x): stub\n", This, index, color);
923
924     return E_NOTIMPL;
925 }
926
927 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertexColorRGB(IDirect3DRMMeshBuilder2* iface,
928                                                                     DWORD index, D3DVALUE red,
929                                                                     D3DVALUE green, D3DVALUE blue)
930 {
931     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
932
933     FIXME("(%p)->(%d,%f,%f,%f): stub\n", This, index, red, green, blue);
934
935     return E_NOTIMPL;
936 }
937
938 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetFaces(IDirect3DRMMeshBuilder2* iface,
939                                                            LPDIRECT3DRMFACEARRAY* pFaceArray)
940 {
941     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
942
943     FIXME("(%p)->(%p): stub\n", This, pFaceArray);
944
945     return E_NOTIMPL;
946 }
947
948 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetVertices(IDirect3DRMMeshBuilder2* iface,
949                                                               DWORD *vcount, D3DVECTOR *vertices,
950                                                               DWORD *ncount, D3DVECTOR *normals,
951                                                               DWORD *face_data_size,
952                                                               DWORD *face_data)
953 {
954     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
955
956     TRACE("(%p)->(%p,%p,%p,%p,%p,%p)\n", This, vcount, vertices, ncount, normals, face_data_size, face_data);
957
958     if (vcount)
959         *vcount = This->nb_vertices;
960     if (vertices && This->nb_vertices)
961         memcpy(vertices, This->pVertices, This->nb_vertices * sizeof(D3DVECTOR));
962     if (ncount)
963         *ncount = This->nb_normals;
964     if (normals && This->nb_normals)
965         memcpy(normals, This->pNormals, This->nb_normals * sizeof(D3DVECTOR));
966     if (face_data_size)
967         *face_data_size = This->face_data_size;
968     if (face_data && This->face_data_size)
969         memcpy(face_data, This->pFaceData, This->face_data_size);
970
971     return D3DRM_OK;
972 }
973
974 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetTextureCoordinates(IDirect3DRMMeshBuilder2* iface,
975                                                                         DWORD index,
976                                                                         D3DVALUE *u, D3DVALUE *v)
977 {
978     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
979
980     FIXME("(%p)->(%d,%p,%p): stub\n", This, index, u, v);
981
982     if (index >= This->nb_coords2d)
983         return D3DRMERR_NOTFOUND;
984
985     *u = This->pCoords2d[index].u;
986     *v = This->pCoords2d[index].v;
987
988     return D3DRM_OK;
989 }
990
991 static int WINAPI IDirect3DRMMeshBuilder2Impl_AddVertex(IDirect3DRMMeshBuilder2* iface,
992                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z)
993 {
994     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
995
996     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
997
998     return 0;
999 }
1000
1001 static int WINAPI IDirect3DRMMeshBuilder2Impl_AddNormal(IDirect3DRMMeshBuilder2* iface,
1002                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z)
1003 {
1004     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1005
1006     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1007
1008     return 0;
1009 }
1010
1011 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_CreateFace(IDirect3DRMMeshBuilder2* iface,
1012                                                              LPDIRECT3DRMFACE* ppFace)
1013 {
1014     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1015
1016     FIXME("(%p)->(%p): stub\n", This, ppFace);
1017
1018     return E_NOTIMPL;
1019 }
1020
1021 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshBuilder2Impl_GetQuality(IDirect3DRMMeshBuilder2* iface)
1022 {
1023     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1024
1025     FIXME("(%p)->(): stub\n", This);
1026
1027     return 0;
1028 }
1029
1030 static BOOL WINAPI IDirect3DRMMeshBuilder2Impl_GetPerspective(IDirect3DRMMeshBuilder2* iface)
1031 {
1032     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1033
1034     FIXME("(%p)->(): stub\n", This);
1035
1036     return FALSE;
1037 }
1038
1039 static int WINAPI IDirect3DRMMeshBuilder2Impl_GetFaceCount(IDirect3DRMMeshBuilder2* iface)
1040 {
1041     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1042
1043     TRACE("(%p)->()\n", This);
1044
1045     return This->nb_faces;
1046 }
1047
1048 static int WINAPI IDirect3DRMMeshBuilder2Impl_GetVertexCount(IDirect3DRMMeshBuilder2* iface)
1049 {
1050     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1051
1052     TRACE("(%p)->()\n", This);
1053
1054     return This->nb_vertices;
1055 }
1056
1057 static D3DCOLOR WINAPI IDirect3DRMMeshBuilder2Impl_GetVertexColor(IDirect3DRMMeshBuilder2* iface,
1058                                                                   DWORD index)
1059 {
1060     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1061
1062     FIXME("(%p)->(%d): stub\n", This, index);
1063
1064     return 0;
1065 }
1066
1067 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_CreateMesh(IDirect3DRMMeshBuilder2* iface,
1068                                                              LPDIRECT3DRMMESH* ppMesh)
1069 {
1070     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1071
1072     FIXME("(%p)->(%p): stub\n", This, ppMesh);
1073
1074     return E_NOTIMPL;
1075 }
1076
1077 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GenerateNormals2(IDirect3DRMMeshBuilder2* iface,
1078                                                                    D3DVALUE crease, DWORD dwFlags)
1079 {
1080     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1081
1082     FIXME("(%p)->(%f,%u): stub\n", This, crease, dwFlags);
1083
1084     return E_NOTIMPL;
1085 }
1086
1087 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetFace(IDirect3DRMMeshBuilder2* iface,
1088                                                           DWORD index, LPDIRECT3DRMFACE* ppFace)
1089 {
1090     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
1091
1092     FIXME("(%p)->(%u,%p): stub\n", This, index, ppFace);
1093
1094     return E_NOTIMPL;
1095 }
1096
1097 static const struct IDirect3DRMMeshBuilder2Vtbl Direct3DRMMeshBuilder2_Vtbl =
1098 {
1099     /*** IUnknown methods ***/
1100     IDirect3DRMMeshBuilder2Impl_QueryInterface,
1101     IDirect3DRMMeshBuilder2Impl_AddRef,
1102     IDirect3DRMMeshBuilder2Impl_Release,
1103     /*** IDirect3DRMObject methods ***/
1104     IDirect3DRMMeshBuilder2Impl_Clone,
1105     IDirect3DRMMeshBuilder2Impl_AddDestroyCallback,
1106     IDirect3DRMMeshBuilder2Impl_DeleteDestroyCallback,
1107     IDirect3DRMMeshBuilder2Impl_SetAppData,
1108     IDirect3DRMMeshBuilder2Impl_GetAppData,
1109     IDirect3DRMMeshBuilder2Impl_SetName,
1110     IDirect3DRMMeshBuilder2Impl_GetName,
1111     IDirect3DRMMeshBuilder2Impl_GetClassName,
1112     /*** IDirect3DRMMeshBuilder methods ***/
1113     IDirect3DRMMeshBuilder2Impl_Load,
1114     IDirect3DRMMeshBuilder2Impl_Save,
1115     IDirect3DRMMeshBuilder2Impl_Scale,
1116     IDirect3DRMMeshBuilder2Impl_Translate,
1117     IDirect3DRMMeshBuilder2Impl_SetColorSource,
1118     IDirect3DRMMeshBuilder2Impl_GetBox,
1119     IDirect3DRMMeshBuilder2Impl_GenerateNormals,
1120     IDirect3DRMMeshBuilder2Impl_GetColorSource,
1121     IDirect3DRMMeshBuilder2Impl_AddMesh,
1122     IDirect3DRMMeshBuilder2Impl_AddMeshBuilder,
1123     IDirect3DRMMeshBuilder2Impl_AddFrame,
1124     IDirect3DRMMeshBuilder2Impl_AddFace,
1125     IDirect3DRMMeshBuilder2Impl_AddFaces,
1126     IDirect3DRMMeshBuilder2Impl_ReserveSpace,
1127     IDirect3DRMMeshBuilder2Impl_SetColorRGB,
1128     IDirect3DRMMeshBuilder2Impl_SetColor,
1129     IDirect3DRMMeshBuilder2Impl_SetTexture,
1130     IDirect3DRMMeshBuilder2Impl_SetMaterial,
1131     IDirect3DRMMeshBuilder2Impl_SetTextureTopology,
1132     IDirect3DRMMeshBuilder2Impl_SetQuality,
1133     IDirect3DRMMeshBuilder2Impl_SetPerspective,
1134     IDirect3DRMMeshBuilder2Impl_SetVertex,
1135     IDirect3DRMMeshBuilder2Impl_SetNormal,
1136     IDirect3DRMMeshBuilder2Impl_SetTextureCoordinates,
1137     IDirect3DRMMeshBuilder2Impl_SetVertexColor,
1138     IDirect3DRMMeshBuilder2Impl_SetVertexColorRGB,
1139     IDirect3DRMMeshBuilder2Impl_GetFaces,
1140     IDirect3DRMMeshBuilder2Impl_GetVertices,
1141     IDirect3DRMMeshBuilder2Impl_GetTextureCoordinates,
1142     IDirect3DRMMeshBuilder2Impl_AddVertex,
1143     IDirect3DRMMeshBuilder2Impl_AddNormal,
1144     IDirect3DRMMeshBuilder2Impl_CreateFace,
1145     IDirect3DRMMeshBuilder2Impl_GetQuality,
1146     IDirect3DRMMeshBuilder2Impl_GetPerspective,
1147     IDirect3DRMMeshBuilder2Impl_GetFaceCount,
1148     IDirect3DRMMeshBuilder2Impl_GetVertexCount,
1149     IDirect3DRMMeshBuilder2Impl_GetVertexColor,
1150     IDirect3DRMMeshBuilder2Impl_CreateMesh,
1151     /*** IDirect3DRMMeshBuilder2 methods ***/
1152     IDirect3DRMMeshBuilder2Impl_GenerateNormals2,
1153     IDirect3DRMMeshBuilder2Impl_GetFace
1154 };
1155
1156
1157 /*** IUnknown methods ***/
1158 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_QueryInterface(IDirect3DRMMeshBuilder3* iface,
1159                                                                  REFIID riid, void** ppvObject)
1160 {
1161     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1162     return IDirect3DRMMeshBuilder_QueryInterface(&This->IDirect3DRMMeshBuilder3_iface, riid, ppvObject);
1163 }
1164
1165 static ULONG WINAPI IDirect3DRMMeshBuilder3Impl_AddRef(IDirect3DRMMeshBuilder3* iface)
1166 {
1167     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1168
1169     TRACE("(%p)\n", This);
1170
1171     return InterlockedIncrement(&This->ref);
1172 }
1173
1174 static ULONG WINAPI IDirect3DRMMeshBuilder3Impl_Release(IDirect3DRMMeshBuilder3* iface)
1175 {
1176     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1177     ULONG ref = InterlockedDecrement(&This->ref);
1178
1179     TRACE("(%p)\n", This);
1180
1181     if (!ref)
1182     {
1183         HeapFree(GetProcessHeap(), 0, This->pVertices);
1184         HeapFree(GetProcessHeap(), 0, This->pNormals);
1185         HeapFree(GetProcessHeap(), 0, This->pFaceData);
1186         HeapFree(GetProcessHeap(), 0, This);
1187     }
1188
1189     return ref;
1190 }
1191
1192 /*** IDirect3DRMObject methods ***/
1193 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Clone(IDirect3DRMMeshBuilder3* iface,
1194                                                         LPUNKNOWN pUnkOuter, REFIID riid,
1195                                                         LPVOID *ppvObj)
1196 {
1197     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1198
1199     FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
1200
1201     return E_NOTIMPL;
1202 }
1203
1204 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddDestroyCallback(IDirect3DRMMeshBuilder3* iface,
1205                                                                      D3DRMOBJECTCALLBACK cb,
1206                                                                      LPVOID argument)
1207 {
1208     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1209
1210     FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
1211
1212     return E_NOTIMPL;
1213 }
1214
1215 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteDestroyCallback(IDirect3DRMMeshBuilder3* iface,
1216                                                                         D3DRMOBJECTCALLBACK cb,
1217                                                                         LPVOID argument)
1218 {
1219     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1220
1221     FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
1222
1223     return E_NOTIMPL;
1224 }
1225
1226 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetAppData(IDirect3DRMMeshBuilder3* iface,
1227                                                              DWORD data)
1228 {
1229     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1230
1231     FIXME("(%p)->(%u): stub\n", This, data);
1232
1233     return E_NOTIMPL;
1234 }
1235
1236 static DWORD WINAPI IDirect3DRMMeshBuilder3Impl_GetAppData(IDirect3DRMMeshBuilder3* iface)
1237 {
1238     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1239
1240     FIXME("(%p)->(): stub\n", This);
1241
1242     return 0;
1243 }
1244
1245 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetName(IDirect3DRMMeshBuilder3* iface,
1246                                                           LPCSTR pName)
1247 {
1248     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1249
1250     FIXME("(%p)->(%s): stub\n", This, pName);
1251
1252     return E_NOTIMPL;
1253 }
1254
1255 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetName(IDirect3DRMMeshBuilder3* iface,
1256                                                           LPDWORD lpdwSize, LPSTR lpName)
1257 {
1258     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1259
1260     FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
1261
1262     return E_NOTIMPL;
1263 }
1264
1265 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetClassName(IDirect3DRMMeshBuilder3* iface,
1266                                                                LPDWORD lpdwSize, LPSTR lpName)
1267 {
1268     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1269
1270     FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
1271
1272     return E_NOTIMPL;
1273 }
1274
1275 /*** IDirect3DRMMeshBuilder3 methods ***/
1276 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* iface,
1277                                                        LPVOID filename, LPVOID name,
1278                                                        D3DRMLOADOPTIONS loadflags,
1279                                                        D3DRMLOADTEXTURE3CALLBACK cb, LPVOID arg)
1280 {
1281     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1282
1283     FIXME("(%p)->(%p,%p,%u,%p,%p): stub\n", This, filename, name, loadflags, cb, arg);
1284
1285     return E_NOTIMPL;
1286 }
1287
1288 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Save(IDirect3DRMMeshBuilder3* iface,
1289                                                        const char* filename, D3DRMXOFFORMAT format,
1290                                                        D3DRMSAVEOPTIONS save)
1291 {
1292     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1293
1294     FIXME("(%p)->(%s,%d,%d): stub\n", This, filename, format, save);
1295
1296     return E_NOTIMPL;
1297 }
1298
1299 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Scale(IDirect3DRMMeshBuilder3* iface,
1300                                                         D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
1301 {
1302     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1303
1304     FIXME("(%p)->(%f,%f,%f): stub\n", This, sx, sy, sz);
1305
1306     return E_NOTIMPL;
1307 }
1308
1309 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Translate(IDirect3DRMMeshBuilder3* iface,
1310                                                             D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
1311 {
1312     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1313
1314     FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty, tz);
1315
1316     return E_NOTIMPL;
1317 }
1318
1319 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColorSource(IDirect3DRMMeshBuilder3* iface,
1320                                                                  D3DRMCOLORSOURCE color)
1321 {
1322     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1323
1324     FIXME("(%p)->(%x): stub\n", This, color);
1325
1326     return E_NOTIMPL;
1327 }
1328
1329 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetBox(IDirect3DRMMeshBuilder3* iface,
1330                                                          D3DRMBOX* box)
1331 {
1332     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1333
1334     FIXME("(%p)->(%p): stub\n", This, box);
1335
1336     return E_NOTIMPL;
1337 }
1338
1339 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GenerateNormals(IDirect3DRMMeshBuilder3* iface,
1340                                                                   D3DVALUE crease, DWORD flags)
1341 {
1342     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1343
1344     FIXME("(%p)->(%f,%u): stub\n", This, crease, flags);
1345
1346     return E_NOTIMPL;
1347 }
1348
1349 static D3DRMCOLORSOURCE WINAPI IDirect3DRMMeshBuilder3Impl_GetColorSource(IDirect3DRMMeshBuilder3* iface)
1350 {
1351     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1352
1353     FIXME("(%p)->(): stub\n", This);
1354
1355     return E_NOTIMPL;
1356 }
1357
1358 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddMesh(IDirect3DRMMeshBuilder3* iface,
1359                                                           LPDIRECT3DRMMESH Mesh)
1360 {
1361     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1362
1363     FIXME("(%p)->(%p): stub\n", This, Mesh);
1364
1365     return E_NOTIMPL;
1366 }
1367
1368 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddMeshBuilder(IDirect3DRMMeshBuilder3* iface,
1369                                                                  LPDIRECT3DRMMESHBUILDER3 MeshBuilder,
1370                                                                  DWORD flags)
1371 {
1372     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1373
1374     FIXME("(%p)->(%p,%u): stub\n", This, MeshBuilder, flags);
1375
1376     return E_NOTIMPL;
1377 }
1378
1379 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFrame(IDirect3DRMMeshBuilder3* iface,
1380                                                            LPDIRECT3DRMFRAME3 Frame)
1381 {
1382     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1383
1384     FIXME("(%p)->(%p): stub\n", This, Frame);
1385
1386     return E_NOTIMPL;
1387 }
1388
1389 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFace(IDirect3DRMMeshBuilder3* iface,
1390                                                           LPDIRECT3DRMFACE2 Face)
1391 {
1392     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1393
1394     FIXME("(%p)->(%p): stub\n", This, Face);
1395
1396     return E_NOTIMPL;
1397 }
1398
1399 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFaces(IDirect3DRMMeshBuilder3* iface,
1400                                                            DWORD vcount, D3DVECTOR* vertices,
1401                                                            DWORD ncount, D3DVECTOR* normals,
1402                                                            DWORD* data,
1403                                                            LPDIRECT3DRMFACEARRAY* FaceArray)
1404 {
1405     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1406
1407     FIXME("(%p)->(%d,%p,%d,%p,%p,%p): stub\n", This, vcount, vertices, ncount,
1408           normals, data, FaceArray);
1409
1410     return E_NOTIMPL;
1411 }
1412
1413 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_ReserveSpace(IDirect3DRMMeshBuilder3* iface,
1414                                                                DWORD vertex_Count,
1415                                                                DWORD normal_count,
1416                                                                DWORD face_count)
1417 {
1418     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1419
1420     FIXME("(%p)->(%d,%d,%d): stub\n", This, vertex_Count, normal_count, face_count);
1421
1422     return E_NOTIMPL;
1423 }
1424
1425 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColorRGB(IDirect3DRMMeshBuilder3* iface,
1426                                                               D3DVALUE red, D3DVALUE green,
1427                                                               D3DVALUE blue)
1428 {
1429     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1430
1431     FIXME("(%p)->(%f,%f,%f): stub\n", This, red, green, blue);
1432
1433     return E_NOTIMPL;
1434 }
1435
1436 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColor(IDirect3DRMMeshBuilder3* iface,
1437                                                            D3DCOLOR color)
1438 {
1439     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1440
1441     FIXME("(%p)->(%x): stub\n", This, color);
1442
1443     return E_NOTIMPL;
1444 }
1445
1446 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTexture(IDirect3DRMMeshBuilder3* iface,
1447                                                              LPDIRECT3DRMTEXTURE3 texture)
1448 {
1449     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1450
1451     FIXME("(%p)->(%p): stub\n", This, texture);
1452
1453     return E_NOTIMPL;
1454 }
1455
1456 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetMaterial(IDirect3DRMMeshBuilder3* iface,
1457                                                               LPDIRECT3DRMMATERIAL2 material)
1458 {
1459     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1460
1461     FIXME("(%p)->(%p): stub\n", This, material);
1462
1463     return E_NOTIMPL;
1464 }
1465
1466 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTextureTopology(IDirect3DRMMeshBuilder3* iface,
1467                                                                      BOOL wrap_u, BOOL wrap_v)
1468 {
1469     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1470
1471     FIXME("(%p)->(%d,%d): stub\n", This, wrap_u, wrap_v);
1472
1473     return E_NOTIMPL;
1474 }
1475
1476 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetQuality(IDirect3DRMMeshBuilder3* iface,
1477                                                              D3DRMRENDERQUALITY quality)
1478 {
1479     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1480
1481     FIXME("(%p)->(%d): stub\n", This, quality);
1482
1483     return E_NOTIMPL;
1484 }
1485
1486 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetPerspective(IDirect3DRMMeshBuilder3* iface,
1487                                                                  BOOL enable)
1488 {
1489     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1490
1491     FIXME("(%p)->(%d): stub\n", This, enable);
1492
1493     return E_NOTIMPL;
1494 }
1495
1496 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertex(IDirect3DRMMeshBuilder3* iface,
1497                                                             DWORD index,
1498                                                             D3DVALUE x, D3DVALUE y, D3DVALUE z)
1499 {
1500     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1501
1502     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1503
1504     return E_NOTIMPL;
1505 }
1506
1507 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetNormal(IDirect3DRMMeshBuilder3* iface,
1508                                                             DWORD index,
1509                                                             D3DVALUE x, D3DVALUE y, D3DVALUE z)
1510 {
1511     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1512
1513     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1514
1515     return E_NOTIMPL;
1516 }
1517
1518 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTextureCoordinates(IDirect3DRMMeshBuilder3* iface,
1519                                                                         DWORD index, D3DVALUE u,
1520                                                                         D3DVALUE v)
1521 {
1522     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1523
1524     FIXME("(%p)->(%f,%f): stub\n", This, u, v);
1525
1526     return E_NOTIMPL;
1527 }
1528
1529 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertexColor(IDirect3DRMMeshBuilder3* iface,
1530                                                                  DWORD index, D3DCOLOR color)
1531 {
1532     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1533
1534     FIXME("(%p)->(%d,%x): stub\n", This, index, color);
1535
1536     return E_NOTIMPL;
1537 }
1538
1539 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertexColorRGB(IDirect3DRMMeshBuilder3* iface,
1540                                                                     DWORD index,
1541                                                                     D3DVALUE red, D3DVALUE green,
1542                                                                     D3DVALUE blue)
1543 {
1544     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1545
1546     FIXME("(%p)->(%d,%f,%f,%f): stub\n", This, index, red, green, blue);
1547
1548     return E_NOTIMPL;
1549 }
1550
1551 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetFaces(IDirect3DRMMeshBuilder3* iface,
1552                                                            LPDIRECT3DRMFACEARRAY* FaceArray)
1553 {
1554     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1555
1556     FIXME("(%p)->(%p): stub\n", This, FaceArray);
1557
1558     return E_NOTIMPL;
1559 }
1560
1561 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetGeometry(IDirect3DRMMeshBuilder3* iface,
1562                                                               DWORD* vcount, D3DVECTOR* vertices,
1563                                                               DWORD* ncount, D3DVECTOR* normals,
1564                                                               DWORD* face_data_size,
1565                                                               DWORD* face_data)
1566 {
1567     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1568
1569     FIXME("(%p)->(%p,%p,%p,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals,
1570           face_data_size, face_data);
1571
1572     return E_NOTIMPL;
1573 }
1574
1575 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetTextureCoordinates(IDirect3DRMMeshBuilder3* iface,
1576                                                                         DWORD index, D3DVALUE* u,
1577                                                                         D3DVALUE* v)
1578 {
1579     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1580
1581     FIXME("(%p)->(%d,%p,%p): stub\n", This, index, u, v);
1582
1583     return E_NOTIMPL;
1584 }
1585
1586
1587 static int WINAPI IDirect3DRMMeshBuilder3Impl_AddVertex(IDirect3DRMMeshBuilder3* iface,
1588                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z)
1589 {
1590     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1591
1592     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1593
1594     return 0;
1595 }
1596
1597 static int WINAPI IDirect3DRMMeshBuilder3Impl_AddNormal(IDirect3DRMMeshBuilder3* iface,
1598                                                         D3DVALUE x, D3DVALUE y, D3DVALUE z)
1599 {
1600     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1601
1602     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1603
1604     return 0;
1605 }
1606
1607 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateFace(IDirect3DRMMeshBuilder3* iface,
1608                                                              LPDIRECT3DRMFACE2* Face)
1609 {
1610     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1611
1612     FIXME("(%p)->(%p): stub\n", This, Face);
1613
1614     return E_NOTIMPL;
1615 }
1616
1617 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshBuilder3Impl_GetQuality(IDirect3DRMMeshBuilder3* iface)
1618 {
1619     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1620
1621     FIXME("(%p)->(): stub\n", This);
1622
1623     return 0;
1624 }
1625
1626 static BOOL WINAPI IDirect3DRMMeshBuilder3Impl_GetPerspective(IDirect3DRMMeshBuilder3* iface)
1627 {
1628     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1629
1630     FIXME("(%p)->(): stub\n", This);
1631
1632     return FALSE;
1633 }
1634
1635 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetFaceCount(IDirect3DRMMeshBuilder3* iface)
1636 {
1637     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1638
1639     TRACE("(%p)->()\n", This);
1640
1641     return This->nb_faces;
1642 }
1643
1644 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetVertexCount(IDirect3DRMMeshBuilder3* iface)
1645 {
1646     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1647
1648     TRACE("(%p)->()\n", This);
1649
1650     return This->nb_vertices;
1651 }
1652
1653 static D3DCOLOR WINAPI IDirect3DRMMeshBuilder3Impl_GetVertexColor(IDirect3DRMMeshBuilder3* iface,
1654                                                                   DWORD index)
1655 {
1656     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1657
1658     FIXME("(%p)->(%d): stub\n", This, index);
1659
1660     return 0;
1661 }
1662
1663 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateMesh(IDirect3DRMMeshBuilder3* iface,
1664                                                              LPDIRECT3DRMMESH* Mesh)
1665 {
1666     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1667
1668     FIXME("(%p)->(%p): stub\n", This, Mesh);
1669
1670     return E_NOTIMPL;
1671 }
1672
1673 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetFace(IDirect3DRMMeshBuilder3* iface,
1674                                                           DWORD index, LPDIRECT3DRMFACE2* Face)
1675 {
1676     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1677
1678     FIXME("(%p)->(%u,%p): stub\n", This, index, Face);
1679
1680     return E_NOTIMPL;
1681 }
1682
1683 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetVertex(IDirect3DRMMeshBuilder3* iface,
1684                                                             DWORD index, LPD3DVECTOR vector)
1685 {
1686     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1687
1688     FIXME("(%p)->(%u,%p): stub\n", This, index, vector);
1689
1690     return E_NOTIMPL;
1691 }
1692
1693 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetNormal(IDirect3DRMMeshBuilder3* iface,
1694                                                             DWORD index, LPD3DVECTOR vector)
1695 {
1696     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1697
1698     FIXME("(%p)->(%u,%p): stub\n", This, index, vector);
1699
1700     return E_NOTIMPL;
1701 }
1702
1703 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteVertices(IDirect3DRMMeshBuilder3* iface,
1704                                                                  DWORD IndexFirst, DWORD count)
1705 {
1706     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1707
1708     FIXME("(%p)->(%u,%u): stub\n", This, IndexFirst, count);
1709
1710     return E_NOTIMPL;
1711 }
1712
1713 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteNormals(IDirect3DRMMeshBuilder3* iface,
1714                                                                 DWORD IndexFirst, DWORD count)
1715 {
1716     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1717
1718     FIXME("(%p)->(%u,%u): stub\n", This, IndexFirst, count);
1719
1720     return E_NOTIMPL;
1721 }
1722
1723 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteFace(IDirect3DRMMeshBuilder3* iface,
1724                                                              LPDIRECT3DRMFACE2 Face)
1725 {
1726     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1727
1728     FIXME("(%p)->(%p): stub\n", This, Face);
1729
1730     return E_NOTIMPL;
1731 }
1732
1733 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Empty(IDirect3DRMMeshBuilder3* iface, DWORD flags)
1734 {
1735     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1736
1737     FIXME("(%p)->(%u): stub\n", This, flags);
1738
1739     return E_NOTIMPL;
1740 }
1741
1742 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Optimize(IDirect3DRMMeshBuilder3* iface,
1743                                                            DWORD flags)
1744 {
1745     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1746
1747     FIXME("(%p)->(%u): stub\n", This, flags);
1748
1749     return E_NOTIMPL;
1750 }
1751
1752 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFacesIndexed(IDirect3DRMMeshBuilder3* iface,
1753                                                                   DWORD flags, DWORD* indices,
1754                                                                   DWORD* IndexFirst, DWORD* count)
1755 {
1756     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1757
1758     FIXME("(%p)->(%u,%p,%p,%p): stub\n", This, flags, indices, IndexFirst, count);
1759
1760     return E_NOTIMPL;
1761 }
1762
1763 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateSubMesh(IDirect3DRMMeshBuilder3* iface,
1764                                                                 LPUNKNOWN *unkwn)
1765 {
1766     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1767
1768     FIXME("(%p)->(%p): stub\n", This, unkwn);
1769
1770     return E_NOTIMPL;
1771 }
1772
1773 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetParentMesh(IDirect3DRMMeshBuilder3* iface,
1774                                                                 DWORD flags, LPUNKNOWN *unkwn)
1775 {
1776     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1777
1778     FIXME("(%p)->(%u,%p): stub\n", This, flags, unkwn);
1779
1780     return E_NOTIMPL;
1781 }
1782
1783 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetSubMeshes(IDirect3DRMMeshBuilder3* iface,
1784                                                                LPDWORD count, LPUNKNOWN *unkwn)
1785 {
1786     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1787
1788     FIXME("(%p)->(%p,%p): stub\n", This, count, unkwn);
1789
1790     return E_NOTIMPL;
1791 }
1792
1793 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteSubMesh(IDirect3DRMMeshBuilder3* iface,
1794                                                                 LPUNKNOWN unkwn)
1795 {
1796     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1797
1798     FIXME("(%p)->(%p): stub\n", This, unkwn);
1799
1800     return E_NOTIMPL;
1801 }
1802
1803 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Enable(IDirect3DRMMeshBuilder3* iface,
1804                                                          DWORD index)
1805 {
1806     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1807
1808     FIXME("(%p)->(%u): stub\n", This, index);
1809
1810     return E_NOTIMPL;
1811 }
1812
1813 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetEnable(IDirect3DRMMeshBuilder3* iface,
1814                                                             DWORD* indices)
1815 {
1816     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1817
1818     FIXME("(%p)->(%p): stub\n", This, indices);
1819
1820     return E_NOTIMPL;
1821 }
1822
1823 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddTriangles(IDirect3DRMMeshBuilder3* iface,
1824                                                                DWORD flags, DWORD format,
1825                                                                DWORD VertexCount, LPVOID data)
1826 {
1827     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1828
1829     FIXME("(%p)->(%u,%u,%u,%p): stub\n", This, flags, format, VertexCount, data);
1830
1831     return E_NOTIMPL;
1832 }
1833
1834 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertices(IDirect3DRMMeshBuilder3* iface,
1835                                                               DWORD IndexFirst, DWORD count,
1836                                                               LPD3DVECTOR vector)
1837 {
1838     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1839
1840     FIXME("(%p)->(%u,%u,%p): stub\n", This, IndexFirst, count, vector);
1841
1842     return E_NOTIMPL;
1843 }
1844
1845 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetVertices(IDirect3DRMMeshBuilder3* iface,
1846                                                               DWORD IndexFirst, LPDWORD count,
1847                                                               LPD3DVECTOR vector)
1848 {
1849     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1850
1851     FIXME("(%p)->(%u,%p,%p): stub\n", This, IndexFirst, count, vector);
1852
1853     return E_NOTIMPL;
1854 }
1855
1856 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetNormals(IDirect3DRMMeshBuilder3* iface,
1857                                                              DWORD IndexFirst, DWORD count,
1858                                                              LPD3DVECTOR vector)
1859 {
1860     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1861
1862     FIXME("(%p)->(%u,%u,%p): stub\n", This, IndexFirst, count, vector);
1863
1864     return E_NOTIMPL;
1865 }
1866
1867 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetNormals(IDirect3DRMMeshBuilder3* iface,
1868                                                              DWORD IndexFirst, LPDWORD count,
1869                                                              LPD3DVECTOR vector)
1870 {
1871     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1872
1873     FIXME("(%p)->(%u,%p,%p): stub\n", This, IndexFirst, count, vector);
1874
1875     return E_NOTIMPL;
1876 }
1877
1878 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetNormalCount(IDirect3DRMMeshBuilder3* iface)
1879 {
1880     IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1881
1882     FIXME("(%p)->(): stub\n", This);
1883
1884     return E_NOTIMPL;
1885 }
1886
1887 static const struct IDirect3DRMMeshBuilder3Vtbl Direct3DRMMeshBuilder3_Vtbl =
1888 {
1889     /*** IUnknown methods ***/
1890     IDirect3DRMMeshBuilder3Impl_QueryInterface,
1891     IDirect3DRMMeshBuilder3Impl_AddRef,
1892     IDirect3DRMMeshBuilder3Impl_Release,
1893     /*** IDirect3DRMObject methods ***/
1894     IDirect3DRMMeshBuilder3Impl_Clone,
1895     IDirect3DRMMeshBuilder3Impl_AddDestroyCallback,
1896     IDirect3DRMMeshBuilder3Impl_DeleteDestroyCallback,
1897     IDirect3DRMMeshBuilder3Impl_SetAppData,
1898     IDirect3DRMMeshBuilder3Impl_GetAppData,
1899     IDirect3DRMMeshBuilder3Impl_SetName,
1900     IDirect3DRMMeshBuilder3Impl_GetName,
1901     IDirect3DRMMeshBuilder3Impl_GetClassName,
1902     /*** IDirect3DRMMeshBuilder3 methods ***/
1903     IDirect3DRMMeshBuilder3Impl_Load,
1904     IDirect3DRMMeshBuilder3Impl_Save,
1905     IDirect3DRMMeshBuilder3Impl_Scale,
1906     IDirect3DRMMeshBuilder3Impl_Translate,
1907     IDirect3DRMMeshBuilder3Impl_SetColorSource,
1908     IDirect3DRMMeshBuilder3Impl_GetBox,
1909     IDirect3DRMMeshBuilder3Impl_GenerateNormals,
1910     IDirect3DRMMeshBuilder3Impl_GetColorSource,
1911     IDirect3DRMMeshBuilder3Impl_AddMesh,
1912     IDirect3DRMMeshBuilder3Impl_AddMeshBuilder,
1913     IDirect3DRMMeshBuilder3Impl_AddFrame,
1914     IDirect3DRMMeshBuilder3Impl_AddFace,
1915     IDirect3DRMMeshBuilder3Impl_AddFaces,
1916     IDirect3DRMMeshBuilder3Impl_ReserveSpace,
1917     IDirect3DRMMeshBuilder3Impl_SetColorRGB,
1918     IDirect3DRMMeshBuilder3Impl_SetColor,
1919     IDirect3DRMMeshBuilder3Impl_SetTexture,
1920     IDirect3DRMMeshBuilder3Impl_SetMaterial,
1921     IDirect3DRMMeshBuilder3Impl_SetTextureTopology,
1922     IDirect3DRMMeshBuilder3Impl_SetQuality,
1923     IDirect3DRMMeshBuilder3Impl_SetPerspective,
1924     IDirect3DRMMeshBuilder3Impl_SetVertex,
1925     IDirect3DRMMeshBuilder3Impl_SetNormal,
1926     IDirect3DRMMeshBuilder3Impl_SetTextureCoordinates,
1927     IDirect3DRMMeshBuilder3Impl_SetVertexColor,
1928     IDirect3DRMMeshBuilder3Impl_SetVertexColorRGB,
1929     IDirect3DRMMeshBuilder3Impl_GetFaces,
1930     IDirect3DRMMeshBuilder3Impl_GetGeometry,
1931     IDirect3DRMMeshBuilder3Impl_GetTextureCoordinates,
1932     IDirect3DRMMeshBuilder3Impl_AddVertex,
1933     IDirect3DRMMeshBuilder3Impl_AddNormal,
1934     IDirect3DRMMeshBuilder3Impl_CreateFace,
1935     IDirect3DRMMeshBuilder3Impl_GetQuality,
1936     IDirect3DRMMeshBuilder3Impl_GetPerspective,
1937     IDirect3DRMMeshBuilder3Impl_GetFaceCount,
1938     IDirect3DRMMeshBuilder3Impl_GetVertexCount,
1939     IDirect3DRMMeshBuilder3Impl_GetVertexColor,
1940     IDirect3DRMMeshBuilder3Impl_CreateMesh,
1941     IDirect3DRMMeshBuilder3Impl_GetFace,
1942     IDirect3DRMMeshBuilder3Impl_GetVertex,
1943     IDirect3DRMMeshBuilder3Impl_GetNormal,
1944     IDirect3DRMMeshBuilder3Impl_DeleteVertices,
1945     IDirect3DRMMeshBuilder3Impl_DeleteNormals,
1946     IDirect3DRMMeshBuilder3Impl_DeleteFace,
1947     IDirect3DRMMeshBuilder3Impl_Empty,
1948     IDirect3DRMMeshBuilder3Impl_Optimize,
1949     IDirect3DRMMeshBuilder3Impl_AddFacesIndexed,
1950     IDirect3DRMMeshBuilder3Impl_CreateSubMesh,
1951     IDirect3DRMMeshBuilder3Impl_GetParentMesh,
1952     IDirect3DRMMeshBuilder3Impl_GetSubMeshes,
1953     IDirect3DRMMeshBuilder3Impl_DeleteSubMesh,
1954     IDirect3DRMMeshBuilder3Impl_Enable,
1955     IDirect3DRMMeshBuilder3Impl_GetEnable,
1956     IDirect3DRMMeshBuilder3Impl_AddTriangles,
1957     IDirect3DRMMeshBuilder3Impl_SetVertices,
1958     IDirect3DRMMeshBuilder3Impl_GetVertices,
1959     IDirect3DRMMeshBuilder3Impl_SetNormals,
1960     IDirect3DRMMeshBuilder3Impl_GetNormals,
1961     IDirect3DRMMeshBuilder3Impl_GetNormalCount
1962 };