diff --git a/dlls/d3dx9_36/Makefile.in b/dlls/d3dx9_36/Makefile.in index 5958c571eec..95e30457e1c 100644 --- a/dlls/d3dx9_36/Makefile.in +++ b/dlls/d3dx9_36/Makefile.in @@ -3,6 +3,7 @@ IMPORTLIB = d3dx9 IMPORTS = d3d9 d3dcompiler dxguid d3dxof ole32 gdi32 user32 C_SRCS = \ + animation.c \ core.c \ d3dx9_36_main.c \ effect.c \ diff --git a/dlls/d3dx9_36/animation.c b/dlls/d3dx9_36/animation.c new file mode 100644 index 00000000000..abee89f7836 --- /dev/null +++ b/dlls/d3dx9_36/animation.c @@ -0,0 +1,452 @@ +/* + * Animation Controller operations specific to D3DX9. + * + * Copyright (C) 2015 Christian Costa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/debug.h" +#include "d3dx9_36_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3dx); + +struct d3dx9_animation_controller +{ + ID3DXAnimationController ID3DXAnimationController_iface; + LONG ref; +}; + +static inline struct d3dx9_animation_controller *impl_from_ID3DXAnimationController(ID3DXAnimationController *iface) +{ + return CONTAINING_RECORD(iface, struct d3dx9_animation_controller, ID3DXAnimationController_iface); +} + +static HRESULT WINAPI d3dx9_animation_controller_QueryInterface(ID3DXAnimationController *iface, REFIID riid, void **out) +{ + TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_ID3DXAnimationController)) + { + iface->lpVtbl->AddRef(iface); + *out = iface; + return D3D_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI d3dx9_animation_controller_AddRef(ID3DXAnimationController *iface) +{ + struct d3dx9_animation_controller *animation = impl_from_ID3DXAnimationController(iface); + ULONG refcount = InterlockedIncrement(&animation->ref); + + TRACE("%p increasing refcount to %u.\n", animation, refcount); + + return refcount; +} + +static ULONG WINAPI d3dx9_animation_controller_Release(ID3DXAnimationController *iface) +{ + struct d3dx9_animation_controller *animation = impl_from_ID3DXAnimationController(iface); + ULONG refcount = InterlockedDecrement(&animation->ref); + + TRACE("%p decreasing refcount to %u.\n", animation, refcount); + + if (!refcount) + { + HeapFree(GetProcessHeap(), 0, animation); + } + + return refcount; +} + +static UINT WINAPI d3dx9_animation_controller_GetMaxNumAnimationOutputs(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0; +} + +static UINT WINAPI d3dx9_animation_controller_GetMaxNumAnimationSets(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0; +} + +static UINT WINAPI d3dx9_animation_controller_GetMaxNumTracks(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0; +} + +static UINT WINAPI d3dx9_animation_controller_GetMaxNumEvents(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0; +} + +static HRESULT WINAPI d3dx9_animation_controller_RegisterAnimationOutput(ID3DXAnimationController *iface, + const char *name, D3DXMATRIX *matrix, D3DXVECTOR3 *scale, D3DXQUATERNION *rotation, D3DXVECTOR3 *translation) +{ + FIXME("iface %p, name %s, matrix %p, scale %p, rotation %p, translation %p stub.\n", iface, debugstr_a(name), + matrix, scale, rotation, translation); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_RegisterAnimationSet(ID3DXAnimationController *iface, + ID3DXAnimationSet *anim_set) +{ + FIXME("iface %p, anim_set %p stub.\n", iface, anim_set); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_UnregisterAnimationSet(ID3DXAnimationController *iface, + ID3DXAnimationSet *anim_set) +{ + FIXME("iface %p, anim_set %p stub.\n", iface, anim_set); + + return E_NOTIMPL; +} + +static UINT WINAPI d3dx9_animation_controller_GetNumAnimationSets(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0; +} + +static HRESULT WINAPI d3dx9_animation_controller_GetAnimationSet(ID3DXAnimationController *iface, + UINT index, ID3DXAnimationSet **anim_set) +{ + FIXME("iface %p, index %u, anim_set %p stub.\n", iface, index, anim_set); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_GetAnimationSetByName(ID3DXAnimationController *iface, + const char *name, ID3DXAnimationSet **anim_set) +{ + FIXME("iface %p, name %s, anim_set %p stub.\n", iface, debugstr_a(name), anim_set); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_AdvanceTime(ID3DXAnimationController *iface, double time_delta, + ID3DXAnimationCallbackHandler *callback_handler) +{ + FIXME("iface %p, time_delta %.16e, callback_handler %p stub.\n", iface, time_delta, callback_handler); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_Reset(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return E_NOTIMPL; +} + +static double WINAPI d3dx9_animation_controller_GetTime(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0.0; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetTrackAnimationSet(ID3DXAnimationController *iface, + UINT track, ID3DXAnimationSet *anim_set) +{ + FIXME("iface %p, track %u, anim_set %p stub.\n", iface, track, anim_set); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_GetTrackAnimationSet(ID3DXAnimationController *iface, + UINT track, ID3DXAnimationSet **anim_set) +{ + FIXME("iface %p, track %u, anim_set %p stub.\n", iface, track, anim_set); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetTrackPriority(ID3DXAnimationController *iface, + UINT track, D3DXPRIORITY_TYPE priority) +{ + FIXME("iface %p, track %u, priority %u stub.\n", iface, track, priority); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetTrackSpeed(ID3DXAnimationController *iface, + UINT track, float speed) +{ + FIXME("iface %p, track %u, speed %.8e stub.\n", iface, track, speed); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetTrackWeight(ID3DXAnimationController *iface, + UINT track, float weight) +{ + FIXME("iface %p, track %u, weight %.8e stub.\n", iface, track, weight); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetTrackPosition(ID3DXAnimationController *iface, + UINT track, double position) +{ + FIXME("iface %p, track %u, position %.16e stub.\n", iface, track, position); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetTrackEnable(ID3DXAnimationController *iface, + UINT track, BOOL enable) +{ + FIXME("iface %p, track %u, enable %#x stub.\n", iface, track, enable); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetTrackDesc(ID3DXAnimationController *iface, + UINT track, D3DXTRACK_DESC *desc) +{ + FIXME("iface %p, track %u, desc %p stub.\n", iface, track, desc); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_GetTrackDesc(ID3DXAnimationController *iface, + UINT track, D3DXTRACK_DESC *desc) +{ + FIXME("iface %p, track %u, desc %p stub.\n", iface, track, desc); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_SetPriorityBlend(ID3DXAnimationController *iface, + float blend_weight) +{ + FIXME("iface %p, blend_weight %.8e stub.\n", iface, blend_weight); + + return E_NOTIMPL; +} + +static float WINAPI d3dx9_animation_controller_GetPriorityBlend(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0.0f; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_KeyTrackSpeed(ID3DXAnimationController *iface, + UINT track, float new_speed, double start_time, double duration, D3DXTRANSITION_TYPE transition) +{ + FIXME("iface %p, track %u, new_speed %.8e, start_time %.16e, duration %.16e, transition %u stub.\n", iface, + track, new_speed, start_time, duration, transition); + + return 0; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_KeyTrackWeight(ID3DXAnimationController *iface, + UINT track, float new_weight, double start_time, double duration, D3DXTRANSITION_TYPE transition) +{ + FIXME("iface %p, track %u, new_weight %.8e, start_time %.16e, duration %.16e, transition %u stub.\n", iface, + track, new_weight, start_time, duration, transition); + + return 0; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_KeyTrackPosition(ID3DXAnimationController *iface, + UINT track, double new_position, double start_time) +{ + FIXME("iface %p, track %u, new_position %.16e, start_time %.16e stub.\n", iface, + track, new_position, start_time); + + return 0; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_KeyTrackEnable(ID3DXAnimationController *iface, + UINT track, BOOL new_enable, double start_time) +{ + FIXME("iface %p, track %u, new_enable %#x, start_time %.16e stub.\n", iface, + track, new_enable, start_time); + + return 0; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_KeyTrackBlend(ID3DXAnimationController *iface, + float new_blend_weight, double start_time, double duration, D3DXTRANSITION_TYPE transition) +{ + FIXME("iface %p, new_blend_weight %.8e, start_time %.16e, duration %.16e, transition %u stub.\n", iface, + new_blend_weight, start_time, duration, transition); + + return 0; +} + +static HRESULT WINAPI d3dx9_animation_controller_UnkeyEvent(ID3DXAnimationController *iface, D3DXEVENTHANDLE event) +{ + FIXME("iface %p, event %u stub.\n", iface, event); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_UnkeyAllTrackEvents(ID3DXAnimationController *iface, UINT track) +{ + FIXME("iface %p, track %u stub.\n", iface, track); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_UnkeyAllPriorityBlends(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return E_NOTIMPL; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_GetCurrentTrackEvent(ID3DXAnimationController *iface, + UINT track, D3DXEVENT_TYPE event_type) +{ + FIXME("iface %p, track %u, event_type %u stub.\n", iface, track, event_type); + + return 0; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_GetCurrentPriorityBlend(ID3DXAnimationController *iface) +{ + FIXME("iface %p stub.\n", iface); + + return 0; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_GetUpcomingTrackEvent(ID3DXAnimationController *iface, + UINT track, D3DXEVENTHANDLE event) +{ + FIXME("iface %p, track %u, event %u stub.\n", iface, track, event); + + return 0; +} + +static D3DXEVENTHANDLE WINAPI d3dx9_animation_controller_GetUpcomingPriorityBlend(ID3DXAnimationController *iface, + D3DXEVENTHANDLE event) +{ + FIXME("iface %p, event %u stub.\n", iface, event); + + return 0; +} + +static HRESULT WINAPI d3dx9_animation_controller_ValidateEvent(ID3DXAnimationController *iface, D3DXEVENTHANDLE event) +{ + FIXME("iface %p, event %u stub.\n", iface, event); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_GetEventDesc(ID3DXAnimationController *iface, + D3DXEVENTHANDLE event, D3DXEVENT_DESC *desc) +{ + FIXME("iface %p, event %u, desc %p stub.\n", iface, event, desc); + + return E_NOTIMPL; +} + +static HRESULT WINAPI d3dx9_animation_controller_CloneAnimationController(ID3DXAnimationController *iface, UINT max_outputs, + UINT max_sets, UINT max_tracks, UINT max_events, ID3DXAnimationController **anim_controller) +{ + FIXME("iface %p, max_outputs %u, max_sets %u, max_tracks %u, max_events %u, anim_controller %p stub.\n", + iface, max_outputs, max_sets, max_tracks, max_events, anim_controller); + + return E_NOTIMPL; +} + +static const struct ID3DXAnimationControllerVtbl d3dx9_animation_controller_vtbl = +{ + d3dx9_animation_controller_QueryInterface, + d3dx9_animation_controller_AddRef, + d3dx9_animation_controller_Release, + d3dx9_animation_controller_GetMaxNumAnimationOutputs, + d3dx9_animation_controller_GetMaxNumAnimationSets, + d3dx9_animation_controller_GetMaxNumTracks, + d3dx9_animation_controller_GetMaxNumEvents, + d3dx9_animation_controller_RegisterAnimationOutput, + d3dx9_animation_controller_RegisterAnimationSet, + d3dx9_animation_controller_UnregisterAnimationSet, + d3dx9_animation_controller_GetNumAnimationSets, + d3dx9_animation_controller_GetAnimationSet, + d3dx9_animation_controller_GetAnimationSetByName, + d3dx9_animation_controller_AdvanceTime, + d3dx9_animation_controller_Reset, + d3dx9_animation_controller_GetTime, + d3dx9_animation_controller_SetTrackAnimationSet, + d3dx9_animation_controller_GetTrackAnimationSet, + d3dx9_animation_controller_SetTrackPriority, + d3dx9_animation_controller_SetTrackSpeed, + d3dx9_animation_controller_SetTrackWeight, + d3dx9_animation_controller_SetTrackPosition, + d3dx9_animation_controller_SetTrackEnable, + d3dx9_animation_controller_SetTrackDesc, + d3dx9_animation_controller_GetTrackDesc, + d3dx9_animation_controller_SetPriorityBlend, + d3dx9_animation_controller_GetPriorityBlend, + d3dx9_animation_controller_KeyTrackSpeed, + d3dx9_animation_controller_KeyTrackWeight, + d3dx9_animation_controller_KeyTrackPosition, + d3dx9_animation_controller_KeyTrackEnable, + d3dx9_animation_controller_KeyTrackBlend, + d3dx9_animation_controller_UnkeyEvent, + d3dx9_animation_controller_UnkeyAllTrackEvents, + d3dx9_animation_controller_UnkeyAllPriorityBlends, + d3dx9_animation_controller_GetCurrentTrackEvent, + d3dx9_animation_controller_GetCurrentPriorityBlend, + d3dx9_animation_controller_GetUpcomingTrackEvent, + d3dx9_animation_controller_GetUpcomingPriorityBlend, + d3dx9_animation_controller_ValidateEvent, + d3dx9_animation_controller_GetEventDesc, + d3dx9_animation_controller_CloneAnimationController +}; + +HRESULT WINAPI D3DXCreateAnimationController(UINT max_outputs, UINT max_sets, + UINT max_tracks, UINT max_events, ID3DXAnimationController **controller) +{ + struct d3dx9_animation_controller *object; + + TRACE("max_outputs %u, max_sets %u, max_tracks %u, max_events %u, controller %p.\n", + max_outputs, max_sets, max_tracks, max_events, controller); + + if (!max_outputs || !max_sets || !max_tracks || !max_events || !controller) + return D3D_OK; + + object = HeapAlloc(GetProcessHeap(), 0, sizeof(*object)); + if (!object) + return E_OUTOFMEMORY; + + object->ID3DXAnimationController_iface.lpVtbl = &d3dx9_animation_controller_vtbl; + object->ref = 1; + + *controller = &object->ID3DXAnimationController_iface; + + return D3D_OK; +} diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec index 5eda04102bc..aa7c9288ed6 100644 --- a/dlls/d3dx9_36/d3dx9_36.spec +++ b/dlls/d3dx9_36/d3dx9_36.spec @@ -30,7 +30,7 @@ @ stub D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) @ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) @ stub D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) -@ stub D3DXCreateAnimationController(long long long long ptr) +@ stdcall D3DXCreateAnimationController(long long long long ptr) @ stdcall D3DXCreateBox(ptr float float float ptr ptr) @ stdcall D3DXCreateBuffer(long ptr) @ stub D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) diff --git a/include/d3dx9anim.h b/include/d3dx9anim.h index b5f2232fdb2..81b8e2f6b2c 100644 --- a/include/d3dx9anim.h +++ b/include/d3dx9anim.h @@ -327,37 +327,37 @@ DECLARE_INTERFACE_(ID3DXAnimationController, IUnknown) STDMETHOD_(UINT, GetNumAnimationSets)(THIS) PURE; STDMETHOD(GetAnimationSet)(THIS_ UINT index, ID3DXAnimationSet **anim_set) PURE; STDMETHOD(GetAnimationSetByName)(THIS_ const char *name, ID3DXAnimationSet **anim_set) PURE; - STDMETHOD(AdvanceTime)(THIS_ double time_delta, ID3DXAnimationCallbackHandler **callback_handler) PURE; + STDMETHOD(AdvanceTime)(THIS_ double time_delta, ID3DXAnimationCallbackHandler *callback_handler) PURE; STDMETHOD(ResetTime)(THIS) PURE; - STDMETHOD_(DOUBLE, GetTime)(THIS) PURE; + STDMETHOD_(double, GetTime)(THIS) PURE; STDMETHOD(SetTrackAnimationSet)(THIS_ UINT track, ID3DXAnimationSet *anim_set) PURE; STDMETHOD(GetTrackAnimationSet)(THIS_ UINT track, ID3DXAnimationSet **anim_set) PURE; - STDMETHOD(GetTrackPriority)(THIS_ UINT track, D3DXPRIORITY_TYPE *priority) PURE; - STDMETHOD(SetTrackSpeed)(THIS_ UINT track, FLOAT speed) PURE; - STDMETHOD(SetTrackWeight)(THIS_ UINT track, FLOAT weight) PURE; - STDMETHOD(SetTrackPosition)(THIS_ UINT track, DOUBLE position) PURE; + STDMETHOD(SetTrackPriority)(THIS_ UINT track, D3DXPRIORITY_TYPE priority) PURE; + STDMETHOD(SetTrackSpeed)(THIS_ UINT track, float speed) PURE; + STDMETHOD(SetTrackWeight)(THIS_ UINT track, float weight) PURE; + STDMETHOD(SetTrackPosition)(THIS_ UINT track, double position) PURE; STDMETHOD(SetTrackEnable)(THIS_ UINT track, BOOL enable) PURE; - STDMETHOD(SetTrackDesc)(THIS_ UINT track, LPD3DXTRACK_DESC desc) PURE; - STDMETHOD(GetTrackDesc)(THIS_ UINT track, LPD3DXTRACK_DESC desc) PURE; - STDMETHOD(SetPriorityBlend)(THIS_ FLOAT blend_weight) PURE; - STDMETHOD_(FLOAT, GetPriorityBlend)(THIS) PURE; - STDMETHOD_(D3DXEVENTHANDLE, KeyTrackSpeed)(THIS_ UINT track, FLOAT new_speed, - DOUBLE start_time, DOUBLE duration, D3DXTRANSITION_TYPE transition) PURE; - STDMETHOD_(D3DXEVENTHANDLE, KeyTrackWeight)(THIS_ UINT track, FLOAT new_weight, - DOUBLE start_time, DOUBLE duration, D3DXTRANSITION_TYPE transition) PURE; - STDMETHOD_(D3DXEVENTHANDLE, KeyTrackPosition)(THIS_ UINT track, DOUBLE new_position, DOUBLE start_time) PURE; - STDMETHOD_(D3DXEVENTHANDLE, KeyTrackEnable)(THIS_ UINT track, BOOL new_enable, DOUBLE start_time) PURE; - STDMETHOD_(D3DXEVENTHANDLE, KeyPriorityBlend)(THIS_ FLOAT new_blend_weight, - DOUBLE start_time, DOUBLE duration, D3DXTRANSITION_TYPE transition) PURE; + STDMETHOD(SetTrackDesc)(THIS_ UINT track, D3DXTRACK_DESC *desc) PURE; + STDMETHOD(GetTrackDesc)(THIS_ UINT track, D3DXTRACK_DESC *desc) PURE; + STDMETHOD(SetPriorityBlend)(THIS_ float blend_weight) PURE; + STDMETHOD_(float, GetPriorityBlend)(THIS) PURE; + STDMETHOD_(D3DXEVENTHANDLE, KeyTrackSpeed)(THIS_ UINT track, float new_speed, + double start_time, double duration, D3DXTRANSITION_TYPE transition) PURE; + STDMETHOD_(D3DXEVENTHANDLE, KeyTrackWeight)(THIS_ UINT track, float new_weight, + double start_time, double duration, D3DXTRANSITION_TYPE transition) PURE; + STDMETHOD_(D3DXEVENTHANDLE, KeyTrackPosition)(THIS_ UINT track, double new_position, double start_time) PURE; + STDMETHOD_(D3DXEVENTHANDLE, KeyTrackEnable)(THIS_ UINT track, BOOL new_enable, double start_time) PURE; + STDMETHOD_(D3DXEVENTHANDLE, KeyPriorityBlend)(THIS_ float new_blend_weight, + double start_time, double duration, D3DXTRANSITION_TYPE transition) PURE; STDMETHOD(UnkeyEvent)(THIS_ D3DXEVENTHANDLE event) PURE; STDMETHOD(UnkeyAllTrackEvents)(THIS_ UINT track) PURE; STDMETHOD(UnkeyAllPriorityBlends)(THIS) PURE; STDMETHOD_(D3DXEVENTHANDLE, GetCurrentTrackEvent)(THIS_ UINT track, D3DXEVENT_TYPE event_type) PURE; STDMETHOD_(D3DXEVENTHANDLE, GetCurrentPriorityBlend)(THIS) PURE; STDMETHOD_(D3DXEVENTHANDLE, GetUpcomingTrackEvent)(THIS_ UINT track, D3DXEVENTHANDLE event) PURE; - STDMETHOD_(D3DXEVENTHANDLE, GetUpcomingPriorityBlend)(THIS_ D3DXEVENTHANDLE handle) PURE; + STDMETHOD_(D3DXEVENTHANDLE, GetUpcomingPriorityBlend)(THIS_ D3DXEVENTHANDLE event) PURE; STDMETHOD(ValidateEvent)(THIS_ D3DXEVENTHANDLE event) PURE; - STDMETHOD(GetEventDesc)(THIS_ D3DXEVENTHANDLE event, LPD3DXEVENT_DESC desc) PURE; + STDMETHOD(GetEventDesc)(THIS_ D3DXEVENTHANDLE event, D3DXEVENT_DESC *desc) PURE; STDMETHOD(CloneAnimationController)(THIS_ UINT max_num_anim_outputs, UINT max_num_anim_sets, UINT max_num_tracks, UINT max_num_events, ID3DXAnimationController **anim_controller) PURE; };