2 * Implementation of IDirect3DRMMeshBuilderX and IDirect3DRMMesh interfaces
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 #define NONAMELESSUNION
26 #include "wine/debug.h"
33 #include "d3drm_private.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
39 D3DRMVERTEX* vertices;
41 unsigned vertex_per_face;
45 IDirect3DRMMaterial2* material;
46 IDirect3DRMTexture3* texture;
50 IDirect3DRMMesh IDirect3DRMMesh_iface;
52 DWORD groups_capacity;
55 } IDirect3DRMMeshImpl;
64 IDirect3DRMMaterial2 *material;
65 IDirect3DRMTexture3 *texture;
69 IDirect3DRMMeshBuilder2 IDirect3DRMMeshBuilder2_iface;
70 IDirect3DRMMeshBuilder3 IDirect3DRMMeshBuilder3_iface;
83 IDirect3DRMMaterial2 *material;
84 IDirect3DRMTexture3 *texture;
86 mesh_material *materials;
87 DWORD *material_indices;
88 } IDirect3DRMMeshBuilderImpl;
94 "<3D82AB43-62DA-11CF-AB39-0020AF71E433>"
101 "<3D82AB5E-62DA-11CF-AB39-0020AF71E433>"
108 "<F6F23F44-7686-11CF-8F52-0040333594A3>"
114 "<F6F23F45-7686-11CF-8F52-0040333594A3>"
115 "array FLOAT matrix[16];"
119 "<35FF44E0-6C7C-11CF-8F52-0040333594A3>"
127 "<D3E16E81-7835-11CF-8F52-0040333594A3>"
132 "template IndexedColor"
134 "<1630B820-7842-11CF-8F52-0040333594A3>"
136 "ColorRGBA indexColor;"
140 "<537DA6A0-CA37-11D0-941C-0080C80CFA7B>"
145 "<4885AE63-78E8-11CF-8F52-0040333594A3>"
149 "template MaterialWrap"
151 "<4885AE60-78E8-11CF-8F52-0040333594A3>"
155 "template TextureFilename"
157 "<A42790E1-7810-11CF-8F52-0040333594A3>"
162 "<3D82AB4D-62DA-11CF-AB39-0020AF71E433>"
163 "ColorRGBA faceColor;"
165 "ColorRGB specularColor;"
166 "ColorRGB emissiveColor;"
171 "<3D82AB5F-62DA-11CF-AB39-0020AF71E433>"
172 "DWORD nFaceVertexIndices;"
173 "array DWORD faceVertexIndices[nFaceVertexIndices];"
175 "template MeshFaceWraps"
177 "<ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B>"
178 "DWORD nFaceWrapValues;"
179 "array Boolean2d faceWrapValues[nFaceWrapValues];"
181 "template MeshTextureCoords"
183 "<F6F23F40-7686-11CF-8F52-0040333594A3>"
184 "DWORD nTextureCoords;"
185 "array Coords2d textureCoords[nTextureCoords];"
187 "template MeshMaterialList"
189 "<F6F23F42-7686-11CF-8F52-0040333594A3>"
191 "DWORD nFaceIndexes;"
192 "array DWORD faceIndexes[nFaceIndexes];"
195 "template MeshNormals"
197 "<F6F23F43-7686-11CF-8F52-0040333594A3>"
199 "array Vector normals[nNormals];"
200 "DWORD nFaceNormals;"
201 "array MeshFace faceNormals[nFaceNormals];"
203 "template MeshVertexColors"
205 "<1630B821-7842-11CF-8F52-0040333594A3>"
206 "DWORD nVertexColors;"
207 "array IndexedColor vertexColors[nVertexColors];"
211 "<3D82AB44-62DA-11CF-AB39-0020AF71E433>"
213 "array Vector vertices[nVertices];"
215 "array MeshFace faces[nFaces];"
218 "template FrameTransformMatrix"
220 "<F6F23F41-7686-11CF-8F52-0040333594A3>"
221 "Matrix4x4 frameMatrix;"
225 "<3D82AB46-62DA-11CF-AB39-0020AF71E433>"
230 "<10DD46A9-775B-11CF-8F52-0040333594A3>"
232 "array FLOAT values[nValues];"
234 "template TimedFloatKeys"
236 "<F406B180-7B3B-11CF-8F52-0040333594A3>"
240 "template AnimationKey"
242 "<10DD46A8-775B-11CF-8F52-0040333594A3>"
245 "array TimedFloatKeys keys[nKeys];"
247 "template AnimationOptions"
249 "<E2BF56C0-840F-11CF-8F52-0040333594A3>"
251 "DWORD positionquality;"
255 "<3D82AB4F-62DA-11CF-AB39-0020AF71E433>"
258 "template AnimationSet"
260 "<3D82AB50-62DA-11CF-AB39-0020AF71E433>"
263 "template InlineData"
265 "<3A23EEA0-94B1-11D0-AB39-0020AF71E433>"
270 "<3A23EEA1-94B1-11D0-AB39-0020AF71E433>"
272 "array STRING urls[nUrls];"
274 "template ProgressiveMesh"
276 "<8A63C360-997D-11D0-941C-0080C80CFA7B>"
281 "<A42790E0-7810-11CF-8F52-0040333594A3>"
285 "array UCHAR data4[8];"
287 "template StringProperty"
289 "<7F0F21E0-BFE1-11D1-82C0-00A0C9697271>"
293 "template PropertyBag"
295 "<7F0F21E1-BFE1-11D1-82C0-00A0C9697271>"
298 "template ExternalVisual"
300 "<98116AA0-BDBA-11D1-82C0-00A0C9697271>"
301 "Guid guidExternalVisual;"
304 "template RightHanded"
306 "<7F5D5EA0-D53A-11D1-82C0-00A0C9697271>"
307 "DWORD bRightHanded;"
311 static inline IDirect3DRMMeshImpl *impl_from_IDirect3DRMMesh(IDirect3DRMMesh *iface)
313 return CONTAINING_RECORD(iface, IDirect3DRMMeshImpl, IDirect3DRMMesh_iface);
316 static inline IDirect3DRMMeshBuilderImpl *impl_from_IDirect3DRMMeshBuilder2(IDirect3DRMMeshBuilder2 *iface)
318 return CONTAINING_RECORD(iface, IDirect3DRMMeshBuilderImpl, IDirect3DRMMeshBuilder2_iface);
321 static inline IDirect3DRMMeshBuilderImpl *impl_from_IDirect3DRMMeshBuilder3(IDirect3DRMMeshBuilder3 *iface)
323 return CONTAINING_RECORD(iface, IDirect3DRMMeshBuilderImpl, IDirect3DRMMeshBuilder3_iface);
326 static void clean_mesh_builder_data(IDirect3DRMMeshBuilderImpl *mesh_builder)
330 HeapFree(GetProcessHeap(), 0, mesh_builder->name);
331 mesh_builder->name = NULL;
332 HeapFree(GetProcessHeap(), 0, mesh_builder->pVertices);
333 mesh_builder->pVertices = NULL;
334 mesh_builder->nb_vertices = 0;
335 HeapFree(GetProcessHeap(), 0, mesh_builder->pNormals);
336 mesh_builder->pNormals = NULL;
337 mesh_builder->nb_normals = 0;
338 HeapFree(GetProcessHeap(), 0, mesh_builder->pFaceData);
339 mesh_builder->pFaceData = NULL;
340 mesh_builder->face_data_size = 0;
341 mesh_builder->nb_faces = 0;
342 HeapFree(GetProcessHeap(), 0, mesh_builder->pCoords2d);
343 mesh_builder->pCoords2d = NULL;
344 mesh_builder->nb_coords2d = 0;
345 for (i = 0; i < mesh_builder->nb_materials; i++)
347 if (mesh_builder->materials[i].material)
348 IDirect3DRMMaterial2_Release(mesh_builder->materials[i].material);
349 if (mesh_builder->materials[i].texture)
350 IDirect3DRMTexture3_Release(mesh_builder->materials[i].texture);
352 mesh_builder->nb_materials = 0;
353 HeapFree(GetProcessHeap(), 0, mesh_builder->materials);
354 HeapFree(GetProcessHeap(), 0, mesh_builder->material_indices);
357 /*** IUnknown methods ***/
358 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_QueryInterface(IDirect3DRMMeshBuilder2* iface,
359 REFIID riid, void** ppvObject)
361 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
363 TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject);
367 if(IsEqualGUID(riid, &IID_IUnknown) ||
368 IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder) ||
369 IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder2))
371 *ppvObject = &This->IDirect3DRMMeshBuilder2_iface;
373 else if(IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
375 *ppvObject = &This->IDirect3DRMMeshBuilder3_iface;
379 FIXME("interface %s not implemented\n", debugstr_guid(riid));
380 return E_NOINTERFACE;
383 IDirect3DRMMeshBuilder_AddRef(iface);
387 static ULONG WINAPI IDirect3DRMMeshBuilder2Impl_AddRef(IDirect3DRMMeshBuilder2* iface)
389 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
390 ULONG ref = InterlockedIncrement(&This->ref);
392 TRACE("(%p)->(): new ref = %d\n", This, ref);
397 static ULONG WINAPI IDirect3DRMMeshBuilder2Impl_Release(IDirect3DRMMeshBuilder2* iface)
399 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
400 ULONG ref = InterlockedDecrement(&This->ref);
402 TRACE("(%p)->(): new ref = %d\n", This, ref);
406 clean_mesh_builder_data(This);
408 IDirect3DRMMaterial2_Release(This->material);
410 IDirect3DRMTexture3_Release(This->texture);
411 HeapFree(GetProcessHeap(), 0, This);
417 /*** IDirect3DRMObject methods ***/
418 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Clone(IDirect3DRMMeshBuilder2* iface,
419 LPUNKNOWN pUnkOuter, REFIID riid,
422 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
424 FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
429 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddDestroyCallback(IDirect3DRMMeshBuilder2* iface,
430 D3DRMOBJECTCALLBACK cb,
433 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
435 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
440 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_DeleteDestroyCallback(IDirect3DRMMeshBuilder2* iface,
441 D3DRMOBJECTCALLBACK cb,
444 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
446 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
451 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetAppData(IDirect3DRMMeshBuilder2* iface,
454 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
456 FIXME("(%p)->(%u): stub\n", This, data);
461 static DWORD WINAPI IDirect3DRMMeshBuilder2Impl_GetAppData(IDirect3DRMMeshBuilder2* iface)
463 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
465 FIXME("(%p)->(): stub\n", This);
470 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetName(IDirect3DRMMeshBuilder2* iface,
473 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
475 TRACE("(%p)->(%s)\n", This, debugstr_a(name));
477 return IDirect3DRMMeshBuilder3_SetName(&This->IDirect3DRMMeshBuilder3_iface, name);
480 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetName(IDirect3DRMMeshBuilder2* iface,
481 LPDWORD size, LPSTR name)
483 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
485 TRACE("(%p)->(%p,%p)\n", This, size, name);
487 return IDirect3DRMMeshBuilder3_GetName(&This->IDirect3DRMMeshBuilder3_iface, size, name);
490 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetClassName(IDirect3DRMMeshBuilder2* iface,
491 LPDWORD size, LPSTR name)
493 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
495 TRACE("(%p)->(%p, %p)\n", This, size, name);
497 return IDirect3DRMMeshBuilder3_GetClassName(&This->IDirect3DRMMeshBuilder3_iface, size, name);
500 /*** IDirect3DRMMeshBuilder2 methods ***/
501 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Load(IDirect3DRMMeshBuilder2* iface,
502 LPVOID filename, LPVOID name,
503 D3DRMLOADOPTIONS loadflags,
504 D3DRMLOADTEXTURECALLBACK cb, LPVOID arg)
506 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
508 TRACE("(%p)->(%p,%p,%x,%p,%p)\n", This, filename, name, loadflags, cb, arg);
511 FIXME("Texture callback is not yet supported\n");
513 return IDirect3DRMMeshBuilder3_Load(&This->IDirect3DRMMeshBuilder3_iface, filename, name,
514 loadflags, NULL, arg);
517 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Save(IDirect3DRMMeshBuilder2* iface,
518 const char *filename, D3DRMXOFFORMAT format,
519 D3DRMSAVEOPTIONS save)
521 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
523 FIXME("(%p)->(%s,%d,%d): stub\n", This, filename, format, save);
528 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Scale(IDirect3DRMMeshBuilder2* iface,
529 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
531 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
533 TRACE("(%p)->(%f,%f,%f)\n", This, sx, sy, sz);
535 return IDirect3DRMMeshBuilder3_Scale(&This->IDirect3DRMMeshBuilder3_iface, sx, sy, sz);
538 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_Translate(IDirect3DRMMeshBuilder2* iface,
539 D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
541 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
543 FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty, tz);
548 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColorSource(IDirect3DRMMeshBuilder2* iface,
549 D3DRMCOLORSOURCE color)
551 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
553 FIXME("(%p)->(%x): stub\n", This, color);
558 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetBox(IDirect3DRMMeshBuilder2* iface,
561 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
563 FIXME("(%p)->(%p): stub\n", This, pBox);
568 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GenerateNormals(IDirect3DRMMeshBuilder2* iface)
570 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
572 FIXME("(%p)->(): stub\n", This);
577 static D3DRMCOLORSOURCE WINAPI IDirect3DRMMeshBuilder2Impl_GetColorSource(IDirect3DRMMeshBuilder2* iface)
579 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
581 FIXME("(%p)->(): stub\n", This);
586 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddMesh(IDirect3DRMMeshBuilder2* iface,
587 LPDIRECT3DRMMESH pMesh)
589 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
591 FIXME("(%p)->(%p): stub\n", This, pMesh);
596 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddMeshBuilder(IDirect3DRMMeshBuilder2* iface,
597 LPDIRECT3DRMMESHBUILDER pMeshBuilder)
599 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
601 FIXME("(%p)->(%p): stub\n", This, pMeshBuilder);
606 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFrame(IDirect3DRMMeshBuilder2* iface,
607 LPDIRECT3DRMFRAME pFrame)
609 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
611 FIXME("(%p)->(%p): stub\n", This, pFrame);
616 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFace(IDirect3DRMMeshBuilder2* iface,
617 LPDIRECT3DRMFACE pFace)
619 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
621 FIXME("(%p)->(%p): stub\n", This, pFace);
626 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_AddFaces(IDirect3DRMMeshBuilder2* iface,
627 DWORD vcount, D3DVECTOR *vertices,
628 DWORD ncount, D3DVECTOR *normals,
630 LPDIRECT3DRMFACEARRAY* pFaceArray)
632 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
634 FIXME("(%p)->(%d,%p,%d,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals, data, pFaceArray);
639 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_ReserveSpace(IDirect3DRMMeshBuilder2* iface,
644 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
646 FIXME("(%p)->(%d,%d,%d): stub\n", This, vertex_Count, normal_count, face_count);
651 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColorRGB(IDirect3DRMMeshBuilder2* iface,
652 D3DVALUE red, D3DVALUE green,
655 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
657 TRACE("(%p)->(%f,%f,%f)\n", This, red, green, blue);
659 return IDirect3DRMMeshBuilder3_SetColorRGB(&This->IDirect3DRMMeshBuilder3_iface, red, green, blue);
662 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetColor(IDirect3DRMMeshBuilder2* iface,
665 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
667 TRACE("(%p)->(%x)\n", This, color);
669 return IDirect3DRMMeshBuilder3_SetColor(&This->IDirect3DRMMeshBuilder3_iface, color);
672 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTexture(IDirect3DRMMeshBuilder2* iface,
673 LPDIRECT3DRMTEXTURE texture)
675 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
676 LPDIRECT3DRMTEXTURE3 texture3 = NULL;
677 HRESULT hr = D3DRM_OK;
680 hr = IDirect3DRMTexture_QueryInterface(texture, &IID_IDirect3DRMTexture3, (LPVOID*)&texture3);
682 hr = IDirect3DRMMeshBuilder3_SetTexture(&This->IDirect3DRMMeshBuilder3_iface, texture3);
684 IDirect3DRMTexture3_Release(texture3);
689 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetMaterial(IDirect3DRMMeshBuilder2* iface,
690 LPDIRECT3DRMMATERIAL material)
692 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
694 TRACE("(%p)->(%p)\n", This, material);
696 return IDirect3DRMMeshBuilder3_SetMaterial(&This->IDirect3DRMMeshBuilder3_iface, (LPDIRECT3DRMMATERIAL2)material);
699 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTextureTopology(IDirect3DRMMeshBuilder2* iface,
700 BOOL wrap_u, BOOL wrap_v)
702 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
704 FIXME("(%p)->(%d,%d): stub\n", This, wrap_u, wrap_v);
709 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetQuality(IDirect3DRMMeshBuilder2* iface,
710 D3DRMRENDERQUALITY quality)
712 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
714 FIXME("(%p)->(%d): stub\n", This, quality);
719 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetPerspective(IDirect3DRMMeshBuilder2* iface,
722 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
724 FIXME("(%p)->(%d): stub\n", This, enable);
729 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertex(IDirect3DRMMeshBuilder2* iface,
731 D3DVALUE x, D3DVALUE y, D3DVALUE z)
733 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
735 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
740 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetNormal(IDirect3DRMMeshBuilder2* iface,
742 D3DVALUE x, D3DVALUE y, D3DVALUE z)
744 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
746 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
751 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetTextureCoordinates(IDirect3DRMMeshBuilder2* iface,
753 D3DVALUE u, D3DVALUE v)
755 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
757 TRACE("(%p)->(%u,%f,%f)\n", This, index, u, v);
759 return IDirect3DRMMeshBuilder3_SetTextureCoordinates(&This->IDirect3DRMMeshBuilder3_iface,
763 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertexColor(IDirect3DRMMeshBuilder2* iface,
764 DWORD index, D3DCOLOR color)
766 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
768 FIXME("(%p)->(%d,%x): stub\n", This, index, color);
773 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_SetVertexColorRGB(IDirect3DRMMeshBuilder2* iface,
774 DWORD index, D3DVALUE red,
775 D3DVALUE green, D3DVALUE blue)
777 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
779 FIXME("(%p)->(%d,%f,%f,%f): stub\n", This, index, red, green, blue);
784 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetFaces(IDirect3DRMMeshBuilder2* iface,
785 LPDIRECT3DRMFACEARRAY* pFaceArray)
787 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
789 FIXME("(%p)->(%p): stub\n", This, pFaceArray);
794 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetVertices(IDirect3DRMMeshBuilder2* iface,
795 DWORD *vcount, D3DVECTOR *vertices,
796 DWORD *ncount, D3DVECTOR *normals,
797 DWORD *face_data_size,
800 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
802 TRACE("(%p)->(%p,%p,%p,%p,%p,%p)\n", This, vcount, vertices, ncount, normals, face_data_size, face_data);
805 *vcount = This->nb_vertices;
806 if (vertices && This->nb_vertices)
807 memcpy(vertices, This->pVertices, This->nb_vertices * sizeof(D3DVECTOR));
809 *ncount = This->nb_normals;
810 if (normals && This->nb_normals)
811 memcpy(normals, This->pNormals, This->nb_normals * sizeof(D3DVECTOR));
813 *face_data_size = This->face_data_size;
814 if (face_data && This->face_data_size)
815 memcpy(face_data, This->pFaceData, This->face_data_size * sizeof(DWORD));
820 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetTextureCoordinates(IDirect3DRMMeshBuilder2* iface,
822 D3DVALUE *u, D3DVALUE *v)
824 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
826 TRACE("(%p)->(%u,%p,%p)\n", This, index, u, v);
828 return IDirect3DRMMeshBuilder3_GetTextureCoordinates(&This->IDirect3DRMMeshBuilder3_iface,
832 static int WINAPI IDirect3DRMMeshBuilder2Impl_AddVertex(IDirect3DRMMeshBuilder2* iface,
833 D3DVALUE x, D3DVALUE y, D3DVALUE z)
835 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
837 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
842 static int WINAPI IDirect3DRMMeshBuilder2Impl_AddNormal(IDirect3DRMMeshBuilder2* iface,
843 D3DVALUE x, D3DVALUE y, D3DVALUE z)
845 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
847 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
852 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_CreateFace(IDirect3DRMMeshBuilder2* iface,
853 LPDIRECT3DRMFACE* ppFace)
855 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
857 FIXME("(%p)->(%p): stub\n", This, ppFace);
862 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshBuilder2Impl_GetQuality(IDirect3DRMMeshBuilder2* iface)
864 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
866 FIXME("(%p)->(): stub\n", This);
871 static BOOL WINAPI IDirect3DRMMeshBuilder2Impl_GetPerspective(IDirect3DRMMeshBuilder2* iface)
873 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
875 FIXME("(%p)->(): stub\n", This);
880 static int WINAPI IDirect3DRMMeshBuilder2Impl_GetFaceCount(IDirect3DRMMeshBuilder2* iface)
882 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
884 TRACE("(%p)->()\n", This);
886 return This->nb_faces;
889 static int WINAPI IDirect3DRMMeshBuilder2Impl_GetVertexCount(IDirect3DRMMeshBuilder2* iface)
891 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
893 TRACE("(%p)->()\n", This);
895 return This->nb_vertices;
898 static D3DCOLOR WINAPI IDirect3DRMMeshBuilder2Impl_GetVertexColor(IDirect3DRMMeshBuilder2* iface,
901 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
903 FIXME("(%p)->(%d): stub\n", This, index);
908 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_CreateMesh(IDirect3DRMMeshBuilder2* iface,
909 LPDIRECT3DRMMESH* mesh)
911 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
913 TRACE("(%p)->(%p)\n", This, mesh);
915 return IDirect3DRMMeshBuilder3_CreateMesh(&This->IDirect3DRMMeshBuilder3_iface, mesh);
918 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GenerateNormals2(IDirect3DRMMeshBuilder2* iface,
919 D3DVALUE crease, DWORD dwFlags)
921 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
923 FIXME("(%p)->(%f,%u): stub\n", This, crease, dwFlags);
928 static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetFace(IDirect3DRMMeshBuilder2* iface,
929 DWORD index, LPDIRECT3DRMFACE* ppFace)
931 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder2(iface);
933 FIXME("(%p)->(%u,%p): stub\n", This, index, ppFace);
938 static const struct IDirect3DRMMeshBuilder2Vtbl Direct3DRMMeshBuilder2_Vtbl =
940 /*** IUnknown methods ***/
941 IDirect3DRMMeshBuilder2Impl_QueryInterface,
942 IDirect3DRMMeshBuilder2Impl_AddRef,
943 IDirect3DRMMeshBuilder2Impl_Release,
944 /*** IDirect3DRMObject methods ***/
945 IDirect3DRMMeshBuilder2Impl_Clone,
946 IDirect3DRMMeshBuilder2Impl_AddDestroyCallback,
947 IDirect3DRMMeshBuilder2Impl_DeleteDestroyCallback,
948 IDirect3DRMMeshBuilder2Impl_SetAppData,
949 IDirect3DRMMeshBuilder2Impl_GetAppData,
950 IDirect3DRMMeshBuilder2Impl_SetName,
951 IDirect3DRMMeshBuilder2Impl_GetName,
952 IDirect3DRMMeshBuilder2Impl_GetClassName,
953 /*** IDirect3DRMMeshBuilder methods ***/
954 IDirect3DRMMeshBuilder2Impl_Load,
955 IDirect3DRMMeshBuilder2Impl_Save,
956 IDirect3DRMMeshBuilder2Impl_Scale,
957 IDirect3DRMMeshBuilder2Impl_Translate,
958 IDirect3DRMMeshBuilder2Impl_SetColorSource,
959 IDirect3DRMMeshBuilder2Impl_GetBox,
960 IDirect3DRMMeshBuilder2Impl_GenerateNormals,
961 IDirect3DRMMeshBuilder2Impl_GetColorSource,
962 IDirect3DRMMeshBuilder2Impl_AddMesh,
963 IDirect3DRMMeshBuilder2Impl_AddMeshBuilder,
964 IDirect3DRMMeshBuilder2Impl_AddFrame,
965 IDirect3DRMMeshBuilder2Impl_AddFace,
966 IDirect3DRMMeshBuilder2Impl_AddFaces,
967 IDirect3DRMMeshBuilder2Impl_ReserveSpace,
968 IDirect3DRMMeshBuilder2Impl_SetColorRGB,
969 IDirect3DRMMeshBuilder2Impl_SetColor,
970 IDirect3DRMMeshBuilder2Impl_SetTexture,
971 IDirect3DRMMeshBuilder2Impl_SetMaterial,
972 IDirect3DRMMeshBuilder2Impl_SetTextureTopology,
973 IDirect3DRMMeshBuilder2Impl_SetQuality,
974 IDirect3DRMMeshBuilder2Impl_SetPerspective,
975 IDirect3DRMMeshBuilder2Impl_SetVertex,
976 IDirect3DRMMeshBuilder2Impl_SetNormal,
977 IDirect3DRMMeshBuilder2Impl_SetTextureCoordinates,
978 IDirect3DRMMeshBuilder2Impl_SetVertexColor,
979 IDirect3DRMMeshBuilder2Impl_SetVertexColorRGB,
980 IDirect3DRMMeshBuilder2Impl_GetFaces,
981 IDirect3DRMMeshBuilder2Impl_GetVertices,
982 IDirect3DRMMeshBuilder2Impl_GetTextureCoordinates,
983 IDirect3DRMMeshBuilder2Impl_AddVertex,
984 IDirect3DRMMeshBuilder2Impl_AddNormal,
985 IDirect3DRMMeshBuilder2Impl_CreateFace,
986 IDirect3DRMMeshBuilder2Impl_GetQuality,
987 IDirect3DRMMeshBuilder2Impl_GetPerspective,
988 IDirect3DRMMeshBuilder2Impl_GetFaceCount,
989 IDirect3DRMMeshBuilder2Impl_GetVertexCount,
990 IDirect3DRMMeshBuilder2Impl_GetVertexColor,
991 IDirect3DRMMeshBuilder2Impl_CreateMesh,
992 /*** IDirect3DRMMeshBuilder2 methods ***/
993 IDirect3DRMMeshBuilder2Impl_GenerateNormals2,
994 IDirect3DRMMeshBuilder2Impl_GetFace
998 /*** IUnknown methods ***/
999 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_QueryInterface(IDirect3DRMMeshBuilder3* iface,
1000 REFIID riid, void** ppvObject)
1002 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1003 return IDirect3DRMMeshBuilder2_QueryInterface(&This->IDirect3DRMMeshBuilder2_iface, riid, ppvObject);
1006 static ULONG WINAPI IDirect3DRMMeshBuilder3Impl_AddRef(IDirect3DRMMeshBuilder3* iface)
1008 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1009 return IDirect3DRMMeshBuilder2_AddRef(&This->IDirect3DRMMeshBuilder2_iface);
1012 static ULONG WINAPI IDirect3DRMMeshBuilder3Impl_Release(IDirect3DRMMeshBuilder3* iface)
1014 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1015 return IDirect3DRMMeshBuilder2_Release(&This->IDirect3DRMMeshBuilder2_iface);
1018 /*** IDirect3DRMObject methods ***/
1019 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Clone(IDirect3DRMMeshBuilder3* iface,
1020 LPUNKNOWN pUnkOuter, REFIID riid,
1023 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1025 FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
1030 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddDestroyCallback(IDirect3DRMMeshBuilder3* iface,
1031 D3DRMOBJECTCALLBACK cb,
1034 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1036 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
1041 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteDestroyCallback(IDirect3DRMMeshBuilder3* iface,
1042 D3DRMOBJECTCALLBACK cb,
1045 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1047 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
1052 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetAppData(IDirect3DRMMeshBuilder3* iface,
1055 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1057 FIXME("(%p)->(%u): stub\n", This, data);
1062 static DWORD WINAPI IDirect3DRMMeshBuilder3Impl_GetAppData(IDirect3DRMMeshBuilder3* iface)
1064 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1066 FIXME("(%p)->(): stub\n", This);
1071 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetName(IDirect3DRMMeshBuilder3* iface,
1074 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1075 char *string = NULL;
1077 TRACE("(%p)->(%s)\n", This, debugstr_a(name));
1081 string = HeapAlloc(GetProcessHeap(), 0, strlen(name) + 1);
1082 if (!string) return E_OUTOFMEMORY;
1083 strcpy(string, name);
1085 HeapFree(GetProcessHeap(), 0, This->name);
1086 This->name = string;
1091 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetName(IDirect3DRMMeshBuilder3* iface,
1092 LPDWORD size, LPSTR name)
1094 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1096 TRACE("(%p)->(%p,%p)\n", This, size, name);
1107 if (*size < (strlen(This->name) + 1))
1108 return E_INVALIDARG;
1110 strcpy(name, This->name);
1111 *size = strlen(This->name) + 1;
1116 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetClassName(IDirect3DRMMeshBuilder3* iface,
1117 LPDWORD size, LPSTR name)
1119 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1121 TRACE("(%p)->(%p, %p)\n", This, size, name);
1123 if (!size || *size < strlen("Builder") || !name)
1124 return E_INVALIDARG;
1126 strcpy(name, "Builder");
1127 *size = sizeof("Builder");
1132 HRESULT load_mesh_data(IDirect3DRMMeshBuilder3* iface, IDirectXFileData *pData, D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg)
1134 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1135 LPDIRECTXFILEOBJECT pObject = NULL;
1136 LPDIRECTXFILEDATA pData2 = NULL;
1141 HRESULT ret = D3DRMERR_BADOBJECT;
1142 DWORD* faces_vertex_idx_data = NULL;
1143 DWORD* faces_vertex_idx_ptr;
1144 DWORD faces_vertex_idx_size;
1145 DWORD* faces_normal_idx_data = NULL;
1146 DWORD* faces_normal_idx_ptr = NULL;
1147 DWORD* faces_data_ptr;
1148 DWORD faces_data_size = 0;
1151 TRACE("(%p)->(%p)\n", This, pData);
1153 hr = IDirectXFileData_GetName(pData, NULL, &size);
1154 if (hr != DXFILE_OK)
1158 This->name = HeapAlloc(GetProcessHeap(), 0, size);
1160 return E_OUTOFMEMORY;
1162 hr = IDirectXFileData_GetName(pData, This->name, &size);
1163 if (hr != DXFILE_OK)
1167 TRACE("Mesh name is '%s'\n", This->name ? This->name : "");
1169 This->nb_normals = 0;
1171 hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
1172 if (hr != DXFILE_OK)
1175 This->nb_vertices = *(DWORD*)ptr;
1176 This->nb_faces = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR));
1177 faces_vertex_idx_size = size - sizeof(DWORD) - This->nb_vertices * sizeof(D3DVECTOR) - sizeof(DWORD);
1178 faces_vertex_idx_ptr = (DWORD*)(ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD));
1180 TRACE("Mesh: nb_vertices = %d, nb_faces = %d, faces_vertex_idx_size = %d\n", This->nb_vertices, This->nb_faces, faces_vertex_idx_size);
1182 This->pVertices = HeapAlloc(GetProcessHeap(), 0, This->nb_vertices * sizeof(D3DVECTOR));
1183 memcpy(This->pVertices, ptr + sizeof(DWORD), This->nb_vertices * sizeof(D3DVECTOR));
1185 faces_vertex_idx_ptr = faces_vertex_idx_data = HeapAlloc(GetProcessHeap(), 0, faces_vertex_idx_size);
1186 memcpy(faces_vertex_idx_data, ptr + sizeof(DWORD) + This->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD), faces_vertex_idx_size);
1188 /* Each vertex index will have its normal index counterpart so just allocate twice the size */
1189 This->pFaceData = HeapAlloc(GetProcessHeap(), 0, faces_vertex_idx_size*2);
1190 faces_data_ptr = (DWORD*)This->pFaceData;
1194 hr = IDirectXFileData_GetNextObject(pData, &pObject);
1195 if (hr == DXFILEERR_NOMOREOBJECTS)
1197 TRACE("No more object\n");
1200 if (hr != DXFILE_OK)
1203 hr = IDirectXFileObject_QueryInterface(pObject, &IID_IDirectXFileData, (void**)&pData2);
1204 IDirectXFileObject_Release(pObject);
1205 if (hr != DXFILE_OK)
1208 hr = IDirectXFileData_GetType(pData2, &pGuid);
1209 if (hr != DXFILE_OK)
1212 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1214 if (IsEqualGUID(pGuid, &TID_D3DRMMeshNormals))
1216 DWORD nb_faces_normals;
1217 DWORD faces_normal_idx_size;
1219 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1220 if (hr != DXFILE_OK)
1223 This->nb_normals = *(DWORD*)ptr;
1224 nb_faces_normals = *(DWORD*)(ptr + sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR));
1226 TRACE("MeshNormals: nb_normals = %d, nb_faces_normals = %d\n", This->nb_normals, nb_faces_normals);
1227 if (nb_faces_normals != This->nb_faces)
1228 WARN("nb_face_normals (%d) != nb_faces (%d)\n", nb_faces_normals, This->nb_normals);
1230 This->pNormals = HeapAlloc(GetProcessHeap(), 0, This->nb_normals * sizeof(D3DVECTOR));
1231 memcpy(This->pNormals, ptr + sizeof(DWORD), This->nb_normals * sizeof(D3DVECTOR));
1233 faces_normal_idx_size = size - (2*sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR));
1234 faces_normal_idx_ptr = faces_normal_idx_data = HeapAlloc(GetProcessHeap(), 0, faces_normal_idx_size);
1235 memcpy(faces_normal_idx_data, ptr + sizeof(DWORD) + This->nb_normals * sizeof(D3DVECTOR) + sizeof(DWORD), faces_normal_idx_size);
1237 else if (IsEqualGUID(pGuid, &TID_D3DRMMeshTextureCoords))
1239 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1240 if (hr != DXFILE_OK)
1243 This->nb_coords2d = *(DWORD*)ptr;
1245 TRACE("MeshTextureCoords: nb_coords2d = %d\n", This->nb_coords2d);
1247 This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d));
1248 memcpy(This->pCoords2d, ptr + sizeof(DWORD), This->nb_coords2d * sizeof(Coords2d));
1251 else if (IsEqualGUID(pGuid, &TID_D3DRMMeshMaterialList))
1254 DWORD nb_face_indices;
1256 LPDIRECTXFILEOBJECT child;
1260 TRACE("Process MeshMaterialList\n");
1262 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1263 if (hr != DXFILE_OK)
1266 nb_materials = *(DWORD*)ptr;
1267 nb_face_indices = *(DWORD*)(ptr + sizeof(DWORD));
1268 data_size = 2 * sizeof(DWORD) + nb_face_indices * sizeof(DWORD);
1270 TRACE("nMaterials = %u, nFaceIndexes = %u\n", nb_materials, nb_face_indices);
1272 if (size != data_size)
1273 WARN("Returned size %u does not match expected one %u\n", size, data_size);
1275 This->material_indices = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->material_indices) * nb_face_indices);
1276 if (!This->material_indices)
1278 memcpy(This->material_indices, ptr + 2 * sizeof(DWORD), sizeof(*This->material_indices) * nb_face_indices),
1280 This->materials = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->materials) * nb_materials);
1281 if (!This->materials)
1283 HeapFree(GetProcessHeap(), 0, This->material_indices);
1286 This->nb_materials = nb_materials;
1288 while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(pData2, &child)) && (i < nb_materials))
1290 LPDIRECTXFILEDATA data;
1291 LPDIRECTXFILEDATAREFERENCE reference;
1292 LPDIRECTXFILEOBJECT material_child;
1294 hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileData, (void **)&data);
1297 hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileDataReference, (void **)&reference);
1298 IDirectXFileObject_Release(child);
1302 hr = IDirectXFileDataReference_Resolve(reference, &data);
1303 IDirectXFileDataReference_Release(reference);
1309 IDirectXFileObject_Release(child);
1312 hr = Direct3DRMMaterial_create(&This->materials[i].material);
1315 IDirectXFileData_Release(data);
1319 hr = IDirectXFileData_GetData(data, NULL, &size, (void**)&ptr);
1320 if (hr != DXFILE_OK)
1322 IDirectXFileData_Release(data);
1327 WARN("Material size %u does not match expected one %u\n", size, 44);
1329 values = (float*)ptr;
1331 This->materials[i].color = D3DCOLOR_ARGB((BYTE)(values[3] * 255.0f), (BYTE)(values[0] * 255.0f),
1332 (BYTE)(values[1] * 255.0f), (BYTE)(values[2] * 255.0f));
1334 IDirect3DRMMaterial2_SetAmbient(This->materials[i].material, values[0], values [1], values[2]); /* Alpha ignored */
1335 IDirect3DRMMaterial2_SetPower(This->materials[i].material, values[4]);
1336 IDirect3DRMMaterial2_SetSpecular(This->materials[i].material, values[5], values[6], values[7]);
1337 IDirect3DRMMaterial2_SetEmissive(This->materials[i].material, values[8], values[9], values[10]);
1339 This->materials[i].texture = NULL;
1341 hr = IDirectXFileData_GetNextObject(data, &material_child);
1344 LPDIRECTXFILEDATA data;
1347 hr = IDirectXFileObject_QueryInterface(material_child, &IID_IDirectXFileData, (void **)&data);
1350 LPDIRECTXFILEDATAREFERENCE reference;
1352 hr = IDirectXFileObject_QueryInterface(material_child, &IID_IDirectXFileDataReference, (void **)&reference);
1356 hr = IDirectXFileDataReference_Resolve(reference, &data);
1357 IDirectXFileDataReference_Release(reference);
1362 hr = IDirectXFileData_GetType(data, &pGuid);
1363 if (hr != DXFILE_OK)
1365 if (!IsEqualGUID(pGuid, &TID_D3DRMTextureFilename))
1367 WARN("Not a texture filename\n");
1372 hr = IDirectXFileData_GetData(data, NULL, &size, (void**)&filename);
1375 if (load_texture_proc)
1377 IDirect3DRMTexture *texture;
1379 hr = load_texture_proc(*filename, arg, &texture);
1382 hr = IDirect3DTexture_QueryInterface(texture, &IID_IDirect3DRMTexture3, (void**)&This->materials[i].texture);
1383 IDirect3DTexture_Release(texture);
1390 /* If the texture file is not found, no texture is associated with the material */
1391 file = CreateFileA(*filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
1392 if (file != INVALID_HANDLE_VALUE)
1396 hr = Direct3DRMTexture_create(&IID_IDirect3DRMTexture3, (IUnknown**)&This->materials[i].texture);
1399 IDirectXFileData_Release(data);
1406 else if (hr != DXFILEERR_NOMOREOBJECTS)
1412 IDirectXFileData_Release(data);
1417 IDirectXFileObject_Release(child);
1418 WARN("Found more sub-objects than expected\n");
1420 else if (hr != DXFILEERR_NOMOREOBJECTS)
1428 FIXME("Unknown GUID %s, ignoring...\n", debugstr_guid(pGuid));
1431 IDirectXFileData_Release(pData2);
1435 if (!This->nb_normals)
1437 /* Allocate normals, one per vertex */
1438 This->pNormals = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->nb_vertices * sizeof(D3DVECTOR));
1439 if (!This->pNormals)
1443 for (i = 0; i < This->nb_faces; i++)
1446 DWORD nb_face_indexes;
1447 D3DVECTOR face_normal;
1449 if (faces_vertex_idx_size < sizeof(DWORD))
1450 WARN("Not enough data to read number of indices of face %d\n", i);
1452 nb_face_indexes = *(faces_data_ptr + faces_data_size++) = *(faces_vertex_idx_ptr++);
1453 faces_vertex_idx_size--;
1454 if (faces_normal_idx_data && (*(faces_normal_idx_ptr++) != nb_face_indexes))
1455 WARN("Faces indices number mismatch\n");
1457 if (faces_vertex_idx_size < (nb_face_indexes * sizeof(DWORD)))
1458 WARN("Not enough data to read all indices of face %d\n", i);
1460 if (!This->nb_normals)
1462 /* Compute face normal */
1463 if (nb_face_indexes > 2)
1467 D3DRMVectorSubtract(&a, &This->pVertices[faces_vertex_idx_ptr[2]], &This->pVertices[faces_vertex_idx_ptr[1]]);
1468 D3DRMVectorSubtract(&b, &This->pVertices[faces_vertex_idx_ptr[0]], &This->pVertices[faces_vertex_idx_ptr[1]]);
1469 D3DRMVectorCrossProduct(&face_normal, &a, &b);
1470 D3DRMVectorNormalize(&face_normal);
1474 face_normal.u1.x = 0.0f;
1475 face_normal.u2.y = 0.0f;
1476 face_normal.u3.z = 0.0f;
1480 for (j = 0; j < nb_face_indexes; j++)
1482 /* Copy vertex index */
1483 *(faces_data_ptr + faces_data_size++) = *faces_vertex_idx_ptr;
1484 /* Copy normal index */
1485 if (This->nb_normals)
1487 /* Read from x file */
1488 *(faces_data_ptr + faces_data_size++) = *(faces_normal_idx_ptr++);
1492 DWORD vertex_idx = *faces_vertex_idx_ptr;
1493 if (vertex_idx >= This->nb_vertices)
1495 WARN("Found vertex index %u but only %u vertices available => use index 0\n", vertex_idx, This->nb_vertices);
1498 *(faces_data_ptr + faces_data_size++) = vertex_idx;
1499 /* Add face normal to vertex normal */
1500 D3DRMVectorAdd(&This->pNormals[vertex_idx], &This->pNormals[vertex_idx], &face_normal);
1502 faces_vertex_idx_ptr++;
1504 faces_vertex_idx_size -= nb_face_indexes;
1507 /* Last DWORD must be 0 */
1508 *(faces_data_ptr + faces_data_size++) = 0;
1510 /* Set size (in number of DWORD) of all faces data */
1511 This->face_data_size = faces_data_size;
1513 if (!This->nb_normals)
1515 /* Normalize all normals */
1516 for (i = 0; i < This->nb_vertices; i++)
1518 D3DRMVectorNormalize(&This->pNormals[i]);
1520 This->nb_normals = This->nb_vertices;
1523 /* If there is no texture coordinates, generate default texture coordinates (0.0f, 0.0f) for each vertex */
1524 if (!This->pCoords2d)
1526 This->nb_coords2d = This->nb_vertices;
1527 This->pCoords2d = HeapAlloc(GetProcessHeap(), 0, This->nb_coords2d * sizeof(Coords2d));
1528 for (i = 0; i < This->nb_coords2d; i++)
1530 This->pCoords2d[i].u = 0.0f;
1531 This->pCoords2d[i].v = 0.0f;
1535 TRACE("Mesh data loaded successfully\n");
1541 HeapFree(GetProcessHeap(), 0, faces_normal_idx_data);
1542 HeapFree(GetProcessHeap(), 0, faces_vertex_idx_data);
1547 /*** IDirect3DRMMeshBuilder3 methods ***/
1548 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Load(IDirect3DRMMeshBuilder3* iface,
1549 LPVOID filename, LPVOID name,
1550 D3DRMLOADOPTIONS loadflags,
1551 D3DRMLOADTEXTURE3CALLBACK cb, LPVOID arg)
1553 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1554 DXFILELOADOPTIONS load_options;
1555 LPDIRECTXFILE pDXFile = NULL;
1556 LPDIRECTXFILEENUMOBJECT pEnumObject = NULL;
1557 LPDIRECTXFILEDATA pData = NULL;
1558 LPDIRECTXFILEDATA pData2 = NULL;
1563 HRESULT ret = D3DRMERR_BADOBJECT;
1565 TRACE("(%p)->(%p,%p,%x,%p,%p)\n", This, filename, name, loadflags, cb, arg);
1567 clean_mesh_builder_data(This);
1569 if (loadflags == D3DRMLOAD_FROMMEMORY)
1571 load_options = DXFILELOAD_FROMMEMORY;
1573 else if (loadflags == D3DRMLOAD_FROMFILE)
1575 load_options = DXFILELOAD_FROMFILE;
1576 TRACE("Loading from file %s\n", debugstr_a(filename));
1580 FIXME("Load options %d not supported yet\n", loadflags);
1584 hr = DirectXFileCreate(&pDXFile);
1585 if (hr != DXFILE_OK)
1588 hr = IDirectXFile_RegisterTemplates(pDXFile, templates, strlen(templates));
1589 if (hr != DXFILE_OK)
1592 hr = IDirectXFile_CreateEnumObject(pDXFile, filename, load_options, &pEnumObject);
1593 if (hr != DXFILE_OK)
1596 hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
1597 if (hr != DXFILE_OK)
1600 hr = IDirectXFileData_GetType(pData, &pGuid);
1601 if (hr != DXFILE_OK)
1604 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1606 if (!IsEqualGUID(pGuid, &TID_DXFILEHeader))
1608 ret = D3DRMERR_BADFILE;
1612 hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&pHeader);
1613 if ((hr != DXFILE_OK) || (size != sizeof(Header)))
1616 TRACE("Version is %d %d %d\n", pHeader->major, pHeader->minor, pHeader->flags);
1618 /* Version must be 1.0.x */
1619 if ((pHeader->major != 1) || (pHeader->minor != 0))
1621 ret = D3DRMERR_BADFILE;
1625 IDirectXFileData_Release(pData);
1628 hr = IDirectXFileEnumObject_GetNextDataObject(pEnumObject, &pData);
1629 if (hr != DXFILE_OK)
1631 ret = D3DRMERR_NOTFOUND;
1635 hr = IDirectXFileData_GetType(pData, &pGuid);
1636 if (hr != DXFILE_OK)
1639 TRACE("Found object type whose GUID = %s\n", debugstr_guid(pGuid));
1641 if (!IsEqualGUID(pGuid, &TID_D3DRMMesh))
1643 ret = D3DRMERR_NOTFOUND;
1647 /* We don't care about the texture interface version since we rely on QueryInterface */
1648 hr = load_mesh_data(iface, pData, (D3DRMLOADTEXTURECALLBACK)cb, arg);
1655 IDirectXFileData_Release(pData2);
1657 IDirectXFileData_Release(pData);
1659 IDirectXFileEnumObject_Release(pEnumObject);
1661 IDirectXFile_Release(pDXFile);
1663 if (ret != D3DRM_OK)
1664 clean_mesh_builder_data(This);
1669 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Save(IDirect3DRMMeshBuilder3* iface,
1670 const char* filename, D3DRMXOFFORMAT format,
1671 D3DRMSAVEOPTIONS save)
1673 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1675 FIXME("(%p)->(%s,%d,%d): stub\n", This, filename, format, save);
1680 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Scale(IDirect3DRMMeshBuilder3* iface,
1681 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
1683 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1686 TRACE("(%p)->(%f,%f,%f)\n", This, sx, sy, sz);
1688 for (i = 0; i < This->nb_vertices; i++)
1690 This->pVertices[i].u1.x *= sx;
1691 This->pVertices[i].u2.y *= sy;
1692 This->pVertices[i].u3.z *= sz;
1695 /* Normals are not affected by Scale */
1700 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Translate(IDirect3DRMMeshBuilder3* iface,
1701 D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
1703 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1705 FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty, tz);
1710 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColorSource(IDirect3DRMMeshBuilder3* iface,
1711 D3DRMCOLORSOURCE color)
1713 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1715 FIXME("(%p)->(%x): stub\n", This, color);
1720 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetBox(IDirect3DRMMeshBuilder3* iface,
1723 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1725 FIXME("(%p)->(%p): stub\n", This, box);
1730 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GenerateNormals(IDirect3DRMMeshBuilder3* iface,
1731 D3DVALUE crease, DWORD flags)
1733 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1735 FIXME("(%p)->(%f,%u): stub\n", This, crease, flags);
1740 static D3DRMCOLORSOURCE WINAPI IDirect3DRMMeshBuilder3Impl_GetColorSource(IDirect3DRMMeshBuilder3* iface)
1742 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1744 FIXME("(%p)->(): stub\n", This);
1749 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddMesh(IDirect3DRMMeshBuilder3* iface,
1750 LPDIRECT3DRMMESH Mesh)
1752 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1754 FIXME("(%p)->(%p): stub\n", This, Mesh);
1759 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddMeshBuilder(IDirect3DRMMeshBuilder3* iface,
1760 LPDIRECT3DRMMESHBUILDER3 MeshBuilder,
1763 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1765 FIXME("(%p)->(%p,%u): stub\n", This, MeshBuilder, flags);
1770 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFrame(IDirect3DRMMeshBuilder3* iface,
1771 LPDIRECT3DRMFRAME3 Frame)
1773 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1775 FIXME("(%p)->(%p): stub\n", This, Frame);
1780 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFace(IDirect3DRMMeshBuilder3* iface,
1781 LPDIRECT3DRMFACE2 Face)
1783 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1785 FIXME("(%p)->(%p): stub\n", This, Face);
1790 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFaces(IDirect3DRMMeshBuilder3* iface,
1791 DWORD vcount, D3DVECTOR* vertices,
1792 DWORD ncount, D3DVECTOR* normals,
1794 LPDIRECT3DRMFACEARRAY* FaceArray)
1796 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1798 FIXME("(%p)->(%d,%p,%d,%p,%p,%p): stub\n", This, vcount, vertices, ncount,
1799 normals, data, FaceArray);
1804 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_ReserveSpace(IDirect3DRMMeshBuilder3* iface,
1809 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1811 FIXME("(%p)->(%d,%d,%d): stub\n", This, vertex_Count, normal_count, face_count);
1816 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColorRGB(IDirect3DRMMeshBuilder3* iface,
1817 D3DVALUE red, D3DVALUE green,
1820 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1822 TRACE("(%p)->(%f,%f,%f)\n", This, red, green, blue);
1824 This->color = D3DCOLOR_ARGB(0xff, (BYTE)(red * 255.0f),
1825 (BYTE)(green * 255.0f),
1826 (BYTE)(blue * 255.0f));
1831 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetColor(IDirect3DRMMeshBuilder3* iface,
1834 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1836 TRACE("(%p)->(%x)\n", This, color);
1838 This->color = color;
1843 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTexture(IDirect3DRMMeshBuilder3* iface,
1844 LPDIRECT3DRMTEXTURE3 texture)
1846 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1848 TRACE("(%p)->(%p)\n", This, texture);
1851 IDirect3DRMTexture3_AddRef(texture);
1853 IDirect3DRMTexture3_Release(This->texture);
1854 This->texture = texture;
1859 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetMaterial(IDirect3DRMMeshBuilder3* iface,
1860 LPDIRECT3DRMMATERIAL2 material)
1862 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1864 TRACE("(%p)->(%p)\n", This, material);
1867 IDirect3DRMTexture2_AddRef(material);
1869 IDirect3DRMTexture2_Release(This->material);
1870 This->material = material;
1875 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTextureTopology(IDirect3DRMMeshBuilder3* iface,
1876 BOOL wrap_u, BOOL wrap_v)
1878 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1880 FIXME("(%p)->(%d,%d): stub\n", This, wrap_u, wrap_v);
1885 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetQuality(IDirect3DRMMeshBuilder3* iface,
1886 D3DRMRENDERQUALITY quality)
1888 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1890 FIXME("(%p)->(%d): stub\n", This, quality);
1895 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetPerspective(IDirect3DRMMeshBuilder3* iface,
1898 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1900 FIXME("(%p)->(%d): stub\n", This, enable);
1905 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertex(IDirect3DRMMeshBuilder3* iface,
1907 D3DVALUE x, D3DVALUE y, D3DVALUE z)
1909 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1911 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1916 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetNormal(IDirect3DRMMeshBuilder3* iface,
1918 D3DVALUE x, D3DVALUE y, D3DVALUE z)
1920 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1922 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
1927 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetTextureCoordinates(IDirect3DRMMeshBuilder3* iface,
1928 DWORD index, D3DVALUE u,
1931 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1933 TRACE("(%p)->(%u,%f,%f)\n", This, index, u, v);
1935 if (index >= This->nb_coords2d)
1936 return D3DRMERR_BADVALUE;
1938 This->pCoords2d[index].u = u;
1939 This->pCoords2d[index].v = v;
1944 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertexColor(IDirect3DRMMeshBuilder3* iface,
1945 DWORD index, D3DCOLOR color)
1947 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1949 FIXME("(%p)->(%d,%x): stub\n", This, index, color);
1954 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertexColorRGB(IDirect3DRMMeshBuilder3* iface,
1956 D3DVALUE red, D3DVALUE green,
1959 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1961 FIXME("(%p)->(%d,%f,%f,%f): stub\n", This, index, red, green, blue);
1966 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetFaces(IDirect3DRMMeshBuilder3* iface,
1967 LPDIRECT3DRMFACEARRAY* FaceArray)
1969 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1971 FIXME("(%p)->(%p): stub\n", This, FaceArray);
1976 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetGeometry(IDirect3DRMMeshBuilder3* iface,
1977 DWORD* vcount, D3DVECTOR* vertices,
1978 DWORD* ncount, D3DVECTOR* normals,
1979 DWORD* face_data_size,
1982 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1984 FIXME("(%p)->(%p,%p,%p,%p,%p,%p): stub\n", This, vcount, vertices, ncount, normals,
1985 face_data_size, face_data);
1990 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetTextureCoordinates(IDirect3DRMMeshBuilder3* iface,
1991 DWORD index, D3DVALUE* u,
1994 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
1996 TRACE("(%p)->(%d,%p,%p)\n", This, index, u, v);
1998 if (index >= This->nb_coords2d)
1999 return D3DRMERR_BADVALUE;
2001 *u = This->pCoords2d[index].u;
2002 *v = This->pCoords2d[index].v;
2008 static int WINAPI IDirect3DRMMeshBuilder3Impl_AddVertex(IDirect3DRMMeshBuilder3* iface,
2009 D3DVALUE x, D3DVALUE y, D3DVALUE z)
2011 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2013 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
2018 static int WINAPI IDirect3DRMMeshBuilder3Impl_AddNormal(IDirect3DRMMeshBuilder3* iface,
2019 D3DVALUE x, D3DVALUE y, D3DVALUE z)
2021 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2023 FIXME("(%p)->(%f,%f,%f): stub\n", This, x, y, z);
2028 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateFace(IDirect3DRMMeshBuilder3* iface,
2029 LPDIRECT3DRMFACE2* Face)
2031 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2033 FIXME("(%p)->(%p): stub\n", This, Face);
2038 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshBuilder3Impl_GetQuality(IDirect3DRMMeshBuilder3* iface)
2040 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2042 FIXME("(%p)->(): stub\n", This);
2047 static BOOL WINAPI IDirect3DRMMeshBuilder3Impl_GetPerspective(IDirect3DRMMeshBuilder3* iface)
2049 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2051 FIXME("(%p)->(): stub\n", This);
2056 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetFaceCount(IDirect3DRMMeshBuilder3* iface)
2058 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2060 TRACE("(%p)->()\n", This);
2062 return This->nb_faces;
2065 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetVertexCount(IDirect3DRMMeshBuilder3* iface)
2067 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2069 TRACE("(%p)->()\n", This);
2071 return This->nb_vertices;
2074 static D3DCOLOR WINAPI IDirect3DRMMeshBuilder3Impl_GetVertexColor(IDirect3DRMMeshBuilder3* iface,
2077 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2079 FIXME("(%p)->(%d): stub\n", This, index);
2084 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateMesh(IDirect3DRMMeshBuilder3* iface,
2085 LPDIRECT3DRMMESH* mesh)
2087 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2089 D3DRMGROUPINDEX group;
2091 TRACE("(%p)->(%p)\n", This, mesh);
2096 hr = Direct3DRMMesh_create(mesh);
2100 /* If there is mesh data, create a group and put data inside */
2101 if (This->nb_vertices)
2104 D3DRMVERTEX* vertices;
2106 vertices = HeapAlloc(GetProcessHeap(), 0, This->nb_vertices * sizeof(D3DRMVERTEX));
2109 IDirect3DRMMesh_Release(*mesh);
2110 return E_OUTOFMEMORY;
2112 for (i = 0; i < This->nb_vertices; i++)
2113 vertices[i].position = This->pVertices[i];
2114 hr = IDirect3DRMMesh_SetVertices(*mesh, 0, 0, This->nb_vertices, vertices);
2115 HeapFree(GetProcessHeap(), 0, vertices);
2117 /* Groups are in reverse order compared to materials list in X file */
2118 for (k = This->nb_materials - 1; k >= 0; k--)
2120 unsigned* face_data;
2122 DWORD* in_ptr = This->pFaceData;
2123 ULONG vertex_per_face = 0;
2124 BOOL* used_vertices;
2125 unsigned nb_vertices = 0;
2126 unsigned nb_faces = 0;
2128 used_vertices = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->face_data_size * sizeof(*used_vertices));
2131 IDirect3DRMMesh_Release(*mesh);
2132 return E_OUTOFMEMORY;
2135 face_data = HeapAlloc(GetProcessHeap(), 0, This->face_data_size * sizeof(*face_data));
2138 IDirect3DRMMesh_Release(*mesh);
2139 return E_OUTOFMEMORY;
2141 out_ptr = face_data;
2143 /* If all faces have the same number of vertex, set vertex_per_face */
2144 for (i = 0; i < This->nb_faces; i++)
2146 /* Process only faces belonging to the group */
2147 if (This->material_indices[i] == k)
2149 if (vertex_per_face && (vertex_per_face != *in_ptr))
2151 vertex_per_face = *in_ptr;
2153 in_ptr += 1 + *in_ptr * 2;
2155 if (i != This->nb_faces)
2156 vertex_per_face = 0;
2158 /* Put only vertex indices */
2159 in_ptr = This->pFaceData;
2160 for (i = 0; i < This->nb_faces; i++)
2162 DWORD nb_indices = *in_ptr++;
2164 /* Skip faces not belonging to the group */
2165 if (This->material_indices[i] != k)
2167 in_ptr += 2 * nb_indices;
2171 /* Don't put nb indices when vertex_per_face is set */
2172 if (vertex_per_face)
2173 *out_ptr++ = nb_indices;
2175 for (j = 0; j < nb_indices; j++)
2177 *out_ptr = *in_ptr++;
2178 used_vertices[*out_ptr++] = TRUE;
2179 /* Skip normal index */
2186 for (i = 0; i < This->nb_vertices; i++)
2187 if (used_vertices[i])
2190 hr = IDirect3DRMMesh_AddGroup(*mesh, nb_vertices, nb_faces, vertex_per_face, face_data, &group);
2191 HeapFree(GetProcessHeap(), 0, used_vertices);
2192 HeapFree(GetProcessHeap(), 0, face_data);
2194 hr = IDirect3DRMMesh_SetGroupColor(*mesh, group, This->materials[k].color);
2196 hr = IDirect3DRMMesh_SetGroupMaterial(*mesh, group, (LPDIRECT3DRMMATERIAL)This->materials[k].material);
2197 if (SUCCEEDED(hr) && This->materials[k].texture)
2199 LPDIRECT3DRMTEXTURE texture;
2201 IDirect3DRMTexture3_QueryInterface(This->materials[k].texture, &IID_IDirect3DRMTexture, (LPVOID*)&texture);
2202 hr = IDirect3DRMMesh_SetGroupTexture(*mesh, group, texture);
2203 IDirect3DRMTexture_Release(texture);
2207 IDirect3DRMMesh_Release(*mesh);
2216 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetFace(IDirect3DRMMeshBuilder3* iface,
2217 DWORD index, LPDIRECT3DRMFACE2* Face)
2219 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2221 FIXME("(%p)->(%u,%p): stub\n", This, index, Face);
2226 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetVertex(IDirect3DRMMeshBuilder3* iface,
2227 DWORD index, LPD3DVECTOR vector)
2229 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2231 FIXME("(%p)->(%u,%p): stub\n", This, index, vector);
2236 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetNormal(IDirect3DRMMeshBuilder3* iface,
2237 DWORD index, LPD3DVECTOR vector)
2239 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2241 FIXME("(%p)->(%u,%p): stub\n", This, index, vector);
2246 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteVertices(IDirect3DRMMeshBuilder3* iface,
2247 DWORD IndexFirst, DWORD count)
2249 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2251 FIXME("(%p)->(%u,%u): stub\n", This, IndexFirst, count);
2256 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteNormals(IDirect3DRMMeshBuilder3* iface,
2257 DWORD IndexFirst, DWORD count)
2259 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2261 FIXME("(%p)->(%u,%u): stub\n", This, IndexFirst, count);
2266 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteFace(IDirect3DRMMeshBuilder3* iface,
2267 LPDIRECT3DRMFACE2 Face)
2269 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2271 FIXME("(%p)->(%p): stub\n", This, Face);
2276 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Empty(IDirect3DRMMeshBuilder3* iface, DWORD flags)
2278 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2280 FIXME("(%p)->(%u): stub\n", This, flags);
2285 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Optimize(IDirect3DRMMeshBuilder3* iface,
2288 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2290 FIXME("(%p)->(%u): stub\n", This, flags);
2295 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddFacesIndexed(IDirect3DRMMeshBuilder3* iface,
2296 DWORD flags, DWORD* indices,
2297 DWORD* IndexFirst, DWORD* count)
2299 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2301 FIXME("(%p)->(%u,%p,%p,%p): stub\n", This, flags, indices, IndexFirst, count);
2306 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_CreateSubMesh(IDirect3DRMMeshBuilder3* iface,
2309 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2311 FIXME("(%p)->(%p): stub\n", This, unkwn);
2316 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetParentMesh(IDirect3DRMMeshBuilder3* iface,
2317 DWORD flags, LPUNKNOWN *unkwn)
2319 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2321 FIXME("(%p)->(%u,%p): stub\n", This, flags, unkwn);
2326 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetSubMeshes(IDirect3DRMMeshBuilder3* iface,
2327 LPDWORD count, LPUNKNOWN *unkwn)
2329 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2331 FIXME("(%p)->(%p,%p): stub\n", This, count, unkwn);
2336 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_DeleteSubMesh(IDirect3DRMMeshBuilder3* iface,
2339 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2341 FIXME("(%p)->(%p): stub\n", This, unkwn);
2346 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_Enable(IDirect3DRMMeshBuilder3* iface,
2349 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2351 FIXME("(%p)->(%u): stub\n", This, index);
2356 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetEnable(IDirect3DRMMeshBuilder3* iface,
2359 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2361 FIXME("(%p)->(%p): stub\n", This, indices);
2366 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_AddTriangles(IDirect3DRMMeshBuilder3* iface,
2367 DWORD flags, DWORD format,
2368 DWORD VertexCount, LPVOID data)
2370 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2372 FIXME("(%p)->(%u,%u,%u,%p): stub\n", This, flags, format, VertexCount, data);
2377 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetVertices(IDirect3DRMMeshBuilder3* iface,
2378 DWORD IndexFirst, DWORD count,
2381 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2383 FIXME("(%p)->(%u,%u,%p): stub\n", This, IndexFirst, count, vector);
2388 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetVertices(IDirect3DRMMeshBuilder3* iface,
2389 DWORD IndexFirst, LPDWORD vcount,
2390 LPD3DVECTOR vertices)
2392 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2393 DWORD count = This->nb_vertices - IndexFirst;
2395 TRACE("(%p)->(%u,%p,%p)\n", This, IndexFirst, vcount, vertices);
2399 if (vertices && This->nb_vertices)
2400 memcpy(vertices, This->pVertices + IndexFirst, count * sizeof(D3DVECTOR));
2405 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_SetNormals(IDirect3DRMMeshBuilder3* iface,
2406 DWORD IndexFirst, DWORD count,
2409 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2411 FIXME("(%p)->(%u,%u,%p): stub\n", This, IndexFirst, count, vector);
2416 static HRESULT WINAPI IDirect3DRMMeshBuilder3Impl_GetNormals(IDirect3DRMMeshBuilder3* iface,
2417 DWORD IndexFirst, LPDWORD count,
2420 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2422 FIXME("(%p)->(%u,%p,%p): stub\n", This, IndexFirst, count, vector);
2427 static int WINAPI IDirect3DRMMeshBuilder3Impl_GetNormalCount(IDirect3DRMMeshBuilder3* iface)
2429 IDirect3DRMMeshBuilderImpl *This = impl_from_IDirect3DRMMeshBuilder3(iface);
2431 FIXME("(%p)->(): stub\n", This);
2436 static const struct IDirect3DRMMeshBuilder3Vtbl Direct3DRMMeshBuilder3_Vtbl =
2438 /*** IUnknown methods ***/
2439 IDirect3DRMMeshBuilder3Impl_QueryInterface,
2440 IDirect3DRMMeshBuilder3Impl_AddRef,
2441 IDirect3DRMMeshBuilder3Impl_Release,
2442 /*** IDirect3DRMObject methods ***/
2443 IDirect3DRMMeshBuilder3Impl_Clone,
2444 IDirect3DRMMeshBuilder3Impl_AddDestroyCallback,
2445 IDirect3DRMMeshBuilder3Impl_DeleteDestroyCallback,
2446 IDirect3DRMMeshBuilder3Impl_SetAppData,
2447 IDirect3DRMMeshBuilder3Impl_GetAppData,
2448 IDirect3DRMMeshBuilder3Impl_SetName,
2449 IDirect3DRMMeshBuilder3Impl_GetName,
2450 IDirect3DRMMeshBuilder3Impl_GetClassName,
2451 /*** IDirect3DRMMeshBuilder3 methods ***/
2452 IDirect3DRMMeshBuilder3Impl_Load,
2453 IDirect3DRMMeshBuilder3Impl_Save,
2454 IDirect3DRMMeshBuilder3Impl_Scale,
2455 IDirect3DRMMeshBuilder3Impl_Translate,
2456 IDirect3DRMMeshBuilder3Impl_SetColorSource,
2457 IDirect3DRMMeshBuilder3Impl_GetBox,
2458 IDirect3DRMMeshBuilder3Impl_GenerateNormals,
2459 IDirect3DRMMeshBuilder3Impl_GetColorSource,
2460 IDirect3DRMMeshBuilder3Impl_AddMesh,
2461 IDirect3DRMMeshBuilder3Impl_AddMeshBuilder,
2462 IDirect3DRMMeshBuilder3Impl_AddFrame,
2463 IDirect3DRMMeshBuilder3Impl_AddFace,
2464 IDirect3DRMMeshBuilder3Impl_AddFaces,
2465 IDirect3DRMMeshBuilder3Impl_ReserveSpace,
2466 IDirect3DRMMeshBuilder3Impl_SetColorRGB,
2467 IDirect3DRMMeshBuilder3Impl_SetColor,
2468 IDirect3DRMMeshBuilder3Impl_SetTexture,
2469 IDirect3DRMMeshBuilder3Impl_SetMaterial,
2470 IDirect3DRMMeshBuilder3Impl_SetTextureTopology,
2471 IDirect3DRMMeshBuilder3Impl_SetQuality,
2472 IDirect3DRMMeshBuilder3Impl_SetPerspective,
2473 IDirect3DRMMeshBuilder3Impl_SetVertex,
2474 IDirect3DRMMeshBuilder3Impl_SetNormal,
2475 IDirect3DRMMeshBuilder3Impl_SetTextureCoordinates,
2476 IDirect3DRMMeshBuilder3Impl_SetVertexColor,
2477 IDirect3DRMMeshBuilder3Impl_SetVertexColorRGB,
2478 IDirect3DRMMeshBuilder3Impl_GetFaces,
2479 IDirect3DRMMeshBuilder3Impl_GetGeometry,
2480 IDirect3DRMMeshBuilder3Impl_GetTextureCoordinates,
2481 IDirect3DRMMeshBuilder3Impl_AddVertex,
2482 IDirect3DRMMeshBuilder3Impl_AddNormal,
2483 IDirect3DRMMeshBuilder3Impl_CreateFace,
2484 IDirect3DRMMeshBuilder3Impl_GetQuality,
2485 IDirect3DRMMeshBuilder3Impl_GetPerspective,
2486 IDirect3DRMMeshBuilder3Impl_GetFaceCount,
2487 IDirect3DRMMeshBuilder3Impl_GetVertexCount,
2488 IDirect3DRMMeshBuilder3Impl_GetVertexColor,
2489 IDirect3DRMMeshBuilder3Impl_CreateMesh,
2490 IDirect3DRMMeshBuilder3Impl_GetFace,
2491 IDirect3DRMMeshBuilder3Impl_GetVertex,
2492 IDirect3DRMMeshBuilder3Impl_GetNormal,
2493 IDirect3DRMMeshBuilder3Impl_DeleteVertices,
2494 IDirect3DRMMeshBuilder3Impl_DeleteNormals,
2495 IDirect3DRMMeshBuilder3Impl_DeleteFace,
2496 IDirect3DRMMeshBuilder3Impl_Empty,
2497 IDirect3DRMMeshBuilder3Impl_Optimize,
2498 IDirect3DRMMeshBuilder3Impl_AddFacesIndexed,
2499 IDirect3DRMMeshBuilder3Impl_CreateSubMesh,
2500 IDirect3DRMMeshBuilder3Impl_GetParentMesh,
2501 IDirect3DRMMeshBuilder3Impl_GetSubMeshes,
2502 IDirect3DRMMeshBuilder3Impl_DeleteSubMesh,
2503 IDirect3DRMMeshBuilder3Impl_Enable,
2504 IDirect3DRMMeshBuilder3Impl_GetEnable,
2505 IDirect3DRMMeshBuilder3Impl_AddTriangles,
2506 IDirect3DRMMeshBuilder3Impl_SetVertices,
2507 IDirect3DRMMeshBuilder3Impl_GetVertices,
2508 IDirect3DRMMeshBuilder3Impl_SetNormals,
2509 IDirect3DRMMeshBuilder3Impl_GetNormals,
2510 IDirect3DRMMeshBuilder3Impl_GetNormalCount
2513 HRESULT Direct3DRMMeshBuilder_create(REFIID riid, IUnknown** ppObj)
2515 IDirect3DRMMeshBuilderImpl* object;
2517 TRACE("(%p)\n", ppObj);
2519 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMeshBuilderImpl));
2522 ERR("Out of memory\n");
2523 return E_OUTOFMEMORY;
2526 object->IDirect3DRMMeshBuilder2_iface.lpVtbl = &Direct3DRMMeshBuilder2_Vtbl;
2527 object->IDirect3DRMMeshBuilder3_iface.lpVtbl = &Direct3DRMMeshBuilder3_Vtbl;
2530 if (IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
2531 *ppObj = (IUnknown*)&object->IDirect3DRMMeshBuilder3_iface;
2533 *ppObj = (IUnknown*)&object->IDirect3DRMMeshBuilder2_iface;
2538 /*** IUnknown methods ***/
2539 static HRESULT WINAPI IDirect3DRMMeshImpl_QueryInterface(IDirect3DRMMesh* iface,
2540 REFIID riid, void** ppvObject)
2542 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2544 TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppvObject);
2548 if (IsEqualGUID(riid, &IID_IUnknown) ||
2549 IsEqualGUID(riid, &IID_IDirect3DRMMesh))
2551 *ppvObject = &This->IDirect3DRMMesh_iface;
2555 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2556 return E_NOINTERFACE;
2559 IDirect3DRMMesh_AddRef(iface);
2563 static ULONG WINAPI IDirect3DRMMeshImpl_AddRef(IDirect3DRMMesh* iface)
2565 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2566 ULONG ref = InterlockedIncrement(&This->ref);
2568 TRACE("(%p)->(): new ref = %d\n", This, ref);
2573 static ULONG WINAPI IDirect3DRMMeshImpl_Release(IDirect3DRMMesh* iface)
2575 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2576 ULONG ref = InterlockedDecrement(&This->ref);
2578 TRACE("(%p)->(): new ref = %d\n", This, ref);
2584 for (i = 0; i < This->nb_groups; i++)
2586 HeapFree(GetProcessHeap(), 0, This->groups[i].vertices);
2587 HeapFree(GetProcessHeap(), 0, This->groups[i].face_data);
2588 if (This->groups[i].material)
2589 IDirect3DRMMaterial2_Release(This->groups[i].material);
2590 if (This->groups[i].texture)
2591 IDirect3DRMTexture3_Release(This->groups[i].texture);
2593 HeapFree(GetProcessHeap(), 0, This->groups);
2594 HeapFree(GetProcessHeap(), 0, This);
2600 /*** IDirect3DRMObject methods ***/
2601 static HRESULT WINAPI IDirect3DRMMeshImpl_Clone(IDirect3DRMMesh* iface,
2602 LPUNKNOWN pUnkOuter, REFIID riid,
2605 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2607 FIXME("(%p)->(%p,%s,%p): stub\n", This, pUnkOuter, debugstr_guid(riid), ppvObj);
2612 static HRESULT WINAPI IDirect3DRMMeshImpl_AddDestroyCallback(IDirect3DRMMesh* iface,
2613 D3DRMOBJECTCALLBACK cb,
2616 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2618 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
2623 static HRESULT WINAPI IDirect3DRMMeshImpl_DeleteDestroyCallback(IDirect3DRMMesh* iface,
2624 D3DRMOBJECTCALLBACK cb,
2627 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2629 FIXME("(%p)->(%p,%p): stub\n", This, cb, argument);
2634 static HRESULT WINAPI IDirect3DRMMeshImpl_SetAppData(IDirect3DRMMesh* iface,
2637 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2639 FIXME("(%p)->(%u): stub\n", This, data);
2644 static DWORD WINAPI IDirect3DRMMeshImpl_GetAppData(IDirect3DRMMesh* iface)
2646 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2648 FIXME("(%p)->(): stub\n", This);
2653 static HRESULT WINAPI IDirect3DRMMeshImpl_SetName(IDirect3DRMMesh* iface,
2656 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2658 FIXME("(%p)->(%s): stub\n", This, pName);
2663 static HRESULT WINAPI IDirect3DRMMeshImpl_GetName(IDirect3DRMMesh* iface,
2664 LPDWORD lpdwSize, LPSTR lpName)
2666 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2668 FIXME("(%p)->(%p,%p): stub\n", This, lpdwSize, lpName);
2673 static HRESULT WINAPI IDirect3DRMMeshImpl_GetClassName(IDirect3DRMMesh* iface,
2674 LPDWORD size, LPSTR name)
2676 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2678 TRACE("(%p)->(%p, %p)\n", This, size, name);
2680 if (!size || *size < strlen("Mesh") || !name)
2681 return E_INVALIDARG;
2683 strcpy(name, "Mesh");
2684 *size = sizeof("Mesh");
2689 /*** IDirect3DRMMesh methods ***/
2690 static HRESULT WINAPI IDirect3DRMMeshImpl_Scale(IDirect3DRMMesh* iface,
2691 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
2693 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2695 FIXME("(%p)->(%f,%f,%f): stub\n", This, sx, sy,sz);
2700 static HRESULT WINAPI IDirect3DRMMeshImpl_Translate(IDirect3DRMMesh* iface,
2701 D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
2703 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2705 FIXME("(%p)->(%f,%f,%f): stub\n", This, tx, ty,tz);
2710 static HRESULT WINAPI IDirect3DRMMeshImpl_GetBox(IDirect3DRMMesh* iface,
2713 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2715 FIXME("(%p)->(%p): stub\n", This, box);
2720 static HRESULT WINAPI IDirect3DRMMeshImpl_AddGroup(IDirect3DRMMesh* iface,
2721 unsigned vertex_count, unsigned face_count, unsigned vertex_per_face,
2722 unsigned *face_data, D3DRMGROUPINDEX *return_id)
2724 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2727 TRACE("(%p)->(%u,%u,%u,%p,%p)\n", This, vertex_count, face_count, vertex_per_face, face_data, return_id);
2729 if (!face_data || !return_id)
2732 if ((This->nb_groups + 1) > This->groups_capacity)
2737 if (!This->groups_capacity)
2740 groups = HeapAlloc(GetProcessHeap(), 0, new_capacity * sizeof(mesh_group));
2744 new_capacity = This->groups_capacity * 2;
2745 groups = HeapReAlloc(GetProcessHeap(), 0, This->groups, new_capacity * sizeof(mesh_group));
2749 return E_OUTOFMEMORY;
2751 This->groups_capacity = new_capacity;
2752 This->groups = groups;
2755 group = This->groups + This->nb_groups;
2757 group->vertices = HeapAlloc(GetProcessHeap(), 0, vertex_count * sizeof(D3DRMVERTEX));
2758 if (!group->vertices)
2759 return E_OUTOFMEMORY;
2760 group->nb_vertices = vertex_count;
2761 group->nb_faces = face_count;
2762 group->vertex_per_face = vertex_per_face;
2764 if (vertex_per_face)
2766 group->face_data_size = face_count * vertex_per_face;
2771 unsigned nb_indices;
2772 unsigned* face_data_ptr = face_data;
2773 group->face_data_size = 0;
2775 for (i = 0; i < face_count; i++)
2777 nb_indices = *face_data_ptr;
2778 group->face_data_size += nb_indices + 1;
2779 face_data_ptr += nb_indices;
2783 group->face_data = HeapAlloc(GetProcessHeap(), 0, group->face_data_size * sizeof(unsigned));
2784 if (!group->face_data)
2786 HeapFree(GetProcessHeap(), 0 , group->vertices);
2787 return E_OUTOFMEMORY;
2790 memcpy(group->face_data, face_data, group->face_data_size * sizeof(unsigned));
2792 group->material = NULL;
2793 group->texture = NULL;
2795 *return_id = This->nb_groups++;
2800 static HRESULT WINAPI IDirect3DRMMeshImpl_SetVertices(IDirect3DRMMesh* iface,
2801 D3DRMGROUPINDEX id, unsigned index, unsigned count,
2802 D3DRMVERTEX *values)
2804 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2806 TRACE("(%p)->(%u,%u,%u,%p)\n", This, id, index, count, values);
2808 if (id >= This->nb_groups)
2809 return D3DRMERR_BADVALUE;
2811 if ((index + count - 1) >= This->groups[id].nb_vertices)
2812 return D3DRMERR_BADVALUE;
2817 memcpy(This->groups[id].vertices + index, values, count * sizeof(D3DRMVERTEX));
2822 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupColor(IDirect3DRMMesh* iface,
2823 D3DRMGROUPINDEX id, D3DCOLOR color)
2825 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2827 TRACE("(%p)->(%u,%x)\n", This, id, color);
2829 if (id >= This->nb_groups)
2830 return D3DRMERR_BADVALUE;
2832 This->groups[id].color = color;
2837 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupColorRGB(IDirect3DRMMesh* iface,
2838 D3DRMGROUPINDEX id, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
2840 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2842 TRACE("(%p)->(%u,%f,%f,%f)\n", This, id, red, green, blue);
2844 if (id >= This->nb_groups)
2845 return D3DRMERR_BADVALUE;
2847 This->groups[id].color = D3DCOLOR_ARGB(0xff, (BYTE)(red * 255.0f),
2848 (BYTE)(green * 255.0f),
2849 (BYTE)(blue * 255.0f));
2854 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupMapping(IDirect3DRMMesh* iface,
2855 D3DRMGROUPINDEX id, D3DRMMAPPING value)
2857 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2859 FIXME("(%p)->(%u,%u): stub\n", This, id, value);
2864 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupQuality(IDirect3DRMMesh* iface,
2865 D3DRMGROUPINDEX id, D3DRMRENDERQUALITY value)
2867 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2869 FIXME("(%p)->(%u,%u): stub\n", This, id, value);
2874 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupMaterial(IDirect3DRMMesh* iface,
2875 D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL material)
2877 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2879 TRACE("(%p)->(%u,%p)\n", This, id, material);
2881 if (id >= This->nb_groups)
2882 return D3DRMERR_BADVALUE;
2884 if (This->groups[id].material)
2885 IDirect3DRMMaterial2_Release(This->groups[id].material);
2887 This->groups[id].material = (LPDIRECT3DRMMATERIAL2)material;
2890 IDirect3DRMMaterial2_AddRef(This->groups[id].material);
2895 static HRESULT WINAPI IDirect3DRMMeshImpl_SetGroupTexture(IDirect3DRMMesh* iface,
2896 D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE texture)
2898 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2900 TRACE("(%p)->(%u,%p)\n", This, id, texture);
2902 if (id >= This->nb_groups)
2903 return D3DRMERR_BADVALUE;
2905 if (This->groups[id].texture)
2906 IDirect3DRMTexture3_Release(This->groups[id].texture);
2910 This->groups[id].texture = NULL;
2914 return IDirect3DRMTexture3_QueryInterface(texture, &IID_IDirect3DRMTexture, (LPVOID*)&This->groups[id].texture);
2917 static DWORD WINAPI IDirect3DRMMeshImpl_GetGroupCount(IDirect3DRMMesh* iface)
2919 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2921 TRACE("(%p)->()\n", This);
2923 return This->nb_groups;
2926 static HRESULT WINAPI IDirect3DRMMeshImpl_GetGroup(IDirect3DRMMesh* iface,
2927 D3DRMGROUPINDEX id, unsigned *vertex_count, unsigned *face_count, unsigned *vertex_per_face,
2928 DWORD *face_data_size, unsigned *face_data)
2930 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2932 TRACE("(%p)->(%u,%p,%p,%p,%p,%p)\n", This, id, vertex_count, face_count, vertex_per_face, face_data_size, face_data);
2934 if (id >= This->nb_groups)
2935 return D3DRMERR_BADVALUE;
2938 *vertex_count = This->groups[id].nb_vertices;
2940 *face_count = This->groups[id].nb_faces;
2941 if (vertex_per_face)
2942 *vertex_per_face = This->groups[id].vertex_per_face;
2944 *face_data_size = This->groups[id].face_data_size;
2946 memcpy(face_data, This->groups[id].face_data, This->groups[id].face_data_size * sizeof(DWORD));
2951 static HRESULT WINAPI IDirect3DRMMeshImpl_GetVertices(IDirect3DRMMesh* iface,
2952 D3DRMGROUPINDEX id, DWORD index, DWORD count, D3DRMVERTEX *return_ptr)
2954 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2956 TRACE("(%p)->(%u,%u,%u,%p)\n", This, id, index, count, return_ptr);
2958 if (id >= This->nb_groups)
2959 return D3DRMERR_BADVALUE;
2961 if ((index + count - 1) >= This->groups[id].nb_vertices)
2962 return D3DRMERR_BADVALUE;
2967 memcpy(return_ptr, This->groups[id].vertices + index, count * sizeof(D3DRMVERTEX));
2972 static D3DCOLOR WINAPI IDirect3DRMMeshImpl_GetGroupColor(IDirect3DRMMesh* iface, D3DRMGROUPINDEX id)
2974 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2976 TRACE("(%p)->(%u)\n", This, id);
2978 return This->groups[id].color;
2981 static D3DRMMAPPING WINAPI IDirect3DRMMeshImpl_GetGroupMapping(IDirect3DRMMesh* iface, D3DRMGROUPINDEX id)
2983 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2985 FIXME("(%p)->(%u): stub\n", This, id);
2989 static D3DRMRENDERQUALITY WINAPI IDirect3DRMMeshImpl_GetGroupQuality(IDirect3DRMMesh* iface, D3DRMGROUPINDEX id)
2991 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
2993 FIXME("(%p)->(%u): stub\n", This, id);
2998 static HRESULT WINAPI IDirect3DRMMeshImpl_GetGroupMaterial(IDirect3DRMMesh* iface,
2999 D3DRMGROUPINDEX id, LPDIRECT3DRMMATERIAL *material)
3001 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
3003 TRACE("(%p)->(%u,%p)\n", This, id, material);
3005 if (id >= This->nb_groups)
3006 return D3DRMERR_BADVALUE;
3011 if (This->groups[id].material)
3012 IDirect3DRMTexture_QueryInterface(This->groups[id].material, &IID_IDirect3DRMMaterial, (void**)material);
3019 static HRESULT WINAPI IDirect3DRMMeshImpl_GetGroupTexture(IDirect3DRMMesh* iface,
3020 D3DRMGROUPINDEX id, LPDIRECT3DRMTEXTURE *texture)
3022 IDirect3DRMMeshImpl *This = impl_from_IDirect3DRMMesh(iface);
3024 TRACE("(%p)->(%u,%p)\n", This, id, texture);
3026 if (id >= This->nb_groups)
3027 return D3DRMERR_BADVALUE;
3032 if (This->groups[id].texture)
3033 IDirect3DRMTexture_QueryInterface(This->groups[id].texture, &IID_IDirect3DRMTexture, (void**)texture);
3040 static const struct IDirect3DRMMeshVtbl Direct3DRMMesh_Vtbl =
3042 /*** IUnknown methods ***/
3043 IDirect3DRMMeshImpl_QueryInterface,
3044 IDirect3DRMMeshImpl_AddRef,
3045 IDirect3DRMMeshImpl_Release,
3046 /*** IDirect3DRMObject methods ***/
3047 IDirect3DRMMeshImpl_Clone,
3048 IDirect3DRMMeshImpl_AddDestroyCallback,
3049 IDirect3DRMMeshImpl_DeleteDestroyCallback,
3050 IDirect3DRMMeshImpl_SetAppData,
3051 IDirect3DRMMeshImpl_GetAppData,
3052 IDirect3DRMMeshImpl_SetName,
3053 IDirect3DRMMeshImpl_GetName,
3054 IDirect3DRMMeshImpl_GetClassName,
3055 /*** IDirect3DRMMesh methods ***/
3056 IDirect3DRMMeshImpl_Scale,
3057 IDirect3DRMMeshImpl_Translate,
3058 IDirect3DRMMeshImpl_GetBox,
3059 IDirect3DRMMeshImpl_AddGroup,
3060 IDirect3DRMMeshImpl_SetVertices,
3061 IDirect3DRMMeshImpl_SetGroupColor,
3062 IDirect3DRMMeshImpl_SetGroupColorRGB,
3063 IDirect3DRMMeshImpl_SetGroupMapping,
3064 IDirect3DRMMeshImpl_SetGroupQuality,
3065 IDirect3DRMMeshImpl_SetGroupMaterial,
3066 IDirect3DRMMeshImpl_SetGroupTexture,
3067 IDirect3DRMMeshImpl_GetGroupCount,
3068 IDirect3DRMMeshImpl_GetGroup,
3069 IDirect3DRMMeshImpl_GetVertices,
3070 IDirect3DRMMeshImpl_GetGroupColor,
3071 IDirect3DRMMeshImpl_GetGroupMapping,
3072 IDirect3DRMMeshImpl_GetGroupQuality,
3073 IDirect3DRMMeshImpl_GetGroupMaterial,
3074 IDirect3DRMMeshImpl_GetGroupTexture
3077 HRESULT Direct3DRMMesh_create(IDirect3DRMMesh** obj)
3079 IDirect3DRMMeshImpl* object;
3081 TRACE("(%p)\n", obj);
3083 object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMMeshImpl));
3086 ERR("Out of memory\n");
3087 return E_OUTOFMEMORY;
3090 object->IDirect3DRMMesh_iface.lpVtbl = &Direct3DRMMesh_Vtbl;
3093 *obj = &object->IDirect3DRMMesh_iface;