OpenBarnyard
 
Loading...
Searching...
No Matches
TIndexPoolResource_DX8.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
5
6//-----------------------------------------------------------------------------
7// Enables memory debugging.
8// Note: Should be the last include!
9//-----------------------------------------------------------------------------
10#include "Core/TMemoryDebugOn.h"
11
13
15
16// $Barnyard: FUNCTION 006d5ef0
18{
19 m_uiIndexOffset = 0;
20 m_pIndices = TNULL;
21 m_uiNumLocksAllTime = 0;
22}
23
24// $Barnyard: FUNCTION 006d5f70
28
29// $Barnyard: FUNCTION 006d5e50
31{
32 if ( IsCreated() && IsValid() )
33 {
34 return TTRUE;
35 }
36
37 auto pFactory = TSTATICCAST( TIndexFactoryResource, GetFactory() );
38 auto pBlock = pFactory->FindBlockResource( this );
39
40 if ( !pBlock )
41 {
42 TUINT32 uiFlags;
43 TUINT16 uiMaxVertices;
44
45 TUINT8 uiUnk1 = m_uiFlags & 7;
46
47 if ( uiUnk1 == 1 )
48 {
49 uiMaxVertices = pFactory->GetMaxStaticIndices();
50 uiFlags = 1;
51 }
52 else if ( uiUnk1 == 2 )
53 {
54 uiMaxVertices = GetMaxIndices();
55 uiFlags = 2;
56 }
57 else
58 {
59 if ( uiUnk1 != 4 )
60 {
61 return TFALSE;
62 }
63
64 uiMaxVertices = GetMaxIndices();
65 uiFlags = 4;
66 }
67
68 pBlock = pFactory->CreateBlockResource( uiMaxVertices, uiFlags );
69
70 if ( !pBlock )
71 {
72 return TFALSE;
73 }
74 }
75
76 pBlock->AttachPool( this );
77 return TResource::Validate();
78}
79
80// $Barnyard: FUNCTION 006d5fe0
82{
83 if ( IsCreated() && IsValid() )
84 {
85 TASSERT( m_uiLockCount == 0 );
86
87 auto pIndexBlock = GetIndexBlock();
88 TVALIDPTR( pIndexBlock );
89
90 pIndexBlock->DettachPool( this );
92 }
93}
94
95// $Barnyard: FUNCTION 006d5e20
97{
98 if ( m_uiFlags & 1 && m_pIndices )
99 {
100 delete[] m_pIndices;
101 m_pIndices = TNULL;
102 }
103
105}
106
107// $Barnyard: FUNCTION 006d6040
109{
110 TVALIDPTR( a_pLockBuffer );
111
112 auto uiOldLockCount = m_uiLockCount;
113 m_uiNumLocksAllTime += 1;
114 m_uiLockCount += 1;
115
116 if ( uiOldLockCount == 0 )
117 {
118 TUINT8 uiUnk1 = m_uiFlags & 7;
119
120 if ( uiUnk1 == 1 )
121 {
122 a_pLockBuffer->pBuffer = m_pIndices;
123 return TTRUE;
124 }
125 else if ( uiUnk1 == 2 )
126 {
127 Validate();
128
129 if ( GetIndexBlock()->Lock( a_pLockBuffer, 0 ) )
130 {
131 m_uiIndexOffset = a_pLockBuffer->uiOffset;
132 return TTRUE;
133 }
134 }
135 else if ( uiUnk1 == 4 )
136 {
137 Validate();
138
139 if ( GetIndexBlock()->Lock( a_pLockBuffer, GetMaxIndices() ) )
140 {
141 m_uiIndexOffset = a_pLockBuffer->uiOffset;
142 return TTRUE;
143 }
144 }
145 }
146
147 return TFALSE;
148}
149
150// $Barnyard: FUNCTION 006d60f0
151void TIndexPoolResource::Unlock( TUINT16 a_uiNewNumIndices )
152{
153 TASSERT( m_uiLockCount > 0 );
154
155 if ( m_uiLockCount > 0 && --m_uiLockCount == 0 )
156 {
157 TINT iChange = a_uiNewNumIndices - GetNumIndices();
158
159 if ( iChange != 0 )
160 {
161 if ( GetParent() )
162 {
164 {
165 auto pIndexBlock = TSTATICCAST( TIndexBlockResource, GetParent() );
166 pIndexBlock->ChildIndexUsedChanged( iChange );
167 }
168 }
169 }
170
171 m_uiNumIndices = a_uiNewNumIndices;
172
173 if ( m_uiFlags & 6 )
174 {
176 }
177 else if ( m_uiFlags & 1 )
178 {
179 Validate();
180 }
181 }
182}
183
184// $Barnyard: FUNCTION 006d5dd0
186{
187 if ( a_uiFlags & 4 )
188 {
189 a_uiFlags = a_uiFlags & 0xfffb | 2;
190 }
191
192 if ( TIndexPoolResourceInterface::Create( a_pFactory, a_uiMaxIndices, a_uiFlags ) )
193 {
194 if ( m_uiFlags & 1 )
195 {
196 m_pIndices = new TIndexType[ a_uiMaxIndices ];
197 TVALIDPTR( m_pIndices );
198 }
199
200 return TTRUE;
201 }
202
203 return TFALSE;
204}
205
207{
208 if ( Tree() )
209 {
210 return Parent() == Tree()->GetRoot() ? TNULL : Parent();
211 }
212
213 return Parent();
214}
215
216// $Barnyard: FUNCTION 006d5fa0
226
227// $Barnyard: FUNCTION 006d6180
229{
230 TVALIDPTR( a_pHALBuffer );
231
232 if ( Validate() )
233 {
234 auto pIndexBlock = GetIndexBlock();
235 TVALIDPTR( pIndexBlock );
236
237 if ( pIndexBlock->Validate() && pIndexBlock->GetHALBuffer( a_pHALBuffer ) )
238 {
239 a_pHALBuffer->uiIndexOffset = m_uiIndexOffset;
240 return TTRUE;
241 }
242 }
243
244 return TFALSE;
245}
246
247// $Barnyard: FUNCTION 006d5ee0
249{
250 return ( m_uiLockCount == 0 ) ? m_pIndices : TNULL;
251}
252
TUINT16 TIndexType
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TVALIDPTR(PTR)
Definition Defines.h:139
#define TGetClass(CLASS)
Definition TObject.h:13
#define TDEFINE_CLASS(...)
Definition TObject.h:120
uint16_t TUINT16
Definition Typedefs.h:15
uint8_t TUINT8
Definition Typedefs.h:17
#define TNULL
Definition Typedefs.h:23
uint32_t TUINT32
Definition Typedefs.h:13
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
TBOOL GetHALBuffer(TIndexBlockResource::HALBuffer *a_pHALBuffer)
virtual TBOOL Lock(LockBuffer *a_pLockBuffer) override
virtual void Unlock(TUINT16 a_uiNewNumIndices) override
TIndexBlockResource * GetIndexBlock()
virtual TBOOL Validate() override
virtual void Invalidate() override
virtual void OnDestroy() override
virtual TBOOL Create(TIndexFactoryResourceInterface *a_pFactory, TUINT16 a_uiMaxIndices, TUINT16 a_uiFlags)
TIndexFactoryResourceInterface * GetFactory() const
TBOOL IsCreated() const
Definition TResource.h:46
virtual void Invalidate()
Definition TResource.cpp:47
virtual TBOOL Validate()
Definition TResource.cpp:36
TBOOL IsValid() const
Definition TResource.h:44
virtual TBOOL Create()
Definition TResource.cpp:28
T * Parent() const
Definition TNodeTree.h:33
TNodeTree< T > * Tree() const
Definition TNodeTree.h:36
virtual Toshi::TClass * GetClass()
Definition TObject.cpp:12
TBOOL IsA(TClass *a_pClass)
Definition TObject.h:192
TBOOL IsExactly(TClass *a_pClass)
Definition TObject.h:191