2 * Copyright 2010, 2012 Christian Costa
3 * Copyright 2012 André Hentschel
4 * Copyright 2011-2014 Henri Verbeet for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include "wine/test.h"
29 #define CHECK_REFCOUNT(obj,rc) \
32 int count = get_refcount( (IUnknown *)obj ); \
33 ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
36 static int get_refcount(IUnknown
*object
)
38 IUnknown_AddRef( object
);
39 return IUnknown_Release( object
);
42 static BOOL
match_float(float a
, float b
)
44 return (a
- b
) < 0.000001f
;
47 static D3DRMMATRIX4D identity
= {
48 { 1.0f
, 0.0f
, 0.0f
, 0.0f
},
49 { 0.0f
, 1.0f
, 0.0f
, 0.0f
},
50 { 0.0f
, 0.0f
, 1.0f
, 0.0f
},
51 { 0.0f
, 0.0f
, 0.0f
, 1.0f
}
54 static char data_bad_version
[] =
61 static char data_no_mesh
[] =
68 static char data_ok
[] =
87 static char data_full
[] =
89 "Header { 1; 0; 1; }\n"
97 " MeshMaterialList {\n"
100 " 0.0; 1.0; 0.0; 1.0;;\n"
104 " TextureFileName {\n"
105 " \"Texture.bmp\";\n"
117 " MeshTextureCoords {\n"
125 static char data_d3drm_load
[] =
152 " 0.1, 0.2, 0.3, 0.4;;\n"
158 static char data_frame_mesh_materials
[] =
160 "Header { 1; 0; 1; }\n"
176 " MeshMaterialList {\n"
177 " 3; 6; 0, 1, 1, 2, 2, 2;\n"
179 " 1.0; 0.0; 0.0; 0.1;;\n"
181 " 0.11; 0.12; 0.13;;\n"
182 " 0.14; 0.15; 0.16;;\n"
185 " 0.0; 1.0; 0.0; 0.2;;\n"
187 " 0.21; 0.22; 0.23;;\n"
188 " 0.24; 0.25; 0.26;;\n"
191 " 0.0; 0.0; 1.0; 0.3;;\n"
193 " 0.31; 0.32; 0.33;;\n"
194 " 0.34; 0.35; 0.36;;\n"
200 static void test_MeshBuilder(void)
204 IDirect3DRMMeshBuilder
*pMeshBuilder
;
205 IDirect3DRMMesh
*mesh
;
206 D3DRMLOADMEMORY info
;
208 DWORD val1
, val2
, val3
;
216 CHAR cname
[64] = {0};
218 hr
= Direct3DRMCreate(&d3drm
);
219 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
221 hr
= IDirect3DRM_CreateMeshBuilder(d3drm
, &pMeshBuilder
);
222 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr
);
224 hr
= IDirect3DRMMeshBuilder_GetClassName(pMeshBuilder
, NULL
, cname
);
225 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
226 hr
= IDirect3DRMMeshBuilder_GetClassName(pMeshBuilder
, NULL
, NULL
);
227 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
229 hr
= IDirect3DRMMeshBuilder_GetClassName(pMeshBuilder
, &size
, cname
);
230 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
231 size
= sizeof(cname
);
232 hr
= IDirect3DRMMeshBuilder_GetClassName(pMeshBuilder
, &size
, cname
);
233 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
234 ok(size
== sizeof("Builder"), "wrong size: %u\n", size
);
235 ok(!strcmp(cname
, "Builder"), "Expected cname to be \"Builder\", but got \"%s\"\n", cname
);
237 info
.lpMemory
= data_bad_version
;
238 info
.dSize
= strlen(data_bad_version
);
239 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
240 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
242 info
.lpMemory
= data_no_mesh
;
243 info
.dSize
= strlen(data_no_mesh
);
244 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
245 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
247 info
.lpMemory
= data_ok
;
248 info
.dSize
= strlen(data_ok
);
249 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
250 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
253 hr
= IDirect3DRMMeshBuilder_GetName(pMeshBuilder
, &size
, name
);
254 ok(hr
== D3DRM_OK
, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr
);
255 ok(!strcmp(name
, "Object"), "Retrieved name '%s' instead of 'Object'\n", name
);
256 size
= strlen("Object"); /* No space for null character */
257 hr
= IDirect3DRMMeshBuilder_GetName(pMeshBuilder
, &size
, name
);
258 ok(hr
== E_INVALIDARG
, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr
);
259 hr
= IDirect3DRMMeshBuilder_SetName(pMeshBuilder
, NULL
);
260 ok(hr
== D3DRM_OK
, "IDirect3DRMMeshBuilder_SetName returned hr = %x\n", hr
);
262 hr
= IDirect3DRMMeshBuilder_GetName(pMeshBuilder
, &size
, name
);
263 ok(hr
== D3DRM_OK
, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr
);
264 ok(size
== 0, "Size should be 0 instead of %u\n", size
);
265 hr
= IDirect3DRMMeshBuilder_SetName(pMeshBuilder
, "");
266 ok(hr
== D3DRM_OK
, "IDirect3DRMMeshBuilder_SetName returned hr = %x\n", hr
);
268 hr
= IDirect3DRMMeshBuilder_GetName(pMeshBuilder
, &size
, name
);
269 ok(hr
== D3DRM_OK
, "IDirect3DRMMeshBuilder_GetName returned hr = %x\n", hr
);
270 ok(!strcmp(name
, ""), "Retrieved name '%s' instead of ''\n", name
);
272 val
= IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder
);
273 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
275 val
= IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder
);
276 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
278 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, NULL
, &val2
, NULL
, &val3
, NULL
);
279 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
280 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
281 ok(val2
== 4, "Wrong number of normals %d (must be 4)\n", val2
);
282 ok(val3
== 22, "Wrong number of face data bytes %d (must be 22)\n", val3
);
284 /* Check that Load method generated default normals */
285 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, NULL
, NULL
, &val2
, n
, NULL
, NULL
);
286 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
287 ok(match_float(U1(n
[0]).x
, 0.577350f
), "Wrong component n[0].x = %f (expected %f)\n", U1(n
[0]).x
, 0.577350f
);
288 ok(match_float(U2(n
[0]).y
, 0.577350f
), "Wrong component n[0].y = %f (expected %f)\n", U2(n
[0]).y
, 0.577350f
);
289 ok(match_float(U3(n
[0]).z
, 0.577350f
), "Wrong component n[0].z = %f (expected %f)\n", U3(n
[0]).z
, 0.577350f
);
290 ok(match_float(U1(n
[1]).x
, -0.229416f
), "Wrong component n[1].x = %f (expected %f)\n", U1(n
[1]).x
, -0.229416f
);
291 ok(match_float(U2(n
[1]).y
, 0.688247f
), "Wrong component n[1].y = %f (expected %f)\n", U2(n
[1]).y
, 0.688247f
);
292 ok(match_float(U3(n
[1]).z
, 0.688247f
), "Wrong component n[1].z = %f (expected %f)\n", U3(n
[1]).z
, 0.688247f
);
293 ok(match_float(U1(n
[2]).x
, -0.229416f
), "Wrong component n[2].x = %f (expected %f)\n", U1(n
[2]).x
, -0.229416f
);
294 ok(match_float(U2(n
[2]).y
, 0.688247f
), "Wrong component n[2].y = %f (expected %f)\n", U2(n
[2]).y
, 0.688247f
);
295 ok(match_float(U3(n
[2]).z
, 0.688247f
), "Wrong component n[2].z = %f (expected %f)\n", U3(n
[2]).z
, 0.688247f
);
296 ok(match_float(U1(n
[3]).x
, -0.577350f
), "Wrong component n[3].x = %f (expected %f)\n", U1(n
[3]).x
, -0.577350f
);
297 ok(match_float(U2(n
[3]).y
, 0.577350f
), "Wrong component n[3].y = %f (expected %f)\n", U2(n
[3]).y
, 0.577350f
);
298 ok(match_float(U3(n
[3]).z
, 0.577350f
), "Wrong component n[3].z = %f (expected %f)\n", U3(n
[3]).z
, 0.577350f
);
300 /* Check that Load method generated default texture coordinates (0.0f, 0.0f) for each vertex */
303 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 0, &valu
, &valv
);
304 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
305 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
306 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
309 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 1, &valu
, &valv
);
310 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
311 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
312 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
315 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 2, &valu
, &valv
);
316 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
317 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
318 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
321 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 3, &valu
, &valv
);
322 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
323 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
324 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
325 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 4, &valu
, &valv
);
326 ok(hr
== D3DRMERR_BADVALUE
, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr
);
330 hr
= IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder
, 0, valu
, valv
);
331 ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
332 hr
= IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder
, 4, valu
, valv
);
333 ok(hr
== D3DRMERR_BADVALUE
, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr
);
337 hr
= IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder
, 0, &valu
, &valv
);
338 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
339 ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
340 ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
342 IDirect3DRMMeshBuilder_Release(pMeshBuilder
);
344 hr
= IDirect3DRM_CreateMeshBuilder(d3drm
, &pMeshBuilder
);
345 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr
);
347 /* No group in mesh when mesh builder is not loaded */
348 hr
= IDirect3DRMMeshBuilder_CreateMesh(pMeshBuilder
, &mesh
);
349 ok(hr
== D3DRM_OK
, "CreateMesh failed returning hr = %x\n", hr
);
354 nb_groups
= IDirect3DRMMesh_GetGroupCount(mesh
);
355 ok(nb_groups
== 0, "GetCroupCount returned %u\n", nb_groups
);
357 IDirect3DRMMesh_Release(mesh
);
360 info
.lpMemory
= data_full
;
361 info
.dSize
= strlen(data_full
);
362 hr
= IDirect3DRMMeshBuilder_Load(pMeshBuilder
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
363 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
365 val
= IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder
);
366 ok(val
== 3, "Wrong number of vertices %d (must be 3)\n", val
);
368 val
= IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder
);
369 ok(val
== 1, "Wrong number of faces %d (must be 1)\n", val
);
371 /* Check no buffer size and too small buffer size errors */
372 val1
= 1; val2
= 3; val3
= 8;
373 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, &val2
, n
, &val3
, f
);
374 ok(hr
== D3DRMERR_BADVALUE
, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr
);
375 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, NULL
, v
, &val2
, n
, &val3
, f
);
376 ok(hr
== D3DRMERR_BADVALUE
, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr
);
377 val1
= 3; val2
= 1; val3
= 8;
378 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, &val2
, n
, &val3
, f
);
379 ok(hr
== D3DRMERR_BADVALUE
, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr
);
380 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, NULL
, n
, &val3
, f
);
381 ok(hr
== D3DRMERR_BADVALUE
, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr
);
382 val1
= 3; val2
= 3; val3
= 1;
383 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, &val2
, n
, &val3
, f
);
384 ok(hr
== D3DRMERR_BADVALUE
, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr
);
385 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, &val2
, n
, NULL
, f
);
386 ok(hr
== D3DRMERR_BADVALUE
, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr
);
388 val1
= 3; val2
= 3; val3
= 8;
389 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, &val2
, n
, &val3
, f
);
390 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
391 ok(val1
== 3, "Wrong number of vertices %d (must be 3)\n", val1
);
392 ok(val2
== 3, "Wrong number of normals %d (must be 3)\n", val2
);
393 ok(val3
== 8, "Wrong number of face data bytes %d (must be 8)\n", val3
);
394 ok(U1(v
[0]).x
== 0.1f
, "Wrong component v[0].x = %f (expected 0.1)\n", U1(v
[0]).x
);
395 ok(U2(v
[0]).y
== 0.2f
, "Wrong component v[0].y = %f (expected 0.2)\n", U2(v
[0]).y
);
396 ok(U3(v
[0]).z
== 0.3f
, "Wrong component v[0].z = %f (expected 0.3)\n", U3(v
[0]).z
);
397 ok(U1(v
[1]).x
== 0.4f
, "Wrong component v[1].x = %f (expected 0.4)\n", U1(v
[1]).x
);
398 ok(U2(v
[1]).y
== 0.5f
, "Wrong component v[1].y = %f (expected 0.5)\n", U2(v
[1]).y
);
399 ok(U3(v
[1]).z
== 0.6f
, "Wrong component v[1].z = %f (expected 0.6)\n", U3(v
[1]).z
);
400 ok(U1(v
[2]).x
== 0.7f
, "Wrong component v[2].x = %f (expected 0.7)\n", U1(v
[2]).x
);
401 ok(U2(v
[2]).y
== 0.8f
, "Wrong component v[2].y = %f (expected 0.8)\n", U2(v
[2]).y
);
402 ok(U3(v
[2]).z
== 0.9f
, "Wrong component v[2].z = %f (expected 0.9)\n", U3(v
[2]).z
);
403 ok(U1(n
[0]).x
== 1.1f
, "Wrong component n[0].x = %f (expected 1.1)\n", U1(n
[0]).x
);
404 ok(U2(n
[0]).y
== 1.2f
, "Wrong component n[0].y = %f (expected 1.2)\n", U2(n
[0]).y
);
405 ok(U3(n
[0]).z
== 1.3f
, "Wrong component n[0].z = %f (expected 1.3)\n", U3(n
[0]).z
);
406 ok(U1(n
[1]).x
== 1.4f
, "Wrong component n[1].x = %f (expected 1.4)\n", U1(n
[1]).x
);
407 ok(U2(n
[1]).y
== 1.5f
, "Wrong component n[1].y = %f (expected 1.5)\n", U2(n
[1]).y
);
408 ok(U3(n
[1]).z
== 1.6f
, "Wrong component n[1].z = %f (expected 1.6)\n", U3(n
[1]).z
);
409 ok(U1(n
[2]).x
== 1.7f
, "Wrong component n[2].x = %f (expected 1.7)\n", U1(n
[2]).x
);
410 ok(U2(n
[2]).y
== 1.8f
, "Wrong component n[2].y = %f (expected 1.8)\n", U2(n
[2]).y
);
411 ok(U3(n
[2]).z
== 1.9f
, "Wrong component n[2].z = %f (expected 1.9)\n", U3(n
[2]).z
);
412 ok(f
[0] == 3 , "Wrong component f[0] = %d (expected 3)\n", f
[0]);
413 ok(f
[1] == 0 , "Wrong component f[1] = %d (expected 0)\n", f
[1]);
414 ok(f
[2] == 0 , "Wrong component f[2] = %d (expected 0)\n", f
[2]);
415 ok(f
[3] == 1 , "Wrong component f[3] = %d (expected 1)\n", f
[3]);
416 ok(f
[4] == 1 , "Wrong component f[4] = %d (expected 1)\n", f
[4]);
417 ok(f
[5] == 2 , "Wrong component f[5] = %d (expected 2)\n", f
[5]);
418 ok(f
[6] == 2 , "Wrong component f[6] = %d (expected 2)\n", f
[6]);
419 ok(f
[7] == 0 , "Wrong component f[7] = %d (expected 0)\n", f
[7]);
421 hr
= IDirect3DRMMeshBuilder_CreateMesh(pMeshBuilder
, &mesh
);
422 ok(hr
== D3DRM_OK
, "CreateMesh failed returning hr = %x\n", hr
);
426 unsigned nb_vertices
, nb_faces
, nb_face_vertices
;
428 IDirect3DRMMaterial
*material
= (IDirect3DRMMaterial
*)0xdeadbeef;
429 IDirect3DRMTexture
*texture
= (IDirect3DRMTexture
*)0xdeadbeef;
432 nb_groups
= IDirect3DRMMesh_GetGroupCount(mesh
);
433 ok(nb_groups
== 1, "GetCroupCount returned %u\n", nb_groups
);
434 hr
= IDirect3DRMMesh_GetGroup(mesh
, 1, &nb_vertices
, &nb_faces
, &nb_face_vertices
, &data_size
, NULL
);
435 ok(hr
== D3DRMERR_BADVALUE
, "GetCroup returned hr = %x\n", hr
);
436 hr
= IDirect3DRMMesh_GetGroup(mesh
, 0, &nb_vertices
, &nb_faces
, &nb_face_vertices
, &data_size
, NULL
);
437 ok(hr
== D3DRM_OK
, "GetCroup failed returning hr = %x\n", hr
);
438 ok(nb_vertices
== 3, "Wrong number of vertices %u (must be 3)\n", nb_vertices
);
439 ok(nb_faces
== 1, "Wrong number of faces %u (must be 1)\n", nb_faces
);
440 ok(nb_face_vertices
== 3, "Wrong number of vertices per face %u (must be 3)\n", nb_face_vertices
);
441 ok(data_size
== 3, "Wrong number of face data bytes %u (must be 3)\n", data_size
);
442 color
= IDirect3DRMMesh_GetGroupColor(mesh
, 0);
443 ok(color
== 0xff00ff00, "Wrong color returned %#x instead of %#x\n", color
, 0xff00ff00);
444 hr
= IDirect3DRMMesh_GetGroupTexture(mesh
, 0, &texture
);
445 ok(hr
== D3DRM_OK
, "GetCroupTexture failed returning hr = %x\n", hr
);
446 ok(texture
== NULL
, "No texture should be present\n");
447 hr
= IDirect3DRMMesh_GetGroupMaterial(mesh
, 0, &material
);
448 ok(hr
== D3DRM_OK
, "GetCroupMaterial failed returning hr = %x\n", hr
);
449 ok(material
!= NULL
, "No material present\n");
450 if ((hr
== D3DRM_OK
) && material
)
452 hr
= IDirect3DRMMaterial_GetEmissive(material
, &values
[0], &values
[1], &values
[2]);
453 ok(hr
== D3DRM_OK
, "GetMaterialEmissive failed returning hr = %x\n", hr
);
454 ok(values
[0] == 0.5f
, "Emissive red component should be %f instead of %f\n", 0.5f
, values
[0]);
455 ok(values
[1] == 0.5f
, "Emissive green component should be %f instead of %f\n", 0.5f
, values
[1]);
456 ok(values
[2] == 0.5f
, "Emissive blue component should be %f instead of %f\n", 0.5f
, values
[2]);
457 hr
= IDirect3DRMMaterial_GetSpecular(material
, &values
[0], &values
[1], &values
[2]);
458 ok(hr
== D3DRM_OK
, "GetMaterialEmissive failed returning hr = %x\n", hr
);
459 ok(values
[0] == 1.0f
, "Specular red component should be %f instead of %f\n", 1.0f
, values
[0]);
460 ok(values
[1] == 0.0f
, "Specular green component should be %f instead of %f\n", 0.0f
, values
[1]);
461 ok(values
[2] == 0.0f
, "Specular blue component should be %f instead of %f\n", 0.0f
, values
[2]);
462 values
[0] = IDirect3DRMMaterial_GetPower(material
);
463 ok(values
[0] == 30.0f
, "Power value should be %f instead of %f\n", 30.0f
, values
[0]);
466 IDirect3DRMMesh_Release(mesh
);
469 hr
= IDirect3DRMMeshBuilder_Scale(pMeshBuilder
, 2, 3 ,4);
470 ok(hr
== D3DRM_OK
, "Scale failed returning hr = %x\n", hr
);
472 hr
= IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder
, &val1
, v
, &val2
, n
, &val3
, f
);
473 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
474 ok(val2
== 3, "Wrong number of normals %d (must be 3)\n", val2
);
475 ok(val1
== 3, "Wrong number of vertices %d (must be 3)\n", val1
);
476 ok(U1(v
[0]).x
== 0.1f
*2, "Wrong component v[0].x = %f (expected %f)\n", U1(v
[0]).x
, 0.1f
*2);
477 ok(U2(v
[0]).y
== 0.2f
*3, "Wrong component v[0].y = %f (expected %f)\n", U2(v
[0]).y
, 0.2f
*3);
478 ok(U3(v
[0]).z
== 0.3f
*4, "Wrong component v[0].z = %f (expected %f)\n", U3(v
[0]).z
, 0.3f
*4);
479 ok(U1(v
[1]).x
== 0.4f
*2, "Wrong component v[1].x = %f (expected %f)\n", U1(v
[1]).x
, 0.4f
*2);
480 ok(U2(v
[1]).y
== 0.5f
*3, "Wrong component v[1].y = %f (expected %f)\n", U2(v
[1]).y
, 0.5f
*3);
481 ok(U3(v
[1]).z
== 0.6f
*4, "Wrong component v[1].z = %f (expected %f)\n", U3(v
[1]).z
, 0.6f
*4);
482 ok(U1(v
[2]).x
== 0.7f
*2, "Wrong component v[2].x = %f (expected %f)\n", U1(v
[2]).x
, 0.7f
*2);
483 ok(U2(v
[2]).y
== 0.8f
*3, "Wrong component v[2].y = %f (expected %f)\n", U2(v
[2]).y
, 0.8f
*3);
484 ok(U3(v
[2]).z
== 0.9f
*4, "Wrong component v[2].z = %f (expected %f)\n", U3(v
[2]).z
, 0.9f
*4);
485 /* Normals are not affected by Scale */
486 ok(U1(n
[0]).x
== 1.1f
, "Wrong component n[0].x = %f (expected %f)\n", U1(n
[0]).x
, 1.1f
);
487 ok(U2(n
[0]).y
== 1.2f
, "Wrong component n[0].y = %f (expected %f)\n", U2(n
[0]).y
, 1.2f
);
488 ok(U3(n
[0]).z
== 1.3f
, "Wrong component n[0].z = %f (expected %f)\n", U3(n
[0]).z
, 1.3f
);
489 ok(U1(n
[1]).x
== 1.4f
, "Wrong component n[1].x = %f (expected %f)\n", U1(n
[1]).x
, 1.4f
);
490 ok(U2(n
[1]).y
== 1.5f
, "Wrong component n[1].y = %f (expected %f)\n", U2(n
[1]).y
, 1.5f
);
491 ok(U3(n
[1]).z
== 1.6f
, "Wrong component n[1].z = %f (expected %f)\n", U3(n
[1]).z
, 1.6f
);
492 ok(U1(n
[2]).x
== 1.7f
, "Wrong component n[2].x = %f (expected %f)\n", U1(n
[2]).x
, 1.7f
);
493 ok(U2(n
[2]).y
== 1.8f
, "Wrong component n[2].y = %f (expected %f)\n", U2(n
[2]).y
, 1.8f
);
494 ok(U3(n
[2]).z
== 1.9f
, "Wrong component n[2].z = %f (expected %f)\n", U3(n
[2]).z
, 1.9f
);
496 IDirect3DRMMeshBuilder_Release(pMeshBuilder
);
498 IDirect3DRM_Release(d3drm
);
501 static void test_MeshBuilder3(void)
505 IDirect3DRM3
*d3drm3
;
506 IDirect3DRMMeshBuilder3
*pMeshBuilder3
;
507 D3DRMLOADMEMORY info
;
512 CHAR cname
[64] = {0};
514 hr
= Direct3DRMCreate(&d3drm
);
515 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
517 if (FAILED(hr
= IDirect3DRM_QueryInterface(d3drm
, &IID_IDirect3DRM3
, (void **)&d3drm3
)))
519 win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr
);
520 IDirect3DRM_Release(d3drm
);
524 hr
= IDirect3DRM3_CreateMeshBuilder(d3drm3
, &pMeshBuilder3
);
525 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr
);
527 hr
= IDirect3DRMMeshBuilder3_GetClassName(pMeshBuilder3
, NULL
, cname
);
528 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
529 hr
= IDirect3DRMMeshBuilder3_GetClassName(pMeshBuilder3
, NULL
, NULL
);
530 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
532 hr
= IDirect3DRMMeshBuilder3_GetClassName(pMeshBuilder3
, &size
, cname
);
533 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
534 size
= sizeof(cname
);
535 hr
= IDirect3DRMMeshBuilder3_GetClassName(pMeshBuilder3
, &size
, cname
);
536 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
537 ok(size
== sizeof("Builder"), "wrong size: %u\n", size
);
538 ok(!strcmp(cname
, "Builder"), "Expected cname to be \"Builder\", but got \"%s\"\n", cname
);
540 info
.lpMemory
= data_bad_version
;
541 info
.dSize
= strlen(data_bad_version
);
542 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
543 ok(hr
== D3DRMERR_BADFILE
, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr
);
545 info
.lpMemory
= data_no_mesh
;
546 info
.dSize
= strlen(data_no_mesh
);
547 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
548 ok(hr
== D3DRMERR_NOTFOUND
, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr
);
550 info
.lpMemory
= data_ok
;
551 info
.dSize
= strlen(data_ok
);
552 hr
= IDirect3DRMMeshBuilder3_Load(pMeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
553 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
555 val
= IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3
);
556 ok(val
== 4, "Wrong number of vertices %d (must be 4)\n", val
);
558 val
= IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3
);
559 ok(val
== 3, "Wrong number of faces %d (must be 3)\n", val
);
561 hr
= IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3
, 0, &val1
, NULL
);
562 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
563 ok(val1
== 4, "Wrong number of vertices %d (must be 4)\n", val1
);
565 /* Check that Load method generated default texture coordinates (0.0f, 0.0f) for each vertex */
568 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 0, &valu
, &valv
);
569 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
570 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
571 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
574 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 1, &valu
, &valv
);
575 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
576 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
577 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
580 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 2, &valu
, &valv
);
581 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
582 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
583 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
586 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 3, &valu
, &valv
);
587 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
588 ok(valu
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valu
);
589 ok(valv
== 0.0f
, "Wrong coordinate %f (must be 0.0)\n", valv
);
590 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 4, &valu
, &valv
);
591 ok(hr
== D3DRMERR_BADVALUE
, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr
);
595 hr
= IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3
, 0, valu
, valv
);
596 ok(hr
== D3DRM_OK
, "Cannot set texture coordinates (hr = %x)\n", hr
);
597 hr
= IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3
, 4, valu
, valv
);
598 ok(hr
== D3DRMERR_BADVALUE
, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr
);
602 hr
= IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3
, 0, &valu
, &valv
);
603 ok(hr
== D3DRM_OK
, "Cannot get texture coordinates (hr = %x)\n", hr
);
604 ok(valu
== 1.23f
, "Wrong coordinate %f (must be 1.23)\n", valu
);
605 ok(valv
== 3.21f
, "Wrong coordinate %f (must be 3.21)\n", valv
);
607 IDirect3DRMMeshBuilder3_Release(pMeshBuilder3
);
608 IDirect3DRM3_Release(d3drm3
);
609 IDirect3DRM_Release(d3drm
);
612 static void test_Mesh(void)
616 IDirect3DRMMesh
*mesh
;
618 CHAR cname
[64] = {0};
620 hr
= Direct3DRMCreate(&d3drm
);
621 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
623 hr
= IDirect3DRM_CreateMesh(d3drm
, &mesh
);
624 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMesh interface (hr = %x)\n", hr
);
626 hr
= IDirect3DRMMesh_GetClassName(mesh
, NULL
, cname
);
627 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
628 hr
= IDirect3DRMMesh_GetClassName(mesh
, NULL
, NULL
);
629 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
631 hr
= IDirect3DRMMesh_GetClassName(mesh
, &size
, cname
);
632 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
633 size
= sizeof(cname
);
634 hr
= IDirect3DRMMesh_GetClassName(mesh
, &size
, cname
);
635 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
636 ok(size
== sizeof("Mesh"), "wrong size: %u\n", size
);
637 ok(!strcmp(cname
, "Mesh"), "Expected cname to be \"Mesh\", but got \"%s\"\n", cname
);
639 IDirect3DRMMesh_Release(mesh
);
641 IDirect3DRM_Release(d3drm
);
644 static void test_Face(void)
648 IDirect3DRM2
*d3drm2
;
649 IDirect3DRM3
*d3drm3
;
650 IDirect3DRMMeshBuilder2
*MeshBuilder2
;
651 IDirect3DRMMeshBuilder3
*MeshBuilder3
;
652 IDirect3DRMFace
*face1
;
653 IDirect3DRMFace2
*face2
;
654 IDirect3DRMFaceArray
*array1
;
655 D3DRMLOADMEMORY info
;
656 D3DVECTOR v1
[4], n1
[4], v2
[4], n2
[4];
658 CHAR cname
[64] = {0};
661 hr
= Direct3DRMCreate(&d3drm
);
662 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
664 hr
= IDirect3DRM_CreateFace(d3drm
, &face1
);
665 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFace interface (hr = %x)\n", hr
);
668 skip("Cannot get IDirect3DRMFace interface (hr = %x), skipping tests\n", hr
);
669 IDirect3DRM_Release(d3drm
);
673 hr
= IDirect3DRMFace_GetClassName(face1
, NULL
, cname
);
674 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
675 hr
= IDirect3DRMFace_GetClassName(face1
, NULL
, NULL
);
676 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
678 hr
= IDirect3DRMFace_GetClassName(face1
, &count
, cname
);
679 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
680 count
= sizeof(cname
);
681 hr
= IDirect3DRMFace_GetClassName(face1
, &count
, cname
);
682 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
683 ok(count
== sizeof("Face"), "wrong size: %u\n", count
);
684 ok(!strcmp(cname
, "Face"), "Expected cname to be \"Face\", but got \"%s\"\n", cname
);
686 icount
= IDirect3DRMFace_GetVertexCount(face1
);
687 ok(!icount
, "wrong VertexCount: %i\n", icount
);
689 IDirect3DRMFace_Release(face1
);
691 if (FAILED(hr
= IDirect3DRM_QueryInterface(d3drm
, &IID_IDirect3DRM2
, (void **)&d3drm2
)))
693 win_skip("Cannot get IDirect3DRM2 interface (hr = %x), skipping tests\n", hr
);
694 IDirect3DRM_Release(d3drm
);
698 hr
= IDirect3DRM2_CreateMeshBuilder(d3drm2
, &MeshBuilder2
);
699 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder2 interface (hr = %x)\n", hr
);
701 icount
= IDirect3DRMMeshBuilder2_GetFaceCount(MeshBuilder2
);
702 ok(!icount
, "wrong FaceCount: %i\n", icount
);
705 hr
= IDirect3DRMMeshBuilder2_GetFaces(MeshBuilder2
, &array1
);
707 ok(hr
== D3DRM_OK
, "Cannot get FaceArray (hr = %x)\n", hr
);
709 hr
= IDirect3DRMMeshBuilder2_CreateFace(MeshBuilder2
, &face1
);
710 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFace interface (hr = %x)\n", hr
);
712 icount
= IDirect3DRMMeshBuilder2_GetFaceCount(MeshBuilder2
);
714 ok(icount
== 1, "wrong FaceCount: %i\n", icount
);
717 hr
= IDirect3DRMMeshBuilder2_GetFaces(MeshBuilder2
, &array1
);
719 ok(hr
== D3DRM_OK
, "Cannot get FaceArray (hr = %x)\n", hr
);
721 ok(array1
!= NULL
, "pArray = %p\n", array1
);
724 IDirect3DRMFace
*face
;
725 count
= IDirect3DRMFaceArray_GetSize(array1
);
726 ok(count
== 1, "count = %u\n", count
);
727 hr
= IDirect3DRMFaceArray_GetElement(array1
, 0, &face
);
728 ok(hr
== D3DRM_OK
, "Cannot get face (hr = %x)\n", hr
);
729 IDirect3DRMFace_Release(face
);
730 IDirect3DRMFaceArray_Release(array1
);
733 icount
= IDirect3DRMFace_GetVertexCount(face1
);
734 ok(!icount
, "wrong VertexCount: %i\n", icount
);
736 IDirect3DRMFace_Release(face1
);
737 IDirect3DRMMeshBuilder2_Release(MeshBuilder2
);
739 if (FAILED(hr
= IDirect3DRM_QueryInterface(d3drm
, &IID_IDirect3DRM3
, (void **)&d3drm3
)))
741 win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr
);
742 IDirect3DRM_Release(d3drm
);
746 hr
= IDirect3DRM3_CreateMeshBuilder(d3drm3
, &MeshBuilder3
);
747 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr
);
749 icount
= IDirect3DRMMeshBuilder3_GetFaceCount(MeshBuilder3
);
750 ok(!icount
, "wrong FaceCount: %i\n", icount
);
752 hr
= IDirect3DRMMeshBuilder3_CreateFace(MeshBuilder3
, &face2
);
753 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFace2 interface (hr = %x)\n", hr
);
755 hr
= IDirect3DRMFace2_GetClassName(face2
, NULL
, cname
);
756 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
757 hr
= IDirect3DRMFace2_GetClassName(face2
, NULL
, NULL
);
758 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
760 hr
= IDirect3DRMFace2_GetClassName(face2
, &count
, cname
);
761 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
762 count
= sizeof(cname
);
763 hr
= IDirect3DRMFace2_GetClassName(face2
, &count
, cname
);
764 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
765 ok(count
== sizeof("Face"), "wrong size: %u\n", count
);
766 ok(!strcmp(cname
, "Face"), "Expected cname to be \"Face\", but got \"%s\"\n", cname
);
768 icount
= IDirect3DRMMeshBuilder3_GetFaceCount(MeshBuilder3
);
770 ok(icount
== 1, "wrong FaceCount: %i\n", icount
);
773 hr
= IDirect3DRMMeshBuilder3_GetFaces(MeshBuilder3
, &array1
);
775 ok(hr
== D3DRM_OK
, "Cannot get FaceArray (hr = %x)\n", hr
);
777 ok(array1
!= NULL
, "pArray = %p\n", array1
);
780 IDirect3DRMFace
*face
;
781 count
= IDirect3DRMFaceArray_GetSize(array1
);
782 ok(count
== 1, "count = %u\n", count
);
783 hr
= IDirect3DRMFaceArray_GetElement(array1
, 0, &face
);
784 ok(hr
== D3DRM_OK
, "Cannot get face (hr = %x)\n", hr
);
785 IDirect3DRMFace_Release(face
);
786 IDirect3DRMFaceArray_Release(array1
);
789 icount
= IDirect3DRMFace2_GetVertexCount(face2
);
790 ok(!icount
, "wrong VertexCount: %i\n", icount
);
792 info
.lpMemory
= data_ok
;
793 info
.dSize
= strlen(data_ok
);
794 hr
= IDirect3DRMMeshBuilder3_Load(MeshBuilder3
, &info
, NULL
, D3DRMLOAD_FROMMEMORY
, NULL
, NULL
);
795 ok(hr
== D3DRM_OK
, "Cannot load mesh data (hr = %x)\n", hr
);
797 icount
= IDirect3DRMMeshBuilder3_GetVertexCount(MeshBuilder3
);
798 ok(icount
== 4, "Wrong number of vertices %d (must be 4)\n", icount
);
800 icount
= IDirect3DRMMeshBuilder3_GetNormalCount(MeshBuilder3
);
801 ok(icount
== 4, "Wrong number of normals %d (must be 4)\n", icount
);
803 icount
= IDirect3DRMMeshBuilder3_GetFaceCount(MeshBuilder3
);
805 ok(icount
== 4, "Wrong number of faces %d (must be 4)\n", icount
);
808 hr
= IDirect3DRMMeshBuilder3_GetVertices(MeshBuilder3
, 0, &count
, v1
);
809 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
810 ok(count
== 4, "Wrong number of vertices %d (must be 4)\n", count
);
812 hr
= IDirect3DRMMeshBuilder3_GetNormals(MeshBuilder3
, 0, &count
, n1
);
813 ok(hr
== D3DRM_OK
, "Cannot get normals information (hr = %x)\n", hr
);
814 ok(count
== 4, "Wrong number of normals %d (must be 4)\n", count
);
817 hr
= IDirect3DRMMeshBuilder3_GetFaces(MeshBuilder3
, &array1
);
819 ok(hr
== D3DRM_OK
, "Cannot get FaceArray (hr = %x)\n", hr
);
821 ok(array1
!= NULL
, "pArray = %p\n", array1
);
824 IDirect3DRMFace
*face
;
825 count
= IDirect3DRMFaceArray_GetSize(array1
);
826 ok(count
== 4, "count = %u\n", count
);
827 hr
= IDirect3DRMFaceArray_GetElement(array1
, 1, &face
);
828 ok(hr
== D3DRM_OK
, "Cannot get face (hr = %x)\n", hr
);
829 hr
= IDirect3DRMFace_GetVertices(face
, &count
, v2
, n2
);
830 ok(hr
== D3DRM_OK
, "Cannot get vertices information (hr = %x)\n", hr
);
831 ok(count
== 3, "Wrong number of vertices %d (must be 3)\n", count
);
832 ok(U1(v2
[0]).x
== U1(v1
[0]).x
, "Wrong component v2[0].x = %f (expected %f)\n",
833 U1(v2
[0]).x
, U1(v1
[0]).x
);
834 ok(U2(v2
[0]).y
== U2(v1
[0]).y
, "Wrong component v2[0].y = %f (expected %f)\n",
835 U2(v2
[0]).y
, U2(v1
[0]).y
);
836 ok(U3(v2
[0]).z
== U3(v1
[0]).z
, "Wrong component v2[0].z = %f (expected %f)\n",
837 U3(v2
[0]).z
, U3(v1
[0]).z
);
838 ok(U1(v2
[1]).x
== U1(v1
[1]).x
, "Wrong component v2[1].x = %f (expected %f)\n",
839 U1(v2
[1]).x
, U1(v1
[1]).x
);
840 ok(U2(v2
[1]).y
== U2(v1
[1]).y
, "Wrong component v2[1].y = %f (expected %f)\n",
841 U2(v2
[1]).y
, U2(v1
[1]).y
);
842 ok(U3(v2
[1]).z
== U3(v1
[1]).z
, "Wrong component v2[1].z = %f (expected %f)\n",
843 U3(v2
[1]).z
, U3(v1
[1]).z
);
844 ok(U1(v2
[2]).x
== U1(v1
[2]).x
, "Wrong component v2[2].x = %f (expected %f)\n",
845 U1(v2
[2]).x
, U1(v1
[2]).x
);
846 ok(U2(v2
[2]).y
== U2(v1
[2]).y
, "Wrong component v2[2].y = %f (expected %f)\n",
847 U2(v2
[2]).y
, U2(v1
[2]).y
);
848 ok(U3(v2
[2]).z
== U3(v1
[2]).z
, "Wrong component v2[2].z = %f (expected %f)\n",
849 U3(v2
[2]).z
, U3(v1
[2]).z
);
851 ok(U1(n2
[0]).x
== U1(n1
[0]).x
, "Wrong component n2[0].x = %f (expected %f)\n",
852 U1(n2
[0]).x
, U1(n1
[0]).x
);
853 ok(U2(n2
[0]).y
== U2(n1
[0]).y
, "Wrong component n2[0].y = %f (expected %f)\n",
854 U2(n2
[0]).y
, U2(n1
[0]).y
);
855 ok(U3(n2
[0]).z
== U3(n1
[0]).z
, "Wrong component n2[0].z = %f (expected %f)\n",
856 U3(n2
[0]).z
, U3(n1
[0]).z
);
857 ok(U1(n2
[1]).x
== U1(n1
[1]).x
, "Wrong component n2[1].x = %f (expected %f)\n",
858 U1(n2
[1]).x
, U1(n1
[1]).x
);
859 ok(U2(n2
[1]).y
== U2(n1
[1]).y
, "Wrong component n2[1].y = %f (expected %f)\n",
860 U2(n2
[1]).y
, U2(n1
[1]).y
);
861 ok(U3(n2
[1]).z
== U3(n1
[1]).z
, "Wrong component n2[1].z = %f (expected %f)\n",
862 U3(n2
[1]).z
, U3(n1
[1]).z
);
863 ok(U1(n2
[2]).x
== U1(n1
[2]).x
, "Wrong component n2[2].x = %f (expected %f)\n",
864 U1(n2
[2]).x
, U1(n1
[2]).x
);
865 ok(U2(n2
[2]).y
== U2(n1
[2]).y
, "Wrong component n2[2].y = %f (expected %f)\n",
866 U2(n2
[2]).y
, U2(n1
[2]).y
);
867 ok(U3(n2
[2]).z
== U3(n1
[2]).z
, "Wrong component n2[2].z = %f (expected %f)\n",
868 U3(n2
[2]).z
, U3(n1
[2]).z
);
870 IDirect3DRMFace_Release(face
);
871 IDirect3DRMFaceArray_Release(array1
);
874 IDirect3DRMFace2_Release(face2
);
875 IDirect3DRMMeshBuilder3_Release(MeshBuilder3
);
876 IDirect3DRM3_Release(d3drm3
);
877 IDirect3DRM2_Release(d3drm2
);
878 IDirect3DRM_Release(d3drm
);
881 static void test_Frame(void)
885 IDirect3DRMFrame
*pFrameC
;
886 IDirect3DRMFrame
*pFrameP1
;
887 IDirect3DRMFrame
*pFrameP2
;
888 IDirect3DRMFrame
*pFrameTmp
;
889 IDirect3DRMFrameArray
*frame_array
;
890 IDirect3DRMMeshBuilder
*mesh_builder
;
891 IDirect3DRMVisual
*visual1
;
892 IDirect3DRMVisual
*visual_tmp
;
893 IDirect3DRMVisualArray
*visual_array
;
894 IDirect3DRMLight
*light1
;
895 IDirect3DRMLight
*light_tmp
;
896 IDirect3DRMLightArray
*light_array
;
899 CHAR cname
[64] = {0};
901 hr
= Direct3DRMCreate(&d3drm
);
902 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
904 hr
= IDirect3DRM_CreateFrame(d3drm
, NULL
, &pFrameC
);
905 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
906 CHECK_REFCOUNT(pFrameC
, 1);
908 hr
= IDirect3DRMFrame_GetClassName(pFrameC
, NULL
, cname
);
909 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
910 hr
= IDirect3DRMFrame_GetClassName(pFrameC
, NULL
, NULL
);
911 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
913 hr
= IDirect3DRMFrame_GetClassName(pFrameC
, &count
, cname
);
914 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
915 count
= sizeof(cname
);
916 hr
= IDirect3DRMFrame_GetClassName(pFrameC
, &count
, cname
);
917 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
918 ok(count
== sizeof("Frame"), "wrong size: %u\n", count
);
919 ok(!strcmp(cname
, "Frame"), "Expected cname to be \"Frame\", but got \"%s\"\n", cname
);
921 hr
= IDirect3DRMFrame_GetParent(pFrameC
, NULL
);
922 ok(hr
== D3DRMERR_BADVALUE
, "Should fail and return D3DRM_BADVALUE (hr = %x)\n", hr
);
923 pFrameTmp
= (void*)0xdeadbeef;
924 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
925 ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
926 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
927 CHECK_REFCOUNT(pFrameC
, 1);
930 hr
= IDirect3DRMFrame_GetChildren(pFrameC
, &frame_array
);
931 ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
932 ok(!!frame_array
, "frame_array = %p\n", frame_array
);
935 count
= IDirect3DRMFrameArray_GetSize(frame_array
);
936 ok(count
== 0, "count = %u\n", count
);
937 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 0, &pFrameTmp
);
938 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
939 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
940 IDirect3DRMFrameArray_Release(frame_array
);
943 hr
= IDirect3DRM_CreateFrame(d3drm
, NULL
, &pFrameP1
);
944 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
946 /* GetParent with NULL pointer */
947 hr
= IDirect3DRMFrame_GetParent(pFrameP1
, NULL
);
948 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
949 CHECK_REFCOUNT(pFrameP1
, 1);
951 /* [Add/Delete]Child with NULL pointer */
952 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, NULL
);
953 ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
954 CHECK_REFCOUNT(pFrameP1
, 1);
956 hr
= IDirect3DRMFrame_DeleteChild(pFrameP1
, NULL
);
957 ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
958 CHECK_REFCOUNT(pFrameP1
, 1);
960 /* Add child to first parent */
961 pFrameTmp
= (void*)0xdeadbeef;
962 hr
= IDirect3DRMFrame_GetParent(pFrameP1
, &pFrameTmp
);
963 ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
964 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
966 hr
= IDirect3DRMFrame_AddChild(pFrameP1
, pFrameC
);
967 ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
968 CHECK_REFCOUNT(pFrameP1
, 1);
969 CHECK_REFCOUNT(pFrameC
, 2);
972 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &frame_array
);
973 ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
974 /* In some older version of d3drm, creating IDirect3DRMFrameArray object with GetChildren does not increment refcount of children frames */
975 ok((get_refcount((IUnknown
*)pFrameC
) == 3) || broken(get_refcount((IUnknown
*)pFrameC
) == 2),
976 "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown
*)pFrameC
));
979 count
= IDirect3DRMFrameArray_GetSize(frame_array
);
980 ok(count
== 1, "count = %u\n", count
);
981 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 0, &pFrameTmp
);
982 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
983 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
984 ok((get_refcount((IUnknown
*)pFrameC
) == 4) || broken(get_refcount((IUnknown
*)pFrameC
) == 3),
985 "Invalid refcount. Expected 4 (or 3) got %d\n", get_refcount((IUnknown
*)pFrameC
));
986 IDirect3DRMFrame_Release(pFrameTmp
);
987 ok((get_refcount((IUnknown
*)pFrameC
) == 3) || broken(get_refcount((IUnknown
*)pFrameC
) == 2),
988 "Invalid refcount. Expected 3 (or 2) got %d\n", get_refcount((IUnknown
*)pFrameC
));
989 IDirect3DRMFrameArray_Release(frame_array
);
990 CHECK_REFCOUNT(pFrameC
, 2);
993 pFrameTmp
= (void*)0xdeadbeef;
994 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
995 ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
996 ok(pFrameTmp
== pFrameP1
, "pFrameTmp = %p\n", pFrameTmp
);
997 CHECK_REFCOUNT(pFrameP1
, 2);
999 /* Add child to second parent */
1000 hr
= IDirect3DRM_CreateFrame(d3drm
, NULL
, &pFrameP2
);
1001 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
1003 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
1004 ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
1005 CHECK_REFCOUNT(pFrameC
, 2);
1008 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &frame_array
);
1009 ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
1012 count
= IDirect3DRMFrameArray_GetSize(frame_array
);
1013 ok(count
== 1, "count = %u\n", count
);
1014 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 0, &pFrameTmp
);
1015 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
1016 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
1017 IDirect3DRMFrame_Release(pFrameTmp
);
1018 IDirect3DRMFrameArray_Release(frame_array
);
1022 hr
= IDirect3DRMFrame_GetChildren(pFrameP1
, &frame_array
);
1023 ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
1026 count
= IDirect3DRMFrameArray_GetSize(frame_array
);
1027 ok(count
== 0, "count = %u\n", count
);
1028 pFrameTmp
= (void*)0xdeadbeef;
1029 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 0, &pFrameTmp
);
1030 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
1031 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
1032 IDirect3DRMFrameArray_Release(frame_array
);
1035 pFrameTmp
= (void*)0xdeadbeef;
1036 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
1037 ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
1038 ok(pFrameTmp
== pFrameP2
, "pFrameTmp = %p\n", pFrameTmp
);
1039 CHECK_REFCOUNT(pFrameP2
, 2);
1040 CHECK_REFCOUNT(pFrameC
, 2);
1042 /* Add child again */
1043 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
1044 ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
1045 CHECK_REFCOUNT(pFrameC
, 2);
1048 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &frame_array
);
1049 ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
1052 count
= IDirect3DRMFrameArray_GetSize(frame_array
);
1053 ok(count
== 1, "count = %u\n", count
);
1054 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 0, &pFrameTmp
);
1055 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
1056 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
1057 IDirect3DRMFrame_Release(pFrameTmp
);
1058 IDirect3DRMFrameArray_Release(frame_array
);
1062 hr
= IDirect3DRMFrame_DeleteChild(pFrameP2
, pFrameC
);
1063 ok(hr
== D3DRM_OK
, "Cannot delete child frame (hr = %x)\n", hr
);
1064 CHECK_REFCOUNT(pFrameC
, 1);
1067 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &frame_array
);
1068 ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
1071 count
= IDirect3DRMFrameArray_GetSize(frame_array
);
1072 ok(count
== 0, "count = %u\n", count
);
1073 pFrameTmp
= (void*)0xdeadbeef;
1074 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 0, &pFrameTmp
);
1075 ok(hr
== D3DRMERR_BADVALUE
, "Should have returned D3DRMERR_BADVALUE (hr = %x)\n", hr
);
1076 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
1077 IDirect3DRMFrameArray_Release(frame_array
);
1080 pFrameTmp
= (void*)0xdeadbeef;
1081 hr
= IDirect3DRMFrame_GetParent(pFrameC
, &pFrameTmp
);
1082 ok(hr
== D3DRM_OK
, "Cannot get parent frame (hr = %x)\n", hr
);
1083 ok(pFrameTmp
== NULL
, "pFrameTmp = %p\n", pFrameTmp
);
1085 /* Add two children */
1086 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameC
);
1087 ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
1088 CHECK_REFCOUNT(pFrameC
, 2);
1090 hr
= IDirect3DRMFrame_AddChild(pFrameP2
, pFrameP1
);
1091 ok(hr
== D3DRM_OK
, "Cannot add child frame (hr = %x)\n", hr
);
1092 CHECK_REFCOUNT(pFrameP1
, 3);
1095 hr
= IDirect3DRMFrame_GetChildren(pFrameP2
, &frame_array
);
1096 ok(hr
== D3DRM_OK
, "Cannot get children (hr = %x)\n", hr
);
1099 count
= IDirect3DRMFrameArray_GetSize(frame_array
);
1100 ok(count
== 2, "count = %u\n", count
);
1101 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 0, &pFrameTmp
);
1102 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
1103 ok(pFrameTmp
== pFrameC
, "pFrameTmp = %p\n", pFrameTmp
);
1104 IDirect3DRMFrame_Release(pFrameTmp
);
1105 hr
= IDirect3DRMFrameArray_GetElement(frame_array
, 1, &pFrameTmp
);
1106 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
1107 ok(pFrameTmp
== pFrameP1
, "pFrameTmp = %p\n", pFrameTmp
);
1108 IDirect3DRMFrame_Release(pFrameTmp
);
1109 IDirect3DRMFrameArray_Release(frame_array
);
1112 /* [Add/Delete]Visual with NULL pointer */
1113 hr
= IDirect3DRMFrame_AddVisual(pFrameP1
, NULL
);
1114 ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
1115 CHECK_REFCOUNT(pFrameP1
, 3);
1117 hr
= IDirect3DRMFrame_DeleteVisual(pFrameP1
, NULL
);
1118 ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
1119 CHECK_REFCOUNT(pFrameP1
, 3);
1122 hr
= IDirect3DRM_CreateMeshBuilder(d3drm
, &mesh_builder
);
1123 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr
);
1124 visual1
= (IDirect3DRMVisual
*)mesh_builder
;
1126 /* Add Visual to first parent */
1127 hr
= IDirect3DRMFrame_AddVisual(pFrameP1
, visual1
);
1128 ok(hr
== D3DRM_OK
, "Cannot add visual (hr = %x)\n", hr
);
1129 CHECK_REFCOUNT(pFrameP1
, 3);
1130 CHECK_REFCOUNT(visual1
, 2);
1132 visual_array
= NULL
;
1133 hr
= IDirect3DRMFrame_GetVisuals(pFrameP1
, &visual_array
);
1134 ok(hr
== D3DRM_OK
, "Cannot get visuals (hr = %x)\n", hr
);
1137 count
= IDirect3DRMVisualArray_GetSize(visual_array
);
1138 ok(count
== 1, "count = %u\n", count
);
1139 hr
= IDirect3DRMVisualArray_GetElement(visual_array
, 0, &visual_tmp
);
1140 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
1141 ok(visual_tmp
== visual1
, "visual_tmp = %p\n", visual_tmp
);
1142 IDirect3DRMVisual_Release(visual_tmp
);
1143 IDirect3DRMVisualArray_Release(visual_array
);
1147 hr
= IDirect3DRMFrame_DeleteVisual(pFrameP1
, visual1
);
1148 ok(hr
== D3DRM_OK
, "Cannot delete visual (hr = %x)\n", hr
);
1149 CHECK_REFCOUNT(pFrameP1
, 3);
1150 IDirect3DRMMeshBuilder_Release(mesh_builder
);
1152 /* [Add/Delete]Light with NULL pointer */
1153 hr
= IDirect3DRMFrame_AddLight(pFrameP1
, NULL
);
1154 ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
1155 CHECK_REFCOUNT(pFrameP1
, 3);
1157 hr
= IDirect3DRMFrame_DeleteLight(pFrameP1
, NULL
);
1158 ok(hr
== D3DRMERR_BADOBJECT
, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr
);
1159 CHECK_REFCOUNT(pFrameP1
, 3);
1162 hr
= IDirect3DRM_CreateLightRGB(d3drm
, D3DRMLIGHT_SPOT
, 0.1, 0.2, 0.3, &light1
);
1163 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMLight interface (hr = %x)\n", hr
);
1165 /* Add Light to first parent */
1166 hr
= IDirect3DRMFrame_AddLight(pFrameP1
, light1
);
1167 ok(hr
== D3DRM_OK
, "Cannot add light (hr = %x)\n", hr
);
1168 CHECK_REFCOUNT(pFrameP1
, 3);
1169 CHECK_REFCOUNT(light1
, 2);
1172 hr
= IDirect3DRMFrame_GetLights(pFrameP1
, &light_array
);
1173 ok(hr
== D3DRM_OK
, "Cannot get lights (hr = %x)\n", hr
);
1176 count
= IDirect3DRMLightArray_GetSize(light_array
);
1177 ok(count
== 1, "count = %u\n", count
);
1178 hr
= IDirect3DRMLightArray_GetElement(light_array
, 0, &light_tmp
);
1179 ok(hr
== D3DRM_OK
, "Cannot get element (hr = %x)\n", hr
);
1180 ok(light_tmp
== light1
, "light_tmp = %p\n", light_tmp
);
1181 IDirect3DRMLight_Release(light_tmp
);
1182 IDirect3DRMLightArray_Release(light_array
);
1186 hr
= IDirect3DRMFrame_DeleteLight(pFrameP1
, light1
);
1187 ok(hr
== D3DRM_OK
, "Cannot delete light (hr = %x)\n", hr
);
1188 CHECK_REFCOUNT(pFrameP1
, 3);
1189 IDirect3DRMLight_Release(light1
);
1191 /* Test SceneBackground on first parent */
1192 color
= IDirect3DRMFrame_GetSceneBackground(pFrameP1
);
1193 ok(color
== 0xff000000, "wrong color (%x)\n", color
);
1195 hr
= IDirect3DRMFrame_SetSceneBackground(pFrameP1
, 0xff180587);
1196 ok(hr
== D3DRM_OK
, "Cannot set color (hr = %x)\n", hr
);
1197 color
= IDirect3DRMFrame_GetSceneBackground(pFrameP1
);
1198 ok(color
== 0xff180587, "wrong color (%x)\n", color
);
1200 hr
= IDirect3DRMFrame_SetSceneBackgroundRGB(pFrameP1
, 0.5, 0.5, 0.5);
1201 ok(hr
== D3DRM_OK
, "Cannot set color (hr = %x)\n", hr
);
1202 color
= IDirect3DRMFrame_GetSceneBackground(pFrameP1
);
1203 ok(color
== 0xff7f7f7f, "wrong color (%x)\n", color
);
1206 IDirect3DRMFrame_Release(pFrameP2
);
1207 CHECK_REFCOUNT(pFrameC
, 2);
1208 CHECK_REFCOUNT(pFrameP1
, 3);
1210 IDirect3DRMFrame_Release(pFrameC
);
1211 IDirect3DRMFrame_Release(pFrameP1
);
1213 IDirect3DRM_Release(d3drm
);
1216 static void test_Viewport(void)
1218 IDirectDrawClipper
*pClipper
;
1221 IDirect3DRMDevice
*device
;
1222 IDirect3DRMFrame
*frame
;
1223 IDirect3DRMViewport
*viewport
;
1228 CHAR cname
[64] = {0};
1230 window
= CreateWindowA("static", "d3drm_test", WS_OVERLAPPEDWINDOW
, 0, 0, 300, 200, 0, 0, 0, 0);
1231 GetClientRect(window
, &rc
);
1233 hr
= Direct3DRMCreate(&d3drm
);
1234 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1236 hr
= DirectDrawCreateClipper(0, &pClipper
, NULL
);
1237 ok(hr
== DD_OK
, "Cannot get IDirectDrawClipper interface (hr = %x)\n", hr
);
1239 hr
= IDirectDrawClipper_SetHWnd(pClipper
, 0, window
);
1240 ok(hr
== DD_OK
, "Cannot set HWnd to Clipper (hr = %x)\n", hr
);
1242 memcpy(&driver
, &IID_IDirect3DRGBDevice
, sizeof(GUID
));
1243 hr
= IDirect3DRM3_CreateDeviceFromClipper(d3drm
, pClipper
, &driver
, rc
.right
, rc
.bottom
, &device
);
1244 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMDevice interface (hr = %x)\n", hr
);
1246 hr
= IDirect3DRM_CreateFrame(d3drm
, NULL
, &frame
);
1247 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
1249 hr
= IDirect3DRM_CreateViewport(d3drm
, device
, frame
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
, &viewport
);
1250 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMViewport interface (hr = %x)\n", hr
);
1252 hr
= IDirect3DRMViewport_GetClassName(viewport
, NULL
, cname
);
1253 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1254 hr
= IDirect3DRMViewport_GetClassName(viewport
, NULL
, NULL
);
1255 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1257 hr
= IDirect3DRMViewport_GetClassName(viewport
, &size
, cname
);
1258 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1259 size
= sizeof(cname
);
1260 hr
= IDirect3DRMViewport_GetClassName(viewport
, &size
, cname
);
1261 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
1262 ok(size
== sizeof("Viewport"), "wrong size: %u\n", size
);
1263 ok(!strcmp(cname
, "Viewport"), "Expected cname to be \"Viewport\", but got \"%s\"\n", cname
);
1265 IDirect3DRMViewport_Release(viewport
);
1266 IDirect3DRMFrame_Release(frame
);
1267 IDirect3DRMDevice_Release(device
);
1268 IDirectDrawClipper_Release(pClipper
);
1270 IDirect3DRM_Release(d3drm
);
1271 DestroyWindow(window
);
1274 static void test_Light(void)
1278 IDirect3DRMLight
*light
;
1279 D3DRMLIGHTTYPE type
;
1282 CHAR cname
[64] = {0};
1284 hr
= Direct3DRMCreate(&d3drm
);
1285 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1287 hr
= IDirect3DRM_CreateLightRGB(d3drm
, D3DRMLIGHT_SPOT
, 0.5, 0.5, 0.5, &light
);
1288 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMLight interface (hr = %x)\n", hr
);
1290 hr
= IDirect3DRMLight_GetClassName(light
, NULL
, cname
);
1291 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1292 hr
= IDirect3DRMLight_GetClassName(light
, NULL
, NULL
);
1293 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1295 hr
= IDirect3DRMLight_GetClassName(light
, &size
, cname
);
1296 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1297 size
= sizeof(cname
);
1298 hr
= IDirect3DRMLight_GetClassName(light
, &size
, cname
);
1299 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
1300 ok(size
== sizeof("Light"), "wrong size: %u\n", size
);
1301 ok(!strcmp(cname
, "Light"), "Expected cname to be \"Light\", but got \"%s\"\n", cname
);
1303 type
= IDirect3DRMLight_GetType(light
);
1304 ok(type
== D3DRMLIGHT_SPOT
, "wrong type (%u)\n", type
);
1306 color
= IDirect3DRMLight_GetColor(light
);
1307 ok(color
== 0xff7f7f7f, "wrong color (%x)\n", color
);
1309 hr
= IDirect3DRMLight_SetType(light
, D3DRMLIGHT_POINT
);
1310 ok(hr
== D3DRM_OK
, "Cannot set type (hr = %x)\n", hr
);
1311 type
= IDirect3DRMLight_GetType(light
);
1312 ok(type
== D3DRMLIGHT_POINT
, "wrong type (%u)\n", type
);
1314 hr
= IDirect3DRMLight_SetColor(light
, 0xff180587);
1315 ok(hr
== D3DRM_OK
, "Cannot set color (hr = %x)\n", hr
);
1316 color
= IDirect3DRMLight_GetColor(light
);
1317 ok(color
== 0xff180587, "wrong color (%x)\n", color
);
1319 hr
= IDirect3DRMLight_SetColorRGB(light
, 0.5, 0.5, 0.5);
1320 ok(hr
== D3DRM_OK
, "Cannot set color (hr = %x)\n", hr
);
1321 color
= IDirect3DRMLight_GetColor(light
);
1322 ok(color
== 0xff7f7f7f, "wrong color (%x)\n", color
);
1324 IDirect3DRMLight_Release(light
);
1326 IDirect3DRM_Release(d3drm
);
1329 static void test_Material2(void)
1333 IDirect3DRM3
*d3drm3
;
1334 IDirect3DRMMaterial2
*material2
;
1337 CHAR cname
[64] = {0};
1339 hr
= Direct3DRMCreate(&d3drm
);
1340 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1342 if (FAILED(hr
= IDirect3DRM_QueryInterface(d3drm
, &IID_IDirect3DRM3
, (void **)&d3drm3
)))
1344 win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr
);
1345 IDirect3DRM_Release(d3drm
);
1349 hr
= IDirect3DRM3_CreateMaterial(d3drm3
, 18.5f
, &material2
);
1350 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMMaterial2 interface (hr = %x)\n", hr
);
1352 hr
= IDirect3DRMMaterial2_GetClassName(material2
, NULL
, cname
);
1353 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1354 hr
= IDirect3DRMMaterial2_GetClassName(material2
, NULL
, NULL
);
1355 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1357 hr
= IDirect3DRMMaterial2_GetClassName(material2
, &size
, cname
);
1358 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1359 size
= sizeof(cname
);
1360 hr
= IDirect3DRMMaterial2_GetClassName(material2
, &size
, cname
);
1361 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
1362 ok(size
== sizeof("Material"), "wrong size: %u\n", size
);
1363 ok(!strcmp(cname
, "Material"), "Expected cname to be \"Material\", but got \"%s\"\n", cname
);
1365 r
= IDirect3DRMMaterial2_GetPower(material2
);
1366 ok(r
== 18.5f
, "wrong power (%f)\n", r
);
1368 hr
= IDirect3DRMMaterial2_GetEmissive(material2
, &r
, &g
, &b
);
1369 ok(hr
== D3DRM_OK
, "Cannot get emissive (hr = %x)\n", hr
);
1370 ok(r
== 0.0f
&& g
== 0.0f
&& b
== 0.0f
, "wrong emissive r=%f g=%f b=%f, expected r=0.0 g=0.0 b=0.0\n", r
, g
, b
);
1372 hr
= IDirect3DRMMaterial2_GetSpecular(material2
, &r
, &g
, &b
);
1373 ok(hr
== D3DRM_OK
, "Cannot get emissive (hr = %x)\n", hr
);
1374 ok(r
== 1.0f
&& g
== 1.0f
&& b
== 1.0f
, "wrong specular r=%f g=%f b=%f, expected r=1.0 g=1.0 b=1.0\n", r
, g
, b
);
1376 hr
= IDirect3DRMMaterial2_GetAmbient(material2
, &r
, &g
, &b
);
1377 ok(hr
== D3DRM_OK
, "Cannot get emissive (hr = %x)\n", hr
);
1378 ok(r
== 0.0f
&& g
== 0.0f
&& b
== 0.0f
, "wrong ambient r=%f g=%f b=%f, expected r=0.0 g=0.0 b=0.0\n", r
, g
, b
);
1380 hr
= IDirect3DRMMaterial2_SetPower(material2
, 5.87f
);
1381 ok(hr
== D3DRM_OK
, "Cannot set power (hr = %x)\n", hr
);
1382 r
= IDirect3DRMMaterial2_GetPower(material2
);
1383 ok(r
== 5.87f
, "wrong power (%f)\n", r
);
1385 hr
= IDirect3DRMMaterial2_SetEmissive(material2
, 0.5f
, 0.5f
, 0.5f
);
1386 ok(hr
== D3DRM_OK
, "Cannot set emissive (hr = %x)\n", hr
);
1387 hr
= IDirect3DRMMaterial2_GetEmissive(material2
, &r
, &g
, &b
);
1388 ok(hr
== D3DRM_OK
, "Cannot get emissive (hr = %x)\n", hr
);
1389 ok(r
== 0.5f
&& g
== 0.5f
&& b
== 0.5f
, "wrong emissive r=%f g=%f b=%f, expected r=0.5 g=0.5 b=0.5\n", r
, g
, b
);
1391 hr
= IDirect3DRMMaterial2_SetSpecular(material2
, 0.6f
, 0.6f
, 0.6f
);
1392 ok(hr
== D3DRM_OK
, "Cannot set specular (hr = %x)\n", hr
);
1393 hr
= IDirect3DRMMaterial2_GetSpecular(material2
, &r
, &g
, &b
);
1394 ok(hr
== D3DRM_OK
, "Cannot get specular (hr = %x)\n", hr
);
1395 ok(r
== 0.6f
&& g
== 0.6f
&& b
== 0.6f
, "wrong specular r=%f g=%f b=%f, expected r=0.6 g=0.6 b=0.6\n", r
, g
, b
);
1397 hr
= IDirect3DRMMaterial2_SetAmbient(material2
, 0.7f
, 0.7f
, 0.7f
);
1398 ok(hr
== D3DRM_OK
, "Cannot set ambient (hr = %x)\n", hr
);
1399 hr
= IDirect3DRMMaterial2_GetAmbient(material2
, &r
, &g
, &b
);
1400 ok(hr
== D3DRM_OK
, "Cannot get ambient (hr = %x)\n", hr
);
1401 ok(r
== 0.7f
&& g
== 0.7f
&& b
== 0.7f
, "wrong ambient r=%f g=%f b=%f, expected r=0.7 g=0.7 b=0.7\n", r
, g
, b
);
1403 IDirect3DRMMaterial2_Release(material2
);
1405 IDirect3DRM3_Release(d3drm3
);
1406 IDirect3DRM_Release(d3drm
);
1409 static void test_Texture(void)
1413 IDirect3DRMTexture
*texture
;
1414 D3DRMIMAGE initimg
= {
1416 TRUE
, 2 * sizeof(DWORD
), NULL
, NULL
,
1417 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000, 0, NULL
1419 DWORD pixel
[4] = { 20000, 30000, 10000, 0 };
1421 CHAR cname
[64] = {0};
1423 hr
= Direct3DRMCreate(&d3drm
);
1424 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1426 initimg
.buffer1
= &pixel
;
1427 hr
= IDirect3DRM_CreateTexture(d3drm
, &initimg
, &texture
);
1428 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMTexture interface (hr = %x)\n", hr
);
1430 hr
= IDirect3DRMTexture_GetClassName(texture
, NULL
, cname
);
1431 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1432 hr
= IDirect3DRMTexture_GetClassName(texture
, NULL
, NULL
);
1433 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1435 hr
= IDirect3DRMTexture_GetClassName(texture
, &size
, cname
);
1436 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1437 size
= sizeof(cname
);
1438 hr
= IDirect3DRMTexture_GetClassName(texture
, &size
, cname
);
1439 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
1440 ok(size
== sizeof("Texture"), "wrong size: %u\n", size
);
1441 ok(!strcmp(cname
, "Texture"), "Expected cname to be \"Texture\", but got \"%s\"\n", cname
);
1443 IDirect3DRMTexture_Release(texture
);
1445 IDirect3DRM_Release(d3drm
);
1448 static void test_Device(void)
1450 IDirectDrawClipper
*pClipper
;
1453 IDirect3DRMDevice
*device
;
1454 IDirect3DRMWinDevice
*win_device
;
1459 CHAR cname
[64] = {0};
1461 window
= CreateWindowA("static", "d3drm_test", WS_OVERLAPPEDWINDOW
, 0, 0, 300, 200, 0, 0, 0, 0);
1462 GetClientRect(window
, &rc
);
1464 hr
= Direct3DRMCreate(&d3drm
);
1465 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1467 hr
= DirectDrawCreateClipper(0, &pClipper
, NULL
);
1468 ok(hr
== DD_OK
, "Cannot get IDirectDrawClipper interface (hr = %x)\n", hr
);
1470 hr
= IDirectDrawClipper_SetHWnd(pClipper
, 0, window
);
1471 ok(hr
== DD_OK
, "Cannot set HWnd to Clipper (hr = %x)\n", hr
);
1473 memcpy(&driver
, &IID_IDirect3DRGBDevice
, sizeof(GUID
));
1474 hr
= IDirect3DRM3_CreateDeviceFromClipper(d3drm
, pClipper
, &driver
, rc
.right
, rc
.bottom
, &device
);
1475 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMDevice interface (hr = %x)\n", hr
);
1477 hr
= IDirect3DRMDevice_GetClassName(device
, NULL
, cname
);
1478 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1479 hr
= IDirect3DRMDevice_GetClassName(device
, NULL
, NULL
);
1480 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1482 hr
= IDirect3DRMDevice_GetClassName(device
, &size
, cname
);
1483 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1484 size
= sizeof(cname
);
1485 hr
= IDirect3DRMDevice_GetClassName(device
, &size
, cname
);
1486 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
1487 ok(size
== sizeof("Device"), "wrong size: %u\n", size
);
1488 ok(!strcmp(cname
, "Device"), "Expected cname to be \"Device\", but got \"%s\"\n", cname
);
1491 if (FAILED(hr
= IDirect3DRMDevice_QueryInterface(device
, &IID_IDirect3DRMWinDevice
, (void **)&win_device
)))
1493 win_skip("Cannot get IDirect3DRMWinDevice interface (hr = %x), skipping tests\n", hr
);
1497 hr
= IDirect3DRMWinDevice_GetClassName(win_device
, NULL
, cname
);
1498 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1499 hr
= IDirect3DRMWinDevice_GetClassName(win_device
, NULL
, NULL
);
1500 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1502 hr
= IDirect3DRMWinDevice_GetClassName(win_device
, &size
, cname
);
1503 ok(hr
== E_INVALIDARG
, "GetClassName failed with %x\n", hr
);
1504 size
= sizeof(cname
);
1505 hr
= IDirect3DRMWinDevice_GetClassName(win_device
, &size
, cname
);
1506 ok(hr
== D3DRM_OK
, "Cannot get classname (hr = %x)\n", hr
);
1507 ok(size
== sizeof("Device"), "wrong size: %u\n", size
);
1508 ok(!strcmp(cname
, "Device"), "Expected cname to be \"Device\", but got \"%s\"\n", cname
);
1510 IDirect3DRMWinDevice_Release(win_device
);
1513 IDirect3DRMDevice_Release(device
);
1514 IDirectDrawClipper_Release(pClipper
);
1516 IDirect3DRM_Release(d3drm
);
1517 DestroyWindow(window
);
1520 static void test_frame_transform(void)
1524 IDirect3DRMFrame
*frame
;
1525 D3DRMMATRIX4D matrix
;
1527 hr
= Direct3DRMCreate(&d3drm
);
1528 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1530 hr
= IDirect3DRM_CreateFrame(d3drm
, NULL
, &frame
);
1531 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr
);
1533 hr
= IDirect3DRMFrame_GetTransform(frame
, matrix
);
1534 ok(hr
== D3DRM_OK
, "IDirect3DRMFrame_GetTransform returned hr = %x\n", hr
);
1535 ok(!memcmp(matrix
, identity
, sizeof(D3DRMMATRIX4D
)), "Returned matrix is not identity\n");
1537 IDirect3DRMFrame_Release(frame
);
1538 IDirect3DRM_Release(d3drm
);
1541 static int nb_objects
= 0;
1542 static const GUID
* refiids
[] =
1544 &IID_IDirect3DRMMeshBuilder
,
1545 &IID_IDirect3DRMMeshBuilder
,
1546 &IID_IDirect3DRMFrame
,
1547 &IID_IDirect3DRMMaterial
/* Not taken into account and not notified */
1550 static void __cdecl
object_load_callback(IDirect3DRMObject
*object
, REFIID objectguid
, void *arg
)
1552 ok(object
!= NULL
, "Arg 1 should not be null\n");
1553 ok(IsEqualGUID(objectguid
, refiids
[nb_objects
]), "Arg 2 is incorrect\n");
1554 ok(arg
== (void *)0xdeadbeef, "Arg 3 should be 0xdeadbeef (got %p)\n", arg
);
1558 static void test_d3drm_load(void)
1562 D3DRMLOADMEMORY info
;
1563 const GUID
* req_refiids
[] = { &IID_IDirect3DRMMeshBuilder
, &IID_IDirect3DRMFrame
, &IID_IDirect3DRMMaterial
};
1565 hr
= Direct3DRMCreate(&d3drm
);
1566 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1568 info
.lpMemory
= data_d3drm_load
;
1569 info
.dSize
= strlen(data_d3drm_load
);
1570 hr
= IDirect3DRM_Load(d3drm
, &info
, NULL
, (GUID
**)req_refiids
, 3, D3DRMLOAD_FROMMEMORY
,
1571 object_load_callback
, (void *)0xdeadbeef, NULL
, NULL
, NULL
);
1572 ok(hr
== D3DRM_OK
, "Cannot load data (hr = %x)\n", hr
);
1573 ok(nb_objects
== 3, "Should have loaded 3 objects (got %d)\n", nb_objects
);
1575 IDirect3DRM_Release(d3drm
);
1578 IDirect3DRMMeshBuilder
*mesh_builder
= NULL
;
1580 static void __cdecl
object_load_callback_frame(IDirect3DRMObject
*object
, REFIID object_guid
, void *arg
)
1583 IDirect3DRMFrame
*frame
;
1584 IDirect3DRMVisualArray
*array
;
1585 IDirect3DRMVisual
*visual
;
1589 hr
= IDirect3DRMObject_QueryInterface(object
, &IID_IDirect3DRMFrame
, (void**)&frame
);
1590 ok(hr
== D3DRM_OK
, "IDirect3DRMObject_QueryInterface returned %x\n", hr
);
1592 hr
= IDirect3DRMFrame_GetVisuals(frame
, &array
);
1593 ok(hr
== D3DRM_OK
, "IDirect3DRMFrame_GetVisuals returned %x\n", hr
);
1595 size
= IDirect3DRMVisualArray_GetSize(array
);
1596 ok(size
== 1, "Wrong size %u returned, expected 1\n", size
);
1598 hr
= IDirect3DRMVisualArray_GetElement(array
, 0, &visual
);
1599 ok(hr
== D3DRM_OK
, "IDirect3DRMVisualArray_GetElement returned %x\n", hr
);
1601 hr
= IDirect3DRMVisual_QueryInterface(visual
, &IID_IDirect3DRMMeshBuilder
, (void**)&mesh_builder
);
1602 ok(hr
== D3DRM_OK
, "IDirect3DRMVisualArray_GetSize returned %x\n", hr
);
1604 size
= sizeof(name
);
1605 hr
= IDirect3DRMMeshBuilder_GetName(mesh_builder
, &size
, name
);
1606 ok(hr
== D3DRM_OK
, "IDirect3DRMMeshBuilder_GetName returned %x\n", hr
);
1607 ok(!strcmp(name
, "mesh1"), "Wrong name %s, expected mesh1\n", name
);
1609 IDirect3DRMVisual_Release(visual
);
1610 IDirect3DRMVisualArray_Release(array
);
1611 IDirect3DRMFrame_Release(frame
);
1617 int vertex_per_face
;
1624 { 4, 3, 3, 9, 0x4c0000ff, 30.0f
, { 0.31f
, 0.32f
, 0.33f
}, { 0.34f
, 0.35f
, 0.36f
} },
1625 { 4, 2, 3, 6, 0x3300ff00, 20.0f
, { 0.21f
, 0.22f
, 0.23f
}, { 0.24f
, 0.25f
, 0.26f
} },
1626 { 3, 1, 3, 3, 0x19ff0000, 10.0f
, { 0.11f
, 0.12f
, 0.13f
}, { 0.14f
, 0.15f
, 0.16f
} }
1629 static void test_frame_mesh_materials(void)
1633 D3DRMLOADMEMORY info
;
1634 const GUID
*req_refiids
[] = { &IID_IDirect3DRMFrame
};
1635 IDirect3DRMMesh
*mesh
;
1637 IDirect3DRMMaterial
*material
;
1638 IDirect3DRMTexture
*texture
;
1641 hr
= Direct3DRMCreate(&d3drm
);
1642 ok(hr
== D3DRM_OK
, "Direct3DRMCreate returned %x\n", hr
);
1644 info
.lpMemory
= data_frame_mesh_materials
;
1645 info
.dSize
= strlen(data_frame_mesh_materials
);
1646 hr
= IDirect3DRM_Load(d3drm
, &info
, NULL
, (GUID
**)req_refiids
, 1, D3DRMLOAD_FROMMEMORY
, object_load_callback_frame
, (void*)0xdeadbeef, NULL
, NULL
, NULL
);
1647 ok(hr
== D3DRM_OK
, "Cannot load data (hr = %x)\n", hr
);
1649 hr
= IDirect3DRMMeshBuilder_CreateMesh(mesh_builder
, &mesh
);
1650 ok(hr
== D3DRM_OK
, "IDirect3DRMMeshBuilder_CreateMesh returned %x\n", hr
);
1652 size
= IDirect3DRMMesh_GetGroupCount(mesh
);
1653 ok(size
== 3, "Wrong size %u returned, expected 3\n", size
);
1655 for (i
= 0; i
< size
; i
++)
1657 D3DVALUE red
, green
, blue
, power
;
1659 unsigned vertex_count
, face_count
, vertex_per_face
;
1660 DWORD face_data_size
;
1662 hr
= IDirect3DRMMesh_GetGroup(mesh
, i
, &vertex_count
, &face_count
, &vertex_per_face
, &face_data_size
, NULL
);
1663 ok(hr
== D3DRM_OK
, "Group %d: IDirect3DRMMesh_GetGroup returned %x\n", i
, hr
);
1664 ok(vertex_count
== groups
[i
].vertex_count
, "Group %d: Wrong vertex count %d, expected %d\n", i
, vertex_count
, groups
[i
].vertex_count
);
1665 ok(face_count
== groups
[i
].face_count
, "Group %d: Wrong face count %d; expected %d\n", i
, face_count
, groups
[i
].face_count
);
1666 ok(vertex_per_face
== groups
[i
].vertex_per_face
, "Group %d: Wrong vertex per face %d, expected %d\n", i
, vertex_per_face
, groups
[i
].vertex_per_face
);
1667 ok(face_data_size
== groups
[i
].face_data_size
, "Group %d: Wrong face data size %d, expected %d\n", i
, face_data_size
, groups
[i
].face_data_size
);
1669 color
= IDirect3DRMMesh_GetGroupColor(mesh
, i
);
1670 ok(color
== groups
[i
].color
, "Group %d: Wrong color %x, expected %x\n", i
, color
, groups
[i
].color
);
1672 hr
= IDirect3DRMMesh_GetGroupMaterial(mesh
, i
, &material
);
1673 ok(hr
== D3DRM_OK
, "Group %d: IDirect3DRMMesh_GetGroupMaterial returned %x\n", i
, hr
);
1674 ok(material
!= NULL
, "Group %d: No material\n", i
);
1675 power
= IDirect3DRMMaterial_GetPower(material
);
1676 ok(power
== groups
[i
].power
, "Group %d: Wrong power %f, expected %f\n", i
, power
, groups
[i
].power
);
1677 hr
= IDirect3DRMMaterial_GetSpecular(material
, &red
, &green
, &blue
);
1678 ok(hr
== D3DRM_OK
, "Group %d: IDirect3DRMMaterial_GetSpecular returned %x\n", i
, hr
);
1679 ok(red
== groups
[i
].specular
[0], "Group %d: Wrong specular red %f, expected %f\n", i
, red
, groups
[i
].specular
[0]);
1680 ok(green
== groups
[i
].specular
[1], "Group %d: Wrong specular green %f, pD3DRMexpected %f\n", i
, green
, groups
[i
].specular
[1]);
1681 ok(blue
== groups
[i
].specular
[2], "Group %d: Wrong specular blue %f, expected %f\n", i
, blue
, groups
[i
].specular
[2]);
1682 hr
= IDirect3DRMMaterial_GetEmissive(material
, &red
, &green
, &blue
);
1683 ok(hr
== D3DRM_OK
, "Group %d: IDirect3DRMMaterial_GetEmissive returned %x\n", i
, hr
);
1684 ok(red
== groups
[i
].emissive
[0], "Group %d: Wrong emissive red %f, expected %f\n", i
, red
, groups
[i
].emissive
[0]);
1685 ok(green
== groups
[i
].emissive
[1], "Group %d: Wrong emissive green %f, expected %f\n", i
, green
, groups
[i
].emissive
[1]);
1686 ok(blue
== groups
[i
].emissive
[2], "Group %d: Wrong emissive blue %f, expected %f\n", i
, blue
, groups
[i
].emissive
[2]);
1688 hr
= IDirect3DRMMesh_GetGroupTexture(mesh
, i
, &texture
);
1689 ok(hr
== D3DRM_OK
, "Group %d: IDirect3DRMMesh_GetGroupTexture returned %x\n", i
, hr
);
1690 ok(!texture
, "Group %d: Unexpected texture\n", i
);
1693 IDirect3DRMMaterial_Release(material
);
1695 IDirect3DRMTexture_Release(texture
);
1698 IDirect3DRMMesh_Release(mesh
);
1699 IDirect3DRMMeshBuilder_Release(mesh_builder
);
1700 IDirect3DRM_Release(d3drm
);
1706 REFIID refcount_iid
;
1711 static void test_qi(const char *test_name
, IUnknown
*base_iface
,
1712 REFIID refcount_iid
, const struct qi_test
*tests
, UINT entry_count
)
1714 ULONG refcount
, expected_refcount
;
1715 IUnknown
*iface1
, *iface2
;
1719 for (i
= 0; i
< entry_count
; ++i
)
1721 hr
= IUnknown_QueryInterface(base_iface
, tests
[i
].iid
, (void **)&iface1
);
1722 ok(hr
== tests
[i
].hr
, "Got hr %#x for test \"%s\" %u.\n", hr
, test_name
, i
);
1725 for (j
= 0; j
< entry_count
; ++j
)
1727 hr
= IUnknown_QueryInterface(iface1
, tests
[j
].iid
, (void **)&iface2
);
1728 ok(hr
== tests
[j
].hr
, "Got hr %#x for test \"%s\" %u, %u.\n", hr
, test_name
, i
, j
);
1731 expected_refcount
= 0;
1732 if (IsEqualGUID(refcount_iid
, tests
[j
].refcount_iid
))
1733 ++expected_refcount
;
1734 if (IsEqualGUID(tests
[i
].refcount_iid
, tests
[j
].refcount_iid
))
1735 ++expected_refcount
;
1736 refcount
= IUnknown_Release(iface2
);
1737 if (tests
[i
].refcount_todo
|| tests
[j
].refcount_todo
)
1738 todo_wine
ok(refcount
== expected_refcount
, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
1739 refcount
, test_name
, i
, j
, expected_refcount
);
1741 ok(refcount
== expected_refcount
, "Got refcount %u for test \"%s\" %u, %u, expected %u.\n",
1742 refcount
, test_name
, i
, j
, expected_refcount
);
1746 expected_refcount
= 0;
1747 if (IsEqualGUID(refcount_iid
, tests
[i
].refcount_iid
))
1748 ++expected_refcount
;
1749 refcount
= IUnknown_Release(iface1
);
1750 if (tests
[i
].refcount_todo
)
1751 todo_wine
ok(refcount
== expected_refcount
, "Got refcount %u for test \"%s\" %u, expected %u.\n",
1752 refcount
, test_name
, i
, expected_refcount
);
1754 ok(refcount
== expected_refcount
, "Got refcount %u for test \"%s\" %u, expected %u.\n",
1755 refcount
, test_name
, i
, expected_refcount
);
1760 static void test_d3drm_qi(void)
1762 static const struct qi_test tests
[] =
1764 { &IID_IDirect3DRM3
, &IID_IDirect3DRM3
, S_OK
, TRUE
},
1765 { &IID_IDirect3DRM2
, &IID_IDirect3DRM2
, S_OK
, TRUE
},
1766 { &IID_IDirect3DRM
, &IID_IDirect3DRM
, S_OK
, FALSE
},
1767 { &IID_IDirect3DRMDevice
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1768 { &IID_IDirect3DRMObject
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1769 { &IID_IDirect3DRMObject2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1770 { &IID_IDirect3DRMDevice2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1771 { &IID_IDirect3DRMDevice3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1772 { &IID_IDirect3DRMViewport
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1773 { &IID_IDirect3DRMViewport2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1774 { &IID_IDirect3DRMFrame
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1775 { &IID_IDirect3DRMFrame2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1776 { &IID_IDirect3DRMFrame3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1777 { &IID_IDirect3DRMVisual
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1778 { &IID_IDirect3DRMMesh
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1779 { &IID_IDirect3DRMMeshBuilder
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1780 { &IID_IDirect3DRMMeshBuilder2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1781 { &IID_IDirect3DRMMeshBuilder3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1782 { &IID_IDirect3DRMFace
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1783 { &IID_IDirect3DRMFace2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1784 { &IID_IDirect3DRMLight
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1785 { &IID_IDirect3DRMTexture
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1786 { &IID_IDirect3DRMTexture2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1787 { &IID_IDirect3DRMTexture3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1788 { &IID_IDirect3DRMWrap
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1789 { &IID_IDirect3DRMMaterial
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1790 { &IID_IDirect3DRMMaterial2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1791 { &IID_IDirect3DRMAnimation
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1792 { &IID_IDirect3DRMAnimation2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1793 { &IID_IDirect3DRMAnimationSet
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1794 { &IID_IDirect3DRMAnimationSet2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1795 { &IID_IDirect3DRMObjectArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1796 { &IID_IDirect3DRMDeviceArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1797 { &IID_IDirect3DRMViewportArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1798 { &IID_IDirect3DRMFrameArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1799 { &IID_IDirect3DRMVisualArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1800 { &IID_IDirect3DRMLightArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1801 { &IID_IDirect3DRMPickedArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1802 { &IID_IDirect3DRMFaceArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1803 { &IID_IDirect3DRMAnimationArray
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1804 { &IID_IDirect3DRMUserVisual
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1805 { &IID_IDirect3DRMShadow
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1806 { &IID_IDirect3DRMShadow2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1807 { &IID_IDirect3DRMInterpolator
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1808 { &IID_IDirect3DRMProgressiveMesh
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1809 { &IID_IDirect3DRMPicked2Array
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1810 { &IID_IDirect3DRMClippedVisual
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1811 { &IID_IDirectDrawClipper
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1812 { &IID_IDirectDrawSurface7
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1813 { &IID_IDirectDrawSurface4
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1814 { &IID_IDirectDrawSurface3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1815 { &IID_IDirectDrawSurface2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1816 { &IID_IDirectDrawSurface
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1817 { &IID_IDirect3DDevice7
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1818 { &IID_IDirect3DDevice3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1819 { &IID_IDirect3DDevice2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1820 { &IID_IDirect3DDevice
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1821 { &IID_IDirect3D7
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1822 { &IID_IDirect3D3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1823 { &IID_IDirect3D2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1824 { &IID_IDirect3D
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1825 { &IID_IDirectDraw7
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1826 { &IID_IDirectDraw4
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1827 { &IID_IDirectDraw3
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1828 { &IID_IDirectDraw2
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1829 { &IID_IDirectDraw
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1830 { &IID_IDirect3DLight
, NULL
, CLASS_E_CLASSNOTAVAILABLE
, FALSE
},
1831 { &IID_IUnknown
, &IID_IDirect3DRM
, S_OK
, FALSE
},
1836 hr
= Direct3DRMCreate(&d3drm
);
1837 ok(hr
== D3DRM_OK
, "Cannot get IDirect3DRM interface (hr = %x)\n", hr
);
1839 test_qi("d3drm_qi", (IUnknown
*)d3drm
, &IID_IDirect3DRM
, tests
, sizeof(tests
) / sizeof(*tests
));
1841 IDirect3DRM_Release(d3drm
);
1847 test_MeshBuilder3();
1856 test_frame_transform();
1858 test_frame_mesh_materials();