OpenBarnyard
 
Loading...
Searching...
No Matches
AAnimatableObject.cpp
Go to the documentation of this file.
1#include "pch.h"
2#include "AAnimatableObject.h"
3#include "AModelRepos.h"
4
5//-----------------------------------------------------------------------------
6// Enables memory debugging.
7// Note: Should be the last include!
8//-----------------------------------------------------------------------------
10
12
14
15// $Barnyard: FUNCTION 0057cff0
17 : m_pUnk1( TNULL )
18 , m_pObjectType( TNULL )
19 , m_pModelInstance( TNULL )
20 , m_eFlags( FLAGS_NONE )
21{
22}
23
24// $Barnyard: FUNCTION 0057d0a0
25// $Barnyard: FUNCTION 0057c530
27{
28 m_llAnimControllers.DeleteAll();
29
30 if ( m_pModelInstance )
31 {
32 AModelInstance* pModelInstance = m_pModelInstance;
33 m_pModelInstance = TNULL;
34
35 AModelRepos::GetSingleton()->DestroyModelInstance( pModelInstance );
36 }
37
38 m_llAttachedObjects.Clear();
39}
40
41// $Barnyard: FUNCTION 0057c650
42TBOOL AAnimatableObject::Create( AAnimatableObjectType* a_pObjectType, void* a_Unk1, CREATE_FLAGS a_eFlags )
43{
44 m_pUnk1 = a_Unk1;
45 m_pObjectType = a_pObjectType;
46
47 // Instantiate a model
48 m_pModelInstance = AModelRepos::GetSingleton()->InstantiateModel( a_pObjectType->GetModel() );
49
50 if ( m_pModelInstance )
51 {
52 if ( !T2String8::CompareNoCase( "sunglasses", a_pObjectType->GetName(), 10 ) )
53 {
54 // Instantiating sunglasses model
55 m_pModelInstance->SetReceivesLight( TFALSE );
56 }
57
58 TSceneObject* pSceneObject = m_pModelInstance->GetSceneObject();
59
60 pSceneObject->GetSomeVector2().y = 1.0;
61 pSceneObject->EnableUnknown1();
62 m_eFlags |= FLAGS_CREATED;
63
64 m_oToshiAnimInterface.SetSkeletonInstance( pSceneObject->GetSkeletonInstance() );
65 m_oToshiAnimInterface.SetAnimationSet( a_pObjectType->GetDefaultAnimationSet() );
66
67 if ( !( a_eFlags & CREATE_FLAGS_NO_ANIM_CONTROLLER ) )
68 {
69 // Create animation controllers
70 T2_FOREACH( a_pObjectType->GetAnimControllerTypes(), it )
71 {
72 TClass* pControllerClass = it->GetControllerClass();
73 TVALIDPTR( pControllerClass );
74
75 AAnimController* pAnimController = TSTATICCAST( AAnimController, pControllerClass->CreateObject() );
76 TVALIDPTR( pAnimController );
77
78 TBOOL bCreated = pAnimController->Create( a_Unk1, this, it );
79 TASSERT( TTRUE == bCreated );
80
81 m_llAnimControllers.PushBack( pAnimController );
82 }
83 }
84
85 a_pObjectType->OnAnimatableObjectCreated( this );
86 }
87
88 return m_eFlags & FLAGS_CREATED;
89}
90
91// $Barnyard: FUNCTION 0057d280
93{
94 if ( !HASANYFLAG( m_eFlags, FLAGS_CREATED ) )
95 return TTRUE;
96
98
99 PlayQueuedAnimation();
100 m_oToshiAnimInterface.Update( a_fDeltaTime, animEvents );
101
102 // Update attached animation controllers
103 UpdateAnimControllers( a_fDeltaTime );
104
105 // Handle the animation events
106 for ( TINT i = 0; i < animEvents.iNumEvents; i++ )
107 {
109 TASSERT( !"Call the breakpoint" );
110 }
111
112 return TTRUE;
113}
114
115// $Barnyard: FUNCTION 0057bf00
117{
118 T2_FOREACH( m_llAnimControllers, it )
119 {
120 if ( it->IsEnabled() )
121 it->OnUpdate( a_fDeltaTime );
122 }
123}
124
125// $Barnyard: FUNCTION 0057d130
126TBOOL AAnimatableObject::PlayAnimation( const Toshi::TPString8& a_strName )
127{
128 if ( !StartAnimation( a_strName ) )
129 {
130 // Couldn't play animation right now, play it later
131 TASSERT( m_vecQueuedAnims.Size() != m_vecQueuedAnims.CAPACITY );
132
133 m_vecQueuedAnims.PushBack( a_strName );
134 return TFALSE;
135 }
136
137 return TTRUE;
138}
139
140// $Barnyard: FUNCTION 0057c8d0
141TBOOL AAnimatableObject::StartAnimation( const TPString8& a_strName )
142{
143 ANamedAnimation* pAnimation = m_oToshiAnimInterface.GetAnimationSet()->GetNamedAnimation( a_strName );
144 TVALIDPTR( pAnimation );
145
146 if ( !pAnimation )
147 return TTRUE;
148
149 // Make sure this animation isn't skipped by any controller
150 TBOOL bShouldPlay = TTRUE;
151 T2_FOREACH( m_llAnimControllers, it )
152 {
153 if ( it->IsEnabled() )
154 {
155 bShouldPlay &= it->IsAnimationAllowed( pAnimation );
156 }
157 }
158
159 if ( bShouldPlay )
160 m_oToshiAnimInterface.PlayAnim( a_strName, -1.0f, TFALSE );
161
162 return bShouldPlay;
163}
164
165// $Barnyard: FUNCTION 0057d0c0
166void AAnimatableObject::PlayQueuedAnimation()
167{
168 T2_FOREACH( m_vecQueuedAnims, it )
169 {
170 if ( StartAnimation( *it ) )
171 {
172 // This animation has been started, remove it from the queue
173 m_vecQueuedAnims.EraseFast( it );
174 it--;
175 }
176 }
177}
178
179// $Barnyard: FUNCTION 0057c2f0
181{
182 TVALIDPTR( m_pModelInstance );
183
184 m_pModelInstance->SetVisible( a_bVisible );
185}
186
187// $Barnyard: FUNCTION 0057c210
188void AAnimatableObject::SetSkeletonUpdating( TBOOL a_bUpdating, TBOOL a_bRecursive )
189{
190 TVALIDPTR( m_pModelInstance );
191
192 m_pModelInstance->SetSkeletonUpdating( a_bUpdating );
193
194 if ( a_bRecursive )
195 {
196 // Update settings of attached objects
197 T2_FOREACH( m_llAttachedObjects, it )
198 {
199 it->SetSkeletonUpdating( a_bUpdating, TTRUE );
200 }
201 }
202}
203
204// $Barnyard: FUNCTION 0057d190
206{
207 m_vecQueuedAnims.Clear();
208 m_oToshiAnimInterface.KillAllAnimations();
209}
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define HASANYFLAG(STATE, FLAG)
Definition Defines.h:5
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TVALIDPTR(PTR)
Definition Defines.h:139
#define T2_FOREACH(vecName, iteratorName)
Definition T2Iterator.h:4
#define TDEFINE_CLASS(...)
Definition TObject.h:120
float TFLOAT
Definition Typedefs.h:4
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
TFLOAT y
Definition TVector2.h:139
static TINT CompareNoCase(const TCHAR *str1, const TCHAR *str2, TSIZE size=-1)
Definition T2String8.cpp:60
Definition TClass.h:8
class TObject * CreateObject() const
Definition TClass.cpp:116
TVector2 & GetSomeVector2()
void EnableUnknown1()
TSkeletonInstance * GetSkeletonInstance()
TBOOL PlayAnimation(const Toshi::TPString8 &a_strName)
TBOOL Create(AAnimatableObjectType *a_pObjectType, void *a_Unk1, CREATE_FLAGS a_eFlags=CREATE_FLAGS_NONE)
TBOOL Update(TFLOAT a_fDeltaTime)
void SetVisible(TBOOL a_bVisible)
void SetSkeletonUpdating(TBOOL a_bUpdating, TBOOL a_bRecursive)
void UpdateAnimControllers(TFLOAT a_fDeltaTime)
const Toshi::TPString8 & GetName() const
ANamedAnimationSetRef GetDefaultAnimationSet() const
Toshi::T2DList< AAnimControllerType > & GetAnimControllerTypes()
virtual void OnAnimatableObjectCreated(AAnimatableObject *a_pAnimatableObject)
TBOOL Create(void *a_pUnk, AAnimatableObject *a_pAnimatableObject, AAnimControllerType *a_pControllerType)
ANamedAnimationSetRef GetAnimationSet()