OpenBarnyard
 
Loading...
Searching...
No Matches
ABoneAttachCameraHelper.cpp
Go to the documentation of this file.
1#include "pch.h"
5#include "Render/ARenderer.h"
6
7#include <Toshi/TScheduler.h>
8
9//-----------------------------------------------------------------------------
10// Enables memory debugging.
11// Note: Should be the last include!
12//-----------------------------------------------------------------------------
13#include <Core/TMemoryDebugOn.h>
14
16
18
19// $Barnyard: FUNCTION 0045fca0
21 : m_pAnimation( TNULL )
22 , m_pAModelInstance( TNULL )
23 , m_pSceneObject( TNULL )
24 , m_pSkeletonInstance( TNULL )
25 , m_iBoneId( -1 )
26 , m_pAnimatableObject( TNULL )
27{
28}
29
30// $Barnyard: FUNCTION 0045fe30
31// $Barnyard: FUNCTION 0045fdd0
33{
34 ThisClass::OnDetach();
35}
36
37// $Barnyard: FUNCTION 0045f990
39{
40 if ( m_pSceneObject )
41 {
42 // Get bone transform transformed by the model transform
43 TMatrix44 matBoneTransform;
44 m_pSkeletonInstance->GetBoneTransformCurrent( m_iBoneId, matBoneTransform );
45 m_pSceneObject->GetTransform().GetLocalMatrixImp( m_oTransform );
46
47 m_oTransform.Multiply( matBoneTransform );
48
49 TVector4 vecDirection = m_oTransform.AsBasisVector4( BASISVECTOR_FORWARD );
50 vecDirection.Normalise();
51 vecDirection.x = -vecDirection.x;
52 vecDirection.y = -vecDirection.y;
53 vecDirection.z = -vecDirection.z;
54 vecDirection.w = 1.0f;
55
56 m_pCamera->GetMatrix().SetTranslation( m_oTransform.GetTranslation() );
57 m_pCamera->LookAtDirection( vecDirection );
58 }
59
60 return TTRUE;
61}
62
64{
65 return TTRUE;
66}
67
69{
70 return TTRUE;
71}
72
76
77// $Barnyard: FUNCTION 0045fb10
79{
80 AAnimatableObjectManager::GetSingleton()->DestroyAnimatableObject( m_pAnimatableObject );
81 m_pAnimatableObject = TNULL;
82}
83
87
88// $Barnyard: FUNCTION 0045fd00
90{
91 m_oAnimStartListener.Disconnect();
92
93 if ( m_pSkeletonInstance )
94 {
95 m_pSkeletonInstance->RemoveAllAnimations();
96 }
97
98 if ( m_pAnimation )
99 {
100 m_iBoneId = -1;
101 m_pAnimation = TNULL;
102 }
103
104 if ( m_pAModelInstance )
105 {
106 TPString8 strModelName = m_pAModelInstance->GetModelName();
107
108 AModelRepos::GetSingleton()->DestroyModelInstance( m_pAModelInstance );
109 AModelRepos::GetSingleton()->UnloadModel( strModelName, TFALSE );
110 AModelRepos::GetSingleton()->UnloadUnusedModels();
111
112 m_pSceneObject = TNULL;
113 m_pSkeletonInstance = TNULL;
114 m_pAModelInstance = TNULL;
115 }
116}
117
121
122// $Barnyard: FUNCTION 0045fba0
123void ABoneAttachCameraHelper::SetModel( const Toshi::TPString8& a_strModelName, const TCHAR* a_szBoneName )
124{
125 AModelRepos* pModelRepos = AModelRepos::GetSingleton();
126
127 // Make sure the model is loaded
128 pModelRepos->LoadModel( a_strModelName, TNULL );
129
130 AModel* pModel = pModelRepos->GetModel( a_strModelName );
131 TASSERT( TNULL != pModel );
132
133 AModelInstance* pInstance = pModelRepos->InstantiateModel( pModel );
134 TASSERT( TNULL != pInstance );
135
136 m_pAModelInstance = pInstance;
137 m_pAModelInstance->GetTransform().SetEuler( TVector3( TMath::HALF_PI, 0.0f, 0.0f ) );
138
139 m_pSceneObject = m_pAModelInstance->GetSceneObject();
140 m_pSkeletonInstance = m_pSceneObject->GetSkeletonInstance();
141
142 TString8 strBoneName = a_szBoneName;
143 m_iBoneId = m_pSkeletonInstance->GetSkeleton()->GetBoneID( strBoneName, strBoneName.Length() );
144 TASSERT( m_iBoneId != TBONE_INVALID );
145
146 m_oAnimStartListener.Connect(
147 ARenderer::GetSingleton()->GetAnimationUpdateStartEmitter(),
148 this,
149 &AnimationStartEventHandler,
150 0
151 );
152}
153
154// $Barnyard: FUNCTION 0045fa80
156{
157 if ( m_pAnimation )
158 {
159 m_pSkeletonInstance->RemoveAnimation( m_pAnimation, 0.0f );
160 m_pAnimation = TNULL;
161 }
162
163 TINT iSeqId = m_pSkeletonInstance->GetSkeleton()->GetSequenceID( a_szSeqName );
164 TASSERT( iSeqId != TSEQ_INVALID );
165
166 m_pAnimation = m_pSkeletonInstance->AddAnimation( iSeqId, 1.0f, 0.0f );
167}
168
169// $Barnyard: FUNCTION 0045fb30
170TBOOL __stdcall ABoneAttachCameraHelper::AnimationStartEventHandler( ABoneAttachCameraHelper* a_pCaller, ARenderer* a_pOwner, TBOOL** a_pData )
171{
172 TScheduler* pScheduler = g_oSystemManager.GetScheduler();
173
174 a_pCaller->m_pSkeletonInstance->UpdateTime( pScheduler->GetCurrentDeltaTime() );
175 a_pCaller->m_pSkeletonInstance->UpdateState( TTRUE );
176
177 return TTRUE;
178}
@ BASISVECTOR_FORWARD
Definition TMatrix44.h:27
#define TBONE_INVALID
Definition TSkeleton.h:9
#define TSEQ_INVALID
Definition TSkeleton.h:10
#define TASSERT(X,...)
Definition Defines.h:138
#define TOSHI_NAMESPACE_USING
Definition Defines.h:46
#define TDEFINE_CLASS(...)
Definition TObject.h:120
char TCHAR
Definition Typedefs.h:20
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
TSystemManager g_oSystemManager
Definition TSystem.cpp:15
constexpr TFLOAT HALF_PI
Definition TMathInline.h:37
void Multiply(const TMatrix44 &a_rLeft, const TMatrix44 &a_rRight)
Definition TMatrix44.cpp:61
TFLOAT w
Definition TVector4.h:367
TFLOAT x
Definition TVector4.h:367
TFLOAT y
Definition TVector4.h:367
void Normalise()
Definition TVector4.cpp:36
TFLOAT z
Definition TVector4.h:367
TFLOAT GetCurrentDeltaTime() const
Definition TScheduler.h:62
TINT Length() const
Definition TString8.h:93
Toshi::TTransformObject & GetTransform() const
Definition AModel.h:53
void LoadModel(const Toshi::TPString8 &a_rcName, Toshi::TTRB *a_pTRB)
AModelInstance * InstantiateModel(AModel *a_pModel)
AModel * GetModel(const Toshi::TPString8 &a_rcName)
virtual TBOOL OnUpdate(TFLOAT a_fDeltaTime) OVERRIDE
virtual void OnCreate() OVERRIDE
virtual TBOOL Unk2(void *) OVERRIDE
virtual void OnDestroy() OVERRIDE
virtual void OnDetach() OVERRIDE
virtual TBOOL Unk3(void *, void *) OVERRIDE
virtual void OnAttach() OVERRIDE
void SetAnimation(const TCHAR *a_szSeqName)
void SetModel(const Toshi::TPString8 &a_strModelName, const TCHAR *a_szBoneName)
ACamera * m_pCamera