diff --git a/dlls/d3drm/d3drm_private.h b/dlls/d3drm/d3drm_private.h index e4ffd2ba5a6..e3ee75ae7e1 100644 --- a/dlls/d3drm/d3drm_private.h +++ b/dlls/d3drm/d3drm_private.h @@ -76,6 +76,7 @@ struct d3drm_frame IDirect3DRMLight **lights; D3DRMMATRIX4D transform; D3DCOLOR scenebackground; + DWORD traversal_options; }; struct d3drm_viewport diff --git a/dlls/d3drm/frame.c b/dlls/d3drm/frame.c index a2643fb5ac5..f6b0a1fe14e 100644 --- a/dlls/d3drm/frame.c +++ b/dlls/d3drm/frame.c @@ -2666,18 +2666,33 @@ static HRESULT WINAPI d3drm_frame3_InverseTransformVectors(IDirect3DRMFrame3 *if return E_NOTIMPL; } -static HRESULT WINAPI d3drm_frame3_SetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD flags) +static HRESULT WINAPI d3drm_frame3_SetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD options) { - FIXME("iface %p, flags %#x stub!\n", iface, flags); + static const DWORD supported_options = D3DRMFRAME_RENDERENABLE | D3DRMFRAME_PICKENABLE; + struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface); - return E_NOTIMPL; + TRACE("iface %p, options %#x.\n", iface, options); + + if (options & ~supported_options) + return D3DRMERR_BADVALUE; + + frame->traversal_options = options; + + return D3DRM_OK; } -static HRESULT WINAPI d3drm_frame3_GetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD *flags) +static HRESULT WINAPI d3drm_frame3_GetTraversalOptions(IDirect3DRMFrame3 *iface, DWORD *options) { - FIXME("iface %p, flags %p stub!\n", iface, flags); + struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface); - return E_NOTIMPL; + TRACE("iface %p, options %p.\n", iface, options); + + if (!options) + return D3DRMERR_BADVALUE; + + *options = frame->traversal_options; + + return D3DRM_OK; } static HRESULT WINAPI d3drm_frame3_SetSceneFogMethod(IDirect3DRMFrame3 *iface, DWORD flags) @@ -2991,6 +3006,7 @@ HRESULT d3drm_frame_create(struct d3drm_frame **frame, IUnknown *parent_frame, I object->d3drm = d3drm; object->ref = 1; d3drm_set_color(&object->scenebackground, 0.0f, 0.0f, 0.0f, 1.0f); + object->traversal_options = D3DRMFRAME_RENDERENABLE | D3DRMFRAME_PICKENABLE; d3drm_object_init(&object->obj, classname); diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index 3613b578071..5cccb438ce5 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -987,9 +987,10 @@ static void test_Frame(void) IDirect3DRMLight *light1; IDirect3DRMLight *light_tmp; IDirect3DRMLightArray *light_array; + IDirect3DRMFrame3 *frame3; + DWORD count, options; ULONG ref, ref2; D3DCOLOR color; - DWORD count; hr = Direct3DRMCreate(&d3drm); ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr); @@ -1315,6 +1316,42 @@ static void test_Frame(void) color = IDirect3DRMFrame_GetSceneBackground(pFrameP1); ok(color == 0xff7f7f7f, "wrong color (%x)\n", color); + /* Traversal options. */ + hr = IDirect3DRMFrame_QueryInterface(pFrameP2, &IID_IDirect3DRMFrame3, (void **)&frame3); + ok(SUCCEEDED(hr), "Failed to get IDirect3DRMFrame3 interface, hr %#x.\n", hr); + + hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, NULL); + ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr); + + options = 0; + hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, &options); + ok(SUCCEEDED(hr), "Failed to get traversal options, hr %#x.\n", hr); + ok(options == (D3DRMFRAME_RENDERENABLE | D3DRMFRAME_PICKENABLE), "Unexpected default options %#x.\n", options); + + hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, 0); + ok(SUCCEEDED(hr), "Unexpected hr %#x.\n", hr); + + hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, 0xf0000000); + ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr); + + hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, 0xf0000000 | D3DRMFRAME_PICKENABLE); + ok(hr == D3DRMERR_BADVALUE, "Unexpected hr %#x.\n", hr); + + options = 0xf; + hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, &options); + ok(SUCCEEDED(hr), "Failed to get traversal options, hr %#x.\n", hr); + ok(options == 0, "Unexpected traversal options %#x.\n", options); + + hr = IDirect3DRMFrame3_SetTraversalOptions(frame3, D3DRMFRAME_PICKENABLE); + ok(SUCCEEDED(hr), "Failed to set traversal options, hr %#x.\n", hr); + + options = 0; + hr = IDirect3DRMFrame3_GetTraversalOptions(frame3, &options); + ok(SUCCEEDED(hr), "Failed to get traversal options, hr %#x.\n", hr); + ok(options == D3DRMFRAME_PICKENABLE, "Unexpected traversal options %#x.\n", options); + + IDirect3DRMFrame3_Release(frame3); + /* Cleanup */ IDirect3DRMFrame_Release(pFrameP2); CHECK_REFCOUNT(pFrameC, 1);