2 * Copyright (c) 2007-2010 SlimDX Group
\r
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
\r
5 * of this software and associated documentation files (the "Software"), to deal
\r
6 * in the Software without restriction, including without limitation the rights
\r
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
\r
8 * copies of the Software, and to permit persons to whom the Software is
\r
9 * furnished to do so, subject to the following conditions:
\r
11 * The above copyright notice and this permission notice shall be included in
\r
12 * all copies or substantial portions of the Software.
\r
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
\r
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
\r
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
\r
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
\r
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
\r
24 #include "../DataStream.h"
\r
25 #include "../ComObject.h"
\r
27 #include "../Math/Matrix.h"
\r
28 #include "../Math/Vector3.h"
\r
30 #include "Direct3D9Exception.h"
\r
32 #include "AnimationFrame.h"
\r
33 #include "AnimationSet.h"
\r
34 #include "AnimationController.h"
\r
35 #include "TrackDescription.h"
\r
36 #include "EventDescription.h"
\r
38 using namespace System;
\r
39 using namespace System::Collections::Generic;
\r
40 using namespace System::Runtime::InteropServices;
\r
46 AnimationController::AnimationController( int maxAnimationOutputs, int maxAnimationSets, int maxTracks, int maxEvents )
\r
48 ID3DXAnimationController *pointer;
\r
50 HRESULT hr = D3DXCreateAnimationController( maxAnimationOutputs, maxAnimationSets, maxTracks, maxEvents, &pointer );
\r
51 if( RECORD_D3D9( hr ).IsFailure )
\r
52 throw gcnew Direct3D9Exception( Result::Last );
\r
54 outputs = gcnew List<GCHandle>();
\r
56 Construct( pointer );
\r
59 AnimationController::~AnimationController()
\r
61 for each (GCHandle handle in outputs)
\r
65 Result AnimationController::AdvanceTime( double time, AnimationCallback^ handler )
\r
67 LPD3DXANIMATIONCALLBACKHANDLER callback = NULL;
\r
68 if(handler != nullptr)
\r
69 callback = reinterpret_cast< LPD3DXANIMATIONCALLBACKHANDLER >( Marshal::GetFunctionPointerForDelegate( handler ).ToPointer() );
\r
71 HRESULT hr = InternalPointer->AdvanceTime( time, callback );
\r
72 return RECORD_D3D9( hr );
\r
75 AnimationController^ AnimationController::Clone( int maxAnimationOutputs, int maxAnimationSets, int maxTracks, int maxEvents )
\r
77 LPD3DXANIMATIONCONTROLLER pointer;
\r
79 HRESULT hr = InternalPointer->CloneAnimationController( maxAnimationOutputs, maxAnimationSets, maxTracks, maxEvents, &pointer );
\r
81 if( RECORD_D3D9( hr ).IsFailure )
\r
84 return gcnew AnimationController( pointer, nullptr );
\r
87 AnimationSet^ AnimationController::GetAnimationSet( int index )
\r
89 LPD3DXANIMATIONSET set;
\r
91 HRESULT hr = InternalPointer->GetAnimationSet( index, &set );
\r
93 if( RECORD_D3D9( hr ).IsFailure )
\r
96 return InternalAnimationSet::FromPointer( set, this );
\r
99 AnimationSet^ AnimationController::GetAnimationSet( String^ name )
\r
101 LPD3DXANIMATIONSET set;
\r
102 array<unsigned char>^ nameBytes = System::Text::ASCIIEncoding::ASCII->GetBytes( name );
\r
103 pin_ptr<unsigned char> pinnedName = &nameBytes[0];
\r
105 HRESULT hr = InternalPointer->GetAnimationSetByName( reinterpret_cast<LPCSTR>( pinnedName ), &set );
\r
107 if( RECORD_D3D9( hr ).IsFailure )
\r
110 return InternalAnimationSet::FromPointer( set, this );
\r
113 int AnimationController::GetCurrentTrackEvent( int track, EventType eventType )
\r
115 return InternalPointer->GetCurrentTrackEvent( track, static_cast<D3DXEVENT_TYPE>( eventType ) );
\r
118 EventDescription AnimationController::GetEventDescription( int handle )
\r
120 EventDescription result;
\r
122 HRESULT hr = InternalPointer->GetEventDesc( handle, reinterpret_cast<LPD3DXEVENT_DESC>( &result ) );
\r
128 AnimationSet^ AnimationController::GetTrackAnimationSet( int track )
\r
130 LPD3DXANIMATIONSET set;
\r
132 HRESULT hr = InternalPointer->GetTrackAnimationSet( track, &set );
\r
134 if( RECORD_D3D9( hr ).IsFailure )
\r
137 return InternalAnimationSet::FromPointer( set, this );
\r
140 TrackDescription AnimationController::GetTrackDescription( int track )
\r
142 TrackDescription result;
\r
144 HRESULT hr = InternalPointer->GetTrackDesc( track, reinterpret_cast<LPD3DXTRACK_DESC>( &result ) );
\r
150 int AnimationController::GetUpcomingPriorityBlend( int handle )
\r
152 return InternalPointer->GetUpcomingPriorityBlend( handle );
\r
155 int AnimationController::GetUpcomingTrackEvent( int track, int handle )
\r
157 return InternalPointer->GetUpcomingTrackEvent( track, handle );
\r
160 int AnimationController::KeyPriorityBlend( float newBlendWeight, double startTime, double duration, TransitionType transition )
\r
162 return InternalPointer->KeyPriorityBlend( newBlendWeight, startTime, duration, static_cast<D3DXTRANSITION_TYPE>( transition ) );
\r
165 int AnimationController::KeyTrackEnable( int track, bool enable, double startTime )
\r
167 return InternalPointer->KeyTrackEnable( track, enable, startTime );
\r
170 int AnimationController::KeyTrackPosition( int track, double position, double startTime )
\r
172 return InternalPointer->KeyTrackPosition( track, position, startTime );
\r
175 int AnimationController::KeyTrackSpeed( int track, float newSpeed, double startTime, double duration, TransitionType transition )
\r
177 return InternalPointer->KeyTrackSpeed( track, newSpeed, startTime, duration, static_cast<D3DXTRANSITION_TYPE>( transition ) );
\r
180 int AnimationController::KeyTrackWeight( int track, float newWeight, double startTime, double duration, TransitionType transition )
\r
182 return InternalPointer->KeyTrackWeight( track, newWeight, startTime, duration, static_cast<D3DXTRANSITION_TYPE>( transition ) );
\r
185 Result AnimationController::RegisterAnimationOutput( Frame^ frame )
\r
187 HRESULT hr = InternalPointer->RegisterAnimationOutput( frame->Pointer->Name, &frame->Pointer->TransformationMatrix, NULL, NULL, NULL );
\r
188 return RECORD_D3D9( hr );
\r
191 Result AnimationController::RegisterAnimationOutput( String^ name, AnimationOutput^ output )
\r
193 D3DXMATRIX *matrix = NULL;
\r
194 D3DXVECTOR3 *scale = NULL;
\r
195 D3DXVECTOR3 *translation = NULL;
\r
196 D3DXQUATERNION *rotation = NULL;
\r
197 array<unsigned char>^ nameBytes = System::Text::ASCIIEncoding::ASCII->GetBytes( name );
\r
198 pin_ptr<unsigned char> pinnedName = &nameBytes[0];
\r
200 GCHandle handle = GCHandle::Alloc(output, GCHandleType::Pinned);
\r
201 char *ptr = reinterpret_cast<char*>(handle.AddrOfPinnedObject().ToPointer()) + sizeof(AnimationOutputFlags);
\r
202 outputs->Add(handle);
\r
204 if( (output->Flags & AnimationOutputFlags::Transformation) == AnimationOutputFlags::Transformation )
\r
205 matrix = reinterpret_cast<D3DXMATRIX*>(ptr);
\r
207 ptr += sizeof(D3DXMATRIX);
\r
208 if( (output->Flags & AnimationOutputFlags::Scale) == AnimationOutputFlags::Scale )
\r
209 scale = reinterpret_cast<D3DXVECTOR3*>(ptr);
\r
211 ptr += sizeof(D3DXVECTOR3);
\r
212 if( (output->Flags & AnimationOutputFlags::Translation) == AnimationOutputFlags::Translation )
\r
213 translation = reinterpret_cast<D3DXVECTOR3*>(ptr);
\r
215 ptr += sizeof(D3DXVECTOR3);
\r
216 if( (output->Flags & AnimationOutputFlags::Rotation) == AnimationOutputFlags::Rotation )
\r
217 rotation = reinterpret_cast<D3DXQUATERNION*>(ptr);
\r
219 HRESULT hr = InternalPointer->RegisterAnimationOutput( reinterpret_cast<LPCSTR>( pinnedName ), matrix, scale, rotation, translation );
\r
220 return RECORD_D3D9( hr );
\r
223 Result AnimationController::RegisterAnimationSet( AnimationSet^ set )
\r
225 HRESULT hr = InternalPointer->RegisterAnimationSet( set->InternalPointer );
\r
226 return RECORD_D3D9( hr );
\r
229 Result AnimationController::ResetTime()
\r
231 HRESULT hr = InternalPointer->ResetTime();
\r
232 return RECORD_D3D9( hr );
\r
235 Result AnimationController::SetTrackAnimationSet( int track, AnimationSet^ set )
\r
237 HRESULT hr = InternalPointer->SetTrackAnimationSet( track, set->InternalPointer );
\r
238 return RECORD_D3D9( hr );
\r
241 Result AnimationController::SetTrackDescription( int track, TrackDescription description )
\r
243 HRESULT hr = InternalPointer->SetTrackDesc( track, reinterpret_cast<LPD3DXTRACK_DESC>( &description ) );
\r
244 return RECORD_D3D9( hr );
\r
247 Result AnimationController::EnableTrack( int track )
\r
249 HRESULT hr = InternalPointer->SetTrackEnable( track, true );
\r
250 return RECORD_D3D9( hr );
\r
253 Result AnimationController::DisableTrack( int track )
\r
255 HRESULT hr = InternalPointer->SetTrackEnable( track, false );
\r
256 return RECORD_D3D9( hr );
\r
259 Result AnimationController::SetTrackPosition( int track, double position )
\r
261 HRESULT hr = InternalPointer->SetTrackPosition( track, position );
\r
262 return RECORD_D3D9( hr );
\r
265 Result AnimationController::SetTrackPriority( int track, TrackPriority priority )
\r
267 HRESULT hr = InternalPointer->SetTrackPriority( track, static_cast<D3DXPRIORITY_TYPE>( priority ) );
\r
268 return RECORD_D3D9( hr );
\r
271 Result AnimationController::SetTrackSpeed( int track, float speed )
\r
273 HRESULT hr = InternalPointer->SetTrackSpeed( track, speed );
\r
274 return RECORD_D3D9( hr );
\r
277 Result AnimationController::SetTrackWeight( int track, float weight )
\r
279 HRESULT hr = InternalPointer->SetTrackWeight( track, weight );
\r
280 return RECORD_D3D9( hr );
\r
283 Result AnimationController::UnkeyAllPriorityBlends()
\r
285 HRESULT hr = InternalPointer->UnkeyAllPriorityBlends();
\r
286 return RECORD_D3D9( hr );
\r
289 Result AnimationController::UnkeyAllTrackEvents( int track )
\r
291 HRESULT hr = InternalPointer->UnkeyAllTrackEvents( track );
\r
292 return RECORD_D3D9( hr );
\r
295 Result AnimationController::UnkeyEvent( int handle )
\r
297 HRESULT hr = InternalPointer->UnkeyEvent( handle );
\r
298 return RECORD_D3D9( hr );
\r
301 Result AnimationController::UnregisterAnimationSet( AnimationSet^ set )
\r
303 HRESULT hr = InternalPointer->UnregisterAnimationSet( set->InternalPointer );
\r
304 return RECORD_D3D9( hr );
\r
307 bool AnimationController::ValidateEvent( int handle )
\r
309 HRESULT hr = InternalPointer->ValidateEvent( handle );
\r
311 return (hr == S_OK);
\r
314 double AnimationController::Time::get()
\r
316 return InternalPointer->GetTime();
\r
319 int AnimationController::CurrentPriorityBlend::get()
\r
321 return InternalPointer->GetCurrentPriorityBlend();
\r
324 float AnimationController::PriorityBlend::get()
\r
326 return InternalPointer->GetPriorityBlend();
\r
329 void AnimationController::PriorityBlend::set( float value )
\r
331 InternalPointer->SetPriorityBlend( value );
\r
334 int AnimationController::AnimationSetCount::get()
\r
336 return InternalPointer->GetNumAnimationSets();
\r
339 int AnimationController::MaxAnimationOutputs::get()
\r
341 return InternalPointer->GetMaxNumAnimationOutputs();
\r
344 int AnimationController::MaxAnimationSets::get()
\r
346 return InternalPointer->GetMaxNumAnimationSets();
\r
349 int AnimationController::MaxTracks::get()
\r
351 return InternalPointer->GetMaxNumTracks();
\r
354 int AnimationController::MaxEvents::get()
\r
356 return InternalPointer->GetMaxNumEvents();
\r