user32: Don't use HIWORD() on a HINSTANCE.
[wine] / dlls / d3drm / meshbuilder.c
1 /*
2  * Implementation of IDirect3DRMMeshBuilder Interface
3  *
4  * Copyright 2010 Christian Costa
5  *
6  * This file contains the (internal) driver registration functions,
7  * driver enumeration APIs and DirectDraw creation functions.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 #include "wine/debug.h"
25
26 #define COBJMACROS
27
28 #include "winbase.h"
29 #include "wingdi.h"
30 #include "dxfile.h"
31
32 #include "d3drm_private.h"
33 #include "d3drm.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
36
37 typedef struct {
38     const IDirect3DRMMeshBuilderVtbl *lpVtbl;
39     LONG ref;
40     DWORD nb_vertices;
41     D3DVECTOR* pVertices;
42     DWORD nb_normals;
43     D3DVECTOR* pNormals;
44     DWORD nb_faces;
45     DWORD face_data_size;
46     LPVOID pFaceData;
47 } IDirect3DRMMeshBuilderImpl;
48
49 typedef struct {
50     WORD major;
51     WORD minor;
52     DWORD flags;
53 } Header;
54
55 static const struct IDirect3DRMMeshBuilderVtbl Direct3DRMMeshBuilder_Vtbl;
56
57 static const GUID GUID_Header = { 0x3D82AB43, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
58 static const GUID GUID_Mesh = { 0x3D82AB44, 0x62DA, 0x11CF, { 0xAB, 0x39, 0x00, 0x20, 0xAF, 0x71, 0xE4, 0x33 } };
59
60 static char templates[] = {
61 "xof 0302txt 0064"
62 "template Header"
63 "{"
64 "<3D82AB43-62DA-11CF-AB39-0020AF71E433>"
65 "WORD major;"
66 "WORD minor;"
67 "DWORD flags;"
68 "}"
69 "template Vector"
70 "{"
71 "<3D82AB5E-62DA-11CF-AB39-0020AF71E433>"
72 "FLOAT x;"
73 "FLOAT y;"
74 "FLOAT z;"
75 "}"
76 "template Coords2d"
77 "{"
78 "<F6F23F44-7686-11CF-8F52-0040333594A3>"
79 "FLOAT u;"
80 "FLOAT v;"
81 "}"
82 "template Matrix4x4"
83 "{"
84 "<F6F23F45-7686-11CF-8F52-0040333594A3>"
85 "array FLOAT matrix[16];"
86 "}"
87 "template ColorRGBA"
88 "{"
89 "<35FF44E0-6C7C-11CF-8F52-0040333594A3>"
90 "FLOAT red;"
91 "FLOAT green;"
92 "FLOAT blue;"
93 "FLOAT alpha;"
94 "}"
95 "template ColorRGB"
96 "{"
97 "<D3E16E81-7835-11CF-8F52-0040333594A3>"
98 "FLOAT red;"
99 "FLOAT green;"
100 "FLOAT blue;"
101 "}"
102 "template IndexedColor"
103 "{"
104 "<1630B820-7842-11CF-8F52-0040333594A3>"
105 "DWORD index;"
106 "ColorRGBA indexColor;"
107 "}"
108 "template Boolean"
109 "{"
110 "<537DA6A0-CA37-11D0-941C-0080C80CFA7B>"
111 "DWORD truefalse;"
112 "}"
113 "template Boolean2d"
114 "{"
115 "<4885AE63-78E8-11CF-8F52-0040333594A3>"
116 "Boolean u;"
117 "Boolean v;"
118 "}"
119 "template MaterialWrap"
120 "{"
121 "<4885AE60-78E8-11CF-8F52-0040333594A3>"
122 "Boolean u;"
123 "Boolean v;"
124 "}"
125 "template TextureFilename"
126 "{"
127 "<A42790E1-7810-11CF-8F52-0040333594A3>"
128 "STRING filename;"
129 "}"
130 "template Material"
131 "{"
132 "<3D82AB4D-62DA-11CF-AB39-0020AF71E433>"
133 "ColorRGBA faceColor;"
134 "FLOAT power;"
135 "ColorRGB specularColor;"
136 "ColorRGB emissiveColor;"
137 "[...]"
138 "}"
139 "template MeshFace"
140 "{"
141 "<3D82AB5F-62DA-11CF-AB39-0020AF71E433>"
142 "DWORD nFaceVertexIndices;"
143 "array DWORD faceVertexIndices[nFaceVertexIndices];"
144 "}"
145 "template MeshFaceWraps"
146 "{"
147 "<ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B>"
148 "DWORD nFaceWrapValues;"
149 "array Boolean2d faceWrapValues[nFaceWrapValues];"
150 "}"
151 "template MeshTextureCoords"
152 "{"
153 "<F6F23F40-7686-11CF-8F52-0040333594A3>"
154 "DWORD nTextureCoords;"
155 "array Coords2d textureCoords[nTextureCoords];"
156 "}"
157 "template MeshMaterialList"
158 "{"
159 "<F6F23F42-7686-11CF-8F52-0040333594A3>"
160 "DWORD nMaterials;"
161 "DWORD nFaceIndexes;"
162 "array DWORD faceIndexes[nFaceIndexes];"
163 "[Material]"
164 "}"
165 "template MeshNormals"
166 "{"
167 "<F6F23F43-7686-11CF-8F52-0040333594A3>"
168 "DWORD nNormals;"
169 "array Vector normals[nNormals];"
170 "DWORD nFaceNormals;"
171 "array MeshFace faceNormals[nFaceNormals];"
172 "}"
173 "template MeshVertexColors"
174 "{"
175 "<1630B821-7842-11CF-8F52-0040333594A3>"
176 "DWORD nVertexColors;"
177 "array IndexedColor vertexColors[nVertexColors];"
178 "}"
179 "template Mesh"
180 "{"
181 "<3D82AB44-62DA-11CF-AB39-0020AF71E433>"
182 "DWORD nVertices;"
183 "array Vector vertices[nVertices];"
184 "DWORD nFaces;"
185 "array MeshFace faces[nFaces];"
186 "[...]"
187 "}"
188 "template FrameTransformMatrix"
189 "{"
190 "<F6F23F41-7686-11CF-8F52-0040333594A3>"
191 "Matrix4x4 frameMatrix;"
192 "}"
193 "template Frame"
194 "{"
195 "<3D82AB46-62DA-11CF-AB39-0020AF71E433>"
196 "[...]"
197 "}"
198 "template FloatKeys"
199 "{"
200 "<10DD46A9-775B-11CF-8F52-0040333594A3>"
201 "DWORD nValues;"
202 "array FLOAT values[nValues];"
203 "}"
204 "template TimedFloatKeys"
205 "{"
206 "<F406B180-7B3B-11CF-8F52-0040333594A3>"
207 "DWORD time;"
208 "FloatKeys tfkeys;"
209 "}"
210 "template AnimationKey"
211 "{"
212 "<10DD46A8-775B-11CF-8F52-0040333594A3>"
213 "DWORD keyType;"
214 "DWORD nKeys;"
215 "array TimedFloatKeys keys[nKeys];"
216 "}"
217 "template AnimationOptions"
218 "{"
219 "<E2BF56C0-840F-11CF-8F52-0040333594A3>"
220 "DWORD openclosed;"
221 "DWORD positionquality;"
222 "}"
223 "template Animation"
224 "{"
225 "<3D82AB4F-62DA-11CF-AB39-0020AF71E433>"
226 "[...]"
227 "}"
228 "template AnimationSet"
229 "{"
230 "<3D82AB50-62DA-11CF-AB39-0020AF71E433>"
231 "[Animation]"
232 "}"
233 "template InlineData"
234 "{"
235 "<3A23EEA0-94B1-11D0-AB39-0020AF71E433>"
236 "[BINARY]"
237 "}"
238 "template Url"
239 "{"
240 "<3A23EEA1-94B1-11D0-AB39-0020AF71E433>"
241 "DWORD nUrls;"
242 "array STRING urls[nUrls];"
243 "}"
244 "template ProgressiveMesh"
245 "{"
246 "<8A63C360-997D-11D0-941C-0080C80CFA7B>"
247 "[Url,InlineData]"
248 "}"
249 "template Guid"
250 "{"
251 "<A42790E0-7810-11CF-8F52-0040333594A3>"
252 "DWORD data1;"
253 "WORD data2;"
254 "WORD data3;"
255 "array UCHAR data4[8];"
256 "}"
257 "template StringProperty"
258 "{"
259 "<7F0F21E0-BFE1-11D1-82C0-00A0C9697271>"
260 "STRING key;"
261 "STRING value;"
262 "}"
263 "template PropertyBag"
264 "{"
265 "<7F0F21E1-BFE1-11D1-82C0-00A0C9697271>"
266 "[StringProperty]"
267 "}"
268 "template ExternalVisual"
269 "{"
270 "<98116AA0-BDBA-11D1-82C0-00A0C9697271>"
271 "Guid guidExternalVisual;"
272 "[...]"
273 "}"
274 "template RightHanded"
275 "{"
276 "<7F5D5EA0-D53A-11D1-82C0-00A0C9697271>"
277 "DWORD bRightHanded;"
278 "}"
279 };
280
281 HRESULT Direct3DRMMeshBuilder_create(LPDIRECT3DRMMESHBUILDER* ppMeshBuilder)
282 {
283     IDirect3DRMMeshBuilderImpl* object;
284
285     TRACE("(%p)\n", ppMeshBuilder);
286
287     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMeshBuilderImpl));
288     if (!object)
289     {
290         ERR("Out of memory\n");
291         return E_OUTOFMEMORY;
292     }
293
294     object->lpVtbl = &Direct3DRMMeshBuilder_Vtbl;
295     object->ref = 1;
296
297     *ppMeshBuilder = (IDirect3DRMMeshBuilder*)object;
298
299     return S_OK;
300 }
301
302 /*** IUnknown methods ***/
303 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_QueryInterface(IDirect3DRMMeshBuilder* iface, REFIID riid, void** ppvObject)
304 {
305     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
306
307     TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject);
308
309     if (IsEqualGUID(riid, &IID_IUnknown) ||
310         IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder))
311     {
312         IClassFactory_AddRef(iface);
313         *ppvObject = This;
314         return S_OK;
315     }
316
317     ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject);
318     return E_NOINTERFACE;
319 }
320
321 static ULONG WINAPI IDirect3DRMMeshBuilderImpl_AddRef(IDirect3DRMMeshBuilder* iface)
322 {
323     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
324
325     TRACE("(%p)\n", This);
326
327     return InterlockedIncrement(&This->ref);
328 }
329
330 static ULONG WINAPI IDirect3DRMMeshBuilderImpl_Release(IDirect3DRMMeshBuilder* iface)
331 {
332     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
333     ULONG ref = InterlockedDecrement(&This->ref);
334
335     TRACE("(%p)\n", This);
336
337     if (!ref)
338     {
339         HeapFree(GetProcessHeap(), 0, This->pVertices);
340         HeapFree(GetProcessHeap(), 0, This->pNormals);
341         HeapFree(GetProcessHeap(), 0, This->pFaceData);
342         HeapFree(GetProcessHeap(), 0, This);
343     }
344
345     return ref;
346 }
347
348 /*** IDirect3DRMObject methods ***/
349 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Clone(IDirect3DRMMeshBuilder* iface, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj)
350 {
351     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
352
353     FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
354
355     return E_NOTIMPL;
356 }
357
358 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_AddDestroyCallback(IDirect3DRMMeshBuilder* iface, D3DRMOBJECTCALLBACK cb, LPVOID argument)
359 {
360     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
361
362     FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
363
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_DeleteDestroyCallback(IDirect3DRMMeshBuilder* iface, D3DRMOBJECTCALLBACK cb, LPVOID argument)
368 {
369     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
370
371     FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
372
373     return E_NOTIMPL;
374 }
375
376 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetAppData(IDirect3DRMMeshBuilder* iface, DWORD data)
377 {
378     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
379
380     FIXME("(%p)->(%u): stub\n", This, data);
381
382     return E_NOTIMPL;
383 }
384
385 static DWORD WINAPI IDirect3DRMMeshBuilderImpl_GetAppData(IDirect3DRMMeshBuilder* iface)
386 {
387     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
388
389     FIXME("(%p)->(): stub\n", This);
390
391     return 0;
392 }
393
394 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetName(IDirect3DRMMeshBuilder* iface, LPCSTR pName)
395 {
396     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
397
398     FIXME("(%p)->(%s): stub\n", This, pName);
399
400     return E_NOTIMPL;
401 }
402
403 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetName(IDirect3DRMMeshBuilder* iface, LPDWORD lpdwSize, LPSTR lpName)
404 {
405     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
406
407     FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
408
409     return E_NOTIMPL;
410 }
411
412 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetClassName(IDirect3DRMMeshBuilder* iface, LPDWORD lpdwSize, LPSTR lpName)
413 {
414     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
415
416     FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
417
418     return E_NOTIMPL;
419 }
420
421 /*** IDirect3DRMMeshBuilder methods ***/
422 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Load(IDirect3DRMMeshBuilder* iface, LPVOID filename, LPVOID name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURECALLBACK cb, LPVOID pArg)
423 {
424     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
425     DXFILELOADOPTIONS load_options;
426     LPDIRECTXFILE pDXFile = NULL;
427     LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
428     LPDIRECTXFILEDATA pData = NULL;
429     const GUID* pGuid;
430     DWORD size;
431     Header* pHeader;
432     LPBYTE ptr;
433     HRESULT hr;
434     HRESULT ret = D3DRMERR_BADOBJECT;
435
436     FIXME("(%p)->(%p,%p,%x,%p,%p): partial stub\n", This, filename, name, loadflags, cb, pArg);
437
438     /* First free allocated buffers of previous mesh data */
439     HeapFree(GetProcessHeap(), 0, This->pVertices);
440     This->pVertices = NULL;
441     HeapFree(GetProcessHeap(), 0, This->pNormals);
442     This->pNormals = NULL;
443     HeapFree(GetProcessHeap(), 0, This->pFaceData);
444     This->pFaceData = NULL;
445
446     if (loadflags == D3DRMLOAD_FROMMEMORY)
447     {
448         DXFILELOADMEMORY info;
449         LPD3DRMLOADMEMORY pinfo = (LPD3DRMLOADMEMORY)filename;
450         info.lpMemory = pinfo->lpMemory;
451         info.dSize = pinfo->dSize;
452         load_options = DXFILELOAD_FROMMEMORY;
453     }
454     else
455     {
456         FIXME("Load options %d not supported yet\n", loadflags);
457         return E_NOTIMPL;
458     }
459
460     hr = DirectXFileCreate(&pDXFile);
461     if (hr != DXFILE_OK)
462         goto end;
463
464     hr = IDirectXFile_RegisterTemplates(pDXFile, templates, strlen(templates));
465     if (hr != DXFILE_OK)
466         goto end;
467
468     hr = IDirectXFile_CreateEnumObject(pDXFile, filename, load_options, &pEnumObject);
469     if (hr != DXFILE_OK)
470         goto end;
471
472     hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
473     if (hr != DXFILE_OK)
474         goto end;
475
476     hr = IDirectXFileData_GetType(pData, &pGuid);
477     if (hr != DXFILE_OK)
478         goto end;
479
480     TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
481
482     if (!IsEqualGUID(pGuid, &GUID_Header))
483     {
484         ret = D3DRMERR_BADFILE;
485         goto end;
486     }
487
488     hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader);
489     if ((hr != DXFILE_OK) || (size != sizeof(Header)))
490         goto end;
491
492     TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags);
493
494     /* Version must be 1.0.x */
495     if ((pHeader->major != 1) || (pHeader->minor != 0))
496     {
497         ret = D3DRMERR_BADFILE;
498         goto end;
499     }
500
501     IDirectXFileData_Release(pData);
502     pData = NULL;
503
504     hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
505     if (hr != DXFILE_OK)
506     {
507         ret = D3DRMERR_NOTFOUND;
508         goto end;
509     }
510
511     hr = IDirectXFileData_GetType(pData, &pGuid);
512     if (hr != DXFILE_OK)
513         goto end;
514
515     TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
516
517     if (!IsEqualGUID(pGuid, &GUID_Mesh))
518     {
519         ret = D3DRMERR_NOTFOUND;
520         goto end;
521     }
522
523     hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
524     if (hr != DXFILE_OK)
525         goto end;
526
527     This->nb_vertices = *(DWORD*)ptr;
528     This->nb_faces = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR));
529     This->face_data_size = size - sizeof(DWORD) - This->nb_vertices * sizeof(D3DVECTOR) - sizeof(DWORD);
530
531     TRACE("Mesh: nb_vertices = %d, nb_faces = %d, face_data_size = %d\n", This->nb_vertices, This->nb_faces, This->face_data_size);
532
533     This->pVertices = HeapAlloc(GetProcessHeap(), 0, This->nb_vertices * sizeof(D3DVECTOR));
534     memcpy(This->pVertices, ptr + sizeof(DWORD), This->nb_vertices * sizeof(D3DVECTOR));
535
536     This->pFaceData = HeapAlloc(GetProcessHeap(), 0, This->face_data_size);
537     memcpy(This->pFaceData, ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD), This->face_data_size);
538
539     ret = D3DRM_OK;
540
541 end:
542     if (pData)
543         IDirectXFileData_Release(pData);
544     if (pEnumObject)
545         IDirectXFileEnumObject_Release(pEnumObject);
546     if (pDXFile)
547         IDirectXFile_Release(pDXFile);
548
549     if (hr != D3DRM_OK)
550     {
551         /* Clean mesh data */
552         This->nb_vertices = 0;
553         This->nb_normals = 0;
554         This->nb_faces = 0;
555         This->face_data_size = 0;
556         HeapFree(GetProcessHeap(), 0, This->pVertices);
557         This->pVertices = NULL;
558         HeapFree(GetProcessHeap(), 0, This->pNormals);
559         This->pNormals = NULL;
560         HeapFree(GetProcessHeap(), 0, This->pFaceData);
561         This->pFaceData = NULL;
562     }
563
564     return ret;
565 }
566
567 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Save(IDirect3DRMMeshBuilder* iface, const char *filename, D3DRMXOFFORMAT format, D3DRMSAVEOPTIONS save)
568 {
569     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
570
571     FIXME("(%p)->(%s,%d,%d): stub\n", This, filename, format, save);
572
573     return E_NOTIMPL;
574 }
575
576 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Scale(IDirect3DRMMeshBuilder* iface, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
577 {
578     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
579
580     FIXME("(%p)->(%f,%f,%f): stub\n", This, sx, sy, sz);
581
582     return E_NOTIMPL;
583 }
584
585 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_Translate(IDirect3DRMMeshBuilder* iface, D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
586 {
587     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
588
589     FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty, tz);
590
591     return E_NOTIMPL;
592 }
593
594 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetColorSource(IDirect3DRMMeshBuilder* iface, D3DRMCOLORSOURCE color)
595 {
596     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
597
598     FIXME("(%p)->(%x): stub\n", This, color);
599
600     return E_NOTIMPL;
601 }
602
603 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetBox(IDirect3DRMMeshBuilder* iface, D3DRMBOX *pBox)
604 {
605     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
606
607     FIXME("(%p)->(%p): stub\n", This, pBox);
608
609     return E_NOTIMPL;
610 }
611
612 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GenerateNormals(IDirect3DRMMeshBuilder* iface)
613 {
614     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
615
616     FIXME("(%p)->(): stub\n", This);
617
618     return E_NOTIMPL;
619 }
620
621 static D3DRMCOLORSOURCE WINAPI IDirect3DRMMeshBuilderImpl_GetColorSource(IDirect3DRMMeshBuilder* iface)
622 {
623     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
624
625     FIXME("(%p)->(): stub\n", This);
626
627     return E_NOTIMPL;
628 }
629
630 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_AddMesh(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMMESH pMesh)
631 {
632     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
633
634     FIXME("(%p)->(%p): stub\n", This, pMesh);
635
636     return E_NOTIMPL;
637 }
638
639 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_AddMeshBuilder(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMMESHBUILDER pMeshBuilder)
640 {
641     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
642
643     FIXME("(%p)->(%p): stub\n", This, pMeshBuilder);
644
645     return E_NOTIMPL;
646 }
647
648 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_AddFrame(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMFRAME pFrame)
649 {
650     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
651
652     FIXME("(%p)->(%p): stub\n", This, pFrame);
653
654     return E_NOTIMPL;
655 }
656
657 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_AddFace(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMFACE pFace)
658 {
659     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
660
661     FIXME("(%p)->(%p): stub\n", This, pFace);
662
663     return E_NOTIMPL;
664 }
665
666 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_AddFaces(IDirect3DRMMeshBuilder* iface, DWORD vcount, D3DVECTOR *vertices, DWORD ncount, D3DVECTOR *normals, DWORD *data, LPDIRECT3DRMFACEARRAY* pFaceArray)
667 {
668     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
669
670     FIXME("(%p)->(%d,%p,%d,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals, data, pFaceArray);
671
672     return E_NOTIMPL;
673 }
674
675 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_ReserveSpace(IDirect3DRMMeshBuilder* iface, DWORD vertex_Count, DWORD normal_count, DWORD face_count)
676 {
677     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
678
679     FIXME("(%p)->(%d,%d,%d): stub\n", This, vertex_Count, normal_count, face_count);
680
681     return E_NOTIMPL;
682 }
683
684 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetColorRGB(IDirect3DRMMeshBuilder* iface, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
685 {
686     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
687
688     FIXME("(%p)->(%f,%f,%f): stub\n", This, red, green, blue);
689
690     return E_NOTIMPL;
691 }
692
693 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetColor(IDirect3DRMMeshBuilder* iface, D3DCOLOR color)
694 {
695     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
696
697     FIXME("(%p)->(%x): stub\n", This, color);
698
699     return E_NOTIMPL;
700 }
701
702 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetTexture(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMTEXTURE pTexture)
703 {
704     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
705
706     FIXME("(%p)->(%p): stub\n", This, pTexture);
707
708     return E_NOTIMPL;
709 }
710
711 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetMaterial(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMMATERIAL pMaterial)
712 {
713     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
714
715     FIXME("(%p)->(%p): stub\n", This, pMaterial);
716
717     return E_NOTIMPL;
718 }
719
720 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetTextureTopology(IDirect3DRMMeshBuilder* iface, BOOL wrap_u, BOOL wrap_v)
721 {
722     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
723
724     FIXME("(%p)->(%d,%d): stub\n", This, wrap_u, wrap_v);
725
726     return E_NOTIMPL;
727 }
728
729 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetQuality(IDirect3DRMMeshBuilder* iface, D3DRMRENDERQUALITY quality)
730 {
731     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
732
733     FIXME("(%p)->(%d): stub\n", This, quality);
734
735     return E_NOTIMPL;
736 }
737
738 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetPerspective(IDirect3DRMMeshBuilder* iface, BOOL enable)
739 {
740     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
741
742     FIXME("(%p)->(%d): stub\n", This, enable);
743
744     return E_NOTIMPL;
745 }
746
747 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetVertex(IDirect3DRMMeshBuilder* iface, DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z)
748 {
749     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
750
751     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
752
753     return E_NOTIMPL;
754 }
755
756 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetNormal(IDirect3DRMMeshBuilder* iface, DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z)
757 {
758     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
759
760     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
761
762     return E_NOTIMPL;
763 }
764
765 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetTextureCoordinates(IDirect3DRMMeshBuilder* iface, DWORD index, D3DVALUE u, D3DVALUE v)
766 {
767     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
768
769     FIXME("(%p)->(%f,%f): stub\n", This, u, v);
770
771     return E_NOTIMPL;
772 }
773
774 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetVertexColor(IDirect3DRMMeshBuilder* iface, DWORD index, D3DCOLOR color)
775 {
776     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
777
778     FIXME("(%p)->(%d,%x): stub\n", This, index, color);
779
780     return E_NOTIMPL;
781 }
782
783 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_SetVertexColorRGB(IDirect3DRMMeshBuilder* iface, DWORD index, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
784 {
785     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
786
787     FIXME("(%p)->(%d,%f,%f,%f): stub\n", This, index, red, green, blue);
788
789     return E_NOTIMPL;
790 }
791
792 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetFaces(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMFACEARRAY* pFaceArray)
793 {
794     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
795
796     FIXME("(%p)->(%p): stub\n", This, pFaceArray);
797
798     return E_NOTIMPL;
799 }
800
801 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetVertices(IDirect3DRMMeshBuilder* iface, DWORD *vcount, D3DVECTOR *vertices, DWORD *ncount, D3DVECTOR *normals, DWORD *face_data_size, DWORD *face_data)
802 {
803     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
804
805     TRACE("(%p)->(%p,%p,%p,%p,%p,%p)\n", This, vcount, vertices, ncount, normals, face_data_size, face_data);
806
807     if (vcount)
808         *vcount = This->nb_vertices;
809     if (vertices && This->nb_vertices)
810         memcpy(vertices, This->pVertices, This->nb_vertices * sizeof(D3DVECTOR));
811     if (ncount)
812         *ncount = This->nb_normals;
813     if (normals && This->nb_normals)
814         memcpy(normals, This->pNormals, This->nb_normals * sizeof(D3DVECTOR));
815     if (face_data_size)
816         *face_data_size = This->face_data_size;
817     if (face_data && This->face_data_size)
818         memcpy(face_data, This->pFaceData, This->face_data_size);
819
820     return D3DRM_OK;
821 }
822
823 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_GetTextureCoordinates(IDirect3DRMMeshBuilder* iface, DWORD index, D3DVALUE *u, D3DVALUE *v)
824 {
825     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
826
827     FIXME("(%p)->(%d,%p,%p): stub\n", This, index, u, v);
828
829     return E_NOTIMPL;
830 }
831
832 static int WINAPI IDirect3DRMMeshBuilderImpl_AddVertex(IDirect3DRMMeshBuilder* iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)
833 {
834     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
835
836     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
837
838     return 0;
839 }
840
841 static int WINAPI IDirect3DRMMeshBuilderImpl_AddNormal(IDirect3DRMMeshBuilder* iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)
842 {
843     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
844
845     FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
846
847     return 0;
848 }
849
850 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_CreateFace(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMFACE* ppFace)
851 {
852     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
853
854     FIXME("(%p)->(%p): stub\n", This, ppFace);
855
856     return E_NOTIMPL;
857 }
858
859 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshBuilderImpl_GetQuality(IDirect3DRMMeshBuilder* iface)
860 {
861     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
862
863     FIXME("(%p)->(): stub\n", This);
864
865     return 0;
866 }
867
868 static BOOL WINAPI IDirect3DRMMeshBuilderImpl_GetPerspective(IDirect3DRMMeshBuilder* iface)
869 {
870     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
871
872     FIXME("(%p)->(): stub\n", This);
873
874     return FALSE;
875 }
876
877 static int WINAPI IDirect3DRMMeshBuilderImpl_GetFaceCount(IDirect3DRMMeshBuilder* iface)
878 {
879     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
880
881     TRACE("(%p)->()\n", This);
882
883     return This->nb_faces;
884 }
885
886 static int WINAPI IDirect3DRMMeshBuilderImpl_GetVertexCount(IDirect3DRMMeshBuilder* iface)
887 {
888     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
889
890     TRACE("(%p)->()\n", This);
891
892     return This->nb_vertices;
893 }
894
895 static D3DCOLOR WINAPI IDirect3DRMMeshBuilderImpl_GetVertexColor(IDirect3DRMMeshBuilder* iface, DWORD index)
896 {
897     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
898
899     FIXME("(%p)->(%d): stub\n", This, index);
900
901     return 0;
902 }
903
904 static HRESULT WINAPI IDirect3DRMMeshBuilderImpl_CreateMesh(IDirect3DRMMeshBuilder* iface, LPDIRECT3DRMMESH* ppMesh)
905 {
906     IDirect3DRMMeshBuilderImpl *This = (IDirect3DRMMeshBuilderImpl *)iface;
907
908     FIXME("(%p)->(%p): stub\n", This, ppMesh);
909
910     return E_NOTIMPL;
911 }
912
913 static const struct IDirect3DRMMeshBuilderVtbl Direct3DRMMeshBuilder_Vtbl =
914 {
915     /*** IUnknown methods ***/
916     IDirect3DRMMeshBuilderImpl_QueryInterface,
917     IDirect3DRMMeshBuilderImpl_AddRef,
918     IDirect3DRMMeshBuilderImpl_Release,
919     /*** IDirect3DRMObject methods ***/
920     IDirect3DRMMeshBuilderImpl_Clone,
921     IDirect3DRMMeshBuilderImpl_AddDestroyCallback,
922     IDirect3DRMMeshBuilderImpl_DeleteDestroyCallback,
923     IDirect3DRMMeshBuilderImpl_SetAppData,
924     IDirect3DRMMeshBuilderImpl_GetAppData,
925     IDirect3DRMMeshBuilderImpl_SetName,
926     IDirect3DRMMeshBuilderImpl_GetName,
927     IDirect3DRMMeshBuilderImpl_GetClassName,
928     /*** IDirect3DRMMeshBuilder methods ***/
929     IDirect3DRMMeshBuilderImpl_Load,
930     IDirect3DRMMeshBuilderImpl_Save,
931     IDirect3DRMMeshBuilderImpl_Scale,
932     IDirect3DRMMeshBuilderImpl_Translate,
933     IDirect3DRMMeshBuilderImpl_SetColorSource,
934     IDirect3DRMMeshBuilderImpl_GetBox,
935     IDirect3DRMMeshBuilderImpl_GenerateNormals,
936     IDirect3DRMMeshBuilderImpl_GetColorSource,
937     IDirect3DRMMeshBuilderImpl_AddMesh,
938     IDirect3DRMMeshBuilderImpl_AddMeshBuilder,
939     IDirect3DRMMeshBuilderImpl_AddFrame,
940     IDirect3DRMMeshBuilderImpl_AddFace,
941     IDirect3DRMMeshBuilderImpl_AddFaces,
942     IDirect3DRMMeshBuilderImpl_ReserveSpace,
943     IDirect3DRMMeshBuilderImpl_SetColorRGB,
944     IDirect3DRMMeshBuilderImpl_SetColor,
945     IDirect3DRMMeshBuilderImpl_SetTexture,
946     IDirect3DRMMeshBuilderImpl_SetMaterial,
947     IDirect3DRMMeshBuilderImpl_SetTextureTopology,
948     IDirect3DRMMeshBuilderImpl_SetQuality,
949     IDirect3DRMMeshBuilderImpl_SetPerspective,
950     IDirect3DRMMeshBuilderImpl_SetVertex,
951     IDirect3DRMMeshBuilderImpl_SetNormal,
952     IDirect3DRMMeshBuilderImpl_SetTextureCoordinates,
953     IDirect3DRMMeshBuilderImpl_SetVertexColor,
954     IDirect3DRMMeshBuilderImpl_SetVertexColorRGB,
955     IDirect3DRMMeshBuilderImpl_GetFaces,
956     IDirect3DRMMeshBuilderImpl_GetVertices,
957     IDirect3DRMMeshBuilderImpl_GetTextureCoordinates,
958     IDirect3DRMMeshBuilderImpl_AddVertex,
959     IDirect3DRMMeshBuilderImpl_AddNormal,
960     IDirect3DRMMeshBuilderImpl_CreateFace,
961     IDirect3DRMMeshBuilderImpl_GetQuality,
962     IDirect3DRMMeshBuilderImpl_GetPerspective,
963     IDirect3DRMMeshBuilderImpl_GetFaceCount,
964     IDirect3DRMMeshBuilderImpl_GetVertexCount,
965     IDirect3DRMMeshBuilderImpl_GetVertexColor,
966     IDirect3DRMMeshBuilderImpl_CreateMesh
967 };