2 * Implementation of IDirect3DRMMeshBuilder2 Interface
4 * Copyright 2010, 2012 Christian Costa
5 * Copyright 2011 André Hentschel
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.
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.
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
22 #include "wine/debug.h"
31 #include "d3drm_private.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
35 static HRESULT Direct3DRMMesh_create(IDirect3DRMMesh** obj);
38 IDirect3DRMMesh IDirect3DRMMesh_iface;
40 } IDirect3DRMMeshImpl;
48 IDirect3DRMMeshBuilder2 IDirect3DRMMeshBuilder2_iface;
49 IDirect3DRMMeshBuilder3 IDirect3DRMMeshBuilder3_iface;
61 } IDirect3DRMMeshBuilderImpl;
67 "<3D82AB43-62DA-11CF-AB39-0020AF71E433>"
74 "<3D82AB5E-62DA-11CF-AB39-0020AF71E433>"
81 "<F6F23F44-7686-11CF-8F52-0040333594A3>"
87 "<F6F23F45-7686-11CF-8F52-0040333594A3>"
88 "array FLOAT matrix[16];"
92 "<35FF44E0-6C7C-11CF-8F52-0040333594A3>"
100 "<D3E16E81-7835-11CF-8F52-0040333594A3>"
105 "template IndexedColor"
107 "<1630B820-7842-11CF-8F52-0040333594A3>"
109 "ColorRGBA indexColor;"
113 "<537DA6A0-CA37-11D0-941C-0080C80CFA7B>"
118 "<4885AE63-78E8-11CF-8F52-0040333594A3>"
122 "template MaterialWrap"
124 "<4885AE60-78E8-11CF-8F52-0040333594A3>"
128 "template TextureFilename"
130 "<A42790E1-7810-11CF-8F52-0040333594A3>"
135 "<3D82AB4D-62DA-11CF-AB39-0020AF71E433>"
136 "ColorRGBA faceColor;"
138 "ColorRGB specularColor;"
139 "ColorRGB emissiveColor;"
144 "<3D82AB5F-62DA-11CF-AB39-0020AF71E433>"
145 "DWORD nFaceVertexIndices;"
146 "array DWORD faceVertexIndices[nFaceVertexIndices];"
148 "template MeshFaceWraps"
150 "<ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B>"
151 "DWORD nFaceWrapValues;"
152 "array Boolean2d faceWrapValues[nFaceWrapValues];"
154 "template MeshTextureCoords"
156 "<F6F23F40-7686-11CF-8F52-0040333594A3>"
157 "DWORD nTextureCoords;"
158 "array Coords2d textureCoords[nTextureCoords];"
160 "template MeshMaterialList"
162 "<F6F23F42-7686-11CF-8F52-0040333594A3>"
164 "DWORD nFaceIndexes;"
165 "array DWORD faceIndexes[nFaceIndexes];"
168 "template MeshNormals"
170 "<F6F23F43-7686-11CF-8F52-0040333594A3>"
172 "array Vector normals[nNormals];"
173 "DWORD nFaceNormals;"
174 "array MeshFace faceNormals[nFaceNormals];"
176 "template MeshVertexColors"
178 "<1630B821-7842-11CF-8F52-0040333594A3>"
179 "DWORD nVertexColors;"
180 "array IndexedColor vertexColors[nVertexColors];"
184 "<3D82AB44-62DA-11CF-AB39-0020AF71E433>"
186 "array Vector vertices[nVertices];"
188 "array MeshFace faces[nFaces];"
191 "template FrameTransformMatrix"
193 "<F6F23F41-7686-11CF-8F52-0040333594A3>"
194 "Matrix4x4 frameMatrix;"
198 "<3D82AB46-62DA-11CF-AB39-0020AF71E433>"
203 "<10DD46A9-775B-11CF-8F52-0040333594A3>"
205 "array FLOAT values[nValues];"
207 "template TimedFloatKeys"
209 "<F406B180-7B3B-11CF-8F52-0040333594A3>"
213 "template AnimationKey"
215 "<10DD46A8-775B-11CF-8F52-0040333594A3>"
218 "array TimedFloatKeys keys[nKeys];"
220 "template AnimationOptions"
222 "<E2BF56C0-840F-11CF-8F52-0040333594A3>"
224 "DWORD positionquality;"
228 "<3D82AB4F-62DA-11CF-AB39-0020AF71E433>"
231 "template AnimationSet"
233 "<3D82AB50-62DA-11CF-AB39-0020AF71E433>"
236 "template InlineData"
238 "<3A23EEA0-94B1-11D0-AB39-0020AF71E433>"
243 "<3A23EEA1-94B1-11D0-AB39-0020AF71E433>"
245 "array STRING urls[nUrls];"
247 "template ProgressiveMesh"
249 "<8A63C360-997D-11D0-941C-0080C80CFA7B>"
254 "<A42790E0-7810-11CF-8F52-0040333594A3>"
258 "array UCHAR data4[8];"
260 "template StringProperty"
262 "<7F0F21E0-BFE1-11D1-82C0-00A0C9697271>"
266 "template PropertyBag"
268 "<7F0F21E1-BFE1-11D1-82C0-00A0C9697271>"
271 "template ExternalVisual"
273 "<98116AA0-BDBA-11D1-82C0-00A0C9697271>"
274 "Guid guidExternalVisual;"
277 "template RightHanded"
279 "<7F5D5EA0-D53A-11D1-82C0-00A0C9697271>"
280 "DWORD bRightHanded;"
284 static inline IDirect3DRMMeshImpl *impl_from_IDirect3DRMMesh(IDirect3DRMMesh *iface)
286 return CONTAINING_RECORD(iface, IDirect3DRMMeshImpl, IDirect3DRMMesh_iface);
289 static inline IDirect3DRMMeshBuilderImpl *impl_from_IDirect3DRMMeshBuilder2(IDirect3DRMMeshBuilder2 *iface)
291 return CONTAINING_RECORD(iface, IDirect3DRMMeshBuilderImpl, IDirect3DRMMeshBuilder2_iface);
294 static inline IDirect3DRMMeshBuilderImpl *impl_from_IDirect3DRMMeshBuilder3(IDirect3DRMMeshBuilder3 *iface)
296 return CONTAINING_RECORD(iface, IDirect3DRMMeshBuilderImpl, IDirect3DRMMeshBuilder3_iface);
299 /*** IUnknown methods ***/
300 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_QueryInterface(IDirect3DRMMeshBuilder2* iface,
301 REFIID riid, void** ppvObject)
303 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
305 TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject);
309 if(IsEqualGUID(riid, &IID_IUnknown) ||
310 IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder) ||
311 IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder2))
313 *ppvObject = &This->IDirect3DRMMeshBuilder2_iface;
315 else if(IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
317 *ppvObject = &This->IDirect3DRMMeshBuilder3_iface;
321 FIXME("interface %s not implemented\n", debugstr_guid(riid));
322 return E_NOINTERFACE;
325 IDirect3DRMMeshBuilder_AddRef(iface);
329 static ULONG WINAPI IDirect3DRMMeshBuilder2Impl_AddRef(IDirect3DRMMeshBuilder2* iface)
331 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
332 ULONG ref = InterlockedIncrement(&This->ref);
334 TRACE("(%p)->(): new ref = %d\n", This, ref);
339 static ULONG WINAPI IDirect3DRMMeshBuilder2Impl_Release(IDirect3DRMMeshBuilder2* iface)
341 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
342 ULONG ref = InterlockedDecrement(&This->ref);
344 TRACE("(%p)->(): new ref = %d\n", This, ref);
348 HeapFree(GetProcessHeap(), 0, This->name);
349 HeapFree(GetProcessHeap(), 0, This->pVertices);
350 HeapFree(GetProcessHeap(), 0, This->pNormals);
351 HeapFree(GetProcessHeap(), 0, This->pFaceData);
352 HeapFree(GetProcessHeap(), 0, This->pCoords2d);
353 HeapFree(GetProcessHeap(), 0, This);
359 /*** IDirect3DRMObject methods ***/
360 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Clone(IDirect3DRMMeshBuilder2* iface,
361 LPUNKNOWN pUnkOuter, REFIID riid,
364 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
366 FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
371 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddDestroyCallback(IDirect3DRMMeshBuilder2* iface,
372 D3DRMOBJECTCALLBACK cb,
375 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
377 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
382 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_DeleteDestroyCallback(IDirect3DRMMeshBuilder2* iface,
383 D3DRMOBJECTCALLBACK cb,
386 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
388 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
393 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetAppData(IDirect3DRMMeshBuilder2* iface,
396 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
398 FIXME("(%p)->(%u): stub\n", This, data);
403 static DWORD WINAPI IDirect3DRMMeshBuilder2Impl_GetAppData(IDirect3DRMMeshBuilder2* iface)
405 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
407 FIXME("(%p)->(): stub\n", This);
412 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetName(IDirect3DRMMeshBuilder2* iface,
415 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
417 TRACE("(%p)->(%s)\n", This, debugstr_a(name));
419 return IDirect3DRMMeshBuilder3_SetName(&This->IDirect3DRMMeshBuilder3_iface, name);
422 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetName(IDirect3DRMMeshBuilder2* iface,
423 LPDWORD size, LPSTR name)
425 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
427 TRACE("(%p)->(%p,%p)\n", This, size, name);
429 return IDirect3DRMMeshBuilder3_GetName(&This->IDirect3DRMMeshBuilder3_iface, size, name);
432 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetClassName(IDirect3DRMMeshBuilder2* iface,
433 LPDWORD lpdwSize, LPSTR lpName)
435 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
437 FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
442 /*** IDirect3DRMMeshBuilder2 methods ***/
443 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Load(IDirect3DRMMeshBuilder2* iface,
444 LPVOID filename, LPVOID name,
445 D3DRMLOADOPTIONS loadflags,
446 D3DRMLOADTEXTURECALLBACK cb, LPVOID arg)
448 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
450 TRACE("(%p)->(%p,%p,%x,%p,%p)\n", This, filename, name, loadflags, cb, arg);
453 FIXME("Texture callback is not yet supported\n");
455 return IDirect3DRMMeshBuilder3_Load(&This->IDirect3DRMMeshBuilder3_iface, filename, name,
456 loadflags, NULL, arg);
459 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Save(IDirect3DRMMeshBuilder2* iface,
460 const char *filename, D3DRMXOFFORMAT format,
461 D3DRMSAVEOPTIONS save)
463 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
465 FIXME("(%p)->(%s,%d,%d): stub\n", This, filename, format, save);
470 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Scale(IDirect3DRMMeshBuilder2* iface,
471 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
473 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
475 FIXME("(%p)->(%f,%f,%f): stub\n", This, sx, sy, sz);
480 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Translate(IDirect3DRMMeshBuilder2* iface,
481 D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
483 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
485 FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty, tz);
490 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColorSource(IDirect3DRMMeshBuilder2* iface,
491 D3DRMCOLORSOURCE color)
493 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
495 FIXME("(%p)->(%x): stub\n", This, color);
500 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetBox(IDirect3DRMMeshBuilder2* iface,
503 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
505 FIXME("(%p)->(%p): stub\n", This, pBox);
510 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GenerateNormals(IDirect3DRMMeshBuilder2* iface)
512 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
514 FIXME("(%p)->(): stub\n", This);
519 static D3DRMCOLORSOURCE WINAPI IDirect3DRMMeshBuilder2Impl_GetColorSource(IDirect3DRMMeshBuilder2* iface)
521 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
523 FIXME("(%p)->(): stub\n", This);
528 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddMesh(IDirect3DRMMeshBuilder2* iface,
529 LPDIRECT3DRMMESH pMesh)
531 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
533 FIXME("(%p)->(%p): stub\n", This, pMesh);
538 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddMeshBuilder(IDirect3DRMMeshBuilder2* iface,
539 LPDIRECT3DRMMESHBUILDER pMeshBuilder)
541 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
543 FIXME("(%p)->(%p): stub\n", This, pMeshBuilder);
548 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFrame(IDirect3DRMMeshBuilder2* iface,
549 LPDIRECT3DRMFRAME pFrame)
551 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
553 FIXME("(%p)->(%p): stub\n", This, pFrame);
558 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFace(IDirect3DRMMeshBuilder2* iface,
559 LPDIRECT3DRMFACE pFace)
561 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
563 FIXME("(%p)->(%p): stub\n", This, pFace);
568 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFaces(IDirect3DRMMeshBuilder2* iface,
569 DWORD vcount, D3DVECTOR *vertices,
570 DWORD ncount, D3DVECTOR *normals,
572 LPDIRECT3DRMFACEARRAY* pFaceArray)
574 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
576 FIXME("(%p)->(%d,%p,%d,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals, data, pFaceArray);
581 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_ReserveSpace(IDirect3DRMMeshBuilder2* iface,
586 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
588 FIXME("(%p)->(%d,%d,%d): stub\n", This, vertex_Count, normal_count, face_count);
593 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColorRGB(IDirect3DRMMeshBuilder2* iface,
594 D3DVALUE red, D3DVALUE green,
597 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
599 FIXME("(%p)->(%f,%f,%f): stub\n", This, red, green, blue);
604 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColor(IDirect3DRMMeshBuilder2* iface,
607 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
609 FIXME("(%p)->(%x): stub\n", This, color);
614 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTexture(IDirect3DRMMeshBuilder2* iface,
615 LPDIRECT3DRMTEXTURE pTexture)
617 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
619 FIXME("(%p)->(%p): stub\n", This, pTexture);
624 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetMaterial(IDirect3DRMMeshBuilder2* iface,
625 LPDIRECT3DRMMATERIAL pMaterial)
627 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
629 FIXME("(%p)->(%p): stub\n", This, pMaterial);
634 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTextureTopology(IDirect3DRMMeshBuilder2* iface,
635 BOOL wrap_u, BOOL wrap_v)
637 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
639 FIXME("(%p)->(%d,%d): stub\n", This, wrap_u, wrap_v);
644 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetQuality(IDirect3DRMMeshBuilder2* iface,
645 D3DRMRENDERQUALITY quality)
647 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
649 FIXME("(%p)->(%d): stub\n", This, quality);
654 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetPerspective(IDirect3DRMMeshBuilder2* iface,
657 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
659 FIXME("(%p)->(%d): stub\n", This, enable);
664 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertex(IDirect3DRMMeshBuilder2* iface,
666 D3DVALUE x, D3DVALUE y, D3DVALUE z)
668 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
670 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
675 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetNormal(IDirect3DRMMeshBuilder2* iface,
677 D3DVALUE x, D3DVALUE y, D3DVALUE z)
679 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
681 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
686 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTextureCoordinates(IDirect3DRMMeshBuilder2* iface,
688 D3DVALUE u, D3DVALUE v)
690 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
692 TRACE("(%p)->(%u,%f,%f)\n", This, index, u, v);
694 return IDirect3DRMMeshBuilder3_SetTextureCoordinates(&This->IDirect3DRMMeshBuilder3_iface,
698 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertexColor(IDirect3DRMMeshBuilder2* iface,
699 DWORD index, D3DCOLOR color)
701 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
703 FIXME("(%p)->(%d,%x): stub\n", This, index, color);
708 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertexColorRGB(IDirect3DRMMeshBuilder2* iface,
709 DWORD index, D3DVALUE red,
710 D3DVALUE green, D3DVALUE blue)
712 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
714 FIXME("(%p)->(%d,%f,%f,%f): stub\n", This, index, red, green, blue);
719 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetFaces(IDirect3DRMMeshBuilder2* iface,
720 LPDIRECT3DRMFACEARRAY* pFaceArray)
722 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
724 FIXME("(%p)->(%p): stub\n", This, pFaceArray);
729 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetVertices(IDirect3DRMMeshBuilder2* iface,
730 DWORD *vcount, D3DVECTOR *vertices,
731 DWORD *ncount, D3DVECTOR *normals,
732 DWORD *face_data_size,
735 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
737 TRACE("(%p)->(%p,%p,%p,%p,%p,%p)\n", This, vcount, vertices, ncount, normals, face_data_size, face_data);
740 *vcount = This->nb_vertices;
741 if (vertices && This->nb_vertices)
742 memcpy(vertices, This->pVertices, This->nb_vertices * sizeof(D3DVECTOR));
744 *ncount = This->nb_normals;
745 if (normals && This->nb_normals)
746 memcpy(normals, This->pNormals, This->nb_normals * sizeof(D3DVECTOR));
748 *face_data_size = This->face_data_size;
749 if (face_data && This->face_data_size)
750 memcpy(face_data, This->pFaceData, This->face_data_size * sizeof(DWORD));
755 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetTextureCoordinates(IDirect3DRMMeshBuilder2* iface,
757 D3DVALUE *u, D3DVALUE *v)
759 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
761 TRACE("(%p)->(%u,%p,%p)\n", This, index, u, v);
763 return IDirect3DRMMeshBuilder3_GetTextureCoordinates(&This->IDirect3DRMMeshBuilder3_iface,
767 static int WINAPI IDirect3DRMMeshBuilder2Impl_AddVertex(IDirect3DRMMeshBuilder2* iface,
768 D3DVALUE x, D3DVALUE y, D3DVALUE z)
770 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
772 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
777 static int WINAPI IDirect3DRMMeshBuilder2Impl_AddNormal(IDirect3DRMMeshBuilder2* iface,
778 D3DVALUE x, D3DVALUE y, D3DVALUE z)
780 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
782 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
787 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_CreateFace(IDirect3DRMMeshBuilder2* iface,
788 LPDIRECT3DRMFACE* ppFace)
790 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
792 FIXME("(%p)->(%p): stub\n", This, ppFace);
797 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshBuilder2Impl_GetQuality(IDirect3DRMMeshBuilder2* iface)
799 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
801 FIXME("(%p)->(): stub\n", This);
806 static BOOL WINAPI IDirect3DRMMeshBuilder2Impl_GetPerspective(IDirect3DRMMeshBuilder2* iface)
808 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
810 FIXME("(%p)->(): stub\n", This);
815 static int WINAPI IDirect3DRMMeshBuilder2Impl_GetFaceCount(IDirect3DRMMeshBuilder2* iface)
817 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
819 TRACE("(%p)->()\n", This);
821 return This->nb_faces;
824 static int WINAPI IDirect3DRMMeshBuilder2Impl_GetVertexCount(IDirect3DRMMeshBuilder2* iface)
826 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
828 TRACE("(%p)->()\n", This);
830 return This->nb_vertices;
833 static D3DCOLOR WINAPI IDirect3DRMMeshBuilder2Impl_GetVertexColor(IDirect3DRMMeshBuilder2* iface,
836 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
838 FIXME("(%p)->(%d): stub\n", This, index);
843 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_CreateMesh(IDirect3DRMMeshBuilder2* iface,
844 LPDIRECT3DRMMESH* ppMesh)
846 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
848 TRACE("(%p)->(%p)\n", This, ppMesh);
850 return Direct3DRMMesh_create(ppMesh);
853 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GenerateNormals2(IDirect3DRMMeshBuilder2* iface,
854 D3DVALUE crease, DWORD dwFlags)
856 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
858 FIXME("(%p)->(%f,%u): stub\n", This, crease, dwFlags);
863 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetFace(IDirect3DRMMeshBuilder2* iface,
864 DWORD index, LPDIRECT3DRMFACE* ppFace)
866 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
868 FIXME("(%p)->(%u,%p): stub\n", This, index, ppFace);
873 static const struct IDirect3DRMMeshBuilder2Vtbl Direct3DRMMeshBuilder2_Vtbl =
875 /*** IUnknown methods ***/
876 IDirect3DRMMeshBuilder2Impl_QueryInterface,
877 IDirect3DRMMeshBuilder2Impl_AddRef,
878 IDirect3DRMMeshBuilder2Impl_Release,
879 /*** IDirect3DRMObject methods ***/
880 IDirect3DRMMeshBuilder2Impl_Clone,
881 IDirect3DRMMeshBuilder2Impl_AddDestroyCallback,
882 IDirect3DRMMeshBuilder2Impl_DeleteDestroyCallback,
883 IDirect3DRMMeshBuilder2Impl_SetAppData,
884 IDirect3DRMMeshBuilder2Impl_GetAppData,
885 IDirect3DRMMeshBuilder2Impl_SetName,
886 IDirect3DRMMeshBuilder2Impl_GetName,
887 IDirect3DRMMeshBuilder2Impl_GetClassName,
888 /*** IDirect3DRMMeshBuilder methods ***/
889 IDirect3DRMMeshBuilder2Impl_Load,
890 IDirect3DRMMeshBuilder2Impl_Save,
891 IDirect3DRMMeshBuilder2Impl_Scale,
892 IDirect3DRMMeshBuilder2Impl_Translate,
893 IDirect3DRMMeshBuilder2Impl_SetColorSource,
894 IDirect3DRMMeshBuilder2Impl_GetBox,
895 IDirect3DRMMeshBuilder2Impl_GenerateNormals,
896 IDirect3DRMMeshBuilder2Impl_GetColorSource,
897 IDirect3DRMMeshBuilder2Impl_AddMesh,
898 IDirect3DRMMeshBuilder2Impl_AddMeshBuilder,
899 IDirect3DRMMeshBuilder2Impl_AddFrame,
900 IDirect3DRMMeshBuilder2Impl_AddFace,
901 IDirect3DRMMeshBuilder2Impl_AddFaces,
902 IDirect3DRMMeshBuilder2Impl_ReserveSpace,
903 IDirect3DRMMeshBuilder2Impl_SetColorRGB,
904 IDirect3DRMMeshBuilder2Impl_SetColor,
905 IDirect3DRMMeshBuilder2Impl_SetTexture,
906 IDirect3DRMMeshBuilder2Impl_SetMaterial,
907 IDirect3DRMMeshBuilder2Impl_SetTextureTopology,
908 IDirect3DRMMeshBuilder2Impl_SetQuality,
909 IDirect3DRMMeshBuilder2Impl_SetPerspective,
910 IDirect3DRMMeshBuilder2Impl_SetVertex,
911 IDirect3DRMMeshBuilder2Impl_SetNormal,
912 IDirect3DRMMeshBuilder2Impl_SetTextureCoordinates,
913 IDirect3DRMMeshBuilder2Impl_SetVertexColor,
914 IDirect3DRMMeshBuilder2Impl_SetVertexColorRGB,
915 IDirect3DRMMeshBuilder2Impl_GetFaces,
916 IDirect3DRMMeshBuilder2Impl_GetVertices,
917 IDirect3DRMMeshBuilder2Impl_GetTextureCoordinates,
918 IDirect3DRMMeshBuilder2Impl_AddVertex,
919 IDirect3DRMMeshBuilder2Impl_AddNormal,
920 IDirect3DRMMeshBuilder2Impl_CreateFace,
921 IDirect3DRMMeshBuilder2Impl_GetQuality,
922 IDirect3DRMMeshBuilder2Impl_GetPerspective,
923 IDirect3DRMMeshBuilder2Impl_GetFaceCount,
924 IDirect3DRMMeshBuilder2Impl_GetVertexCount,
925 IDirect3DRMMeshBuilder2Impl_GetVertexColor,
926 IDirect3DRMMeshBuilder2Impl_CreateMesh,
927 /*** IDirect3DRMMeshBuilder2 methods ***/
928 IDirect3DRMMeshBuilder2Impl_GenerateNormals2,
929 IDirect3DRMMeshBuilder2Impl_GetFace
933 /*** IUnknown methods ***/
934 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_QueryInterface(IDirect3DRMMeshBuilder3* iface,
935 REFIID riid, void** ppvObject)
937 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
938 return IDirect3DRMMeshBuilder2_QueryInterface(&This->IDirect3DRMMeshBuilder2_iface, riid, ppvObject);
941 static ULONG WINAPI IDirect3DRMMeshBuilder3Impl_AddRef(IDirect3DRMMeshBuilder3* iface)
943 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
944 return IDirect3DRMMeshBuilder2_AddRef(&This->IDirect3DRMMeshBuilder2_iface);
947 static ULONG WINAPI IDirect3DRMMeshBuilder3Impl_Release(IDirect3DRMMeshBuilder3* iface)
949 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
950 return IDirect3DRMMeshBuilder2_Release(&This->IDirect3DRMMeshBuilder2_iface);
953 /*** IDirect3DRMObject methods ***/
954 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Clone(IDirect3DRMMeshBuilder3* iface,
955 LPUNKNOWN pUnkOuter, REFIID riid,
958 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
960 FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
965 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddDestroyCallback(IDirect3DRMMeshBuilder3* iface,
966 D3DRMOBJECTCALLBACK cb,
969 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
971 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
976 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteDestroyCallback(IDirect3DRMMeshBuilder3* iface,
977 D3DRMOBJECTCALLBACK cb,
980 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
982 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
987 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetAppData(IDirect3DRMMeshBuilder3* iface,
990 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
992 FIXME("(%p)->(%u): stub\n", This, data);
997 static DWORD WINAPI IDirect3DRMMeshBuilder3Impl_GetAppData(IDirect3DRMMeshBuilder3* iface)
999 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1001 FIXME("(%p)->(): stub\n", This);
1006 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetName(IDirect3DRMMeshBuilder3* iface,
1009 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1010 char *string = NULL;
1012 TRACE("(%p)->(%s)\n", This, debugstr_a(name));
1016 string = HeapAlloc(GetProcessHeap(), 0, strlen(name) + 1);
1017 if (!string) return E_OUTOFMEMORY;
1018 strcpy(string, name);
1020 HeapFree(GetProcessHeap(), 0, This->name);
1021 This->name = string;
1026 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetName(IDirect3DRMMeshBuilder3* iface,
1027 LPDWORD size, LPSTR name)
1029 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1031 TRACE("(%p)->(%p,%p)\n", This, size, name);
1042 if (*size < (strlen(This->name) + 1))
1043 return E_INVALIDARG;
1045 strcpy(name, This->name);
1046 *size = strlen(This->name) + 1;
1051 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetClassName(IDirect3DRMMeshBuilder3* iface,
1052 LPDWORD lpdwSize, LPSTR lpName)
1054 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1056 FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
1061 HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, LPDIRECTXFILEDATA pData)
1063 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1064 LPDIRECTXFILEOBJECT pObject = NULL;
1065 LPDIRECTXFILEDATA pData2 = NULL;
1070 HRESULT ret = D3DRMERR_BADOBJECT;
1071 DWORD* faces_vertex_idx_data = NULL;
1072 DWORD* faces_vertex_idx_ptr;
1073 DWORD faces_vertex_idx_size;
1074 DWORD* faces_normal_idx_data = NULL;
1075 DWORD* faces_normal_idx_ptr = NULL;
1076 DWORD* faces_data_ptr;
1077 DWORD faces_data_size = 0;
1080 TRACE("(%p)->(%p)\n", This, pData);
1082 /* Remove previous name */
1083 HeapFree(GetProcessHeap(), 0, This->name);
1085 hr = IDirectXFileData_GetName(pData, NULL, &size);
1086 if (hr != DXFILE_OK)
1090 This->name = HeapAlloc(GetProcessHeap(), 0, size);
1092 return E_OUTOFMEMORY;
1094 hr = IDirectXFileData_GetName(pData, This->name, &size);
1095 if (hr != DXFILE_OK)
1097 HeapFree(GetProcessHeap(), 0, This->name);
1103 TRACE("Mesh name is '%s'\n", This->name ? This->name : "");
1105 hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
1106 if (hr != DXFILE_OK)
1109 This->nb_vertices = *(DWORD*)ptr;
1110 This->nb_faces = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR));
1111 faces_vertex_idx_size = size - sizeof(DWORD) - This->nb_vertices * sizeof(D3DVECTOR) - sizeof(DWORD);
1112 faces_vertex_idx_ptr = (DWORD*)(ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD));
1114 TRACE("Mesh: nb_vertices = %d, nb_faces = %d, faces_vertex_idx_size = %d\n", This->nb_vertices, This->nb_faces, faces_vertex_idx_size);
1116 This->pVertices = HeapAlloc(GetProcessHeap(), 0, This->nb_vertices * sizeof(D3DVECTOR));
1117 memcpy(This->pVertices, ptr + sizeof(DWORD), This->nb_vertices * sizeof(D3DVECTOR));
1119 faces_vertex_idx_ptr = faces_vertex_idx_data = HeapAlloc(GetProcessHeap(), 0, faces_vertex_idx_size);
1120 memcpy(faces_vertex_idx_data, ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD), faces_vertex_idx_size);
1122 /* Each vertex index will have its normal index counterpart so just allocate twice the size */
1123 This->pFaceData = HeapAlloc(GetProcessHeap(), 0, faces_vertex_idx_size*2);
1124 faces_data_ptr = (DWORD*)This->pFaceData;
1128 hr = IDirectXFileData_GetNextObject(pData, &pObject);
1129 if (hr == DXFILEERR_NOMOREOBJECTS)
1131 TRACE("No more object\n");
1134 if (hr != DXFILE_OK)
1137 hr = IDirectXFileObject_QueryInterface(pObject, &IID_IDirectXFileData, (void**)&pData2);
1138 IDirectXFileObject_Release(pObject);
1139 if (hr != DXFILE_OK)
1142 hr = IDirectXFileData_GetType(pData2, &pGuid);
1143 if (hr != DXFILE_OK)
1146 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1148 if (IsEqualGUID(pGuid, &TID_D3DRMMeshNormals))
1150 DWORD nb_faces_normals;
1151 DWORD faces_normal_idx_size;
1153 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1154 if (hr != DXFILE_OK)
1157 This->nb_normals = *(DWORD*)ptr;
1158 nb_faces_normals = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR));
1160 TRACE("MeshNormals: nb_normals = %d, nb_faces_normals = %d\n", This->nb_normals, nb_faces_normals);
1161 if (nb_faces_normals != This->nb_faces)
1162 WARN("nb_face_normals (%d) != nb_faces (%d)\n", nb_faces_normals, This->nb_normals);
1164 This->pNormals = HeapAlloc(GetProcessHeap(), 0, This->nb_normals * sizeof(D3DVECTOR));
1165 memcpy(This->pNormals, ptr + sizeof(DWORD), This->nb_normals * sizeof(D3DVECTOR));
1167 faces_normal_idx_size = size - (2*sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR));
1168 faces_normal_idx_ptr = faces_normal_idx_data = HeapAlloc(GetProcessHeap(), 0, faces_normal_idx_size);
1169 memcpy(faces_normal_idx_data, ptr + sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR) + sizeof(DWORD), faces_normal_idx_size);
1171 else if (IsEqualGUID(pGuid, &TID_D3DRMMeshTextureCoords))
1173 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1174 if (hr != DXFILE_OK)
1177 This->nb_coords2d = *(DWORD*)ptr;
1179 TRACE("MeshTextureCoords: nb_coords2d = %d\n", This->nb_coords2d);
1181 This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d));
1182 memcpy(This->pCoords2d, ptr + sizeof(DWORD), This->nb_coords2d * sizeof(Coords2d));
1185 else if (IsEqualGUID(pGuid, &TID_D3DRMMeshMaterialList))
1187 FIXME("MeshMaterialList not supported yet, ignoring...\n");
1191 FIXME("Unknown GUID %s, ignoring...\n", debugstr_guid(pGuid));
1194 IDirectXFileData_Release(pData2);
1198 for (i = 0; i < This->nb_faces; i++)
1201 DWORD nb_face_indexes;
1203 if (faces_vertex_idx_size < sizeof(DWORD))
1204 WARN("Not enough data to read number of indices of face %d\n", i);
1206 nb_face_indexes = *(faces_data_ptr + faces_data_size++) = *(faces_vertex_idx_ptr++);
1207 faces_vertex_idx_size--;
1208 if (faces_normal_idx_data && (*(faces_normal_idx_ptr++) != nb_face_indexes))
1209 WARN("Faces indices number mismatch\n");
1211 if (faces_vertex_idx_size < (nb_face_indexes * sizeof(DWORD)))
1212 WARN("Not enough data to read all indices of face %d\n", i);
1214 for (j = 0; j < nb_face_indexes; j++)
1216 /* Copy vertex index */
1217 *(faces_data_ptr + faces_data_size++) = *(faces_vertex_idx_ptr++);
1218 /* Copy normal index */
1219 if (faces_normal_idx_data)
1221 /* Read from x file */
1222 *(faces_data_ptr + faces_data_size++) = *(faces_normal_idx_ptr++);
1226 FIXME("No normal available, generate a fake normal index\n");
1227 /* Must be generated, put 0 for now */
1228 *(faces_data_ptr + faces_data_size++) = 0;
1231 faces_vertex_idx_size -= nb_face_indexes;
1234 /* Last DWORD must be 0 */
1235 *(faces_data_ptr + faces_data_size++) = 0;
1237 /* Set size (in number of DWORD) of all faces data */
1238 This->face_data_size = faces_data_size;
1240 /* If there is no texture coordinates, generate default texture coordinates (0.0f, 0.0f) for each vertex */
1241 if (!This->pCoords2d)
1243 This->nb_coords2d = This->nb_vertices;
1244 This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d));
1245 for (i = 0; i < This->nb_coords2d; i++)
1247 This->pCoords2d[i].u = 0.0f;
1248 This->pCoords2d[i].v = 0.0f;
1252 TRACE("Mesh data loaded successfully\n");
1258 HeapFree(GetProcessHeap(), 0, faces_normal_idx_data);
1259 HeapFree(GetProcessHeap(), 0, faces_vertex_idx_data);
1264 /*** IDirect3DRMMeshBuilder3 methods ***/
1265 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* iface,
1266 LPVOID filename, LPVOID name,
1267 D3DRMLOADOPTIONS loadflags,
1268 D3DRMLOADTEXTURE3CALLBACK cb, LPVOID arg)
1270 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1271 DXFILELOADOPTIONS load_options;
1272 LPDIRECTXFILE pDXFile = NULL;
1273 LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
1274 LPDIRECTXFILEDATA pData = NULL;
1275 LPDIRECTXFILEDATA pData2 = NULL;
1280 HRESULT ret = D3DRMERR_BADOBJECT;
1282 TRACE("(%p)->(%p,%p,%x,%p,%p)\n", This, filename, name, loadflags, cb, arg);
1284 /* First free allocated buffers of previous mesh data */
1285 HeapFree(GetProcessHeap(), 0, This->pVertices);
1286 This->pVertices = NULL;
1287 HeapFree(GetProcessHeap(), 0, This->pNormals);
1288 This->pNormals = NULL;
1289 HeapFree(GetProcessHeap(), 0, This->pFaceData);
1290 This->pFaceData = NULL;
1291 HeapFree(GetProcessHeap(), 0, This->pCoords2d);
1292 This->pCoords2d = NULL;
1294 if (loadflags == D3DRMLOAD_FROMMEMORY)
1296 load_options = DXFILELOAD_FROMMEMORY;
1300 FIXME("Load options %d not supported yet\n", loadflags);
1304 hr = DirectXFileCreate(&pDXFile);
1305 if (hr != DXFILE_OK)
1308 hr = IDirectXFile_RegisterTemplates(pDXFile, templates, strlen(templates));
1309 if (hr != DXFILE_OK)
1312 hr = IDirectXFile_CreateEnumObject(pDXFile, filename, load_options, &pEnumObject);
1313 if (hr != DXFILE_OK)
1316 hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
1317 if (hr != DXFILE_OK)
1320 hr = IDirectXFileData_GetType(pData, &pGuid);
1321 if (hr != DXFILE_OK)
1324 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1326 if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
1328 ret = D3DRMERR_BADFILE;
1332 hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader);
1333 if ((hr != DXFILE_OK) || (size != sizeof(Header)))
1336 TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags);
1338 /* Version must be 1.0.x */
1339 if ((pHeader->major != 1) || (pHeader->minor != 0))
1341 ret = D3DRMERR_BADFILE;
1345 IDirectXFileData_Release(pData);
1348 hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
1349 if (hr != DXFILE_OK)
1351 ret = D3DRMERR_NOTFOUND;
1355 hr = IDirectXFileData_GetType(pData, &pGuid);
1356 if (hr != DXFILE_OK)
1359 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1361 if (!IsEqualGUID(pGuid, &TID_D3DRMMesh))
1363 ret = D3DRMERR_NOTFOUND;
1367 hr = load_mesh_data(iface, pData);
1374 IDirectXFileData_Release(pData2);
1376 IDirectXFileData_Release(pData);
1378 IDirectXFileEnumObject_Release(pEnumObject);
1380 IDirectXFile_Release(pDXFile);
1382 if (ret != D3DRM_OK)
1384 /* Clean mesh data */
1385 This->nb_vertices = 0;
1386 This->nb_normals = 0;
1388 This->face_data_size = 0;
1389 This->nb_coords2d = 0;
1390 HeapFree(GetProcessHeap(), 0, This->pVertices);
1391 This->pVertices = NULL;
1392 HeapFree(GetProcessHeap(), 0, This->pNormals);
1393 This->pNormals = NULL;
1394 HeapFree(GetProcessHeap(), 0, This->pFaceData);
1395 This->pFaceData = NULL;
1396 HeapFree(GetProcessHeap(), 0, This->pCoords2d);
1397 This->pCoords2d = NULL;
1403 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Save(IDirect3DRMMeshBuilder3* iface,
1404 const char* filename, D3DRMXOFFORMAT format,
1405 D3DRMSAVEOPTIONS save)
1407 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1409 FIXME("(%p)->(%s,%d,%d): stub\n", This, filename, format, save);
1414 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Scale(IDirect3DRMMeshBuilder3* iface,
1415 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
1417 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1419 FIXME("(%p)->(%f,%f,%f): stub\n", This, sx, sy, sz);
1424 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Translate(IDirect3DRMMeshBuilder3* iface,
1425 D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
1427 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1429 FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty, tz);
1434 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColorSource(IDirect3DRMMeshBuilder3* iface,
1435 D3DRMCOLORSOURCE color)
1437 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1439 FIXME("(%p)->(%x): stub\n", This, color);
1444 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetBox(IDirect3DRMMeshBuilder3* iface,
1447 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1449 FIXME("(%p)->(%p): stub\n", This, box);
1454 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GenerateNormals(IDirect3DRMMeshBuilder3* iface,
1455 D3DVALUE crease, DWORD flags)
1457 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1459 FIXME("(%p)->(%f,%u): stub\n", This, crease, flags);
1464 static D3DRMCOLORSOURCE WINAPI IDirect3DRMMeshBuilder3Impl_GetColorSource(IDirect3DRMMeshBuilder3* iface)
1466 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1468 FIXME("(%p)->(): stub\n", This);
1473 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddMesh(IDirect3DRMMeshBuilder3* iface,
1474 LPDIRECT3DRMMESH Mesh)
1476 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1478 FIXME("(%p)->(%p): stub\n", This, Mesh);
1483 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddMeshBuilder(IDirect3DRMMeshBuilder3* iface,
1484 LPDIRECT3DRMMESHBUILDER3 MeshBuilder,
1487 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1489 FIXME("(%p)->(%p,%u): stub\n", This, MeshBuilder, flags);
1494 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFrame(IDirect3DRMMeshBuilder3* iface,
1495 LPDIRECT3DRMFRAME3 Frame)
1497 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1499 FIXME("(%p)->(%p): stub\n", This, Frame);
1504 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFace(IDirect3DRMMeshBuilder3* iface,
1505 LPDIRECT3DRMFACE2 Face)
1507 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1509 FIXME("(%p)->(%p): stub\n", This, Face);
1514 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFaces(IDirect3DRMMeshBuilder3* iface,
1515 DWORD vcount, D3DVECTOR* vertices,
1516 DWORD ncount, D3DVECTOR* normals,
1518 LPDIRECT3DRMFACEARRAY* FaceArray)
1520 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1522 FIXME("(%p)->(%d,%p,%d,%p,%p,%p): stub\n", This, vcount, vertices, ncount,
1523 normals, data, FaceArray);
1528 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_ReserveSpace(IDirect3DRMMeshBuilder3* iface,
1533 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1535 FIXME("(%p)->(%d,%d,%d): stub\n", This, vertex_Count, normal_count, face_count);
1540 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColorRGB(IDirect3DRMMeshBuilder3* iface,
1541 D3DVALUE red, D3DVALUE green,
1544 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1546 FIXME("(%p)->(%f,%f,%f): stub\n", This, red, green, blue);
1551 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColor(IDirect3DRMMeshBuilder3* iface,
1554 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1556 FIXME("(%p)->(%x): stub\n", This, color);
1561 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTexture(IDirect3DRMMeshBuilder3* iface,
1562 LPDIRECT3DRMTEXTURE3 texture)
1564 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1566 FIXME("(%p)->(%p): stub\n", This, texture);
1571 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetMaterial(IDirect3DRMMeshBuilder3* iface,
1572 LPDIRECT3DRMMATERIAL2 material)
1574 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1576 FIXME("(%p)->(%p): stub\n", This, material);
1581 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTextureTopology(IDirect3DRMMeshBuilder3* iface,
1582 BOOL wrap_u, BOOL wrap_v)
1584 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1586 FIXME("(%p)->(%d,%d): stub\n", This, wrap_u, wrap_v);
1591 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetQuality(IDirect3DRMMeshBuilder3* iface,
1592 D3DRMRENDERQUALITY quality)
1594 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1596 FIXME("(%p)->(%d): stub\n", This, quality);
1601 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetPerspective(IDirect3DRMMeshBuilder3* iface,
1604 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1606 FIXME("(%p)->(%d): stub\n", This, enable);
1611 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertex(IDirect3DRMMeshBuilder3* iface,
1613 D3DVALUE x, D3DVALUE y, D3DVALUE z)
1615 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1617 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1622 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetNormal(IDirect3DRMMeshBuilder3* iface,
1624 D3DVALUE x, D3DVALUE y, D3DVALUE z)
1626 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1628 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1633 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTextureCoordinates(IDirect3DRMMeshBuilder3* iface,
1634 DWORD index, D3DVALUE u,
1637 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1639 TRACE("(%p)->(%u,%f,%f)\n", This, index, u, v);
1641 if (index >= This->nb_coords2d)
1642 return D3DRMERR_BADVALUE;
1644 This->pCoords2d[index].u = u;
1645 This->pCoords2d[index].v = v;
1650 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertexColor(IDirect3DRMMeshBuilder3* iface,
1651 DWORD index, D3DCOLOR color)
1653 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1655 FIXME("(%p)->(%d,%x): stub\n", This, index, color);
1660 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertexColorRGB(IDirect3DRMMeshBuilder3* iface,
1662 D3DVALUE red, D3DVALUE green,
1665 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1667 FIXME("(%p)->(%d,%f,%f,%f): stub\n", This, index, red, green, blue);
1672 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetFaces(IDirect3DRMMeshBuilder3* iface,
1673 LPDIRECT3DRMFACEARRAY* FaceArray)
1675 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1677 FIXME("(%p)->(%p): stub\n", This, FaceArray);
1682 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetGeometry(IDirect3DRMMeshBuilder3* iface,
1683 DWORD* vcount, D3DVECTOR* vertices,
1684 DWORD* ncount, D3DVECTOR* normals,
1685 DWORD* face_data_size,
1688 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1690 FIXME("(%p)->(%p,%p,%p,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals,
1691 face_data_size, face_data);
1696 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetTextureCoordinates(IDirect3DRMMeshBuilder3* iface,
1697 DWORD index, D3DVALUE* u,
1700 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1702 TRACE("(%p)->(%d,%p,%p)\n", This, index, u, v);
1704 if (index >= This->nb_coords2d)
1705 return D3DRMERR_BADVALUE;
1707 *u = This->pCoords2d[index].u;
1708 *v = This->pCoords2d[index].v;
1714 static int WINAPI IDirect3DRMMeshBuilder3Impl_AddVertex(IDirect3DRMMeshBuilder3* iface,
1715 D3DVALUE x, D3DVALUE y, D3DVALUE z)
1717 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1719 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1724 static int WINAPI IDirect3DRMMeshBuilder3Impl_AddNormal(IDirect3DRMMeshBuilder3* iface,
1725 D3DVALUE x, D3DVALUE y, D3DVALUE z)
1727 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1729 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1734 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateFace(IDirect3DRMMeshBuilder3* iface,
1735 LPDIRECT3DRMFACE2* Face)
1737 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1739 FIXME("(%p)->(%p): stub\n", This, Face);
1744 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshBuilder3Impl_GetQuality(IDirect3DRMMeshBuilder3* iface)
1746 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1748 FIXME("(%p)->(): stub\n", This);
1753 static BOOL WINAPI IDirect3DRMMeshBuilder3Impl_GetPerspective(IDirect3DRMMeshBuilder3* iface)
1755 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1757 FIXME("(%p)->(): stub\n", This);
1762 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetFaceCount(IDirect3DRMMeshBuilder3* iface)
1764 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1766 TRACE("(%p)->()\n", This);
1768 return This->nb_faces;
1771 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetVertexCount(IDirect3DRMMeshBuilder3* iface)
1773 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1775 TRACE("(%p)->()\n", This);
1777 return This->nb_vertices;
1780 static D3DCOLOR WINAPI IDirect3DRMMeshBuilder3Impl_GetVertexColor(IDirect3DRMMeshBuilder3* iface,
1783 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1785 FIXME("(%p)->(%d): stub\n", This, index);
1790 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateMesh(IDirect3DRMMeshBuilder3* iface,
1791 LPDIRECT3DRMMESH* Mesh)
1793 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1795 TRACE("(%p)->(%p)\n", This, Mesh);
1797 return Direct3DRMMesh_create(Mesh);
1800 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetFace(IDirect3DRMMeshBuilder3* iface,
1801 DWORD index, LPDIRECT3DRMFACE2* Face)
1803 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1805 FIXME("(%p)->(%u,%p): stub\n", This, index, Face);
1810 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetVertex(IDirect3DRMMeshBuilder3* iface,
1811 DWORD index, LPD3DVECTOR vector)
1813 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1815 FIXME("(%p)->(%u,%p): stub\n", This, index, vector);
1820 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetNormal(IDirect3DRMMeshBuilder3* iface,
1821 DWORD index, LPD3DVECTOR vector)
1823 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1825 FIXME("(%p)->(%u,%p): stub\n", This, index, vector);
1830 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteVertices(IDirect3DRMMeshBuilder3* iface,
1831 DWORD IndexFirst, DWORD count)
1833 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1835 FIXME("(%p)->(%u,%u): stub\n", This, IndexFirst, count);
1840 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteNormals(IDirect3DRMMeshBuilder3* iface,
1841 DWORD IndexFirst, DWORD count)
1843 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1845 FIXME("(%p)->(%u,%u): stub\n", This, IndexFirst, count);
1850 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteFace(IDirect3DRMMeshBuilder3* iface,
1851 LPDIRECT3DRMFACE2 Face)
1853 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1855 FIXME("(%p)->(%p): stub\n", This, Face);
1860 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Empty(IDirect3DRMMeshBuilder3* iface, DWORD flags)
1862 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1864 FIXME("(%p)->(%u): stub\n", This, flags);
1869 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Optimize(IDirect3DRMMeshBuilder3* iface,
1872 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1874 FIXME("(%p)->(%u): stub\n", This, flags);
1879 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFacesIndexed(IDirect3DRMMeshBuilder3* iface,
1880 DWORD flags, DWORD* indices,
1881 DWORD* IndexFirst, DWORD* count)
1883 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1885 FIXME("(%p)->(%u,%p,%p,%p): stub\n", This, flags, indices, IndexFirst, count);
1890 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateSubMesh(IDirect3DRMMeshBuilder3* iface,
1893 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1895 FIXME("(%p)->(%p): stub\n", This, unkwn);
1900 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetParentMesh(IDirect3DRMMeshBuilder3* iface,
1901 DWORD flags, LPUNKNOWN *unkwn)
1903 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1905 FIXME("(%p)->(%u,%p): stub\n", This, flags, unkwn);
1910 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetSubMeshes(IDirect3DRMMeshBuilder3* iface,
1911 LPDWORD count, LPUNKNOWN *unkwn)
1913 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1915 FIXME("(%p)->(%p,%p): stub\n", This, count, unkwn);
1920 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteSubMesh(IDirect3DRMMeshBuilder3* iface,
1923 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1925 FIXME("(%p)->(%p): stub\n", This, unkwn);
1930 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Enable(IDirect3DRMMeshBuilder3* iface,
1933 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1935 FIXME("(%p)->(%u): stub\n", This, index);
1940 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetEnable(IDirect3DRMMeshBuilder3* iface,
1943 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1945 FIXME("(%p)->(%p): stub\n", This, indices);
1950 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddTriangles(IDirect3DRMMeshBuilder3* iface,
1951 DWORD flags, DWORD format,
1952 DWORD VertexCount, LPVOID data)
1954 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1956 FIXME("(%p)->(%u,%u,%u,%p): stub\n", This, flags, format, VertexCount, data);
1961 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertices(IDirect3DRMMeshBuilder3* iface,
1962 DWORD IndexFirst, DWORD count,
1965 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1967 FIXME("(%p)->(%u,%u,%p): stub\n", This, IndexFirst, count, vector);
1972 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetVertices(IDirect3DRMMeshBuilder3* iface,
1973 DWORD IndexFirst, LPDWORD vcount,
1974 LPD3DVECTOR vertices)
1976 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1977 DWORD count = This->nb_vertices - IndexFirst;
1979 TRACE("(%p)->(%u,%p,%p)\n", This, IndexFirst, vcount, vertices);
1983 if (vertices && This->nb_vertices)
1984 memcpy(vertices, This->pVertices + IndexFirst, count * sizeof(D3DVECTOR));
1989 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetNormals(IDirect3DRMMeshBuilder3* iface,
1990 DWORD IndexFirst, DWORD count,
1993 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1995 FIXME("(%p)->(%u,%u,%p): stub\n", This, IndexFirst, count, vector);
2000 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetNormals(IDirect3DRMMeshBuilder3* iface,
2001 DWORD IndexFirst, LPDWORD count,
2004 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2006 FIXME("(%p)->(%u,%p,%p): stub\n", This, IndexFirst, count, vector);
2011 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetNormalCount(IDirect3DRMMeshBuilder3* iface)
2013 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2015 FIXME("(%p)->(): stub\n", This);
2020 static const struct IDirect3DRMMeshBuilder3Vtbl Direct3DRMMeshBuilder3_Vtbl =
2022 /*** IUnknown methods ***/
2023 IDirect3DRMMeshBuilder3Impl_QueryInterface,
2024 IDirect3DRMMeshBuilder3Impl_AddRef,
2025 IDirect3DRMMeshBuilder3Impl_Release,
2026 /*** IDirect3DRMObject methods ***/
2027 IDirect3DRMMeshBuilder3Impl_Clone,
2028 IDirect3DRMMeshBuilder3Impl_AddDestroyCallback,
2029 IDirect3DRMMeshBuilder3Impl_DeleteDestroyCallback,
2030 IDirect3DRMMeshBuilder3Impl_SetAppData,
2031 IDirect3DRMMeshBuilder3Impl_GetAppData,
2032 IDirect3DRMMeshBuilder3Impl_SetName,
2033 IDirect3DRMMeshBuilder3Impl_GetName,
2034 IDirect3DRMMeshBuilder3Impl_GetClassName,
2035 /*** IDirect3DRMMeshBuilder3 methods ***/
2036 IDirect3DRMMeshBuilder3Impl_Load,
2037 IDirect3DRMMeshBuilder3Impl_Save,
2038 IDirect3DRMMeshBuilder3Impl_Scale,
2039 IDirect3DRMMeshBuilder3Impl_Translate,
2040 IDirect3DRMMeshBuilder3Impl_SetColorSource,
2041 IDirect3DRMMeshBuilder3Impl_GetBox,
2042 IDirect3DRMMeshBuilder3Impl_GenerateNormals,
2043 IDirect3DRMMeshBuilder3Impl_GetColorSource,
2044 IDirect3DRMMeshBuilder3Impl_AddMesh,
2045 IDirect3DRMMeshBuilder3Impl_AddMeshBuilder,
2046 IDirect3DRMMeshBuilder3Impl_AddFrame,
2047 IDirect3DRMMeshBuilder3Impl_AddFace,
2048 IDirect3DRMMeshBuilder3Impl_AddFaces,
2049 IDirect3DRMMeshBuilder3Impl_ReserveSpace,
2050 IDirect3DRMMeshBuilder3Impl_SetColorRGB,
2051 IDirect3DRMMeshBuilder3Impl_SetColor,
2052 IDirect3DRMMeshBuilder3Impl_SetTexture,
2053 IDirect3DRMMeshBuilder3Impl_SetMaterial,
2054 IDirect3DRMMeshBuilder3Impl_SetTextureTopology,
2055 IDirect3DRMMeshBuilder3Impl_SetQuality,
2056 IDirect3DRMMeshBuilder3Impl_SetPerspective,
2057 IDirect3DRMMeshBuilder3Impl_SetVertex,
2058 IDirect3DRMMeshBuilder3Impl_SetNormal,
2059 IDirect3DRMMeshBuilder3Impl_SetTextureCoordinates,
2060 IDirect3DRMMeshBuilder3Impl_SetVertexColor,
2061 IDirect3DRMMeshBuilder3Impl_SetVertexColorRGB,
2062 IDirect3DRMMeshBuilder3Impl_GetFaces,
2063 IDirect3DRMMeshBuilder3Impl_GetGeometry,
2064 IDirect3DRMMeshBuilder3Impl_GetTextureCoordinates,
2065 IDirect3DRMMeshBuilder3Impl_AddVertex,
2066 IDirect3DRMMeshBuilder3Impl_AddNormal,
2067 IDirect3DRMMeshBuilder3Impl_CreateFace,
2068 IDirect3DRMMeshBuilder3Impl_GetQuality,
2069 IDirect3DRMMeshBuilder3Impl_GetPerspective,
2070 IDirect3DRMMeshBuilder3Impl_GetFaceCount,
2071 IDirect3DRMMeshBuilder3Impl_GetVertexCount,
2072 IDirect3DRMMeshBuilder3Impl_GetVertexColor,
2073 IDirect3DRMMeshBuilder3Impl_CreateMesh,
2074 IDirect3DRMMeshBuilder3Impl_GetFace,
2075 IDirect3DRMMeshBuilder3Impl_GetVertex,
2076 IDirect3DRMMeshBuilder3Impl_GetNormal,
2077 IDirect3DRMMeshBuilder3Impl_DeleteVertices,
2078 IDirect3DRMMeshBuilder3Impl_DeleteNormals,
2079 IDirect3DRMMeshBuilder3Impl_DeleteFace,
2080 IDirect3DRMMeshBuilder3Impl_Empty,
2081 IDirect3DRMMeshBuilder3Impl_Optimize,
2082 IDirect3DRMMeshBuilder3Impl_AddFacesIndexed,
2083 IDirect3DRMMeshBuilder3Impl_CreateSubMesh,
2084 IDirect3DRMMeshBuilder3Impl_GetParentMesh,
2085 IDirect3DRMMeshBuilder3Impl_GetSubMeshes,
2086 IDirect3DRMMeshBuilder3Impl_DeleteSubMesh,
2087 IDirect3DRMMeshBuilder3Impl_Enable,
2088 IDirect3DRMMeshBuilder3Impl_GetEnable,
2089 IDirect3DRMMeshBuilder3Impl_AddTriangles,
2090 IDirect3DRMMeshBuilder3Impl_SetVertices,
2091 IDirect3DRMMeshBuilder3Impl_GetVertices,
2092 IDirect3DRMMeshBuilder3Impl_SetNormals,
2093 IDirect3DRMMeshBuilder3Impl_GetNormals,
2094 IDirect3DRMMeshBuilder3Impl_GetNormalCount
2097 HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj)
2099 IDirect3DRMMeshBuilderImpl* object;
2101 TRACE("(%p)\n", ppObj);
2103 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMeshBuilderImpl));
2106 ERR("Out of memory\n");
2107 return E_OUTOFMEMORY;
2110 object->IDirect3DRMMeshBuilder2_iface.lpVtbl = &Direct3DRMMeshBuilder2_Vtbl;
2111 object->IDirect3DRMMeshBuilder3_iface.lpVtbl = &Direct3DRMMeshBuilder3_Vtbl;
2114 if (IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
2115 *ppObj = (IUnknown*)&object->IDirect3DRMMeshBuilder3_iface;
2117 *ppObj = (IUnknown*)&object->IDirect3DRMMeshBuilder2_iface;
2122 /*** IUnknown methods ***/
2123 static HRESULT WINAPI IDirect3DRMMeshImpl_QueryInterface(IDirect3DRMMesh* iface,
2124 REFIID riid, void** ppvObject)
2126 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2128 TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject);
2132 if (IsEqualGUID(riid, &IID_IUnknown) ||
2133 IsEqualGUID(riid, &IID_IDirect3DRMMesh))
2135 *ppvObject = &This->IDirect3DRMMesh_iface;
2139 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2140 return E_NOINTERFACE;
2143 IDirect3DRMMesh_AddRef(iface);
2147 static ULONG WINAPI IDirect3DRMMeshImpl_AddRef(IDirect3DRMMesh* iface)
2149 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2150 ULONG ref = InterlockedIncrement(&This->ref);
2152 TRACE("(%p): AddRef from %d\n", This, ref - 1);
2157 static ULONG WINAPI IDirect3DRMMeshImpl_Release(IDirect3DRMMesh* iface)
2159 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2160 ULONG ref = InterlockedDecrement(&This->ref);
2162 TRACE("(%p): ReleaseRef to %d\n", This, ref);
2165 HeapFree(GetProcessHeap(), 0, This);
2170 /*** IDirect3DRMObject methods ***/
2171 static HRESULT WINAPI IDirect3DRMMeshImpl_Clone(IDirect3DRMMesh* iface,
2172 LPUNKNOWN pUnkOuter, REFIID riid,
2175 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2177 FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
2182 static HRESULT WINAPI IDirect3DRMMeshImpl_AddDestroyCallback(IDirect3DRMMesh* iface,
2183 D3DRMOBJECTCALLBACK cb,
2186 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2188 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
2193 static HRESULT WINAPI IDirect3DRMMeshImpl_DeleteDestroyCallback(IDirect3DRMMesh* iface,
2194 D3DRMOBJECTCALLBACK cb,
2197 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2199 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
2204 static HRESULT WINAPI IDirect3DRMMeshImpl_SetAppData(IDirect3DRMMesh* iface,
2207 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2209 FIXME("(%p)->(%u): stub\n", This, data);
2214 static DWORD WINAPI IDirect3DRMMeshImpl_GetAppData(IDirect3DRMMesh* iface)
2216 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2218 FIXME("(%p)->(): stub\n", This);
2223 static HRESULT WINAPI IDirect3DRMMeshImpl_SetName(IDirect3DRMMesh* iface,
2226 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2228 FIXME("(%p)->(%s): stub\n", This, pName);
2233 static HRESULT WINAPI IDirect3DRMMeshImpl_GetName(IDirect3DRMMesh* iface,
2234 LPDWORD lpdwSize, LPSTR lpName)
2236 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2238 FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
2243 static HRESULT WINAPI IDirect3DRMMeshImpl_GetClassName(IDirect3DRMMesh* iface,
2244 LPDWORD lpdwSize, LPSTR lpName)
2246 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2248 FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
2253 /*** IDirect3DRMMesh methods ***/
2254 static HRESULT WINAPI IDirect3DRMMeshImpl_Scale(IDirect3DRMMesh* iface,
2255 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
2257 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2259 FIXME("(%p)->(%f,%f,%f): stub\n", This, sx, sy,sz);
2264 static HRESULT WINAPI IDirect3DRMMeshImpl_Translate(IDirect3DRMMesh* iface,
2265 D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
2267 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2269 FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty,tz);
2274 static HRESULT WINAPI IDirect3DRMMeshImpl_GetBox(IDirect3DRMMesh* iface,
2277 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2279 FIXME("(%p)->(%p): stub\n", This, box);
2284 static HRESULT WINAPI IDirect3DRMMeshImpl_AddGroup(IDirect3DRMMesh* iface,
2285 unsigned vCount, unsigned fCount, unsigned vPerFace,
2286 unsigned *fData, D3DRMGROUPINDEX *returnId)
2288 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2290 FIXME("(%p)->(%u,%u,%u,%p,%p): stub\n", This, vCount, fCount, vPerFace, fData, returnId);
2295 static HRESULT WINAPI IDirect3DRMMeshImpl_SetVertices(IDirect3DRMMesh* iface,
2296 D3DRMGROUPINDEX id, unsigned index, unsigned count,
2297 D3DRMVERTEX *values)
2299 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2301 FIXME("(%p)->(%u,%u,%u,%p): stub\n", This, id, index, count, values);
2306 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupColor(IDirect3DRMMesh* iface,
2307 D3DRMGROUPINDEX id, D3DCOLOR value)
2309 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2311 FIXME("(%p)->(%u,%x): stub\n", This, id, value);
2316 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupColorRGB(IDirect3DRMMesh* iface,
2317 D3DRMGROUPINDEX id, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
2319 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2321 FIXME("(%p)->(%u,%f,%f,%f): stub\n", This, id, red, green, blue);
2326 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupMapping(IDirect3DRMMesh* iface,
2327 D3DRMGROUPINDEX id, D3DRMMAPPING value)
2329 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2331 FIXME("(%p)->(%u,%u): stub\n", This, id, value);
2336 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupQuality(IDirect3DRMMesh* iface,
2337 D3DRMGROUPINDEX id, D3DRMRENDERQUALITY value)
2339 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2341 FIXME("(%p)->(%u,%u): stub\n", This, id, value);
2346 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupMaterial(IDirect3DRMMesh* iface,
2347 D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL value)
2349 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2351 FIXME("(%p)->(%u,%p): stub\n", This, id, value);
2356 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupTexture(IDirect3DRMMesh* iface,
2357 D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE value)
2359 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2361 FIXME("(%p)->(%u,%p): stub\n", This, id, value);
2366 static DWORD WINAPI IDirect3DRMMeshImpl_GetGroupCount(IDirect3DRMMesh* iface)
2368 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2370 FIXME("(%p)->(): stub\n", This);
2375 static HRESULT WINAPI IDirect3DRMMeshImpl_GetGroup(IDirect3DRMMesh* iface,
2376 D3DRMGROUPINDEX id, unsigned *vCount, unsigned *fCount, unsigned *vPerFace,
2377 DWORD *fDataSize, unsigned *fData)
2379 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2381 FIXME("(%p)->(%u,%p,%p,%p,%p,%p): stub\n", This, id, vCount, fCount, vPerFace, fDataSize, fData);
2386 static HRESULT WINAPI IDirect3DRMMeshImpl_GetVertices(IDirect3DRMMesh* iface,
2387 D3DRMGROUPINDEX id, DWORD index, DWORD count, D3DRMVERTEX *returnPtr)
2389 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2391 FIXME("(%p)->(%u,%u,%u,%p): stub\n", This, id, index, count, returnPtr);
2396 static D3DCOLOR WINAPI IDirect3DRMMeshImpl_GetGroupColor(IDirect3DRMMesh* iface, D3DRMGROUPINDEX id)
2398 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2400 FIXME("(%p)->(%u): stub\n", This, id);
2405 static D3DRMMAPPING WINAPI IDirect3DRMMeshImpl_GetGroupMapping(IDirect3DRMMesh* iface, D3DRMGROUPINDEX id)
2407 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2409 FIXME("(%p)->(%u): stub\n", This, id);
2413 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshImpl_GetGroupQuality(IDirect3DRMMesh* iface, D3DRMGROUPINDEX id)
2415 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2417 FIXME("(%p)->(%u): stub\n", This, id);
2422 static HRESULT WINAPI IDirect3DRMMeshImpl_GetGroupMaterial(IDirect3DRMMesh* iface,
2423 D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL *returnPtr)
2425 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2427 FIXME("(%p)->(%u,%p): stub\n", This, id, returnPtr);
2432 static HRESULT WINAPI IDirect3DRMMeshImpl_GetGroupTexture(IDirect3DRMMesh* iface,
2433 D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE *returnPtr)
2435 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2437 FIXME("(%p)->(%u,%p): stub\n", This, id, returnPtr);
2442 static const struct IDirect3DRMMeshVtbl Direct3DRMMesh_Vtbl =
2444 /*** IUnknown methods ***/
2445 IDirect3DRMMeshImpl_QueryInterface,
2446 IDirect3DRMMeshImpl_AddRef,
2447 IDirect3DRMMeshImpl_Release,
2448 /*** IDirect3DRMObject methods ***/
2449 IDirect3DRMMeshImpl_Clone,
2450 IDirect3DRMMeshImpl_AddDestroyCallback,
2451 IDirect3DRMMeshImpl_DeleteDestroyCallback,
2452 IDirect3DRMMeshImpl_SetAppData,
2453 IDirect3DRMMeshImpl_GetAppData,
2454 IDirect3DRMMeshImpl_SetName,
2455 IDirect3DRMMeshImpl_GetName,
2456 IDirect3DRMMeshImpl_GetClassName,
2457 /*** IDirect3DRMMesh methods ***/
2458 IDirect3DRMMeshImpl_Scale,
2459 IDirect3DRMMeshImpl_Translate,
2460 IDirect3DRMMeshImpl_GetBox,
2461 IDirect3DRMMeshImpl_AddGroup,
2462 IDirect3DRMMeshImpl_SetVertices,
2463 IDirect3DRMMeshImpl_SetGroupColor,
2464 IDirect3DRMMeshImpl_SetGroupColorRGB,
2465 IDirect3DRMMeshImpl_SetGroupMapping,
2466 IDirect3DRMMeshImpl_SetGroupQuality,
2467 IDirect3DRMMeshImpl_SetGroupMaterial,
2468 IDirect3DRMMeshImpl_SetGroupTexture,
2469 IDirect3DRMMeshImpl_GetGroupCount,
2470 IDirect3DRMMeshImpl_GetGroup,
2471 IDirect3DRMMeshImpl_GetVertices,
2472 IDirect3DRMMeshImpl_GetGroupColor,
2473 IDirect3DRMMeshImpl_GetGroupMapping,
2474 IDirect3DRMMeshImpl_GetGroupQuality,
2475 IDirect3DRMMeshImpl_GetGroupMaterial,
2476 IDirect3DRMMeshImpl_GetGroupTexture
2479 static HRESULT Direct3DRMMesh_create(IDirect3DRMMesh** obj)
2481 IDirect3DRMMeshImpl* object;
2483 TRACE("(%p)\n", obj);
2485 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMeshImpl));
2488 ERR("Out of memory\n");
2489 return E_OUTOFMEMORY;
2492 object->IDirect3DRMMesh_iface.lpVtbl = &Direct3DRMMesh_Vtbl;
2495 *obj = &object->IDirect3DRMMesh_iface;