Skip to content

Commit 4273144

Browse files
committed
Work on AInstanceManager
1 parent 103e39c commit 4273144

12 files changed

Lines changed: 307 additions & 15 deletions
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#include "pch.h"
2+
#include "AInstanceManager.h"
3+
4+
//-----------------------------------------------------------------------------
5+
// Enables memory debugging.
6+
// Note: Should be the last include!
7+
//-----------------------------------------------------------------------------
8+
#include <Core/TMemoryDebugOn.h>
9+
10+
TOSHI_NAMESPACE_USING
11+
12+
// $Barnyard: FUNCTION 005dfd60
13+
AInstanceManager::AInstanceManager()
14+
: m_ppKeyLibs( TNULL )
15+
, m_pModels( TNULL )
16+
, m_pSomeBuffer( TNULL )
17+
, m_iInstanceLibIndex( -1 )
18+
, m_ppCollObjectModelNodes( TNULL )
19+
, m_pCollisionModelInstances( TNULL )
20+
, m_uiModelsFlags( 0 )
21+
, m_iNumKeyLibraries( 0 )
22+
, m_flUnk1( 30.0f )
23+
, m_flUnk2( 85.0f )
24+
, m_flUnk3( 75.0f )
25+
{
26+
m_iNumModels = NUM_MODELS;
27+
m_pModels = new Model[ NUM_MODELS ];
28+
29+
for ( TSIZE i = 0; i < TARRAYSIZE( m_aS1 ); i++ )
30+
m_llFreeS1.PushFront( &m_aS1[ i ] );
31+
32+
m_pSomeBuffer = TMalloc( m_iNumModels << 3 );
33+
}
34+
35+
AInstanceManager::~AInstanceManager()
36+
{
37+
}
38+
39+
// $Barnyard: FUNCTION 005e00f0
40+
void AInstanceManager::DestroyCollisionSets()
41+
{
42+
while ( !m_vecCollisionSets.IsEmpty() )
43+
{
44+
ACollisionModelSet* pModelSet = *m_vecCollisionSets.Back();
45+
delete pModelSet;
46+
47+
m_vecCollisionSets.PopBack();
48+
}
49+
50+
m_uiModelsFlags &= ~2;
51+
}
52+
53+
// $Barnyard: FUNCTION 005e0050
54+
void AInstanceManager::ClearList( List& a_rList )
55+
{
56+
while ( !a_rList.llCollModelNodes.IsEmpty() )
57+
{
58+
auto pLast = a_rList.llCollModelNodes.Back().Get();
59+
a_rList.llCollModelNodes.PopBack();
60+
61+
ACollisionObjectModel* pModel = &pLast->GetNodeValue();
62+
63+
m_llFreeCollisionModelNodes.PushBack( pLast );
64+
if ( pModel->IsCollisionObjectLinked() )
65+
pModel->UnlinkCollisionObject();
66+
}
67+
68+
a_rList.iUnknown = 0;
69+
}
70+
71+
// $Barnyard: FUNCTION 005e0140
72+
void AInstanceManager::SetupCollisions( TBOOL a_bCreateCollisionSets )
73+
{
74+
const TBOOL bHasCollisionSets = ( ( m_uiModelsFlags & 2 ) == 2 );
75+
76+
// Check if new flag value is different
77+
if ( bHasCollisionSets == a_bCreateCollisionSets ) return;
78+
79+
// Update flags
80+
if ( bHasCollisionSets ) m_uiModelsFlags |= 2;
81+
else m_uiModelsFlags &= ~2;
82+
83+
if ( bHasCollisionSets )
84+
{
85+
if ( m_llFreeCollisionModelInstances.IsEmpty() )
86+
{
87+
// Need to (re)allocate model instance nodes
88+
if ( m_pCollisionModelInstances ) delete[] m_pCollisionModelInstances;
89+
90+
// Create nodes
91+
m_pCollisionModelInstances = new ACollisionModelInstanceNode[ 34 ];
92+
93+
// Add all to the free list
94+
for ( TINT i = 0; i < 34; i++ )
95+
m_llFreeCollisionModelInstances.PushFront( &m_pCollisionModelInstances[ i ] );
96+
}
97+
98+
// Create collision sets for the models
99+
for ( TINT i = 0; i < m_iNumModels; i++ )
100+
{
101+
TModel* pModel = m_pModels[ i ].pManagedModel->GetModel();
102+
const TINT iNumCollMeshes = pModel->GetNumCollisionMeshes();
103+
104+
if ( iNumCollMeshes > 0 )
105+
{
106+
ACollisionModelSet* pCollModelSet = new ACollisionModelSet;
107+
pCollModelSet->Create( pModel );
108+
109+
m_vecCollisionSets.PushBack( pCollModelSet );
110+
}
111+
}
112+
}
113+
else
114+
{
115+
// Doesn't need collision sets anymore, destroy them
116+
m_llFreeCollisionModelInstances.Clear();
117+
DestroyCollisionSets();
118+
}
119+
}
120+
121+
// T2SList:
122+
// $Barnyard: FUNCTION 006c7e10
123+
// $Barnyard: FUNCTION 006c7e60
124+
// $Barnyard: FUNCTION 006c7e30
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#pragma once
2+
#include "Physics/ACollisionModelSet.h"
3+
#include "Physics/ACollisionObjectModel.h"
4+
#include "Physics/ACollisionModelInstance.h"
5+
6+
#include <Toshi/T2SList.h>
7+
#include <Toshi/TSingleton.h>
8+
#include <Toshi/TSceneObject.h>
9+
#include <Toshi/T2Vector.h>
10+
#include <Render/TModel.h>
11+
12+
class AInstanceManager
13+
: public Toshi::TSingleton<AInstanceManager>
14+
{
15+
public:
16+
struct Model
17+
{
18+
Toshi::TManagedModel* pManagedModel = TNULL;
19+
Toshi::TSceneObject* pSceneObject = TNULL;
20+
};
21+
22+
struct CollObjectModel
23+
{
24+
};
25+
26+
using ACollisionObjectModelNode = Toshi::T2SListNodeWrapper<ACollisionObjectModel>;
27+
using ACollisionModelInstanceNode = Toshi::T2SListNodeWrapper<ACollisionModelInstance>;
28+
29+
struct S1 : public Toshi::T2SList<S1>::Node
30+
{
31+
};
32+
33+
struct List
34+
{
35+
Toshi::T2SList<ACollisionObjectModelNode> llCollModelNodes;
36+
Toshi::T2SList<ACollisionModelInstanceNode> llCollModelInstances;
37+
TINT iUnknown = 0;
38+
};
39+
40+
inline static constexpr TSIZE NUM_MODELS = 137;
41+
inline static constexpr TSIZE MAX_INSTANCES = 5000;
42+
43+
public:
44+
AInstanceManager();
45+
~AInstanceManager();
46+
47+
private:
48+
void DestroyCollisionSets();
49+
void ClearList( List& a_rList );
50+
void SetupCollisions( TBOOL a_bCreateCollisionSets );
51+
52+
private:
53+
TINT m_iNumKeyLibraries;
54+
Toshi::TKeyframeLibrary** m_ppKeyLibs;
55+
56+
TINT m_iNumModels;
57+
Model* m_pModels;
58+
59+
void* m_pSomeBuffer;
60+
ACollisionObjectModelNode m_aS1[ MAX_INSTANCES ];
61+
62+
Toshi::T2SList<S1> m_llUnk1;
63+
Toshi::T2SList<S1> m_llFreeS1;
64+
65+
// ...
66+
67+
TFLOAT m_flUnk1;
68+
TFLOAT m_flUnk2;
69+
TFLOAT m_flUnk3;
70+
71+
// ...
72+
73+
TINT m_iInstanceLibIndex;
74+
Toshi::T2Vector<ACollisionModelSet*, NUM_MODELS> m_vecCollisionSets;
75+
ACollisionObjectModelNode** m_ppCollObjectModelNodes;
76+
ACollisionModelInstanceNode* m_pCollisionModelInstances;
77+
Toshi::T2SList<ACollisionObjectModelNode> m_llFreeCollisionModelNodes;
78+
Toshi::T2SList<ACollisionModelInstanceNode> m_llFreeCollisionModelInstances;
79+
80+
List m_aLists[ 3 ];
81+
TUINT8 m_uiModelsFlags;
82+
};

