ReactOS 0.4.17-dev-966-gf06eace
meshbuilder.c
Go to the documentation of this file.
1/*
2 * Implementation of IDirect3DRMMeshBuilderX and IDirect3DRMMesh interfaces
3 *
4 * Copyright 2010, 2012 Christian Costa
5 * Copyright 2011 André Hentschel
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22#include "d3drm_private.h"
23
25
27{
30};
31
33{
35 IDirect3DRMMaterial2 *material;
36 IDirect3DRMTexture3 *texture;
37};
38
39char templates[] = {
40"xof 0302txt 0064"
41"template Header"
42"{"
43"<3D82AB43-62DA-11CF-AB39-0020AF71E433>"
44"WORD major;"
45"WORD minor;"
46"DWORD flags;"
47"}"
48"template Vector"
49"{"
50"<3D82AB5E-62DA-11CF-AB39-0020AF71E433>"
51"FLOAT x;"
52"FLOAT y;"
53"FLOAT z;"
54"}"
55"template Coords2d"
56"{"
57"<F6F23F44-7686-11CF-8F52-0040333594A3>"
58"FLOAT u;"
59"FLOAT v;"
60"}"
61"template Matrix4x4"
62"{"
63"<F6F23F45-7686-11CF-8F52-0040333594A3>"
64"array FLOAT matrix[16];"
65"}"
66"template ColorRGBA"
67"{"
68"<35FF44E0-6C7C-11CF-8F52-0040333594A3>"
69"FLOAT red;"
70"FLOAT green;"
71"FLOAT blue;"
72"FLOAT alpha;"
73"}"
74"template ColorRGB"
75"{"
76"<D3E16E81-7835-11CF-8F52-0040333594A3>"
77"FLOAT red;"
78"FLOAT green;"
79"FLOAT blue;"
80"}"
81"template IndexedColor"
82"{"
83"<1630B820-7842-11CF-8F52-0040333594A3>"
84"DWORD index;"
85"ColorRGBA indexColor;"
86"}"
87"template Boolean"
88"{"
89"<537DA6A0-CA37-11D0-941C-0080C80CFA7B>"
90"DWORD truefalse;"
91"}"
92"template Boolean2d"
93"{"
94"<4885AE63-78E8-11CF-8F52-0040333594A3>"
95"Boolean u;"
96"Boolean v;"
97"}"
98"template MaterialWrap"
99"{"
100"<4885AE60-78E8-11CF-8F52-0040333594A3>"
101"Boolean u;"
102"Boolean v;"
103"}"
104"template TextureFilename"
105"{"
106"<A42790E1-7810-11CF-8F52-0040333594A3>"
107"STRING filename;"
108"}"
109"template Material"
110"{"
111"<3D82AB4D-62DA-11CF-AB39-0020AF71E433>"
112"ColorRGBA faceColor;"
113"FLOAT power;"
114"ColorRGB specularColor;"
115"ColorRGB emissiveColor;"
116"[...]"
117"}"
118"template MeshFace"
119"{"
120"<3D82AB5F-62DA-11CF-AB39-0020AF71E433>"
121"DWORD nFaceVertexIndices;"
122"array DWORD faceVertexIndices[nFaceVertexIndices];"
123"}"
124"template MeshFaceWraps"
125"{"
126"<ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B>"
127"DWORD nFaceWrapValues;"
128"array Boolean2d faceWrapValues[nFaceWrapValues];"
129"}"
130"template MeshTextureCoords"
131"{"
132"<F6F23F40-7686-11CF-8F52-0040333594A3>"
133"DWORD nTextureCoords;"
134"array Coords2d textureCoords[nTextureCoords];"
135"}"
136"template MeshMaterialList"
137"{"
138"<F6F23F42-7686-11CF-8F52-0040333594A3>"
139"DWORD nMaterials;"
140"DWORD nFaceIndexes;"
141"array DWORD faceIndexes[nFaceIndexes];"
142"[Material]"
143"}"
144"template MeshNormals"
145"{"
146"<F6F23F43-7686-11CF-8F52-0040333594A3>"
147"DWORD nNormals;"
148"array Vector normals[nNormals];"
149"DWORD nFaceNormals;"
150"array MeshFace faceNormals[nFaceNormals];"
151"}"
152"template MeshVertexColors"
153"{"
154"<1630B821-7842-11CF-8F52-0040333594A3>"
155"DWORD nVertexColors;"
156"array IndexedColor vertexColors[nVertexColors];"
157"}"
158"template Mesh"
159"{"
160"<3D82AB44-62DA-11CF-AB39-0020AF71E433>"
161"DWORD nVertices;"
162"array Vector vertices[nVertices];"
163"DWORD nFaces;"
164"array MeshFace faces[nFaces];"
165"[...]"
166"}"
167"template FrameTransformMatrix"
168"{"
169"<F6F23F41-7686-11CF-8F52-0040333594A3>"
170"Matrix4x4 frameMatrix;"
171"}"
172"template Frame"
173"{"
174"<3D82AB46-62DA-11CF-AB39-0020AF71E433>"
175"[...]"
176"}"
177"template FloatKeys"
178"{"
179"<10DD46A9-775B-11CF-8F52-0040333594A3>"
180"DWORD nValues;"
181"array FLOAT values[nValues];"
182"}"
183"template TimedFloatKeys"
184"{"
185"<F406B180-7B3B-11CF-8F52-0040333594A3>"
186"DWORD time;"
187"FloatKeys tfkeys;"
188"}"
189"template AnimationKey"
190"{"
191"<10DD46A8-775B-11CF-8F52-0040333594A3>"
192"DWORD keyType;"
193"DWORD nKeys;"
194"array TimedFloatKeys keys[nKeys];"
195"}"
196"template AnimationOptions"
197"{"
198"<E2BF56C0-840F-11CF-8F52-0040333594A3>"
199"DWORD openclosed;"
200"DWORD positionquality;"
201"}"
202"template Animation"
203"{"
204"<3D82AB4F-62DA-11CF-AB39-0020AF71E433>"
205"[...]"
206"}"
207"template AnimationSet"
208"{"
209"<3D82AB50-62DA-11CF-AB39-0020AF71E433>"
210"[Animation]"
211"}"
212"template InlineData"
213"{"
214"<3A23EEA0-94B1-11D0-AB39-0020AF71E433>"
215"[BINARY]"
216"}"
217"template Url"
218"{"
219"<3A23EEA1-94B1-11D0-AB39-0020AF71E433>"
220"DWORD nUrls;"
221"array STRING urls[nUrls];"
222"}"
223"template ProgressiveMesh"
224"{"
225"<8A63C360-997D-11D0-941C-0080C80CFA7B>"
226"[Url,InlineData]"
227"}"
228"template Guid"
229"{"
230"<A42790E0-7810-11CF-8F52-0040333594A3>"
231"DWORD data1;"
232"WORD data2;"
233"WORD data3;"
234"array UCHAR data4[8];"
235"}"
236"template StringProperty"
237"{"
238"<7F0F21E0-BFE1-11D1-82C0-00A0C9697271>"
239"STRING key;"
240"STRING value;"
241"}"
242"template PropertyBag"
243"{"
244"<7F0F21E1-BFE1-11D1-82C0-00A0C9697271>"
245"[StringProperty]"
246"}"
247"template ExternalVisual"
248"{"
249"<98116AA0-BDBA-11D1-82C0-00A0C9697271>"
250"Guid guidExternalVisual;"
251"[...]"
252"}"
253"template RightHanded"
254"{"
255"<7F5D5EA0-D53A-11D1-82C0-00A0C9697271>"
256"DWORD bRightHanded;"
257"}"
258};
259
261{
262 SIZE_T new_capacity, max_capacity;
263 void *new_elements;
264
265 if (element_count <= *capacity)
266 return TRUE;
267
268 max_capacity = ~(SIZE_T)0 / element_size;
269 if (max_capacity < element_count)
270 return FALSE;
271
272 new_capacity = max(*capacity, 4);
273 while (new_capacity < element_count && new_capacity <= max_capacity / 2)
274 new_capacity *= 2;
275
276 if (new_capacity < element_count)
277 new_capacity = max_capacity;
278
279 if (!(new_elements = realloc(*elements, new_capacity * element_size)))
280 return FALSE;
281
282 *elements = new_elements;
283 *capacity = new_capacity;
284 return TRUE;
285}
286
287static inline struct d3drm_mesh *impl_from_IDirect3DRMMesh(IDirect3DRMMesh *iface)
288{
290}
291
292static inline struct d3drm_mesh_builder *impl_from_IDirect3DRMMeshBuilder2(IDirect3DRMMeshBuilder2 *iface)
293{
295}
296
297static inline struct d3drm_mesh_builder *impl_from_IDirect3DRMMeshBuilder3(IDirect3DRMMeshBuilder3 *iface)
298{
300}
301
302static inline struct d3drm_wrap *impl_from_IDirect3DRMWrap(IDirect3DRMWrap *iface)
303{
305}
306
308{
309 DWORD i;
310
311 IDirect3DRMMeshBuilder3_SetName(&mesh_builder->IDirect3DRMMeshBuilder3_iface, NULL);
312 free(mesh_builder->vertices);
313 mesh_builder->vertices = NULL;
314 mesh_builder->nb_vertices = 0;
315 mesh_builder->vertices_size = 0;
316 free(mesh_builder->normals);
317 mesh_builder->normals = NULL;
318 mesh_builder->nb_normals = 0;
319 mesh_builder->normals_size = 0;
320 free(mesh_builder->pFaceData);
321 mesh_builder->pFaceData = NULL;
322 mesh_builder->face_data_size = 0;
323 mesh_builder->nb_faces = 0;
324 free(mesh_builder->pCoords2d);
325 mesh_builder->pCoords2d = NULL;
326 mesh_builder->nb_coords2d = 0;
327 for (i = 0; i < mesh_builder->nb_materials; i++)
328 {
329 if (mesh_builder->materials[i].material)
330 IDirect3DRMMaterial2_Release(mesh_builder->materials[i].material);
331 if (mesh_builder->materials[i].texture)
332 IDirect3DRMTexture3_Release(mesh_builder->materials[i].texture);
333 }
334 mesh_builder->nb_materials = 0;
335 free(mesh_builder->materials);
336 mesh_builder->materials = NULL;
337 free(mesh_builder->material_indices);
338 mesh_builder->material_indices = NULL;
339}
340
341static HRESULT WINAPI d3drm_mesh_builder2_QueryInterface(IDirect3DRMMeshBuilder2 *iface, REFIID riid, void **out)
342{
344
345 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
346
347 if (IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder2)
348 || IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder)
349 || IsEqualGUID(riid, &IID_IDirect3DRMVisual)
350 || IsEqualGUID(riid, &IID_IDirect3DRMObject)
352 {
353 *out = &mesh_builder->IDirect3DRMMeshBuilder2_iface;
354 }
355 else if (IsEqualGUID(riid, &IID_IDirect3DRMMeshBuilder3))
356 {
357 *out = &mesh_builder->IDirect3DRMMeshBuilder3_iface;
358 }
359 else
360 {
361 *out = NULL;
362 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
363 return E_NOINTERFACE;
364 }
365
366 IUnknown_AddRef((IUnknown *)*out);
367 return S_OK;
368}
369
370static ULONG WINAPI d3drm_mesh_builder2_AddRef(IDirect3DRMMeshBuilder2 *iface)
371{
373 ULONG refcount = InterlockedIncrement(&mesh_builder->ref);
374
375 TRACE("%p increasing refcount to %lu.\n", mesh_builder, refcount);
376
377 return refcount;
378}
379
380static ULONG WINAPI d3drm_mesh_builder2_Release(IDirect3DRMMeshBuilder2 *iface)
381{
383 ULONG refcount = InterlockedDecrement(&mesh_builder->ref);
384
385 TRACE("%p decreasing refcount to %lu.\n", mesh_builder, refcount);
386
387 if (!refcount)
388 {
389 d3drm_object_cleanup((IDirect3DRMObject *)iface, &mesh_builder->obj);
391 if (mesh_builder->material)
393 if (mesh_builder->texture)
397 }
398
399 return refcount;
400}
401
402static HRESULT WINAPI d3drm_mesh_builder2_Clone(IDirect3DRMMeshBuilder2 *iface,
403 IUnknown *outer, REFIID iid, void **out)
404{
405 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
406
407 return E_NOTIMPL;
408}
409
410static HRESULT WINAPI d3drm_mesh_builder2_AddDestroyCallback(IDirect3DRMMeshBuilder2 *iface,
412{
414
415 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
416
417 return IDirect3DRMMeshBuilder3_AddDestroyCallback(&mesh_builder->IDirect3DRMMeshBuilder3_iface, cb, ctx);
418}
419
420static HRESULT WINAPI d3drm_mesh_builder2_DeleteDestroyCallback(IDirect3DRMMeshBuilder2 *iface,
422{
424
425 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
426
427 return IDirect3DRMMeshBuilder3_DeleteDestroyCallback(&mesh_builder->IDirect3DRMMeshBuilder3_iface, cb, ctx);
428}
429
430static HRESULT WINAPI d3drm_mesh_builder3_SetAppData(IDirect3DRMMeshBuilder3 *iface, DWORD data)
431{
433
434 TRACE("iface %p, data %#lx.\n", iface, data);
435
436 mesh_builder->obj.appdata = data;
437
438 return D3DRM_OK;
439}
440
441static HRESULT WINAPI d3drm_mesh_builder2_SetAppData(IDirect3DRMMeshBuilder2 *iface, DWORD data)
442{
444
445 TRACE("iface %p, data %#lx.\n", iface, data);
446
447 return d3drm_mesh_builder3_SetAppData(&mesh_builder->IDirect3DRMMeshBuilder3_iface, data);
448}
449
450static DWORD WINAPI d3drm_mesh_builder3_GetAppData(IDirect3DRMMeshBuilder3 *iface)
451{
453
454 TRACE("iface %p.\n", iface);
455
456 return mesh_builder->obj.appdata;
457}
458
459static DWORD WINAPI d3drm_mesh_builder2_GetAppData(IDirect3DRMMeshBuilder2 *iface)
460{
462
463 TRACE("iface %p.\n", iface);
464
465 return d3drm_mesh_builder3_GetAppData(&mesh_builder->IDirect3DRMMeshBuilder3_iface);
466}
467
468static HRESULT WINAPI d3drm_mesh_builder2_SetName(IDirect3DRMMeshBuilder2 *iface, const char *name)
469{
471
472 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
473
474 return IDirect3DRMMeshBuilder3_SetName(&mesh_builder->IDirect3DRMMeshBuilder3_iface, name);
475}
476
477static HRESULT WINAPI d3drm_mesh_builder2_GetName(IDirect3DRMMeshBuilder2 *iface, DWORD *size, char *name)
478{
480
481 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
482
483 return IDirect3DRMMeshBuilder3_GetName(&mesh_builder->IDirect3DRMMeshBuilder3_iface, size, name);
484}
485
486static HRESULT WINAPI d3drm_mesh_builder2_GetClassName(IDirect3DRMMeshBuilder2 *iface, DWORD *size, char *name)
487{
489
490 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
491
492 return IDirect3DRMMeshBuilder3_GetClassName(&mesh_builder->IDirect3DRMMeshBuilder3_iface, size, name);
493}
494
495static HRESULT WINAPI d3drm_mesh_builder2_Load(IDirect3DRMMeshBuilder2 *iface, void *filename,
497{
499
500 TRACE("iface %p, filename %p, name %p, flags %#lx, cb %p, ctx %p.\n",
501 iface, filename, name, flags, cb, ctx);
502
503 if (cb)
504 FIXME("Texture callback is not yet supported\n");
505
506 return IDirect3DRMMeshBuilder3_Load(&mesh_builder->IDirect3DRMMeshBuilder3_iface,
508}
509
510static HRESULT WINAPI d3drm_mesh_builder2_Save(IDirect3DRMMeshBuilder2 *iface,
512{
513 FIXME("iface %p, filename %s, format %#x, flags %#lx stub!\n",
514 iface, debugstr_a(filename), format, flags);
515
516 return E_NOTIMPL;
517}
518
519static HRESULT WINAPI d3drm_mesh_builder2_Scale(IDirect3DRMMeshBuilder2 *iface,
520 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
521{
523
524 TRACE("iface %p, sx %.8e, sy %.8e, sz %.8e.\n", iface, sx, sy, sz);
525
526 return IDirect3DRMMeshBuilder3_Scale(&mesh_builder->IDirect3DRMMeshBuilder3_iface, sx, sy, sz);
527}
528
529static HRESULT WINAPI d3drm_mesh_builder2_Translate(IDirect3DRMMeshBuilder2 *iface,
531{
532 FIXME("iface %p, tx %.8e, ty %.8e, tz %.8e stub!\n", iface, tx, ty, tz);
533
534 return E_NOTIMPL;
535}
536
538{
539 FIXME("iface %p, source %#x stub!\n", iface, source);
540
541 return E_NOTIMPL;
542}
543
544static HRESULT WINAPI d3drm_mesh_builder2_GetBox(IDirect3DRMMeshBuilder2 *iface, D3DRMBOX *box)
545{
546 FIXME("iface %p, box %p stub!\n", iface, box);
547
548 return E_NOTIMPL;
549}
550
551static HRESULT WINAPI d3drm_mesh_builder2_GenerateNormals(IDirect3DRMMeshBuilder2 *iface)
552{
553 FIXME("iface %p stub!\n", iface);
554
555 return E_NOTIMPL;
556}
557
558static D3DRMCOLORSOURCE WINAPI d3drm_mesh_builder2_GetColorSource(IDirect3DRMMeshBuilder2 *iface)
559{
560 FIXME("iface %p stub!\n", iface);
561
562 return E_NOTIMPL;
563}
564
565static HRESULT WINAPI d3drm_mesh_builder2_AddMesh(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMMesh *mesh)
566{
567 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
568
569 return E_NOTIMPL;
570}
571
572static HRESULT WINAPI d3drm_mesh_builder2_AddMeshBuilder(IDirect3DRMMeshBuilder2 *iface,
573 IDirect3DRMMeshBuilder *mesh_builder)
574{
575 FIXME("iface %p, mesh_builder %p stub!\n", iface, mesh_builder);
576
577 return E_NOTIMPL;
578}
579
580static HRESULT WINAPI d3drm_mesh_builder2_AddFrame(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMFrame *frame)
581{
582 FIXME("iface %p, frame %p stub!\n", iface, frame);
583
584 return E_NOTIMPL;
585}
586
587static HRESULT WINAPI d3drm_mesh_builder2_AddFace(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMFace *face)
588{
589 FIXME("iface %p, face %p stub!\n", iface, face);
590
591 return E_NOTIMPL;
592}
593
594static HRESULT WINAPI d3drm_mesh_builder2_AddFaces(IDirect3DRMMeshBuilder2 *iface,
596 DWORD *face_data, IDirect3DRMFaceArray **array)
597{
598 FIXME("iface %p, vertex_count %lu, vertices %p, normal_count %lu, normals %p, face_data %p, array %p stub!\n",
599 iface, vertex_count, vertices, normal_count, normals, face_data, array);
600
601 return E_NOTIMPL;
602}
603
604static HRESULT WINAPI d3drm_mesh_builder2_ReserveSpace(IDirect3DRMMeshBuilder2 *iface,
605 DWORD vertex_count, DWORD normal_count, DWORD face_count)
606{
607 FIXME("iface %p, vertex_count %lu, normal_count %lu, face_count %lu stub!\n",
608 iface, vertex_count, normal_count, face_count);
609
610 return E_NOTIMPL;
611}
612
613static HRESULT WINAPI d3drm_mesh_builder2_SetColorRGB(IDirect3DRMMeshBuilder2 *iface,
615{
617
618 TRACE("iface %p, red %.8e, green %.8e, blue %.8e.\n", iface, red, green, blue);
619
620 return IDirect3DRMMeshBuilder3_SetColorRGB(&mesh_builder->IDirect3DRMMeshBuilder3_iface, red, green, blue);
621}
622
623static HRESULT WINAPI d3drm_mesh_builder2_SetColor(IDirect3DRMMeshBuilder2 *iface, D3DCOLOR color)
624{
626
627 TRACE("iface %p, color 0x%08lx.\n", iface, color);
628
629 return IDirect3DRMMeshBuilder3_SetColor(&mesh_builder->IDirect3DRMMeshBuilder3_iface, color);
630}
631
632static HRESULT WINAPI d3drm_mesh_builder2_SetTexture(IDirect3DRMMeshBuilder2 *iface,
633 IDirect3DRMTexture *texture)
634{
636 IDirect3DRMTexture3 *texture3 = NULL;
638
639 TRACE("iface %p, texture %p.\n", iface, texture);
640
641 if (texture)
642 hr = IDirect3DRMTexture_QueryInterface(texture, &IID_IDirect3DRMTexture3, (void **)&texture3);
643 if (SUCCEEDED(hr))
644 hr = IDirect3DRMMeshBuilder3_SetTexture(&mesh_builder->IDirect3DRMMeshBuilder3_iface, texture3);
645 if (texture3)
647
648 return hr;
649}
650
651static HRESULT WINAPI d3drm_mesh_builder2_SetMaterial(IDirect3DRMMeshBuilder2 *iface,
652 IDirect3DRMMaterial *material)
653{
655
656 TRACE("iface %p, material %p.\n", iface, material);
657
658 return IDirect3DRMMeshBuilder3_SetMaterial(&mesh_builder->IDirect3DRMMeshBuilder3_iface,
659 (IDirect3DRMMaterial2 *)material);
660}
661
662static HRESULT WINAPI d3drm_mesh_builder2_SetTextureTopology(IDirect3DRMMeshBuilder2 *iface,
663 BOOL wrap_u, BOOL wrap_v)
664{
665 FIXME("iface %p, wrap_u %#x, wrap_v %#x stub!\n", iface, wrap_u, wrap_v);
666
667 return E_NOTIMPL;
668}
669
670static HRESULT WINAPI d3drm_mesh_builder2_SetQuality(IDirect3DRMMeshBuilder2 *iface,
672{
674 TRACE("iface %p, quality %#lx\n", iface, quality);
675
676 return IDirect3DRMMeshBuilder3_SetQuality(&mesh_builder->IDirect3DRMMeshBuilder3_iface, quality);
677}
678
679static HRESULT WINAPI d3drm_mesh_builder2_SetPerspective(IDirect3DRMMeshBuilder2 *iface, BOOL enable)
680{
681 FIXME("iface %p, enable %#x stub!\n", iface, enable);
682
683 return E_NOTIMPL;
684}
685
686static HRESULT WINAPI d3drm_mesh_builder2_SetVertex(IDirect3DRMMeshBuilder2 *iface,
688{
689 FIXME("iface %p, index %lu, x %.8e, y %.8e, z %.8e stub!\n", iface, index, x, y, z);
690
691 return E_NOTIMPL;
692}
693
694static HRESULT WINAPI d3drm_mesh_builder2_SetNormal(IDirect3DRMMeshBuilder2 *iface,
696{
697 FIXME("iface %p, index %lu, x %.8e, y %.8e, z %.8e stub!\n", iface, index, x, y, z);
698
699 return E_NOTIMPL;
700}
701
702static HRESULT WINAPI d3drm_mesh_builder2_SetTextureCoordinates(IDirect3DRMMeshBuilder2 *iface,
704{
706
707 TRACE("iface %p, index %lu, u %.8e, v %.8e.\n", iface, index, u, v);
708
709 return IDirect3DRMMeshBuilder3_SetTextureCoordinates(&mesh_builder->IDirect3DRMMeshBuilder3_iface,
710 index, u, v);
711}
712
713static HRESULT WINAPI d3drm_mesh_builder2_SetVertexColor(IDirect3DRMMeshBuilder2 *iface,
715{
716 FIXME("iface %p, index %lu, color 0x%08lx stub!\n", iface, index, color);
717
718 return E_NOTIMPL;
719}
720
721static HRESULT WINAPI d3drm_mesh_builder2_SetVertexColorRGB(IDirect3DRMMeshBuilder2 *iface,
723{
724 FIXME("iface %p, index %lu, red %.8e, green %.8e, blue %.8e stub!\n",
725 iface, index, red, green, blue);
726
727 return E_NOTIMPL;
728}
729
730static HRESULT WINAPI d3drm_mesh_builder2_GetFaces(IDirect3DRMMeshBuilder2 *iface,
731 IDirect3DRMFaceArray **array)
732{
733 FIXME("iface %p, array %p stub!\n", iface, array);
734
735 return E_NOTIMPL;
736}
737
738static HRESULT WINAPI d3drm_mesh_builder2_GetVertices(IDirect3DRMMeshBuilder2 *iface,
740 DWORD *face_data_size, DWORD *face_data)
741{
743
744 TRACE("iface %p, vertex_count %p, vertices %p, normal_count %p, normals %p, face_data_size %p, face_data %p.\n",
745 iface, vertex_count, vertices, normal_count, normals, face_data_size, face_data);
746
747 if (vertices && (!vertex_count || (*vertex_count < mesh_builder->nb_vertices)))
748 return D3DRMERR_BADVALUE;
749 if (vertex_count)
750 *vertex_count = mesh_builder->nb_vertices;
751 if (vertices && mesh_builder->nb_vertices)
752 memcpy(vertices, mesh_builder->vertices, mesh_builder->nb_vertices * sizeof(*vertices));
753
754 if (normals && (!normal_count || (*normal_count < mesh_builder->nb_normals)))
755 return D3DRMERR_BADVALUE;
756 if (normal_count)
757 *normal_count = mesh_builder->nb_normals;
758 if (normals && mesh_builder->nb_normals)
759 memcpy(normals, mesh_builder->normals, mesh_builder->nb_normals * sizeof(*normals));
760
761 if (face_data && (!face_data_size || (*face_data_size < mesh_builder->face_data_size)))
762 return D3DRMERR_BADVALUE;
763 if (face_data_size)
764 *face_data_size = mesh_builder->face_data_size;
765 if (face_data && mesh_builder->face_data_size)
766 memcpy(face_data, mesh_builder->pFaceData, mesh_builder->face_data_size * sizeof(*face_data));
767
768 return D3DRM_OK;
769}
770
771static HRESULT WINAPI d3drm_mesh_builder2_GetTextureCoordinates(IDirect3DRMMeshBuilder2 *iface,
773{
775
776 TRACE("iface %p, index %lu, u %p, v %p.\n", iface, index, u, v);
777
778 return IDirect3DRMMeshBuilder3_GetTextureCoordinates(&mesh_builder->IDirect3DRMMeshBuilder3_iface,
779 index, u, v);
780}
781
782static int WINAPI d3drm_mesh_builder2_AddVertex(IDirect3DRMMeshBuilder2 *iface,
784{
786
787 TRACE("iface %p, x %.8e, y %.8e, z %.8e.\n", iface, x, y, z);
788
789 return IDirect3DRMMeshBuilder3_AddVertex(&mesh_builder->IDirect3DRMMeshBuilder3_iface, x, y, z);
790}
791
792static int WINAPI d3drm_mesh_builder2_AddNormal(IDirect3DRMMeshBuilder2 *iface,
794{
796
797 TRACE("iface %p, x %.8e, y %.8e, z %.8e.\n", iface, x, y, z);
798
799 return IDirect3DRMMeshBuilder3_AddNormal(&mesh_builder->IDirect3DRMMeshBuilder3_iface, x, y, z);
800}
801
802static HRESULT WINAPI d3drm_mesh_builder2_CreateFace(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMFace **face)
803{
804 struct d3drm_face *object;
805 HRESULT hr;
806
807 TRACE("iface %p, face %p.\n", iface, face);
808
809 if (FAILED(hr = d3drm_face_create(&object)))
810 return hr;
811
812 *face = &object->IDirect3DRMFace_iface;
813
814 return S_OK;
815}
816
817static D3DRMRENDERQUALITY WINAPI d3drm_mesh_builder2_GetQuality(IDirect3DRMMeshBuilder2 *iface)
818{
820
821 TRACE("iface %p\n", iface);
822
823 return mesh_builder->quality;
824}
825
826static BOOL WINAPI d3drm_mesh_builder2_GetPerspective(IDirect3DRMMeshBuilder2 *iface)
827{
828 FIXME("iface %p stub!\n", iface);
829
830 return FALSE;
831}
832
833static int WINAPI d3drm_mesh_builder2_GetFaceCount(IDirect3DRMMeshBuilder2 *iface)
834{
836
837 TRACE("iface %p.\n", iface);
838
839 return mesh_builder->nb_faces;
840}
841
842static int WINAPI d3drm_mesh_builder2_GetVertexCount(IDirect3DRMMeshBuilder2 *iface)
843{
845
846 TRACE("iface %p.\n", iface);
847
848 return mesh_builder->nb_vertices;
849}
850
851static D3DCOLOR WINAPI d3drm_mesh_builder2_GetVertexColor(IDirect3DRMMeshBuilder2 *iface, DWORD index)
852{
853 FIXME("iface %p, index %lu stub!\n", iface, index);
854
855 return 0;
856}
857
858static HRESULT WINAPI d3drm_mesh_builder2_CreateMesh(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMMesh **mesh)
859{
861
862 TRACE("iface %p, mesh %p.\n", iface, mesh);
863
864 return IDirect3DRMMeshBuilder3_CreateMesh(&mesh_builder->IDirect3DRMMeshBuilder3_iface, mesh);
865}
866
867static HRESULT WINAPI d3drm_mesh_builder2_GenerateNormals2(IDirect3DRMMeshBuilder2 *iface,
868 D3DVALUE crease, DWORD flags)
869{
870 FIXME("iface %p, crease %.8e, flags %#lx stub!\n", iface, crease, flags);
871
872 return E_NOTIMPL;
873}
874
875static HRESULT WINAPI d3drm_mesh_builder2_GetFace(IDirect3DRMMeshBuilder2 *iface,
876 DWORD index, IDirect3DRMFace **face)
877{
878 FIXME("iface %p, index %lu, face %p stub!\n", iface, index, face);
879
880 return E_NOTIMPL;
881}
882
883static const struct IDirect3DRMMeshBuilder2Vtbl d3drm_mesh_builder2_vtbl =
884{
936};
937
938static HRESULT WINAPI d3drm_mesh_builder3_QueryInterface(IDirect3DRMMeshBuilder3 *iface, REFIID riid, void **out)
939{
941
942 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
943
944 return d3drm_mesh_builder2_QueryInterface(&mesh_builder->IDirect3DRMMeshBuilder2_iface, riid, out);
945}
946
947static ULONG WINAPI d3drm_mesh_builder3_AddRef(IDirect3DRMMeshBuilder3 *iface)
948{
950
951 TRACE("iface %p.\n", iface);
952
953 return d3drm_mesh_builder2_AddRef(&mesh_builder->IDirect3DRMMeshBuilder2_iface);
954}
955
956static ULONG WINAPI d3drm_mesh_builder3_Release(IDirect3DRMMeshBuilder3 *iface)
957{
959
960 TRACE("iface %p.\n", iface);
961
962 return d3drm_mesh_builder2_Release(&mesh_builder->IDirect3DRMMeshBuilder2_iface);
963}
964
965static HRESULT WINAPI d3drm_mesh_builder3_Clone(IDirect3DRMMeshBuilder3 *iface,
966 IUnknown *outer, REFIID iid, void **out)
967{
968 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
969
970 return E_NOTIMPL;
971}
972
973static HRESULT WINAPI d3drm_mesh_builder3_AddDestroyCallback(IDirect3DRMMeshBuilder3 *iface,
975{
977
978 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
979
981}
982
983static HRESULT WINAPI d3drm_mesh_builder3_DeleteDestroyCallback(IDirect3DRMMeshBuilder3 *iface,
985{
987
988 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
989
991}
992
993static HRESULT WINAPI d3drm_mesh_builder3_SetName(IDirect3DRMMeshBuilder3 *iface, const char *name)
994{
996
997 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
998
1000}
1001
1002static HRESULT WINAPI d3drm_mesh_builder3_GetName(IDirect3DRMMeshBuilder3 *iface,
1003 DWORD *size, char *name)
1004{
1006
1007 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
1008
1010}
1011
1012static HRESULT WINAPI d3drm_mesh_builder3_GetClassName(IDirect3DRMMeshBuilder3 *iface,
1013 DWORD *size, char *name)
1014{
1015 struct d3drm_mesh_builder *meshbuilder = impl_from_IDirect3DRMMeshBuilder3(iface);
1016
1017 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
1018
1019 return d3drm_object_get_class_name(&meshbuilder->obj, size, name);
1020}
1021
1022HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData,
1023 D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg)
1024{
1026 IDirectXFileData *pData2 = NULL;
1027 const GUID* guid;
1028 DWORD size;
1029 BYTE *ptr;
1030 HRESULT hr;
1032 DWORD* faces_vertex_idx_data = NULL;
1033 DWORD* faces_vertex_idx_ptr;
1034 DWORD faces_vertex_idx_size;
1035 DWORD* faces_normal_idx_data = NULL;
1036 DWORD* faces_normal_idx_ptr = NULL;
1037 DWORD* faces_data_ptr;
1038 DWORD faces_data_size = 0;
1039 DWORD i;
1040
1041 TRACE("(%p)->(%p)\n", mesh_builder, pData);
1042
1044 if (hr != DXFILE_OK)
1045 return hr;
1046 if (size)
1047 {
1048 char *name;
1049
1050 if (!(name = malloc(size)))
1051 return E_OUTOFMEMORY;
1052
1055 free(name);
1056 if (hr != DXFILE_OK)
1057 return hr;
1058 }
1059
1060 TRACE("Mesh name is %s\n", debugstr_a(mesh_builder->obj.name));
1061
1062 mesh_builder->nb_normals = 0;
1063
1064 hr = IDirectXFileData_GetData(pData, NULL, &size, (void**)&ptr);
1065 if (hr != DXFILE_OK)
1066 goto end;
1067
1068 mesh_builder->nb_vertices = *(DWORD*)ptr;
1069 mesh_builder->nb_faces = *(DWORD*)(ptr + sizeof(DWORD) + mesh_builder->nb_vertices * sizeof(D3DVECTOR));
1070 faces_vertex_idx_size = size - sizeof(DWORD) - mesh_builder->nb_vertices * sizeof(D3DVECTOR) - sizeof(DWORD);
1071
1072 TRACE("Mesh: nb_vertices = %Iu, nb_faces = %ld, faces_vertex_idx_size = %ld\n", mesh_builder->nb_vertices,
1073 mesh_builder->nb_faces, faces_vertex_idx_size);
1074
1075 if (!d3drm_array_reserve((void **)&mesh_builder->vertices, &mesh_builder->vertices_size, mesh_builder->nb_vertices,
1076 sizeof(*mesh_builder->vertices)))
1077 {
1078 hr = E_OUTOFMEMORY;
1079 goto end;
1080 }
1081 memcpy(mesh_builder->vertices, ptr + sizeof(DWORD), mesh_builder->nb_vertices * sizeof(D3DVECTOR));
1082
1083 faces_vertex_idx_ptr = faces_vertex_idx_data = malloc(faces_vertex_idx_size);
1084 memcpy(faces_vertex_idx_data, ptr + sizeof(DWORD) + mesh_builder->nb_vertices * sizeof(D3DVECTOR) + sizeof(DWORD),
1085 faces_vertex_idx_size);
1086
1087 /* Each vertex index will have its normal index counterpart so just allocate twice the size */
1088 mesh_builder->pFaceData = malloc(faces_vertex_idx_size * 2);
1089 faces_data_ptr = (DWORD*)mesh_builder->pFaceData;
1090
1091 while (1)
1092 {
1093 IDirectXFileObject *object;
1094
1097 {
1098 TRACE("No more object\n");
1099 break;
1100 }
1101 if (hr != DXFILE_OK)
1102 goto end;
1103
1104 hr = IDirectXFileObject_QueryInterface(object, &IID_IDirectXFileData, (void**)&pData2);
1106 if (hr != DXFILE_OK)
1107 goto end;
1108
1109 hr = IDirectXFileData_GetType(pData2, &guid);
1110 if (hr != DXFILE_OK)
1111 goto end;
1112
1113 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
1114
1115 if (IsEqualGUID(guid, &TID_D3DRMMeshNormals))
1116 {
1117 DWORD nb_faces_normals;
1118 DWORD faces_normal_idx_size;
1119
1120 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1121 if (hr != DXFILE_OK)
1122 goto end;
1123
1124 mesh_builder->nb_normals = *(DWORD*)ptr;
1125 nb_faces_normals = *(DWORD*)(ptr + sizeof(DWORD) + mesh_builder->nb_normals * sizeof(D3DVECTOR));
1126
1127 TRACE("MeshNormals: nb_normals = %Iu, nb_faces_normals = %ld\n", mesh_builder->nb_normals, nb_faces_normals);
1128 if (nb_faces_normals != mesh_builder->nb_faces)
1129 WARN("nb_face_normals (%ld) != nb_faces (%ld)\n", nb_faces_normals, mesh_builder->nb_faces);
1130
1131 if (!d3drm_array_reserve((void **)&mesh_builder->normals, &mesh_builder->normals_size,
1132 mesh_builder->nb_normals, sizeof(*mesh_builder->normals)))
1133 {
1134 hr = E_OUTOFMEMORY;
1135 goto end;
1136 }
1137 memcpy(mesh_builder->normals, ptr + sizeof(DWORD), mesh_builder->nb_normals * sizeof(D3DVECTOR));
1138
1139 faces_normal_idx_size = size - (2 * sizeof(DWORD) + mesh_builder->nb_normals * sizeof(D3DVECTOR));
1140 faces_normal_idx_ptr = faces_normal_idx_data = malloc(faces_normal_idx_size);
1141 memcpy(faces_normal_idx_data, ptr + sizeof(DWORD) + mesh_builder->nb_normals * sizeof(D3DVECTOR)
1142 + sizeof(DWORD), faces_normal_idx_size);
1143 }
1144 else if (IsEqualGUID(guid, &TID_D3DRMMeshTextureCoords))
1145 {
1146 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1147 if (hr != DXFILE_OK)
1148 goto end;
1149
1150 mesh_builder->nb_coords2d = *(DWORD*)ptr;
1151
1152 TRACE("MeshTextureCoords: nb_coords2d = %ld\n", mesh_builder->nb_coords2d);
1153
1154 mesh_builder->pCoords2d = calloc(mesh_builder->nb_coords2d, sizeof(*mesh_builder->pCoords2d));
1155 memcpy(mesh_builder->pCoords2d, ptr + sizeof(DWORD), mesh_builder->nb_coords2d * sizeof(*mesh_builder->pCoords2d));
1156 }
1157 else if (IsEqualGUID(guid, &TID_D3DRMMeshMaterialList))
1158 {
1160 DWORD nb_face_indices;
1161 DWORD data_size;
1162 IDirectXFileObject *child;
1163 DWORD i = 0;
1164 float* values;
1165 struct d3drm_texture *texture_object;
1166
1167 TRACE("Process MeshMaterialList\n");
1168
1169 hr = IDirectXFileData_GetData(pData2, NULL, &size, (void**)&ptr);
1170 if (hr != DXFILE_OK)
1171 goto end;
1172
1173 nb_materials = *(DWORD*)ptr;
1174 nb_face_indices = *(DWORD*)(ptr + sizeof(DWORD));
1175 data_size = 2 * sizeof(DWORD) + nb_face_indices * sizeof(DWORD);
1176
1177 TRACE("nMaterials = %lu, nFaceIndexes = %lu\n", nb_materials, nb_face_indices);
1178
1179 if (size != data_size)
1180 WARN("Returned size %lu does not match expected one %lu\n", size, data_size);
1181
1182 if (!(mesh_builder->material_indices = calloc(nb_face_indices,
1183 sizeof(*mesh_builder->material_indices))))
1184 goto end;
1185 memcpy(mesh_builder->material_indices, ptr + 2 * sizeof(DWORD),
1186 nb_face_indices * sizeof(*mesh_builder->material_indices));
1187
1188 if (!(mesh_builder->materials = calloc(nb_materials, sizeof(*mesh_builder->materials))))
1189 {
1190 free(mesh_builder->material_indices);
1191 goto end;
1192 }
1193 mesh_builder->nb_materials = nb_materials;
1194
1195 while (SUCCEEDED(hr = IDirectXFileData_GetNextObject(pData2, &child)) && (i < nb_materials))
1196 {
1197 IDirectXFileData *data;
1198 IDirectXFileDataReference *reference;
1199 IDirectXFileObject *material_child;
1200 struct d3drm_material *object;
1201
1202 hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileData, (void **)&data);
1203 if (FAILED(hr))
1204 {
1205 hr = IDirectXFileObject_QueryInterface(child, &IID_IDirectXFileDataReference, (void **)&reference);
1207 if (FAILED(hr))
1208 goto end;
1209
1212 if (FAILED(hr))
1213 goto end;
1214 }
1215 else
1216 {
1218 }
1219
1220 hr = d3drm_material_create(&object, mesh_builder->d3drm);
1221 if (FAILED(hr))
1222 {
1224 goto end;
1225 }
1226 mesh_builder->materials[i].material = &object->IDirect3DRMMaterial2_iface;
1227
1228 hr = IDirectXFileData_GetData(data, NULL, &size, (void**)&ptr);
1229 if (hr != DXFILE_OK)
1230 {
1232 goto end;
1233 }
1234
1235 if (size != 44)
1236 WARN("Material size %lu does not match expected one %u\n", size, 44);
1237
1238 values = (float*)ptr;
1239
1240 d3drm_set_color(&mesh_builder->materials[i].color, values[0], values[1], values[2], values[3]);
1241
1242 IDirect3DRMMaterial2_SetAmbient(mesh_builder->materials[i].material, values[0], values [1], values[2]); /* Alpha ignored */
1243 IDirect3DRMMaterial2_SetPower(mesh_builder->materials[i].material, values[4]);
1244 IDirect3DRMMaterial2_SetSpecular(mesh_builder->materials[i].material, values[5], values[6], values[7]);
1245 IDirect3DRMMaterial2_SetEmissive(mesh_builder->materials[i].material, values[8], values[9], values[10]);
1246
1247 mesh_builder->materials[i].texture = NULL;
1248
1249 hr = IDirectXFileData_GetNextObject(data, &material_child);
1250 if (hr == S_OK)
1251 {
1252 IDirectXFileData *data;
1253 char **filename;
1254
1255 if (FAILED(hr = IDirectXFileObject_QueryInterface(material_child,
1256 &IID_IDirectXFileData, (void **)&data)))
1257 {
1258 IDirectXFileDataReference *reference;
1259
1261 &IID_IDirectXFileDataReference, (void **)&reference)))
1262 {
1265 }
1266 }
1267 IDirectXFileObject_Release(material_child);
1268 if (FAILED(hr))
1269 goto end;
1270
1272 if (hr != DXFILE_OK)
1273 goto end;
1274 if (!IsEqualGUID(guid, &TID_D3DRMTextureFilename))
1275 {
1276 WARN("Not a texture filename\n");
1277 goto end;
1278 }
1279
1280 size = 4;
1282 if (SUCCEEDED(hr))
1283 {
1284 if (load_texture_proc)
1285 {
1286 IDirect3DRMTexture *texture;
1287
1288 hr = load_texture_proc(*filename, arg, &texture);
1289 if (SUCCEEDED(hr))
1290 {
1291 hr = IDirect3DTexture_QueryInterface(texture, &IID_IDirect3DRMTexture3,
1292 (void **)&mesh_builder->materials[i].texture);
1294 }
1295 }
1296 else
1297 {
1298 HANDLE file;
1299
1300 /* If the texture file is not found, no texture is associated with the material */
1303 {
1305 if (FAILED(hr = d3drm_texture_create(&texture_object, NULL)))
1306 {
1308 goto end;
1309 }
1310 mesh_builder->materials[i].texture = &texture_object->IDirect3DRMTexture3_iface;
1311 }
1312 }
1313 }
1315 }
1316 else if (hr != DXFILEERR_NOMOREOBJECTS)
1317 {
1318 goto end;
1319 }
1320 hr = S_OK;
1321
1323 i++;
1324 }
1325 if (hr == S_OK)
1326 {
1328 WARN("Found more sub-objects than expected\n");
1329 }
1330 else if (hr != DXFILEERR_NOMOREOBJECTS)
1331 {
1332 goto end;
1333 }
1334 hr = S_OK;
1335 }
1336 else
1337 {
1338 FIXME("Unknown GUID %s, ignoring...\n", debugstr_guid(guid));
1339 }
1340
1342 pData2 = NULL;
1343 }
1344
1345 if (!mesh_builder->nb_normals)
1346 {
1347 /* Allocate normals, one per vertex */
1348 if (!d3drm_array_reserve((void **)&mesh_builder->normals, &mesh_builder->normals_size,
1349 mesh_builder->nb_vertices, sizeof(*mesh_builder->normals)))
1350 goto end;
1351 memset(mesh_builder->normals, 0, mesh_builder->nb_vertices * sizeof(*mesh_builder->normals));
1352 }
1353
1354 for (i = 0; i < mesh_builder->nb_faces; i++)
1355 {
1356 DWORD j;
1357 DWORD nb_face_indexes;
1358 D3DVECTOR face_normal;
1359
1360 if (faces_vertex_idx_size < sizeof(DWORD))
1361 WARN("Not enough data to read number of indices of face %ld\n", i);
1362
1363 nb_face_indexes = *(faces_data_ptr + faces_data_size++) = *(faces_vertex_idx_ptr++);
1364 faces_vertex_idx_size--;
1365 if (faces_normal_idx_data && (*(faces_normal_idx_ptr++) != nb_face_indexes))
1366 WARN("Faces indices number mismatch\n");
1367
1368 if (faces_vertex_idx_size < (nb_face_indexes * sizeof(DWORD)))
1369 WARN("Not enough data to read all indices of face %ld\n", i);
1370
1371 if (!mesh_builder->nb_normals)
1372 {
1373 /* Compute face normal */
1374 if (nb_face_indexes > 2
1375 && faces_vertex_idx_ptr[0] < mesh_builder->nb_vertices
1376 && faces_vertex_idx_ptr[1] < mesh_builder->nb_vertices
1377 && faces_vertex_idx_ptr[2] < mesh_builder->nb_vertices)
1378 {
1379 D3DVECTOR a, b;
1380
1381 D3DRMVectorSubtract(&a, &mesh_builder->vertices[faces_vertex_idx_ptr[2]], &mesh_builder->vertices[faces_vertex_idx_ptr[1]]);
1382 D3DRMVectorSubtract(&b, &mesh_builder->vertices[faces_vertex_idx_ptr[0]], &mesh_builder->vertices[faces_vertex_idx_ptr[1]]);
1383 D3DRMVectorCrossProduct(&face_normal, &a, &b);
1384 D3DRMVectorNormalize(&face_normal);
1385 }
1386 else
1387 {
1388 face_normal.x = 0.0f;
1389 face_normal.y = 0.0f;
1390 face_normal.z = 0.0f;
1391 }
1392 }
1393
1394 for (j = 0; j < nb_face_indexes; j++)
1395 {
1396 /* Copy vertex index */
1397 *(faces_data_ptr + faces_data_size++) = *faces_vertex_idx_ptr;
1398 /* Copy normal index */
1399 if (mesh_builder->nb_normals)
1400 {
1401 /* Read from x file */
1402 *(faces_data_ptr + faces_data_size++) = *(faces_normal_idx_ptr++);
1403 }
1404 else
1405 {
1406 DWORD vertex_idx = *faces_vertex_idx_ptr;
1407 if (vertex_idx >= mesh_builder->nb_vertices)
1408 {
1409 WARN("Found vertex index %lu but only %Iu vertices available => use index 0\n", vertex_idx,
1410 mesh_builder->nb_vertices);
1411 vertex_idx = 0;
1412 }
1413 *(faces_data_ptr + faces_data_size++) = vertex_idx;
1414 /* Add face normal to vertex normal */
1415 D3DRMVectorAdd(&mesh_builder->normals[vertex_idx], &mesh_builder->normals[vertex_idx], &face_normal);
1416 }
1417 faces_vertex_idx_ptr++;
1418 }
1419 faces_vertex_idx_size -= nb_face_indexes;
1420 }
1421
1422 /* Last DWORD must be 0 */
1423 *(faces_data_ptr + faces_data_size++) = 0;
1424
1425 /* Set size (in number of DWORD) of all faces data */
1426 mesh_builder->face_data_size = faces_data_size;
1427
1428 if (!mesh_builder->nb_normals)
1429 {
1430 /* Normalize all normals */
1431 for (i = 0; i < mesh_builder->nb_vertices; i++)
1432 {
1434 }
1435 mesh_builder->nb_normals = mesh_builder->nb_vertices;
1436 }
1437
1438 /* If there is no texture coordinates, generate default texture coordinates (0.0f, 0.0f) for each vertex */
1439 if (!mesh_builder->pCoords2d)
1440 {
1441 mesh_builder->nb_coords2d = mesh_builder->nb_vertices;
1442 mesh_builder->pCoords2d = calloc(mesh_builder->nb_coords2d, sizeof(*mesh_builder->pCoords2d));
1443 for (i = 0; i < mesh_builder->nb_coords2d; ++i)
1444 {
1445 mesh_builder->pCoords2d[i].u = 0.0f;
1446 mesh_builder->pCoords2d[i].v = 0.0f;
1447 }
1448 }
1449
1450 TRACE("Mesh data loaded successfully\n");
1451
1452 ret = D3DRM_OK;
1453
1454end:
1455
1456 free(faces_normal_idx_data);
1457 free(faces_vertex_idx_data);
1458
1459 return ret;
1460}
1461
1462static HRESULT WINAPI d3drm_mesh_builder3_Load(IDirect3DRMMeshBuilder3 *iface, void *filename,
1463 void *name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURE3CALLBACK cb, void *arg)
1464{
1465 static const DWORD supported_flags = D3DRMLOAD_FROMFILE | D3DRMLOAD_FROMRESOURCE
1468 DXFILELOADOPTIONS load_options = loadflags & supported_flags;
1469 IDirectXFile *dxfile = NULL;
1470 IDirectXFileEnumObject *enum_object = NULL;
1471 IDirectXFileData *data = NULL;
1472 const GUID* guid;
1473 DWORD size;
1474 struct d3drm_file_header *header;
1475 HRESULT hr;
1477
1478 TRACE("iface %p, filename %p, name %p, loadflags %#lx, cb %p, arg %p.\n",
1479 iface, filename, name, loadflags, cb, arg);
1480
1481 if (loadflags & ~supported_flags)
1482 FIXME("Ignoring flags %#lx.\n", loadflags & ~supported_flags);
1483
1485
1486 hr = DirectXFileCreate(&dxfile);
1487 if (hr != DXFILE_OK)
1488 goto end;
1489
1491 if (hr != DXFILE_OK)
1492 goto end;
1493
1494 hr = IDirectXFile_CreateEnumObject(dxfile, filename, load_options, &enum_object);
1495 if (hr != DXFILE_OK)
1496 {
1497 WARN("Failed to create object, load flags %#lx.\n", loadflags);
1498 goto end;
1499 }
1500
1502 if (hr != DXFILE_OK)
1503 goto end;
1504
1506 if (hr != DXFILE_OK)
1507 goto end;
1508
1509 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
1510
1511 if (!IsEqualGUID(guid, &TID_DXFILEHeader))
1512 {
1514 goto end;
1515 }
1516
1518 if ((hr != DXFILE_OK) || (size != sizeof(*header)))
1519 goto end;
1520
1521 TRACE("Version is %u.%u, flags %#lx.\n", header->major, header->minor, header->flags);
1522
1523 /* Version must be 1.0.x */
1524 if ((header->major != 1) || (header->minor != 0))
1525 {
1527 goto end;
1528 }
1529
1531 data = NULL;
1532
1534 if (hr != DXFILE_OK)
1535 {
1537 goto end;
1538 }
1539
1541 if (hr != DXFILE_OK)
1542 goto end;
1543
1544 TRACE("Found object type whose GUID = %s\n", debugstr_guid(guid));
1545
1546 if (!IsEqualGUID(guid, &TID_D3DRMMesh))
1547 {
1549 goto end;
1550 }
1551
1552 /* We don't care about the texture interface version since we rely on QueryInterface */
1554 if (hr == S_OK)
1555 ret = D3DRM_OK;
1556
1557end:
1558
1559 if (data)
1561 if (enum_object)
1562 IDirectXFileEnumObject_Release(enum_object);
1563 if (dxfile)
1564 IDirectXFile_Release(dxfile);
1565
1566 if (ret != D3DRM_OK)
1568
1569 return ret;
1570}
1571
1572static HRESULT WINAPI d3drm_mesh_builder3_Save(IDirect3DRMMeshBuilder3 *iface,
1574{
1575 FIXME("iface %p, filename %s, format %#x, flags %#lx stub!\n",
1576 iface, debugstr_a(filename), format, flags);
1577
1578 return E_NOTIMPL;
1579}
1580
1581static HRESULT WINAPI d3drm_mesh_builder3_Scale(IDirect3DRMMeshBuilder3 *iface,
1582 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
1583{
1585 DWORD i;
1586
1587 TRACE("iface %p, sx %.8e, sy %.8e, sz %.8e.\n", iface, sx, sy, sz);
1588
1589 for (i = 0; i < mesh_builder->nb_vertices; ++i)
1590 {
1591 mesh_builder->vertices[i].x *= sx;
1592 mesh_builder->vertices[i].y *= sy;
1593 mesh_builder->vertices[i].z *= sz;
1594 }
1595
1596 /* Normals are not affected by Scale */
1597
1598 return D3DRM_OK;
1599}
1600
1601static HRESULT WINAPI d3drm_mesh_builder3_Translate(IDirect3DRMMeshBuilder3 *iface,
1603{
1604 FIXME("iface %p, tx %.8e, ty %.8e, tz %.8e stub!\n", iface, tx, ty, tz);
1605
1606 return E_NOTIMPL;
1607}
1608
1609static HRESULT WINAPI d3drm_mesh_builder3_SetColorSource(IDirect3DRMMeshBuilder3 *iface,
1611{
1612 FIXME("iface %p, source %#x stub!\n", iface, source);
1613
1614 return E_NOTIMPL;
1615}
1616
1617static HRESULT WINAPI d3drm_mesh_builder3_GetBox(IDirect3DRMMeshBuilder3 *iface, D3DRMBOX *box)
1618{
1619 FIXME("iface %p, box %p stub!\n", iface, box);
1620
1621 return E_NOTIMPL;
1622}
1623
1624static HRESULT WINAPI d3drm_mesh_builder3_GenerateNormals(IDirect3DRMMeshBuilder3 *iface,
1625 D3DVALUE crease, DWORD flags)
1626{
1627 FIXME("iface %p, crease %.8e, flags %#lx stub!\n", iface, crease, flags);
1628
1629 return E_NOTIMPL;
1630}
1631
1632static D3DRMCOLORSOURCE WINAPI d3drm_mesh_builder3_GetColorSource(IDirect3DRMMeshBuilder3 *iface)
1633{
1634 FIXME("iface %p stub!\n", iface);
1635
1636 return E_NOTIMPL;
1637}
1638
1639static HRESULT WINAPI d3drm_mesh_builder3_AddMesh(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMMesh *mesh)
1640{
1641 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
1642
1643 return E_NOTIMPL;
1644}
1645
1646static HRESULT WINAPI d3drm_mesh_builder3_AddMeshBuilder(IDirect3DRMMeshBuilder3 *iface,
1647 IDirect3DRMMeshBuilder3 *mesh_builder, DWORD flags)
1648{
1649 FIXME("iface %p, mesh_builder %p, flags %#lx stub!\n", iface, mesh_builder, flags);
1650
1651 return E_NOTIMPL;
1652}
1653
1654static HRESULT WINAPI d3drm_mesh_builder3_AddFrame(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFrame3 *frame)
1655{
1656 FIXME("iface %p, frame %p stub!\n", iface, frame);
1657
1658 return E_NOTIMPL;
1659}
1660
1661static HRESULT WINAPI d3drm_mesh_builder3_AddFace(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFace2 *face)
1662{
1663 FIXME("iface %p, face %p stub!\n", iface, face);
1664
1665 return E_NOTIMPL;
1666}
1667
1668static HRESULT WINAPI d3drm_mesh_builder3_AddFaces(IDirect3DRMMeshBuilder3 *iface,
1670 DWORD *face_data, IDirect3DRMFaceArray **array)
1671{
1672 FIXME("iface %p, vertex_count %lu, vertices %p, normal_count %lu, normals %p, face_data %p array %p stub!\n",
1673 iface, vertex_count, vertices, normal_count, normals, face_data, array);
1674
1675 return E_NOTIMPL;
1676}
1677
1678static HRESULT WINAPI d3drm_mesh_builder3_ReserveSpace(IDirect3DRMMeshBuilder3 *iface,
1679 DWORD vertex_count, DWORD normal_count, DWORD face_count)
1680{
1681 FIXME("iface %p, vertex_count %lu, normal_count %lu, face_count %lu stub!\n",
1682 iface, vertex_count, normal_count, face_count);
1683
1684 return E_NOTIMPL;
1685}
1686
1687static HRESULT WINAPI d3drm_mesh_builder3_SetColorRGB(IDirect3DRMMeshBuilder3 *iface,
1689{
1691
1692 TRACE("iface %p, red %.8e, green %.8e, blue %.8e.\n", iface, red, green, blue);
1693
1694 d3drm_set_color(&mesh_builder->color, red, green, blue, 1.0f);
1695
1696 return D3DRM_OK;
1697}
1698
1699static HRESULT WINAPI d3drm_mesh_builder3_SetColor(IDirect3DRMMeshBuilder3 *iface, D3DCOLOR color)
1700{
1702
1703 TRACE("iface %p, color 0x%08lx.\n", iface, color);
1704
1705 mesh_builder->color = color;
1706
1707 return D3DRM_OK;
1708}
1709
1710static HRESULT WINAPI d3drm_mesh_builder3_SetTexture(IDirect3DRMMeshBuilder3 *iface,
1711 IDirect3DRMTexture3 *texture)
1712{
1714
1715 TRACE("iface %p, texture %p.\n", iface, texture);
1716
1717 if (texture)
1719 if (mesh_builder->texture)
1721 mesh_builder->texture = texture;
1722
1723 return D3DRM_OK;
1724}
1725
1726static HRESULT WINAPI d3drm_mesh_builder3_SetMaterial(IDirect3DRMMeshBuilder3 *iface,
1727 IDirect3DRMMaterial2 *material)
1728{
1730
1731 TRACE("iface %p, material %p.\n", iface, material);
1732
1733 if (material)
1735 if (mesh_builder->material)
1737 mesh_builder->material = material;
1738
1739 return D3DRM_OK;
1740}
1741
1742static HRESULT WINAPI d3drm_mesh_builder3_SetTextureTopology(IDirect3DRMMeshBuilder3 *iface,
1743 BOOL wrap_u, BOOL wrap_v)
1744{
1745 FIXME("iface %p, wrap_u %#x, wrap_v %#x stub!\n", iface, wrap_u, wrap_v);
1746
1747 return E_NOTIMPL;
1748}
1749
1750static HRESULT WINAPI d3drm_mesh_builder3_SetQuality(IDirect3DRMMeshBuilder3 *iface,
1752{
1754
1755 TRACE("iface %p, quality %#lx\n", iface, quality);
1756
1757 mesh_builder->quality = quality;
1758
1759 return S_OK;
1760}
1761
1762static HRESULT WINAPI d3drm_mesh_builder3_SetPerspective(IDirect3DRMMeshBuilder3 *iface,
1763 BOOL enable)
1764{
1765 FIXME("iface %p, enable %#x stub!\n", iface, enable);
1766
1767 return E_NOTIMPL;
1768}
1769
1770static HRESULT WINAPI d3drm_mesh_builder3_SetVertex(IDirect3DRMMeshBuilder3 *iface,
1772{
1773 FIXME("iface %p, index %lu, x %.8e, y %.8e, z %.8e stub!\n", iface, index, x, y, z);
1774
1775 return E_NOTIMPL;
1776}
1777
1778static HRESULT WINAPI d3drm_mesh_builder3_SetNormal(IDirect3DRMMeshBuilder3 *iface,
1780{
1781 FIXME("iface %p, index %lu, x %.8e, y %.8e, z %.8e stub!\n", iface, index, x, y, z);
1782
1783 return E_NOTIMPL;
1784}
1785
1786static HRESULT WINAPI d3drm_mesh_builder3_SetTextureCoordinates(IDirect3DRMMeshBuilder3 *iface,
1788{
1790
1791 TRACE("iface %p, index %lu, u %.8e, v %.8e.\n", iface, index, u, v);
1792
1793 if (index >= mesh_builder->nb_coords2d)
1794 return D3DRMERR_BADVALUE;
1795
1796 mesh_builder->pCoords2d[index].u = u;
1797 mesh_builder->pCoords2d[index].v = v;
1798
1799 return D3DRM_OK;
1800}
1801
1802static HRESULT WINAPI d3drm_mesh_builder3_SetVertexColor(IDirect3DRMMeshBuilder3 *iface,
1804{
1805 FIXME("iface %p, index %lu, color 0x%08lx stub!\n", iface, index, color);
1806
1807 return E_NOTIMPL;
1808}
1809
1810static HRESULT WINAPI d3drm_mesh_builder3_SetVertexColorRGB(IDirect3DRMMeshBuilder3 *iface,
1812{
1813 FIXME("iface %p, index %lu, red %.8e, green %.8e, blue %.8e stub!\n",
1814 iface, index, red, green, blue);
1815
1816 return E_NOTIMPL;
1817}
1818
1819static HRESULT WINAPI d3drm_mesh_builder3_GetFaces(IDirect3DRMMeshBuilder3 *iface,
1820 IDirect3DRMFaceArray **array)
1821{
1822 FIXME("iface %p, array %p stub!\n", iface, array);
1823
1824 return E_NOTIMPL;
1825}
1826
1827static HRESULT WINAPI d3drm_mesh_builder3_GetGeometry(IDirect3DRMMeshBuilder3 *iface,
1829 DWORD *face_data_size, DWORD *face_data)
1830{
1831 FIXME("iface %p, vertex_count %p, vertices %p, normal_count %p, normals %p, "
1832 "face_data_size %p, face_data %p stub!\n",
1833 iface, vertex_count, vertices, normal_count, normals, face_data_size, face_data);
1834
1835 return E_NOTIMPL;
1836}
1837
1838static HRESULT WINAPI d3drm_mesh_builder3_GetTextureCoordinates(IDirect3DRMMeshBuilder3 *iface,
1840{
1842
1843 TRACE("iface %p, index %lu, u %p, v %p.\n", iface, index, u, v);
1844
1845 if (index >= mesh_builder->nb_coords2d)
1846 return D3DRMERR_BADVALUE;
1847
1848 *u = mesh_builder->pCoords2d[index].u;
1849 *v = mesh_builder->pCoords2d[index].v;
1850
1851 return D3DRM_OK;
1852}
1853
1854static int WINAPI d3drm_mesh_builder3_AddVertex(IDirect3DRMMeshBuilder3 *iface,
1856{
1858
1859 TRACE("iface %p, x %.8e, y %.8e, z %.8e.\n", iface, x, y, z);
1860
1861 if (!d3drm_array_reserve((void **)&mesh_builder->vertices, &mesh_builder->vertices_size,
1862 mesh_builder->nb_vertices + 1, sizeof(*mesh_builder->vertices)))
1863 return 0;
1864
1865 mesh_builder->vertices[mesh_builder->nb_vertices].x = x;
1866 mesh_builder->vertices[mesh_builder->nb_vertices].y = y;
1867 mesh_builder->vertices[mesh_builder->nb_vertices].z = z;
1868
1869 return mesh_builder->nb_vertices++;
1870}
1871
1872static int WINAPI d3drm_mesh_builder3_AddNormal(IDirect3DRMMeshBuilder3 *iface,
1874{
1876
1877 TRACE("iface %p, x %.8e, y %.8e, z %.8e.\n", iface, x, y, z);
1878
1879 if (!d3drm_array_reserve((void **)&mesh_builder->normals, &mesh_builder->normals_size,
1880 mesh_builder->nb_normals + 1, sizeof(*mesh_builder->normals)))
1881 return 0;
1882
1883 mesh_builder->normals[mesh_builder->nb_normals].x = x;
1884 mesh_builder->normals[mesh_builder->nb_normals].y = y;
1885 mesh_builder->normals[mesh_builder->nb_normals].z = z;
1886
1887 return mesh_builder->nb_normals++;
1888}
1889
1890static HRESULT WINAPI d3drm_mesh_builder3_CreateFace(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFace2 **face)
1891{
1892 struct d3drm_face *object;
1893 HRESULT hr;
1894
1895 TRACE("iface %p, face %p.\n", iface, face);
1896
1897 if (FAILED(hr = d3drm_face_create(&object)))
1898 return hr;
1899
1900 *face = &object->IDirect3DRMFace2_iface;
1901
1902 return S_OK;
1903}
1904
1905static D3DRMRENDERQUALITY WINAPI d3drm_mesh_builder3_GetQuality(IDirect3DRMMeshBuilder3 *iface)
1906{
1908
1909 TRACE("iface %p\n", iface);
1910
1911 return mesh_builder->quality;
1912}
1913
1914static BOOL WINAPI d3drm_mesh_builder3_GetPerspective(IDirect3DRMMeshBuilder3 *iface)
1915{
1916 FIXME("iface %p stub!\n", iface);
1917
1918 return FALSE;
1919}
1920
1921static int WINAPI d3drm_mesh_builder3_GetFaceCount(IDirect3DRMMeshBuilder3 *iface)
1922{
1924
1925 TRACE("iface %p.\n", iface);
1926
1927 return mesh_builder->nb_faces;
1928}
1929
1930static int WINAPI d3drm_mesh_builder3_GetVertexCount(IDirect3DRMMeshBuilder3 *iface)
1931{
1933
1934 TRACE("iface %p.\n", iface);
1935
1936 return mesh_builder->nb_vertices;
1937}
1938
1939static D3DCOLOR WINAPI d3drm_mesh_builder3_GetVertexColor(IDirect3DRMMeshBuilder3 *iface,
1940 DWORD index)
1941{
1942 FIXME("iface %p, index %lu stub!\n", iface, index);
1943
1944 return 0;
1945}
1946
1947static HRESULT WINAPI d3drm_mesh_builder3_CreateMesh(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMMesh **mesh)
1948{
1950 HRESULT hr;
1952
1953 TRACE("iface %p, mesh %p.\n", iface, mesh);
1954
1955 if (!mesh)
1956 return E_POINTER;
1957
1959 if (FAILED(hr))
1960 return hr;
1961
1962 /* If there is mesh data, create a group and put data inside */
1963 if (mesh_builder->nb_vertices)
1964 {
1965 DWORD i, j;
1966 int k;
1968
1969 if (!(vertices = calloc(mesh_builder->nb_vertices, sizeof(*vertices))))
1970 {
1972 return E_OUTOFMEMORY;
1973 }
1974 for (i = 0; i < mesh_builder->nb_vertices; i++)
1975 vertices[i].position = mesh_builder->vertices[i];
1976 hr = IDirect3DRMMesh_SetVertices(*mesh, 0, 0, mesh_builder->nb_vertices, vertices);
1977 free(vertices);
1978
1979 /* Groups are in reverse order compared to materials list in X file */
1980 for (k = mesh_builder->nb_materials - 1; k >= 0; k--)
1981 {
1982 unsigned* face_data;
1983 unsigned* out_ptr;
1984 DWORD* in_ptr = mesh_builder->pFaceData;
1986 BOOL* used_vertices;
1987 unsigned nb_vertices = 0;
1988 unsigned nb_faces = 0;
1989
1990 if (!(used_vertices = calloc(mesh_builder->face_data_size, sizeof(*used_vertices))))
1991 {
1993 return E_OUTOFMEMORY;
1994 }
1995
1996 if (!(face_data = calloc(mesh_builder->face_data_size, sizeof(*face_data))))
1997 {
1998 free(used_vertices);
2000 return E_OUTOFMEMORY;
2001 }
2002 out_ptr = face_data;
2003
2004 /* If all faces have the same number of vertex, set vertex_per_face */
2005 for (i = 0; i < mesh_builder->nb_faces; i++)
2006 {
2007 /* Process only faces belonging to the group */
2008 if (mesh_builder->material_indices[i] == k)
2009 {
2010 if (vertex_per_face && (vertex_per_face != *in_ptr))
2011 break;
2012 vertex_per_face = *in_ptr;
2013 }
2014 in_ptr += 1 + *in_ptr * 2;
2015 }
2016 if (i != mesh_builder->nb_faces)
2017 vertex_per_face = 0;
2018
2019 /* Put only vertex indices */
2020 in_ptr = mesh_builder->pFaceData;
2021 for (i = 0; i < mesh_builder->nb_faces; i++)
2022 {
2023 DWORD nb_indices = *in_ptr++;
2024
2025 /* Skip faces not belonging to the group */
2026 if (mesh_builder->material_indices[i] != k)
2027 {
2028 in_ptr += 2 * nb_indices;
2029 continue;
2030 }
2031
2032 /* Don't put nb indices when vertex_per_face is set */
2033 if (vertex_per_face)
2034 *out_ptr++ = nb_indices;
2035
2036 for (j = 0; j < nb_indices; j++)
2037 {
2038 *out_ptr = *in_ptr++;
2039 used_vertices[*out_ptr++] = TRUE;
2040 /* Skip normal index */
2041 in_ptr++;
2042 }
2043
2044 nb_faces++;
2045 }
2046
2047 for (i = 0; i < mesh_builder->nb_vertices; i++)
2048 if (used_vertices[i])
2049 nb_vertices++;
2050
2052 free(used_vertices);
2053 free(face_data);
2054 if (SUCCEEDED(hr))
2055 hr = IDirect3DRMMesh_SetGroupColor(*mesh, group, mesh_builder->materials[k].color);
2056 if (SUCCEEDED(hr))
2058 (IDirect3DRMMaterial *)mesh_builder->materials[k].material);
2059 if (SUCCEEDED(hr) && mesh_builder->materials[k].texture)
2060 {
2061 IDirect3DRMTexture *texture;
2062
2064 &IID_IDirect3DRMTexture, (void **)&texture);
2067 }
2068 if (FAILED(hr))
2069 {
2071 return hr;
2072 }
2073 }
2074 }
2075
2076 return D3DRM_OK;
2077}
2078
2079static HRESULT WINAPI d3drm_mesh_builder3_GetFace(IDirect3DRMMeshBuilder3 *iface,
2080 DWORD index, IDirect3DRMFace2 **face)
2081{
2082 FIXME("iface %p, index %lu, face %p stub!\n", iface, index, face);
2083
2084 return E_NOTIMPL;
2085}
2086
2087static HRESULT WINAPI d3drm_mesh_builder3_GetVertex(IDirect3DRMMeshBuilder3 *iface,
2089{
2090 FIXME("iface %p, index %lu, vector %p stub!\n", iface, index, vector);
2091
2092 return E_NOTIMPL;
2093}
2094
2095static HRESULT WINAPI d3drm_mesh_builder3_GetNormal(IDirect3DRMMeshBuilder3 *iface,
2097{
2098 FIXME("iface %p, index %lu, vector %p stub!\n", iface, index, vector);
2099
2100 return E_NOTIMPL;
2101}
2102
2103static HRESULT WINAPI d3drm_mesh_builder3_DeleteVertices(IDirect3DRMMeshBuilder3 *iface,
2104 DWORD start_idx, DWORD count)
2105{
2106 FIXME("iface %p, start_idx %lu, count %lu stub!\n", iface, start_idx, count);
2107
2108 return E_NOTIMPL;
2109}
2110
2111static HRESULT WINAPI d3drm_mesh_builder3_DeleteNormals(IDirect3DRMMeshBuilder3 *iface,
2112 DWORD start_idx, DWORD count)
2113{
2114 FIXME("iface %p, start_idx %lu, count %lu stub!\n", iface, start_idx, count);
2115
2116 return E_NOTIMPL;
2117}
2118
2119static HRESULT WINAPI d3drm_mesh_builder3_DeleteFace(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFace2 *face)
2120{
2121 FIXME("iface %p, face %p stub!\n", iface, face);
2122
2123 return E_NOTIMPL;
2124}
2125
2126static HRESULT WINAPI d3drm_mesh_builder3_Empty(IDirect3DRMMeshBuilder3 *iface, DWORD flags)
2127{
2128 FIXME("iface %p, flags %#lx stub!\n", iface, flags);
2129
2130 return E_NOTIMPL;
2131}
2132
2133static HRESULT WINAPI d3drm_mesh_builder3_Optimize(IDirect3DRMMeshBuilder3 *iface, DWORD flags)
2134{
2135 FIXME("iface %p, flags %#lx stub!\n", iface, flags);
2136
2137 return S_OK;
2138}
2139
2140static HRESULT WINAPI d3drm_mesh_builder3_AddFacesIndexed(IDirect3DRMMeshBuilder3 *iface,
2141 DWORD flags, DWORD *indices, DWORD *start_idx, DWORD *count)
2142{
2143 FIXME("iface %p, flags %#lx, indices %p, start_idx %p, count %p stub!\n",
2144 iface, flags, indices, start_idx, count);
2145
2146 return E_NOTIMPL;
2147}
2148
2149static HRESULT WINAPI d3drm_mesh_builder3_CreateSubMesh(IDirect3DRMMeshBuilder3 *iface, IUnknown **mesh)
2150{
2151 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
2152
2153 return E_NOTIMPL;
2154}
2155
2156static HRESULT WINAPI d3drm_mesh_builder3_GetParentMesh(IDirect3DRMMeshBuilder3 *iface,
2158{
2159 FIXME("iface %p, flags %#lx, parent %p stub!\n", iface, flags, parent);
2160
2161 return E_NOTIMPL;
2162}
2163
2164static HRESULT WINAPI d3drm_mesh_builder3_GetSubMeshes(IDirect3DRMMeshBuilder3 *iface,
2165 DWORD *count, IUnknown **meshes)
2166{
2167 FIXME("iface %p, count %p, meshes %p stub!\n", iface, count, meshes);
2168
2169 return E_NOTIMPL;
2170}
2171
2172static HRESULT WINAPI d3drm_mesh_builder3_DeleteSubMesh(IDirect3DRMMeshBuilder3 *iface, IUnknown *mesh)
2173{
2174 FIXME("iface %p, mesh %p stub!\n", iface, mesh);
2175
2176 return E_NOTIMPL;
2177}
2178
2179static HRESULT WINAPI d3drm_mesh_builder3_Enable(IDirect3DRMMeshBuilder3 *iface, DWORD index)
2180{
2181 FIXME("iface %p, index %lu stub!\n", iface, index);
2182
2183 return E_NOTIMPL;
2184}
2185
2186static HRESULT WINAPI d3drm_mesh_builder3_GetEnable(IDirect3DRMMeshBuilder3 *iface, DWORD *indices)
2187{
2188 FIXME("iface %p, indices %p stub!\n", iface, indices);
2189
2190 return E_NOTIMPL;
2191}
2192
2193static HRESULT WINAPI d3drm_mesh_builder3_AddTriangles(IDirect3DRMMeshBuilder3 *iface,
2195{
2196 FIXME("iface %p, flags %#lx, format %#lx, vertex_count %lu, data %p stub!\n",
2197 iface, flags, format, vertex_count, data);
2198
2199 return E_NOTIMPL;
2200}
2201
2202static HRESULT WINAPI d3drm_mesh_builder3_SetVertices(IDirect3DRMMeshBuilder3 *iface,
2203 DWORD start_idx, DWORD count, D3DVECTOR *vector)
2204{
2205 FIXME("iface %p, start_idx %lu, count %lu, vector %p stub!\n", iface, start_idx, count, vector);
2206
2207 return E_NOTIMPL;
2208}
2209
2210static HRESULT WINAPI d3drm_mesh_builder3_GetVertices(IDirect3DRMMeshBuilder3 *iface,
2212{
2214 DWORD count = mesh_builder->nb_vertices - start_idx;
2215
2216 TRACE("iface %p, start_idx %lu, vertex_count %p, vertices %p.\n",
2217 iface, start_idx, vertex_count, vertices);
2218
2219 if (vertex_count)
2221 if (vertices && mesh_builder->nb_vertices)
2222 memcpy(vertices, mesh_builder->vertices + start_idx, count * sizeof(*vertices));
2223
2224 return D3DRM_OK;
2225}
2226
2227static HRESULT WINAPI d3drm_mesh_builder3_SetNormals(IDirect3DRMMeshBuilder3 *iface,
2228 DWORD start_idx, DWORD count, D3DVECTOR *vector)
2229{
2230 FIXME("iface %p, start_idx %lu, count %lu, vector %p stub!\n",
2231 iface, start_idx, count, vector);
2232
2233 return E_NOTIMPL;
2234}
2235
2236static HRESULT WINAPI d3drm_mesh_builder3_GetNormals(IDirect3DRMMeshBuilder3 *iface,
2237 DWORD start_idx, DWORD *normal_count, D3DVECTOR *normals)
2238{
2240 DWORD count = mesh_builder->nb_normals - start_idx;
2241
2242 TRACE("iface %p, start_idx %lu, normal_count %p, normals %p.\n",
2243 iface, start_idx, normal_count, normals);
2244
2245 if (normal_count)
2246 *normal_count = count;
2247 if (normals && mesh_builder->nb_normals)
2248 memcpy(normals, &mesh_builder->normals[start_idx], count * sizeof(*normals));
2249
2250 return D3DRM_OK;
2251}
2252
2253static int WINAPI d3drm_mesh_builder3_GetNormalCount(IDirect3DRMMeshBuilder3 *iface)
2254{
2256
2257 TRACE("iface %p.\n", iface);
2258
2259 return mesh_builder->nb_normals;
2260}
2261
2262static const struct IDirect3DRMMeshBuilder3Vtbl d3drm_mesh_builder3_vtbl =
2263{
2334};
2335
2337{
2338 static const char classname[] = "Builder";
2339 struct d3drm_mesh_builder *object;
2340
2341 TRACE("mesh_builder %p.\n", mesh_builder);
2342
2343 if (!(object = calloc(1, sizeof(*object))))
2344 return E_OUTOFMEMORY;
2345
2346 object->IDirect3DRMMeshBuilder2_iface.lpVtbl = &d3drm_mesh_builder2_vtbl;
2347 object->IDirect3DRMMeshBuilder3_iface.lpVtbl = &d3drm_mesh_builder3_vtbl;
2348 object->ref = 1;
2349 object->d3drm = d3drm;
2350 object->quality = D3DRMRENDER_GOURAUD;
2351 IDirect3DRM_AddRef(object->d3drm);
2352
2354
2356
2357 return S_OK;
2358}
2359
2360static HRESULT WINAPI d3drm_mesh_QueryInterface(IDirect3DRMMesh *iface, REFIID riid, void **out)
2361{
2362 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
2363
2364 if (IsEqualGUID(riid, &IID_IDirect3DRMMesh)
2365 || IsEqualGUID(riid, &IID_IDirect3DRMVisual)
2366 || IsEqualGUID(riid, &IID_IDirect3DRMObject)
2368 {
2370 *out = iface;
2371 return S_OK;
2372 }
2373
2374 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
2375
2376 *out = NULL;
2377 return E_NOINTERFACE;
2378}
2379
2380static ULONG WINAPI d3drm_mesh_AddRef(IDirect3DRMMesh *iface)
2381{
2382 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2383 ULONG refcount = InterlockedIncrement(&mesh->ref);
2384
2385 TRACE("%p increasing refcount to %lu.\n", iface, refcount);
2386
2387 return refcount;
2388}
2389
2390static ULONG WINAPI d3drm_mesh_Release(IDirect3DRMMesh *iface)
2391{
2392 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2393 ULONG refcount = InterlockedDecrement(&mesh->ref);
2394
2395 TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
2396
2397 if (!refcount)
2398 {
2399 DWORD i;
2400
2401 d3drm_object_cleanup((IDirect3DRMObject *)iface, &mesh->obj);
2402 IDirect3DRM_Release(mesh->d3drm);
2403 for (i = 0; i < mesh->nb_groups; ++i)
2404 {
2405 free(mesh->groups[i].vertices);
2406 free(mesh->groups[i].face_data);
2407 if (mesh->groups[i].material)
2408 IDirect3DRMMaterial2_Release(mesh->groups[i].material);
2409 if (mesh->groups[i].texture)
2410 IDirect3DRMTexture3_Release(mesh->groups[i].texture);
2411 }
2412 free(mesh->groups);
2413 free(mesh);
2414 }
2415
2416 return refcount;
2417}
2418
2419static HRESULT WINAPI d3drm_mesh_Clone(IDirect3DRMMesh *iface,
2420 IUnknown *outer, REFIID iid, void **out)
2421{
2422 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
2423
2424 return E_NOTIMPL;
2425}
2426
2427static HRESULT WINAPI d3drm_mesh_AddDestroyCallback(IDirect3DRMMesh *iface,
2428 D3DRMOBJECTCALLBACK cb, void *ctx)
2429{
2430 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2431
2432 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
2433
2435}
2436
2438 D3DRMOBJECTCALLBACK cb, void *ctx)
2439{
2440 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2441
2442 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
2443
2445}
2446
2447static HRESULT WINAPI d3drm_mesh_SetAppData(IDirect3DRMMesh *iface, DWORD data)
2448{
2449 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2450
2451 TRACE("iface %p, data %#lx.\n", iface, data);
2452
2453 mesh->obj.appdata = data;
2454
2455 return D3DRM_OK;
2456}
2457
2458static DWORD WINAPI d3drm_mesh_GetAppData(IDirect3DRMMesh *iface)
2459{
2460 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2461
2462 TRACE("iface %p.\n", iface);
2463
2464 return mesh->obj.appdata;
2465}
2466
2467static HRESULT WINAPI d3drm_mesh_SetName(IDirect3DRMMesh *iface, const char *name)
2468{
2469 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2470
2471 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2472
2473 return d3drm_object_set_name(&mesh->obj, name);
2474}
2475
2476static HRESULT WINAPI d3drm_mesh_GetName(IDirect3DRMMesh *iface, DWORD *size, char *name)
2477{
2478 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2479
2480 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
2481
2482 return d3drm_object_get_name(&mesh->obj, size, name);
2483}
2484
2485static HRESULT WINAPI d3drm_mesh_GetClassName(IDirect3DRMMesh *iface, DWORD *size, char *name)
2486{
2487 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2488
2489 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
2490
2491 return d3drm_object_get_class_name(&mesh->obj, size, name);
2492}
2493
2494static HRESULT WINAPI d3drm_mesh_Scale(IDirect3DRMMesh *iface,
2495 D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
2496{
2497 FIXME("iface %p, sx %.8e, sy %.8e, sz %.8e stub!\n", iface, sx, sy, sz);
2498
2499 return E_NOTIMPL;
2500}
2501
2502static HRESULT WINAPI d3drm_mesh_Translate(IDirect3DRMMesh *iface,
2504{
2505 FIXME("iface %p, tx %.8e, ty %.8e, tz %.8e stub!\n", iface, tx, ty, tz);
2506
2507 return E_NOTIMPL;
2508}
2509
2510static HRESULT WINAPI d3drm_mesh_GetBox(IDirect3DRMMesh *iface, D3DRMBOX *box)
2511{
2512 FIXME("iface %p, box %p stub!\n", iface, box);
2513
2514 return E_NOTIMPL;
2515}
2516
2517static HRESULT WINAPI d3drm_mesh_AddGroup(IDirect3DRMMesh *iface, unsigned vertex_count,
2518 unsigned face_count, unsigned vertex_per_face, unsigned *face_data, D3DRMGROUPINDEX *id)
2519{
2520 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2521 struct mesh_group *group;
2522
2523 TRACE("iface %p, vertex_count %u, face_count %u, vertex_per_face %u, face_data %p, id %p.\n",
2525
2526 if (!face_data || !id)
2527 return E_POINTER;
2528
2529 if (!d3drm_array_reserve((void **)&mesh->groups, &mesh->groups_size, mesh->nb_groups + 1, sizeof(*mesh->groups)))
2530 return E_OUTOFMEMORY;
2531
2532 group = mesh->groups + mesh->nb_groups;
2533
2534 if (!(group->vertices = calloc(vertex_count, sizeof(*group->vertices))))
2535 return E_OUTOFMEMORY;
2536 group->nb_vertices = vertex_count;
2537 group->nb_faces = face_count;
2538 group->vertex_per_face = vertex_per_face;
2539
2540 if (vertex_per_face)
2541 {
2542 group->face_data_size = face_count * vertex_per_face;
2543 }
2544 else
2545 {
2546 unsigned i;
2547 unsigned nb_indices;
2548 unsigned* face_data_ptr = face_data;
2549 group->face_data_size = 0;
2550
2551 for (i = 0; i < face_count; i++)
2552 {
2553 nb_indices = *face_data_ptr;
2554 group->face_data_size += nb_indices + 1;
2555 face_data_ptr += nb_indices;
2556 }
2557 }
2558
2559 if (!(group->face_data = calloc(group->face_data_size, sizeof(*group->face_data))))
2560 {
2561 free(group->vertices);
2562 return E_OUTOFMEMORY;
2563 }
2564 memcpy(group->face_data, face_data, group->face_data_size * sizeof(*face_data));
2565
2566 group->material = NULL;
2567 group->texture = NULL;
2568
2569 *id = mesh->nb_groups++;
2570
2571 return D3DRM_OK;
2572}
2573
2574static HRESULT WINAPI d3drm_mesh_SetVertices(IDirect3DRMMesh *iface, D3DRMGROUPINDEX group_id,
2575 unsigned int start_idx, unsigned int count, D3DRMVERTEX *values)
2576{
2577 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2578
2579 TRACE("iface %p, group_id %#lx, start_idx %u, count %u, values %p.\n",
2580 iface, group_id, start_idx, count, values);
2581
2582 if (group_id >= mesh->nb_groups)
2583 return D3DRMERR_BADVALUE;
2584
2585 if ((start_idx + count - 1) >= mesh->groups[group_id].nb_vertices)
2586 return D3DRMERR_BADVALUE;
2587
2588 if (!values)
2589 return E_POINTER;
2590
2591 memcpy(mesh->groups[group_id].vertices + start_idx, values, count * sizeof(*values));
2592
2593 return D3DRM_OK;
2594}
2595
2597{
2598 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2599
2600 TRACE("iface %p, id %#lx, color 0x%08lx.\n", iface, id, color);
2601
2602 if (id >= mesh->nb_groups)
2603 return D3DRMERR_BADVALUE;
2604
2605 mesh->groups[id].color = color;
2606
2607 return D3DRM_OK;
2608}
2609
2610static HRESULT WINAPI d3drm_mesh_SetGroupColorRGB(IDirect3DRMMesh *iface,
2612{
2613 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2614
2615 TRACE("iface %p, id %#lx, red %.8e, green %.8e, blue %.8e.\n", iface, id, red, green, blue);
2616
2617 if (id >= mesh->nb_groups)
2618 return D3DRMERR_BADVALUE;
2619
2620 d3drm_set_color(&mesh->groups[id].color, red, green, blue, 1.0f);
2621
2622 return D3DRM_OK;
2623}
2624
2626{
2627 FIXME("iface %p, id %#lx, value %#lx stub!\n", iface, id, value);
2628
2629 return E_NOTIMPL;
2630}
2631
2633{
2634 FIXME("iface %p, id %#lx, value %#lx stub!\n", iface, id, value);
2635
2636 return E_NOTIMPL;
2637}
2638
2639static HRESULT WINAPI d3drm_mesh_SetGroupMaterial(IDirect3DRMMesh *iface,
2640 D3DRMGROUPINDEX id, IDirect3DRMMaterial *material)
2641{
2642 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2643
2644 TRACE("iface %p, id %#lx, material %p.\n", iface, id, material);
2645
2646 if (id >= mesh->nb_groups)
2647 return D3DRMERR_BADVALUE;
2648
2649 if (mesh->groups[id].material)
2650 IDirect3DRMMaterial2_Release(mesh->groups[id].material);
2651
2652 mesh->groups[id].material = (IDirect3DRMMaterial2 *)material;
2653
2654 if (material)
2655 IDirect3DRMMaterial2_AddRef(mesh->groups[id].material);
2656
2657 return D3DRM_OK;
2658}
2659
2660static HRESULT WINAPI d3drm_mesh_SetGroupTexture(IDirect3DRMMesh *iface,
2661 D3DRMGROUPINDEX id, IDirect3DRMTexture *texture)
2662{
2663 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2664
2665 TRACE("iface %p, id %#lx, texture %p.\n", iface, id, texture);
2666
2667 if (id >= mesh->nb_groups)
2668 return D3DRMERR_BADVALUE;
2669
2670 if (mesh->groups[id].texture)
2671 IDirect3DRMTexture3_Release(mesh->groups[id].texture);
2672
2673 if (!texture)
2674 {
2675 mesh->groups[id].texture = NULL;
2676 return D3DRM_OK;
2677 }
2678
2679 return IDirect3DRMTexture3_QueryInterface(texture, &IID_IDirect3DRMTexture, (void **)&mesh->groups[id].texture);
2680}
2681
2682static UINT WINAPI d3drm_mesh_GetGroupCount(IDirect3DRMMesh *iface)
2683{
2684 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2685
2686 TRACE("iface %p.\n", iface);
2687
2688 return mesh->nb_groups;
2689}
2690
2691static HRESULT WINAPI d3drm_mesh_GetGroup(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, unsigned *vertex_count,
2692 unsigned *face_count, unsigned *vertex_per_face, DWORD *face_data_size, unsigned *face_data)
2693{
2694 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2695
2696 TRACE("iface %p, id %#lx, vertex_count %p, face_count %p, vertex_per_face %p, face_data_size %p, face_data %p.\n",
2697 iface, id, vertex_count, face_count, vertex_per_face, face_data_size,face_data);
2698
2699 if (id >= mesh->nb_groups)
2700 return D3DRMERR_BADVALUE;
2701
2702 if (vertex_count)
2703 *vertex_count = mesh->groups[id].nb_vertices;
2704 if (face_count)
2705 *face_count = mesh->groups[id].nb_faces;
2706 if (vertex_per_face)
2707 *vertex_per_face = mesh->groups[id].vertex_per_face;
2708 if (face_data_size)
2709 *face_data_size = mesh->groups[id].face_data_size;
2710 if (face_data)
2711 memcpy(face_data, mesh->groups[id].face_data, mesh->groups[id].face_data_size * sizeof(*face_data));
2712
2713 return D3DRM_OK;
2714}
2715
2716static HRESULT WINAPI d3drm_mesh_GetVertices(IDirect3DRMMesh *iface,
2717 D3DRMGROUPINDEX group_id, DWORD start_idx, DWORD count, D3DRMVERTEX *vertices)
2718{
2719 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2720
2721 TRACE("iface %p, group_id %#lx, start_idx %lu, count %lu, vertices %p.\n",
2722 iface, group_id, start_idx, count, vertices);
2723
2724 if (group_id >= mesh->nb_groups)
2725 return D3DRMERR_BADVALUE;
2726
2727 if ((start_idx + count - 1) >= mesh->groups[group_id].nb_vertices)
2728 return D3DRMERR_BADVALUE;
2729
2730 if (!vertices)
2731 return E_POINTER;
2732
2733 memcpy(vertices, mesh->groups[group_id].vertices + start_idx, count * sizeof(*vertices));
2734
2735 return D3DRM_OK;
2736}
2737
2739{
2740 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2741
2742 TRACE("iface %p, id %#lx.\n", iface, id);
2743
2744 return mesh->groups[id].color;
2745}
2746
2748{
2749 FIXME("iface %p, id %#lx stub!\n", iface, id);
2750
2751 return 0;
2752}
2754{
2755 FIXME("iface %p, id %#lx stub!\n", iface, id);
2756
2757 return 0;
2758}
2759
2760static HRESULT WINAPI d3drm_mesh_GetGroupMaterial(IDirect3DRMMesh *iface,
2761 D3DRMGROUPINDEX id, IDirect3DRMMaterial **material)
2762{
2763 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2764
2765 TRACE("iface %p, id %#lx, material %p.\n", iface, id, material);
2766
2767 if (id >= mesh->nb_groups)
2768 return D3DRMERR_BADVALUE;
2769
2770 if (!material)
2771 return E_POINTER;
2772
2773 if (mesh->groups[id].material)
2774 IDirect3DRMTexture_QueryInterface(mesh->groups[id].material, &IID_IDirect3DRMMaterial, (void **)material);
2775 else
2776 *material = NULL;
2777
2778 return D3DRM_OK;
2779}
2780
2781static HRESULT WINAPI d3drm_mesh_GetGroupTexture(IDirect3DRMMesh *iface,
2782 D3DRMGROUPINDEX id, IDirect3DRMTexture **texture)
2783{
2784 struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
2785
2786 TRACE("iface %p, id %#lx, texture %p.\n", iface, id, texture);
2787
2788 if (id >= mesh->nb_groups)
2789 return D3DRMERR_BADVALUE;
2790
2791 if (!texture)
2792 return E_POINTER;
2793
2794 if (mesh->groups[id].texture)
2795 IDirect3DRMTexture_QueryInterface(mesh->groups[id].texture, &IID_IDirect3DRMTexture, (void **)texture);
2796 else
2797 *texture = NULL;
2798
2799 return D3DRM_OK;
2800}
2801
2802static const struct IDirect3DRMMeshVtbl d3drm_mesh_vtbl =
2803{
2834};
2835
2837{
2838 static const char classname[] = "Mesh";
2839 struct d3drm_mesh *object;
2840
2841 TRACE("mesh %p, d3drm %p.\n", mesh, d3drm);
2842
2843 if (!(object = calloc(1, sizeof(*object))))
2844 return E_OUTOFMEMORY;
2845
2846 object->IDirect3DRMMesh_iface.lpVtbl = &d3drm_mesh_vtbl;
2847 object->ref = 1;
2848 object->d3drm = d3drm;
2849 IDirect3DRM_AddRef(object->d3drm);
2850
2852
2853 *mesh = object;
2854
2855 return S_OK;
2856}
2857
2858static HRESULT WINAPI d3drm_wrap_QueryInterface(IDirect3DRMWrap *iface, REFIID riid, void **out)
2859{
2860 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
2861
2862 if (IsEqualGUID(riid, &IID_IDirect3DRMWrap)
2863 || IsEqualGUID(riid, &IID_IDirect3DRMObject)
2865 {
2867 *out = iface;
2868 return S_OK;
2869 }
2870
2871 WARN("%s not implemented.\n", debugstr_guid(riid));
2872
2873 *out = NULL;
2875}
2876
2877static ULONG WINAPI d3drm_wrap_AddRef(IDirect3DRMWrap *iface)
2878{
2879 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2880 ULONG refcount = InterlockedIncrement(&wrap->ref);
2881
2882 TRACE("%p increasing refcount to %lu.\n", iface, refcount);
2883
2884 return refcount;
2885}
2886
2887static ULONG WINAPI d3drm_wrap_Release(IDirect3DRMWrap *iface)
2888{
2889 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2890 ULONG refcount = InterlockedDecrement(&wrap->ref);
2891
2892 TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
2893
2894 if (!refcount)
2895 {
2896 d3drm_object_cleanup((IDirect3DRMObject *)iface, &wrap->obj);
2897 free(wrap);
2898 }
2899
2900 return refcount;
2901}
2902
2903static HRESULT WINAPI d3drm_wrap_Clone(IDirect3DRMWrap *iface,
2904 IUnknown *outer, REFIID iid, void **out)
2905{
2906 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
2907
2908 return E_NOTIMPL;
2909}
2910
2911static HRESULT WINAPI d3drm_wrap_AddDestroyCallback(IDirect3DRMWrap *iface,
2912 D3DRMOBJECTCALLBACK cb, void *ctx)
2913{
2914 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2915
2916 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
2917
2919}
2920
2922 D3DRMOBJECTCALLBACK cb, void *ctx)
2923{
2924 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2925
2926 TRACE("iface %p, cb %p, ctx %p.\n", iface, cb, ctx);
2927
2929}
2930
2931static HRESULT WINAPI d3drm_wrap_SetAppData(IDirect3DRMWrap *iface, DWORD data)
2932{
2933 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2934
2935 TRACE("iface %p, data %#lx.\n", iface, data);
2936
2937 wrap->obj.appdata = data;
2938
2939 return D3DRM_OK;
2940}
2941
2942static DWORD WINAPI d3drm_wrap_GetAppData(IDirect3DRMWrap *iface)
2943{
2944 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2945
2946 TRACE("iface %p.\n", iface);
2947
2948 return wrap->obj.appdata;
2949}
2950
2951static HRESULT WINAPI d3drm_wrap_SetName(IDirect3DRMWrap *iface, const char *name)
2952{
2953 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2954
2955 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
2956
2957 return d3drm_object_set_name(&wrap->obj, name);
2958}
2959
2960static HRESULT WINAPI d3drm_wrap_GetName(IDirect3DRMWrap *iface, DWORD *size, char *name)
2961{
2962 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2963
2964 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
2965
2966 return d3drm_object_get_name(&wrap->obj, size, name);
2967}
2968
2969static HRESULT WINAPI d3drm_wrap_GetClassName(IDirect3DRMWrap *iface, DWORD *size, char *name)
2970{
2971 struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
2972
2973 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
2974
2975 return d3drm_object_get_class_name(&wrap->obj, size, name);
2976}
2977
2978static HRESULT WINAPI d3drm_wrap_Init(IDirect3DRMWrap *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *reference,
2980 D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv)
2981{
2982 FIXME("iface %p, type %d, reference frame %p, ox %.8e, oy %.8e, oz %.8e, dx %.8e, dy %.8e, dz %.8e, ux %.8e, "
2983 "uy %.8e, uz %.8e, ou %.8e, ov %.8e, su %.8e, sv %.8e.\n", iface, type, reference, ox, oy, oz, dx, dy, dz,
2984 ux, uy, uz, ou, ov, su, sv);
2985
2986 return E_NOTIMPL;
2987}
2988
2989static HRESULT WINAPI d3drm_wrap_Apply(IDirect3DRMWrap *iface, IDirect3DRMObject *object)
2990{
2991 FIXME("iface %p, object %p.\n", iface, object);
2992
2993 return E_NOTIMPL;
2994}
2995
2996static HRESULT WINAPI d3drm_wrap_ApplyRelative(IDirect3DRMWrap *iface, IDirect3DRMFrame *frame,
2997 IDirect3DRMObject *object)
2998{
2999 FIXME("iface %p, frame %p, object %p.\n", iface, frame, object);
3000
3001 return E_NOTIMPL;
3002}
3003
3004static const struct IDirect3DRMWrapVtbl d3drm_wrap_vtbl =
3005{
3020};
3021
3023{
3024 static const char classname[] = "";
3025 struct d3drm_wrap *object;
3026
3027 TRACE("wrap %p, d3drm %p.\n", wrap, d3drm);
3028
3029 if (!(object = calloc(1, sizeof(*object))))
3030 return E_OUTOFMEMORY;
3031
3032 object->IDirect3DRMWrap_iface.lpVtbl = &d3drm_wrap_vtbl;
3033 object->ref = 1;
3034
3036
3037 *wrap = object;
3038
3039 return S_OK;
3040}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define index(s, c)
Definition: various.h:29
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
struct _D3DVECTOR D3DVECTOR
#define IDirect3DTexture_QueryInterface(p, a, b)
Definition: d3d.h:584
#define IDirect3DTexture_Release(p)
Definition: d3d.h:586
#define IDirect3DRM_CreateMesh(p, a)
Definition: d3drm.h:115
#define D3DRMERR_NOTFOUND
Definition: d3drm.h:491
#define D3DRM_OK
Definition: d3drm.h:486
#define D3DRMERR_BADFILE
Definition: d3drm.h:494
#define D3DRMERR_BADVALUE
Definition: d3drm.h:496
#define IDirect3DRM_Release(p)
Definition: d3drm.h:111
#define D3DRMERR_BADOBJECT
Definition: d3drm.h:487
#define IDirect3DRM_AddRef(p)
Definition: d3drm.h:110
void d3drm_object_cleanup(IDirect3DRMObject *iface, struct d3drm_object *object)
Definition: d3drm_main.c:155
void d3drm_object_init(struct d3drm_object *object, const char *classname)
Definition: d3drm_main.c:41
HRESULT d3drm_object_get_name(struct d3drm_object *object, DWORD *size, char *name)
Definition: d3drm_main.c:113
HRESULT d3drm_object_delete_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: d3drm_main.c:74
HRESULT d3drm_object_add_destroy_callback(struct d3drm_object *object, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: d3drm_main.c:57
HRESULT d3drm_object_set_name(struct d3drm_object *object, const char *name)
Definition: d3drm_main.c:137
HRESULT d3drm_object_get_class_name(struct d3drm_object *object, DWORD *size, char *name)
Definition: d3drm_main.c:94
HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm)
Definition: texture.c:1460
static void d3drm_set_color(D3DCOLOR *color, float r, float g, float b, float a)
HRESULT d3drm_face_create(struct d3drm_face **face)
Definition: face.c:620
HRESULT d3drm_material_create(struct d3drm_material **material, IDirect3DRM *d3drm)
Definition: material.c:279
#define D3DRMLOAD_FROMURL
Definition: d3drmdef.h:345
enum _D3DRMWRAPTYPE D3DRMWRAPTYPE
#define D3DRMRENDER_GOURAUD
Definition: d3drmdef.h:94
DWORD D3DRMMAPPING
Definition: d3drmdef.h:418
DWORD D3DRMSAVEOPTIONS
Definition: d3drmdef.h:193
DWORD D3DRMLOADOPTIONS
Definition: d3drmdef.h:339
DWORD D3DRMRENDERQUALITY
Definition: d3drmdef.h:89
#define D3DRMLOAD_FROMFILE
Definition: d3drmdef.h:341
#define D3DRMLOAD_FROMSTREAM
Definition: d3drmdef.h:344
enum _D3DRMXOFFORMAT D3DRMXOFFORMAT
enum _D3DRMCOLORSOURCE D3DRMCOLORSOURCE
LONG D3DRMGROUPINDEX
Definition: d3drmdef.h:431
#define D3DRMLOAD_FROMMEMORY
Definition: d3drmdef.h:343
#define D3DRMLOAD_FROMRESOURCE
Definition: d3drmdef.h:342
#define IDirect3DRMMeshBuilder3_SetName(p, a)
Definition: d3drmobj.h:2933
#define IDirect3DRMMeshBuilder3_SetQuality(p, a)
Definition: d3drmobj.h:2957
#define IDirect3DRMMeshBuilder3_SetTextureCoordinates(p, a, b, c)
Definition: d3drmobj.h:2961
#define IDirect3DRMMeshBuilder3_SetMaterial(p, a)
Definition: d3drmobj.h:2955
#define IDirect3DRMMeshBuilder3_DeleteDestroyCallback(p, a, b)
Definition: d3drmobj.h:2930
#define IDirect3DRMTexture3_Release(p)
Definition: d3drmobj.h:3476
#define IDirect3DRMMeshBuilder3_GetTextureCoordinates(p, a, b, c)
Definition: d3drmobj.h:2966
#define IDirect3DRMMeshBuilder3_AddNormal(p, a, b, c)
Definition: d3drmobj.h:2968
#define IDirect3DRMTexture_QueryInterface(p, a, b)
Definition: d3drmobj.h:3230
#define IDirect3DRMMeshBuilder3_AddVertex(p, a, b, c)
Definition: d3drmobj.h:2967
#define IDirect3DRMMeshBuilder3_GetClassName(p, a, b)
Definition: d3drmobj.h:2935
#define IDirect3DRMMaterial2_AddRef(p)
Definition: d3drmobj.h:3731
#define IDirect3DRMMeshBuilder3_Load(p, a, b, c, d, e)
Definition: d3drmobj.h:2938
#define IDirect3DRMMaterial2_SetPower(p, a)
Definition: d3drmobj.h:3743
#define IDirect3DRMMaterial2_SetAmbient(p, a, b, c)
Definition: d3drmobj.h:3749
#define IDirect3DRMMaterial2_SetEmissive(p, a, b, c)
Definition: d3drmobj.h:3745
#define IDirect3DRMTexture2_Release(p)
Definition: d3drmobj.h:3348
#define IDirect3DRMMeshBuilder3_SetColor(p, a)
Definition: d3drmobj.h:2953
#define IDirect3DRMMeshBuilder3_SetTexture(p, a)
Definition: d3drmobj.h:2954
#define IDirect3DRMWrap_AddRef(p)
Definition: d3drmobj.h:3589
#define IDirect3DRMTexture3_AddRef(p)
Definition: d3drmobj.h:3475
#define IDirect3DRMMeshBuilder3_Scale(p, a, b, c)
Definition: d3drmobj.h:2940
#define IDirect3DRMTexture3_QueryInterface(p, a, b)
Definition: d3drmobj.h:3474
#define IDirect3DRMMeshBuilder3_CreateMesh(p, a)
Definition: d3drmobj.h:2977
#define IDirect3DRMMesh_AddGroup(p, a, b, c, d, e)
Definition: d3drmobj.h:1955
#define IDirect3DRMMeshBuilder3_SetColorRGB(p, a, b, c)
Definition: d3drmobj.h:2952
#define IDirect3DRMTexture_Release(p)
Definition: d3drmobj.h:3232
HRESULT(__cdecl * D3DRMLOADTEXTURE3CALLBACK)(char *tex_name, void *arg, struct IDirect3DRMTexture3 **texture)
Definition: d3drmobj.h:166
#define IDirect3DRMMaterial2_SetSpecular(p, a, b, c)
Definition: d3drmobj.h:3744
#define IDirect3DRMMesh_SetGroupMaterial(p, a, b)
Definition: d3drmobj.h:1961
#define IDirect3DRMMesh_SetGroupTexture(p, a, b)
Definition: d3drmobj.h:1962
#define IDirect3DRMMesh_Release(p)
Definition: d3drmobj.h:1941
#define IDirect3DRMMeshBuilder3_GetName(p, a, b)
Definition: d3drmobj.h:2934
#define IDirect3DRMMeshBuilder3_AddDestroyCallback(p, a, b)
Definition: d3drmobj.h:2929
#define IDirect3DRMMaterial2_Release(p)
Definition: d3drmobj.h:3732
#define IDirect3DRMMesh_SetGroupColor(p, a, b)
Definition: d3drmobj.h:1957
void(__cdecl * D3DRMOBJECTCALLBACK)(struct IDirect3DRMObject *obj, void *arg)
Definition: d3drmobj.h:157
HRESULT(__cdecl * D3DRMLOADTEXTURECALLBACK)(char *tex_name, void *arg, struct IDirect3DRMTexture **texture)
Definition: d3drmobj.h:165
#define IDirect3DRMMesh_AddRef(p)
Definition: d3drmobj.h:1940
#define IDirect3DRMTexture2_AddRef(p)
Definition: d3drmobj.h:3347
#define IDirect3DRMMesh_SetVertices(p, a, b, c, d)
Definition: d3drmobj.h:1956
float D3DVALUE
Definition: d3dtypes.h:89
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
size_t const element_size
Definition: debug_heap.cpp:510
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
D3DVECTOR *WINAPI D3DRMVectorNormalize(D3DVECTOR *u)
Definition: math.c:196
D3DVECTOR *WINAPI D3DRMVectorAdd(D3DVECTOR *d, D3DVECTOR *s1, D3DVECTOR *s2)
Definition: math.c:141
D3DVECTOR *WINAPI D3DRMVectorCrossProduct(D3DVECTOR *d, D3DVECTOR *s1, D3DVECTOR *s2)
Definition: math.c:167
D3DVECTOR *WINAPI D3DRMVectorSubtract(D3DVECTOR *d, D3DVECTOR *s1, D3DVECTOR *s2)
Definition: math.c:154
HRESULT WINAPI DirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile)
Definition: main.c:121
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileA(a, b, c, d, e, f, g)
Definition: compat.h:740
#define GENERIC_READ
Definition: compat.h:135
#define FILE_SHARE_READ
Definition: compat.h:136
GUID guid
Definition: version.c:147
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
#define wrap(journal, var)
Definition: recovery.c:207
#define IDirectXFile_RegisterTemplates(p, a, b)
Definition: dxfile.h:86
DWORD DXFILELOADOPTIONS
Definition: dxfile.h:35
#define IDirectXFile_Release(p)
Definition: dxfile.h:82
#define IDirectXFileEnumObject_GetNextDataObject(p, a)
Definition: dxfile.h:109
#define IDirectXFileObject_Release(p)
Definition: dxfile.h:160
#define IDirectXFileEnumObject_Release(p)
Definition: dxfile.h:107
#define IDirectXFileDataReference_Release(p)
Definition: dxfile.h:212
#define IDirectXFile_CreateEnumObject(p, a, b, c)
Definition: dxfile.h:84
#define IDirectXFileData_GetType(p, a)
Definition: dxfile.h:191
#define DXFILE_OK
Definition: dxfile.h:268
#define IDirectXFileData_GetName(p, a, b)
Definition: dxfile.h:187
#define IDirectXFileData_GetData(p, a, b, c)
Definition: dxfile.h:190
#define IDirectXFileObject_QueryInterface(p, a, b)
Definition: dxfile.h:158
#define DXFILEERR_NOMOREOBJECTS
Definition: dxfile.h:291
#define IDirectXFileDataReference_Resolve(p, a)
Definition: dxfile.h:217
#define IDirectXFileData_GetNextObject(p, a)
Definition: dxfile.h:192
#define IDirectXFileData_Release(p)
Definition: dxfile.h:185
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLclampf green
Definition: gl.h:1740
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLclampf GLclampf blue
Definition: gl.h:1740
GLuint GLuint GLsizei GLenum const GLvoid * indices
Definition: gl.h:1545
GLbyte GLbyte tz
Definition: glext.h:8756
GLenum GLuint texture
Definition: glext.h:6295
GLsizeiptr size
Definition: glext.h:5919
GLuint color
Definition: glext.h:6243
GLuint index
Definition: glext.h:6031
GLenum GLuint GLint GLenum face
Definition: glext.h:7025
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLint reference
Definition: glext.h:11729
GLboolean GLenum GLenum GLvoid * values
Definition: glext.h:5666
GLbitfield flags
Definition: glext.h:7161
GLboolean GLuint group
Definition: glext.h:11120
GLboolean enable
Definition: glext.h:11120
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLbyte ty
Definition: glext.h:8756
GLuint id
Definition: glext.h:5910
GLdouble GLdouble z
Definition: glext.h:5874
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
const char * filename
Definition: ioapi.h:137
int quality
Definition: jpeglib.h:994
#define a
Definition: ke_i.h:78
#define b
Definition: ke_i.h:79
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_a
Definition: kernel32.h:31
GLint dy
Definition: linetemp.h:97
GLint dx
Definition: linetemp.h:97
#define red
Definition: linetest.c:67
static HRESULT WINAPI d3drm_mesh_SetGroupColorRGB(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
Definition: meshbuilder.c:2610
static ULONG WINAPI d3drm_mesh_builder3_Release(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:956
static HRESULT WINAPI d3drm_mesh_builder3_GetNormal(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DVECTOR *vector)
Definition: meshbuilder.c:2095
static int WINAPI d3drm_mesh_builder3_AddNormal(IDirect3DRMMeshBuilder3 *iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:1872
static HRESULT WINAPI d3drm_mesh_SetGroupMaterial(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, IDirect3DRMMaterial *material)
Definition: meshbuilder.c:2639
static HRESULT WINAPI d3drm_mesh_GetGroup(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, unsigned *vertex_count, unsigned *face_count, unsigned *vertex_per_face, DWORD *face_data_size, unsigned *face_data)
Definition: meshbuilder.c:2691
static HRESULT WINAPI d3drm_mesh_builder2_AddMeshBuilder(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMMeshBuilder *mesh_builder)
Definition: meshbuilder.c:572
static HRESULT WINAPI d3drm_mesh_builder3_AddMesh(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMMesh *mesh)
Definition: meshbuilder.c:1639
static const struct IDirect3DRMMeshBuilder3Vtbl d3drm_mesh_builder3_vtbl
Definition: meshbuilder.c:2262
static HRESULT WINAPI d3drm_mesh_builder2_Translate(IDirect3DRMMeshBuilder2 *iface, D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
Definition: meshbuilder.c:529
static HRESULT WINAPI d3drm_mesh_SetGroupColor(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, D3DCOLOR color)
Definition: meshbuilder.c:2596
static ULONG WINAPI d3drm_mesh_builder2_AddRef(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:370
static ULONG WINAPI d3drm_mesh_builder2_Release(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:380
static HRESULT WINAPI d3drm_mesh_builder2_GetClassName(IDirect3DRMMeshBuilder2 *iface, DWORD *size, char *name)
Definition: meshbuilder.c:486
static HRESULT WINAPI d3drm_mesh_QueryInterface(IDirect3DRMMesh *iface, REFIID riid, void **out)
Definition: meshbuilder.c:2360
static int WINAPI d3drm_mesh_builder3_AddVertex(IDirect3DRMMeshBuilder3 *iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:1854
static HRESULT WINAPI d3drm_mesh_builder3_SetTexture(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMTexture3 *texture)
Definition: meshbuilder.c:1710
static HRESULT WINAPI d3drm_mesh_GetBox(IDirect3DRMMesh *iface, D3DRMBOX *box)
Definition: meshbuilder.c:2510
static HRESULT WINAPI d3drm_mesh_builder3_SetColor(IDirect3DRMMeshBuilder3 *iface, D3DCOLOR color)
Definition: meshbuilder.c:1699
static HRESULT WINAPI d3drm_wrap_GetClassName(IDirect3DRMWrap *iface, DWORD *size, char *name)
Definition: meshbuilder.c:2969
static HRESULT WINAPI d3drm_mesh_Clone(IDirect3DRMMesh *iface, IUnknown *outer, REFIID iid, void **out)
Definition: meshbuilder.c:2419
static HRESULT WINAPI d3drm_mesh_builder2_Clone(IDirect3DRMMeshBuilder2 *iface, IUnknown *outer, REFIID iid, void **out)
Definition: meshbuilder.c:402
static int WINAPI d3drm_mesh_builder3_GetNormalCount(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:2253
static HRESULT WINAPI d3drm_mesh_builder3_GetParentMesh(IDirect3DRMMeshBuilder3 *iface, DWORD flags, IUnknown **parent)
Definition: meshbuilder.c:2156
static HRESULT WINAPI d3drm_mesh_builder2_SetVertexColor(IDirect3DRMMeshBuilder2 *iface, DWORD index, D3DCOLOR color)
Definition: meshbuilder.c:713
static HRESULT WINAPI d3drm_mesh_builder2_GetBox(IDirect3DRMMeshBuilder2 *iface, D3DRMBOX *box)
Definition: meshbuilder.c:544
static HRESULT WINAPI d3drm_mesh_builder3_AddDestroyCallback(IDirect3DRMMeshBuilder3 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:973
static HRESULT WINAPI d3drm_mesh_builder2_Scale(IDirect3DRMMeshBuilder2 *iface, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
Definition: meshbuilder.c:519
static HRESULT WINAPI d3drm_mesh_builder2_GenerateNormals2(IDirect3DRMMeshBuilder2 *iface, D3DVALUE crease, DWORD flags)
Definition: meshbuilder.c:867
static HRESULT WINAPI d3drm_mesh_builder2_GetName(IDirect3DRMMeshBuilder2 *iface, DWORD *size, char *name)
Definition: meshbuilder.c:477
static HRESULT WINAPI d3drm_mesh_builder2_AddFrame(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMFrame *frame)
Definition: meshbuilder.c:580
static BOOL WINAPI d3drm_mesh_builder3_GetPerspective(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:1914
static HRESULT WINAPI d3drm_mesh_builder2_SetAppData(IDirect3DRMMeshBuilder2 *iface, DWORD data)
Definition: meshbuilder.c:441
static int WINAPI d3drm_mesh_builder2_AddNormal(IDirect3DRMMeshBuilder2 *iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:792
static HRESULT WINAPI d3drm_mesh_builder3_DeleteFace(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFace2 *face)
Definition: meshbuilder.c:2119
static HRESULT WINAPI d3drm_wrap_ApplyRelative(IDirect3DRMWrap *iface, IDirect3DRMFrame *frame, IDirect3DRMObject *object)
Definition: meshbuilder.c:2996
HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, IDirect3DRM *d3drm)
Definition: meshbuilder.c:2836
static D3DCOLOR WINAPI d3drm_mesh_builder3_GetVertexColor(IDirect3DRMMeshBuilder3 *iface, DWORD index)
Definition: meshbuilder.c:1939
static HRESULT WINAPI d3drm_mesh_SetVertices(IDirect3DRMMesh *iface, D3DRMGROUPINDEX group_id, unsigned int start_idx, unsigned int count, D3DRMVERTEX *values)
Definition: meshbuilder.c:2574
static D3DRMRENDERQUALITY WINAPI d3drm_mesh_builder3_GetQuality(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:1905
static HRESULT WINAPI d3drm_mesh_builder3_AddMeshBuilder(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMMeshBuilder3 *mesh_builder, DWORD flags)
Definition: meshbuilder.c:1646
static ULONG WINAPI d3drm_mesh_builder3_AddRef(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:947
static HRESULT WINAPI d3drm_wrap_AddDestroyCallback(IDirect3DRMWrap *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:2911
static HRESULT WINAPI d3drm_mesh_builder3_SetNormals(IDirect3DRMMeshBuilder3 *iface, DWORD start_idx, DWORD count, D3DVECTOR *vector)
Definition: meshbuilder.c:2227
static HRESULT WINAPI d3drm_mesh_builder3_GetVertex(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DVECTOR *vector)
Definition: meshbuilder.c:2087
char templates[]
Definition: meshbuilder.c:39
static struct d3drm_mesh_builder * impl_from_IDirect3DRMMeshBuilder2(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:292
HRESULT d3drm_mesh_builder_create(struct d3drm_mesh_builder **mesh_builder, IDirect3DRM *d3drm)
Definition: meshbuilder.c:2336
static HRESULT WINAPI d3drm_mesh_GetClassName(IDirect3DRMMesh *iface, DWORD *size, char *name)
Definition: meshbuilder.c:2485
static HRESULT WINAPI d3drm_mesh_builder2_SetQuality(IDirect3DRMMeshBuilder2 *iface, D3DRMRENDERQUALITY quality)
Definition: meshbuilder.c:670
static HRESULT WINAPI d3drm_mesh_builder3_SetMaterial(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMMaterial2 *material)
Definition: meshbuilder.c:1726
static const struct IDirect3DRMWrapVtbl d3drm_wrap_vtbl
Definition: meshbuilder.c:3004
static HRESULT WINAPI d3drm_mesh_builder3_AddFacesIndexed(IDirect3DRMMeshBuilder3 *iface, DWORD flags, DWORD *indices, DWORD *start_idx, DWORD *count)
Definition: meshbuilder.c:2140
static HRESULT WINAPI d3drm_mesh_builder3_SetTextureTopology(IDirect3DRMMeshBuilder3 *iface, BOOL wrap_u, BOOL wrap_v)
Definition: meshbuilder.c:1742
static HRESULT WINAPI d3drm_mesh_builder3_GetClassName(IDirect3DRMMeshBuilder3 *iface, DWORD *size, char *name)
Definition: meshbuilder.c:1012
static struct d3drm_wrap * impl_from_IDirect3DRMWrap(IDirect3DRMWrap *iface)
Definition: meshbuilder.c:302
static HRESULT WINAPI d3drm_mesh_builder2_QueryInterface(IDirect3DRMMeshBuilder2 *iface, REFIID riid, void **out)
Definition: meshbuilder.c:341
static int WINAPI d3drm_mesh_builder3_GetVertexCount(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:1930
static HRESULT WINAPI d3drm_mesh_builder3_AddFaces(IDirect3DRMMeshBuilder3 *iface, DWORD vertex_count, D3DVECTOR *vertices, DWORD normal_count, D3DVECTOR *normals, DWORD *face_data, IDirect3DRMFaceArray **array)
Definition: meshbuilder.c:1668
static HRESULT WINAPI d3drm_mesh_GetGroupMaterial(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, IDirect3DRMMaterial **material)
Definition: meshbuilder.c:2760
static HRESULT WINAPI d3drm_mesh_builder2_SetColorRGB(IDirect3DRMMeshBuilder2 *iface, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
Definition: meshbuilder.c:613
static void clean_mesh_builder_data(struct d3drm_mesh_builder *mesh_builder)
Definition: meshbuilder.c:307
HRESULT load_mesh_data(IDirect3DRMMeshBuilder3 *iface, IDirectXFileData *pData, D3DRMLOADTEXTURECALLBACK load_texture_proc, void *arg)
Definition: meshbuilder.c:1022
static HRESULT WINAPI d3drm_mesh_builder3_DeleteDestroyCallback(IDirect3DRMMeshBuilder3 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:983
static HRESULT WINAPI d3drm_mesh_builder3_ReserveSpace(IDirect3DRMMeshBuilder3 *iface, DWORD vertex_count, DWORD normal_count, DWORD face_count)
Definition: meshbuilder.c:1678
static HRESULT WINAPI d3drm_mesh_builder3_GetNormals(IDirect3DRMMeshBuilder3 *iface, DWORD start_idx, DWORD *normal_count, D3DVECTOR *normals)
Definition: meshbuilder.c:2236
static HRESULT WINAPI d3drm_mesh_Translate(IDirect3DRMMesh *iface, D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
Definition: meshbuilder.c:2502
static HRESULT WINAPI d3drm_mesh_builder3_SetVertexColor(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DCOLOR color)
Definition: meshbuilder.c:1802
static D3DRMRENDERQUALITY WINAPI d3drm_mesh_GetGroupQuality(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id)
Definition: meshbuilder.c:2753
static HRESULT WINAPI d3drm_mesh_builder2_SetColorSource(IDirect3DRMMeshBuilder2 *iface, D3DRMCOLORSOURCE source)
Definition: meshbuilder.c:537
static ULONG WINAPI d3drm_wrap_AddRef(IDirect3DRMWrap *iface)
Definition: meshbuilder.c:2877
static HRESULT WINAPI d3drm_wrap_QueryInterface(IDirect3DRMWrap *iface, REFIID riid, void **out)
Definition: meshbuilder.c:2858
static ULONG WINAPI d3drm_mesh_Release(IDirect3DRMMesh *iface)
Definition: meshbuilder.c:2390
static HRESULT WINAPI d3drm_mesh_builder3_CreateMesh(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMMesh **mesh)
Definition: meshbuilder.c:1947
static HRESULT WINAPI d3drm_mesh_GetGroupTexture(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, IDirect3DRMTexture **texture)
Definition: meshbuilder.c:2781
static HRESULT WINAPI d3drm_mesh_builder3_GetVertices(IDirect3DRMMeshBuilder3 *iface, DWORD start_idx, DWORD *vertex_count, D3DVECTOR *vertices)
Definition: meshbuilder.c:2210
static HRESULT WINAPI d3drm_mesh_builder3_DeleteSubMesh(IDirect3DRMMeshBuilder3 *iface, IUnknown *mesh)
Definition: meshbuilder.c:2172
static HRESULT WINAPI d3drm_mesh_builder2_SetPerspective(IDirect3DRMMeshBuilder2 *iface, BOOL enable)
Definition: meshbuilder.c:679
static HRESULT WINAPI d3drm_mesh_SetAppData(IDirect3DRMMesh *iface, DWORD data)
Definition: meshbuilder.c:2447
static HRESULT WINAPI d3drm_mesh_builder3_SetVertex(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:1770
static HRESULT WINAPI d3drm_mesh_builder2_Save(IDirect3DRMMeshBuilder2 *iface, const char *filename, D3DRMXOFFORMAT format, D3DRMSAVEOPTIONS flags)
Definition: meshbuilder.c:510
static HRESULT WINAPI d3drm_mesh_builder3_AddFrame(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFrame3 *frame)
Definition: meshbuilder.c:1654
static HRESULT WINAPI d3drm_mesh_builder2_SetVertex(IDirect3DRMMeshBuilder2 *iface, DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:686
static HRESULT WINAPI d3drm_mesh_builder2_Load(IDirect3DRMMeshBuilder2 *iface, void *filename, void *name, D3DRMLOADOPTIONS flags, D3DRMLOADTEXTURECALLBACK cb, void *ctx)
Definition: meshbuilder.c:495
static HRESULT WINAPI d3drm_mesh_builder3_SetColorRGB(IDirect3DRMMeshBuilder3 *iface, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
Definition: meshbuilder.c:1687
static HRESULT WINAPI d3drm_mesh_builder3_GetEnable(IDirect3DRMMeshBuilder3 *iface, DWORD *indices)
Definition: meshbuilder.c:2186
static ULONG WINAPI d3drm_mesh_AddRef(IDirect3DRMMesh *iface)
Definition: meshbuilder.c:2380
static HRESULT WINAPI d3drm_mesh_builder3_GetGeometry(IDirect3DRMMeshBuilder3 *iface, DWORD *vertex_count, D3DVECTOR *vertices, DWORD *normal_count, D3DVECTOR *normals, DWORD *face_data_size, DWORD *face_data)
Definition: meshbuilder.c:1827
static HRESULT WINAPI d3drm_mesh_SetName(IDirect3DRMMesh *iface, const char *name)
Definition: meshbuilder.c:2467
static HRESULT WINAPI d3drm_mesh_builder3_Clone(IDirect3DRMMeshBuilder3 *iface, IUnknown *outer, REFIID iid, void **out)
Definition: meshbuilder.c:965
static HRESULT WINAPI d3drm_mesh_builder2_SetMaterial(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMMaterial *material)
Definition: meshbuilder.c:651
static HRESULT WINAPI d3drm_mesh_builder3_Load(IDirect3DRMMeshBuilder3 *iface, void *filename, void *name, D3DRMLOADOPTIONS loadflags, D3DRMLOADTEXTURE3CALLBACK cb, void *arg)
Definition: meshbuilder.c:1462
static DWORD WINAPI d3drm_mesh_builder2_GetAppData(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:459
static HRESULT WINAPI d3drm_mesh_builder3_GetFaces(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFaceArray **array)
Definition: meshbuilder.c:1819
static HRESULT WINAPI d3drm_mesh_builder3_Translate(IDirect3DRMMeshBuilder3 *iface, D3DVALUE tx, D3DVALUE ty, D3DVALUE tz)
Definition: meshbuilder.c:1601
static HRESULT WINAPI d3drm_mesh_AddDestroyCallback(IDirect3DRMMesh *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:2427
static DWORD WINAPI d3drm_mesh_GetAppData(IDirect3DRMMesh *iface)
Definition: meshbuilder.c:2458
static HRESULT WINAPI d3drm_mesh_builder3_SetName(IDirect3DRMMeshBuilder3 *iface, const char *name)
Definition: meshbuilder.c:993
static HRESULT WINAPI d3drm_mesh_builder3_DeleteNormals(IDirect3DRMMeshBuilder3 *iface, DWORD start_idx, DWORD count)
Definition: meshbuilder.c:2111
static HRESULT WINAPI d3drm_mesh_builder2_GetVertices(IDirect3DRMMeshBuilder2 *iface, DWORD *vertex_count, D3DVECTOR *vertices, DWORD *normal_count, D3DVECTOR *normals, DWORD *face_data_size, DWORD *face_data)
Definition: meshbuilder.c:738
static const struct IDirect3DRMMeshVtbl d3drm_mesh_vtbl
Definition: meshbuilder.c:2802
static HRESULT WINAPI d3drm_mesh_builder2_GetFaces(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMFaceArray **array)
Definition: meshbuilder.c:730
HRESULT d3drm_wrap_create(struct d3drm_wrap **wrap, IDirect3DRM *d3drm)
Definition: meshbuilder.c:3022
static HRESULT WINAPI d3drm_mesh_DeleteDestroyCallback(IDirect3DRMMesh *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:2437
static HRESULT WINAPI d3drm_mesh_builder3_Scale(IDirect3DRMMeshBuilder3 *iface, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
Definition: meshbuilder.c:1581
static HRESULT WINAPI d3drm_mesh_builder3_QueryInterface(IDirect3DRMMeshBuilder3 *iface, REFIID riid, void **out)
Definition: meshbuilder.c:938
static HRESULT WINAPI d3drm_mesh_builder2_SetNormal(IDirect3DRMMeshBuilder2 *iface, DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:694
static D3DRMMAPPING WINAPI d3drm_mesh_GetGroupMapping(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id)
Definition: meshbuilder.c:2747
static HRESULT WINAPI d3drm_mesh_builder2_GetTextureCoordinates(IDirect3DRMMeshBuilder2 *iface, DWORD index, D3DVALUE *u, D3DVALUE *v)
Definition: meshbuilder.c:771
static HRESULT WINAPI d3drm_mesh_SetGroupQuality(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, D3DRMRENDERQUALITY value)
Definition: meshbuilder.c:2632
static HRESULT WINAPI d3drm_mesh_builder3_SetPerspective(IDirect3DRMMeshBuilder3 *iface, BOOL enable)
Definition: meshbuilder.c:1762
static HRESULT WINAPI d3drm_mesh_builder2_SetTextureTopology(IDirect3DRMMeshBuilder2 *iface, BOOL wrap_u, BOOL wrap_v)
Definition: meshbuilder.c:662
static HRESULT WINAPI d3drm_mesh_AddGroup(IDirect3DRMMesh *iface, unsigned vertex_count, unsigned face_count, unsigned vertex_per_face, unsigned *face_data, D3DRMGROUPINDEX *id)
Definition: meshbuilder.c:2517
static int WINAPI d3drm_mesh_builder2_GetFaceCount(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:833
static HRESULT WINAPI d3drm_mesh_builder3_GetTextureCoordinates(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DVALUE *u, D3DVALUE *v)
Definition: meshbuilder.c:1838
static UINT WINAPI d3drm_mesh_GetGroupCount(IDirect3DRMMesh *iface)
Definition: meshbuilder.c:2682
static HRESULT WINAPI d3drm_mesh_GetName(IDirect3DRMMesh *iface, DWORD *size, char *name)
Definition: meshbuilder.c:2476
static HRESULT WINAPI d3drm_mesh_builder3_SetTextureCoordinates(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DVALUE u, D3DVALUE v)
Definition: meshbuilder.c:1786
static HRESULT WINAPI d3drm_mesh_builder3_SetColorSource(IDirect3DRMMeshBuilder3 *iface, D3DRMCOLORSOURCE source)
Definition: meshbuilder.c:1609
static DWORD WINAPI d3drm_wrap_GetAppData(IDirect3DRMWrap *iface)
Definition: meshbuilder.c:2942
static HRESULT WINAPI d3drm_mesh_builder3_Empty(IDirect3DRMMeshBuilder3 *iface, DWORD flags)
Definition: meshbuilder.c:2126
static HRESULT WINAPI d3drm_mesh_builder2_DeleteDestroyCallback(IDirect3DRMMeshBuilder2 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:420
static HRESULT WINAPI d3drm_mesh_builder3_AddTriangles(IDirect3DRMMeshBuilder3 *iface, DWORD flags, DWORD format, DWORD vertex_count, void *data)
Definition: meshbuilder.c:2193
static HRESULT WINAPI d3drm_wrap_DeleteDestroyCallback(IDirect3DRMWrap *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:2921
static BOOL WINAPI d3drm_mesh_builder2_GetPerspective(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:826
static HRESULT WINAPI d3drm_mesh_builder3_GetSubMeshes(IDirect3DRMMeshBuilder3 *iface, DWORD *count, IUnknown **meshes)
Definition: meshbuilder.c:2164
static struct d3drm_mesh * impl_from_IDirect3DRMMesh(IDirect3DRMMesh *iface)
Definition: meshbuilder.c:287
static HRESULT WINAPI d3drm_mesh_builder2_ReserveSpace(IDirect3DRMMeshBuilder2 *iface, DWORD vertex_count, DWORD normal_count, DWORD face_count)
Definition: meshbuilder.c:604
static HRESULT WINAPI d3drm_mesh_builder3_CreateFace(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFace2 **face)
Definition: meshbuilder.c:1890
static D3DRMRENDERQUALITY WINAPI d3drm_mesh_builder2_GetQuality(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:817
static int WINAPI d3drm_mesh_builder2_GetVertexCount(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:842
static HRESULT WINAPI d3drm_wrap_Init(IDirect3DRMWrap *iface, D3DRMWRAPTYPE type, IDirect3DRMFrame *reference, D3DVALUE ox, D3DVALUE oy, D3DVALUE oz, D3DVALUE dx, D3DVALUE dy, D3DVALUE dz, D3DVALUE ux, D3DVALUE uy, D3DVALUE uz, D3DVALUE ou, D3DVALUE ov, D3DVALUE su, D3DVALUE sv)
Definition: meshbuilder.c:2978
static HRESULT WINAPI d3drm_mesh_Scale(IDirect3DRMMesh *iface, D3DVALUE sx, D3DVALUE sy, D3DVALUE sz)
Definition: meshbuilder.c:2494
static HRESULT WINAPI d3drm_mesh_builder3_GetBox(IDirect3DRMMeshBuilder3 *iface, D3DRMBOX *box)
Definition: meshbuilder.c:1617
static HRESULT WINAPI d3drm_mesh_builder3_GetFace(IDirect3DRMMeshBuilder3 *iface, DWORD index, IDirect3DRMFace2 **face)
Definition: meshbuilder.c:2079
static D3DRMCOLORSOURCE WINAPI d3drm_mesh_builder2_GetColorSource(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:558
static D3DRMCOLORSOURCE WINAPI d3drm_mesh_builder3_GetColorSource(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:1632
static HRESULT WINAPI d3drm_mesh_builder3_SetVertexColorRGB(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
Definition: meshbuilder.c:1810
static HRESULT WINAPI d3drm_mesh_SetGroupMapping(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, D3DRMMAPPING value)
Definition: meshbuilder.c:2625
static ULONG WINAPI d3drm_wrap_Release(IDirect3DRMWrap *iface)
Definition: meshbuilder.c:2887
BOOL d3drm_array_reserve(void **elements, SIZE_T *capacity, SIZE_T element_count, SIZE_T element_size)
Definition: meshbuilder.c:260
static HRESULT WINAPI d3drm_mesh_builder2_SetVertexColorRGB(IDirect3DRMMeshBuilder2 *iface, DWORD index, D3DVALUE red, D3DVALUE green, D3DVALUE blue)
Definition: meshbuilder.c:721
static HRESULT WINAPI d3drm_mesh_builder2_AddFace(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMFace *face)
Definition: meshbuilder.c:587
static HRESULT WINAPI d3drm_mesh_builder3_SetNormal(IDirect3DRMMeshBuilder3 *iface, DWORD index, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:1778
static HRESULT WINAPI d3drm_mesh_builder3_Enable(IDirect3DRMMeshBuilder3 *iface, DWORD index)
Definition: meshbuilder.c:2179
static const struct IDirect3DRMMeshBuilder2Vtbl d3drm_mesh_builder2_vtbl
Definition: meshbuilder.c:883
static HRESULT WINAPI d3drm_wrap_SetAppData(IDirect3DRMWrap *iface, DWORD data)
Definition: meshbuilder.c:2931
static HRESULT WINAPI d3drm_mesh_builder3_GenerateNormals(IDirect3DRMMeshBuilder3 *iface, D3DVALUE crease, DWORD flags)
Definition: meshbuilder.c:1624
static HRESULT WINAPI d3drm_mesh_builder2_SetTexture(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMTexture *texture)
Definition: meshbuilder.c:632
static HRESULT WINAPI d3drm_wrap_SetName(IDirect3DRMWrap *iface, const char *name)
Definition: meshbuilder.c:2951
static HRESULT WINAPI d3drm_mesh_builder3_CreateSubMesh(IDirect3DRMMeshBuilder3 *iface, IUnknown **mesh)
Definition: meshbuilder.c:2149
static HRESULT WINAPI d3drm_mesh_builder3_AddFace(IDirect3DRMMeshBuilder3 *iface, IDirect3DRMFace2 *face)
Definition: meshbuilder.c:1661
static HRESULT WINAPI d3drm_wrap_Apply(IDirect3DRMWrap *iface, IDirect3DRMObject *object)
Definition: meshbuilder.c:2989
static HRESULT WINAPI d3drm_mesh_builder3_Save(IDirect3DRMMeshBuilder3 *iface, const char *filename, D3DRMXOFFORMAT format, D3DRMSAVEOPTIONS flags)
Definition: meshbuilder.c:1572
static HRESULT WINAPI d3drm_wrap_Clone(IDirect3DRMWrap *iface, IUnknown *outer, REFIID iid, void **out)
Definition: meshbuilder.c:2903
static HRESULT WINAPI d3drm_mesh_builder2_AddFaces(IDirect3DRMMeshBuilder2 *iface, DWORD vertex_count, D3DVECTOR *vertices, DWORD normal_count, D3DVECTOR *normals, DWORD *face_data, IDirect3DRMFaceArray **array)
Definition: meshbuilder.c:594
static HRESULT WINAPI d3drm_mesh_builder3_DeleteVertices(IDirect3DRMMeshBuilder3 *iface, DWORD start_idx, DWORD count)
Definition: meshbuilder.c:2103
static HRESULT WINAPI d3drm_mesh_builder2_GenerateNormals(IDirect3DRMMeshBuilder2 *iface)
Definition: meshbuilder.c:551
static HRESULT WINAPI d3drm_mesh_builder3_SetQuality(IDirect3DRMMeshBuilder3 *iface, D3DRMRENDERQUALITY quality)
Definition: meshbuilder.c:1750
static HRESULT WINAPI d3drm_mesh_builder2_GetFace(IDirect3DRMMeshBuilder2 *iface, DWORD index, IDirect3DRMFace **face)
Definition: meshbuilder.c:875
static int WINAPI d3drm_mesh_builder2_AddVertex(IDirect3DRMMeshBuilder2 *iface, D3DVALUE x, D3DVALUE y, D3DVALUE z)
Definition: meshbuilder.c:782
static HRESULT WINAPI d3drm_mesh_builder3_GetName(IDirect3DRMMeshBuilder3 *iface, DWORD *size, char *name)
Definition: meshbuilder.c:1002
static HRESULT WINAPI d3drm_wrap_GetName(IDirect3DRMWrap *iface, DWORD *size, char *name)
Definition: meshbuilder.c:2960
static HRESULT WINAPI d3drm_mesh_builder3_SetVertices(IDirect3DRMMeshBuilder3 *iface, DWORD start_idx, DWORD count, D3DVECTOR *vector)
Definition: meshbuilder.c:2202
static HRESULT WINAPI d3drm_mesh_builder2_AddMesh(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMMesh *mesh)
Definition: meshbuilder.c:565
static HRESULT WINAPI d3drm_mesh_builder2_SetColor(IDirect3DRMMeshBuilder2 *iface, D3DCOLOR color)
Definition: meshbuilder.c:623
static D3DCOLOR WINAPI d3drm_mesh_builder2_GetVertexColor(IDirect3DRMMeshBuilder2 *iface, DWORD index)
Definition: meshbuilder.c:851
static HRESULT WINAPI d3drm_mesh_builder2_CreateMesh(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMMesh **mesh)
Definition: meshbuilder.c:858
static HRESULT WINAPI d3drm_mesh_builder2_SetTextureCoordinates(IDirect3DRMMeshBuilder2 *iface, DWORD index, D3DVALUE u, D3DVALUE v)
Definition: meshbuilder.c:702
static HRESULT WINAPI d3drm_mesh_builder2_AddDestroyCallback(IDirect3DRMMeshBuilder2 *iface, D3DRMOBJECTCALLBACK cb, void *ctx)
Definition: meshbuilder.c:410
static HRESULT WINAPI d3drm_mesh_GetVertices(IDirect3DRMMesh *iface, D3DRMGROUPINDEX group_id, DWORD start_idx, DWORD count, D3DRMVERTEX *vertices)
Definition: meshbuilder.c:2716
static HRESULT WINAPI d3drm_mesh_SetGroupTexture(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id, IDirect3DRMTexture *texture)
Definition: meshbuilder.c:2660
static HRESULT WINAPI d3drm_mesh_builder3_SetAppData(IDirect3DRMMeshBuilder3 *iface, DWORD data)
Definition: meshbuilder.c:430
static HRESULT WINAPI d3drm_mesh_builder2_CreateFace(IDirect3DRMMeshBuilder2 *iface, IDirect3DRMFace **face)
Definition: meshbuilder.c:802
static HRESULT WINAPI d3drm_mesh_builder3_Optimize(IDirect3DRMMeshBuilder3 *iface, DWORD flags)
Definition: meshbuilder.c:2133
static int WINAPI d3drm_mesh_builder3_GetFaceCount(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:1921
static DWORD WINAPI d3drm_mesh_builder3_GetAppData(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:450
static struct d3drm_mesh_builder * impl_from_IDirect3DRMMeshBuilder3(IDirect3DRMMeshBuilder3 *iface)
Definition: meshbuilder.c:297
static HRESULT WINAPI d3drm_mesh_builder2_SetName(IDirect3DRMMeshBuilder2 *iface, const char *name)
Definition: meshbuilder.c:468
static D3DCOLOR WINAPI d3drm_mesh_GetGroupColor(IDirect3DRMMesh *iface, D3DRMGROUPINDEX id)
Definition: meshbuilder.c:2738
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
int face_count
Definition: d3drm.c:3529
int vertex_per_face
Definition: d3drm.c:3530
IDirect3DRMMeshBuilder * mesh_builder
Definition: d3drm.c:3491
int vertex_count
Definition: d3drm.c:3528
int face_data_size
Definition: d3drm.c:3531
static ULONG ** element_count
Definition: exception.c:124
static IUnknown * outer
Definition: compobj.c:82
static HWND child
Definition: cursoricon.c:298
int k
Definition: mpi.c:3369
#define DWORD
Definition: nt_native.h:44
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
WCHAR classname[128]
Definition: startup.c:15
#define calloc
Definition: rosglue.h:14
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
Definition: undname.c:54
Definition: palette.c:466
D3DVALUE v
Definition: meshbuilder.c:29
D3DVALUE u
Definition: meshbuilder.c:28
IDirect3DRM * d3drm
D3DVECTOR * vertices
D3DVECTOR * normals
struct d3drm_object obj
IDirect3DRMMeshBuilder3 IDirect3DRMMeshBuilder3_iface
IDirect3DRMMeshBuilder2 IDirect3DRMMeshBuilder2_iface
IDirect3DRMMaterial2 * material
IDirect3DRM * d3drm
IDirect3DRMMesh IDirect3DRMMesh_iface
IDirect3DRMTexture3 IDirect3DRMTexture3_iface
Definition: d3drm_private.h:60
IDirect3DRMWrap IDirect3DRMWrap_iface
Definition: d3drm.c:189
Definition: fci.c:123
unsigned * face_data
IDirect3DRMTexture3 * texture
Definition: meshbuilder.c:36
D3DCOLOR color
Definition: meshbuilder.c:34
IDirect3DRMMaterial2 * material
Definition: meshbuilder.c:35
Definition: mesh.c:189
struct vertex * vertices
Definition: mesh.c:191
Definition: name.c:39
#define max(a, b)
Definition: svc.c:63
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
Definition: pdh_main.c:64
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480
#define CLASS_E_CLASSNOTAVAILABLE
Definition: winerror.h:3772
unsigned char BYTE
Definition: xxhash.c:193