OpenBarnyard/Source/Physics/ACollisionObject.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,13 @@ void* ACollisionObject::VTable0x54( void*, void*, void*, void*, void*, void*, vo
6666
return TNULL; // does it even have a return value?
6767
}
6868

69+
// $Barnyard: FUNCTION 0061c590
70+
void ACollisionObject::UnlinkCollisionObject()
71+
{
72+
AHashedObjectAuto::RemoveHash();
73+
Node::Remove();
74+
}
75+
6976
// $Barnyard: FUNCTION 0061f700
7077
AObjectHash::CellObject* ACollisionObject::CreateHash()
7178
{

OpenBarnyard/Source/Physics/ACollisionObject.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
#include "AObjectHash.h"
33
#include "AHashedObjectAuto.h"
44

5+
#include <Toshi/T2DList.h>
6+
57
class ACollisionObject
68
: public AHashedObjectAuto
79
, public Toshi::TObject
10+
, public Toshi::T2DList<ACollisionObject>::Node
811
{
912
public:
1013
TDECLARE_CLASS( ACollisionObject, Toshi::TObject );
@@ -44,12 +47,15 @@ class ACollisionObject
4447
virtual TFLOAT GetObjectRadius() = 0; // VTable: 0x40
4548
virtual void VTable0x44( Toshi::TVector4& a_rOutVector ) = 0; // VTable: 0x44
4649
virtual TFLOAT GetHeightScale() = 0; // VTable: 0x48
47-
virtual TBOOL UpdateHash( TFLOAT a_fRadius ); // VTable: 0x4Ñ
50+
virtual TBOOL UpdateHash( TFLOAT a_fRadius ); // VTable: 0x4C
4851
virtual void* VTable0x50();
4952
virtual void* VTable0x54( void*, void*, void*, void*, void*, void*, void* ); // return value is unknown
5053
virtual void TranslateBy( const Toshi::TVector4& a_rDirection, TFLOAT a_fLength ) = 0; // VTable: 0x58
5154
virtual void VTable0x5C( void* ) = 0; // return value is unknown
5255

56+
TBOOL IsCollisionObjectLinked() const { return Node::IsLinked(); }
57+
void UnlinkCollisionObject();
58+
5359
protected:
5460
TINT field3_0x18;
5561
Type m_eType;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "pch.h"
2+
#include "ACollisionObjectModel.h"
3+
4+
//-----------------------------------------------------------------------------
5+
// Enables memory debugging.
6+
// Note: Should be the last include!
7+
//-----------------------------------------------------------------------------
8+
#include <Core/TMemoryDebugOn.h>
9+
10+
TOSHI_NAMESPACE_USING
11+
12+
// $Barnyard: FUNCTION 0061e810
13+
ACollisionObjectModel::ACollisionObjectModel()
14+
: m_vUnk1( TVector4::VEC_NEGY )
15+
, m_iUnk2( 0 )
16+
{
17+
m_eType = Type_Simple;
18+
}
19+
20+
// $Barnyard: FUNCTION 0061e8a0
21+
// $Barnyard: FUNCTION 0061edf0
22+
// $Barnyard: FUNCTION 0061e8b0
23+
ACollisionObjectModel::~ACollisionObjectModel()
24+
{
25+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#pragma once
2+
#include "ACollisionObject.h"
3+
4+
#include <Render/TTransformObject.h>
5+
6+
class ACollisionObjectModel
7+
: public ACollisionObject
8+
{
9+
public:
10+
ACollisionObjectModel();
11+
~ACollisionObjectModel();
12+
13+
// STUBS:
14+
virtual void VTable0x1C( void* ) {}
15+
virtual void VTable0x20( void*, void* ) {}
16+
virtual void VTable0x24( void*, void*, void*, void*, void*, void*, void* ) {}
17+
virtual void VTable0x28( void*, void*, void*, void*, void*, void* ) {}
18+
virtual void VTable0x2C( void*, void*, void*, void* ) {}
19+
virtual const Toshi::TSphere& GetObjectSphere() { return Toshi::TSphere(); }
20+
virtual const Toshi::TVector4& GetObjectPosition() { return Toshi::TVector4::VEC_NEGX; }
21+
virtual TFLOAT GetObjectRadius() { return 0.0f; }
22+
virtual void VTable0x44( Toshi::TVector4& a_rOutVector ) {}
23+
virtual TFLOAT GetHeightScale() { return 0.0f; }
24+
virtual void TranslateBy( const Toshi::TVector4& a_rDirection, TFLOAT a_fLength ) {}
25+
virtual void VTable0x5C( void* ) {}
26+
27+
private:
28+
// ...
29+
Toshi::TVector4 m_vUnk1;
30+
TINT m_iUnk2;
31+
Toshi::TTransformObject m_oTransform;
32+
};

OpenBarnyard/Source/Physics/ACollisionObjectSimple.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ void ACollisionObjectSimple::VTable0x1C( void* )
2929
{
3030
}
3131

32+
// $Barnyard: FUNCTION 0052de80
33+
TBOOL ACollisionObjectSimple::VTable0x60( TINT a_Unk )
34+
{
35+
field4_0x34 = a_Unk;
36+
return TFALSE;
37+
}
38+
3239
// $Barnyard: FUNCTION 0061c010
3340
TBOOL ACollisionObjectSimple::UpdateHash( TFLOAT a_fRadius, const Toshi::TVector3& a_rcPosition )
3441
{

OpenBarnyard/Source/Physics/ACollisionObjectSimple.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class ACollisionObjectSimple
2020
// Own methods
2121
//-----------------------------------------------------------------------------
2222

23+
virtual TBOOL VTable0x60( TINT a_Unk );
24+
2325
// Checks if the position or the radius has changed and updates hash if needed
2426
virtual TBOOL UpdateHash( TFLOAT a_fRadius, const Toshi::TVector3& a_rcPosition ); // VTable: 0x64
2527

OpenBarnyard/Source/Physics/AHashedObjectAuto.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ AHashedObjectAuto::AHashedObjectAuto()
1919
// $Barnyard: FUNCTION 0061f710
2020
AHashedObjectAuto::~AHashedObjectAuto()
2121
{
22-
AHashedObjectAuto::Remove();
22+
AHashedObjectAuto::RemoveHash();
2323
}
2424

2525
// $Barnyard: FUNCTION 0061f6e0
26-
void AHashedObjectAuto::Remove()
26+
void AHashedObjectAuto::RemoveHash()
2727
{
2828
if ( AObjectHashMain::IsSingletonCreated() )
2929
{

OpenBarnyard/Source/Physics/AHashedObjectAuto.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ class AHashedObjectAuto
1111
AHashedObjectAuto();
1212
~AHashedObjectAuto();
1313

14+
protected:
1415
//-----------------------------------------------------------------------------
1516
// Own methods
1617
//-----------------------------------------------------------------------------
17-
virtual void Remove();
18+
virtual void RemoveHash();
1819

1920
};

0 commit comments

Comments
 (0)