Skip to content

Commit 4f18e72

Browse files
committed
Somehow getting a NULLPTR error in TNodeList...
1 parent c219a04 commit 4f18e72

7 files changed

Lines changed: 132 additions & 18 deletions

File tree

Toshi/Include/TRender/TVertexPoolResourceInterface.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@ class TRENDERINTERFACE_EXPORTS TVertexPoolResourceInterface : public TResource
1010
public:
1111
class TRENDERINTERFACE_EXPORTS LockBuffer
1212
{
13+
public:
1314
LockBuffer();
1415

15-
TUINT uiNumStreams;
16-
TUINT32 uiOffset;
17-
unsigned char *apStreams[TVertexFactoryFormat::MAX_NUM_STREAMS];
16+
TUINT uiNumStreams; // 0x0
17+
TUINT32 uiOffset; // 0x4
18+
unsigned char *apStreams[TVertexFactoryFormat::MAX_NUM_STREAMS]; // 0x8
1819
};
1920

2021
TVertexPoolResourceInterface();

Toshi/Include/TRenderD3D/TD3DVertexBlockResource.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#pragma once
22
#include "TRender/TResource.h"
33
#include "TKernel/TFreeList.h"
4+
#include "TKernel/TSystemTools.h"
45
#include "TRender/TVertexFactoryResourceInterface.h"
6+
#include "TRender/TVertexPoolResourceInterface.h"
57
#include <d3d8.h>
68
#include "Defines.h"
79

@@ -20,18 +22,33 @@ class TRENDERINTERFACED3D_EXPORTS TVertexBlockResource : public TResource
2022
{
2123
HALBuffer()
2224
{
25+
uiNumStreams = 0;
26+
uiVertexOffset = 0;
27+
TSystem::MemSet(apVertexBuffers, 0, sizeof(apVertexBuffers));
2328
}
2429

2530
TUINT uiNumStreams;
2631
TUSHORT uiVertexOffset;
2732
IDirect3DVertexBuffer8 *apVertexBuffers[TVertexFactoryFormat::MAX_NUM_STREAMS];
2833
};
2934

35+
TVertexBlockResource()
36+
{
37+
m_pFactory = TNULL;
38+
m_uiFlags = 0;
39+
m_uiMaxVertices = 0;
40+
m_uiOffset = 0;
41+
m_uiVerticesUsed = 0;
42+
m_uiLockCount = 0;
43+
m_Unk1 = 0;
44+
}
45+
3046
TBOOL Create(TVertexFactoryResource *a_pFactory, TUSHORT a_uiMaxVertices, TUINT a_uiFlags);
3147

3248
TBOOL AttachPool(TVertexPoolResource *a_pPool);
3349
TBOOL CanFit(TVertexPoolResource *a_pPoolResource);
3450

51+
TBOOL Lock(TVertexPoolResourceInterface::LockBuffer *a_pLockBuffer, TUSHORT a_usNumVertices);
3552
void Unlock();
3653

3754
// $TRenderD3DInterface: FUNCTION 10008e90
@@ -52,7 +69,7 @@ class TRENDERINTERFACED3D_EXPORTS TVertexBlockResource : public TResource
5269
TVertexFactoryResourceInterface *m_pFactory; // 0x30
5370
TUINT m_uiFlags; // 0x34
5471
TUSHORT m_uiMaxVertices;
55-
TUINT m_uiOffset;
72+
TUINT m_uiOffset; // 0x3C
5673
TUINT m_uiVerticesUsed;
5774
TUINT m_uiLockCount;
5875
TUINT m_Unk1;

Toshi/Include/TRenderD3D/TD3DVertexPoolResource.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ class TRENDERINTERFACED3D_EXPORTS TVertexPoolResource : public TVertexPoolResour
1414

1515
public:
1616

17+
TVertexPoolResource()
18+
{
19+
m_uiVertexOffset = 0;
20+
m_uiNumLocksOverall = 0;
21+
TSystem::MemSet(m_apManagedStreams, 0, sizeof(m_apManagedStreams));
22+
}
23+
1724
virtual TBOOL Validate() override;
1825
virtual void Invalidate() override;
1926
virtual void OnDestroy() override;
@@ -39,6 +46,11 @@ class TRENDERINTERFACED3D_EXPORTS TVertexPoolResource : public TVertexPoolResour
3946
}
4047
return TNULL;
4148
}
49+
50+
private:
51+
TUINT m_uiVertexOffset; // 0x3C
52+
TBYTE *m_apManagedStreams[TVertexFactoryFormat::MAX_NUM_STREAMS]; // 0x40
53+
TUINT m_uiNumLocksOverall; // 0x60
4254
};
4355

4456
TOSHI_NAMESPACE_END

Toshi/Shaders/TSpriteShader/Include/TSpriteShader.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,11 @@ class TSpriteShader : public TShader
9797

9898
TSpriteShader()
9999
{
100-
m_pVertexLockBuffer = TNULL;
101-
m_iNumIndices = 0;
102-
m_iNumVertices = 0;
103-
m_uiFlags = 100;
104-
m_usMaxStaticIndices = 6144;
105-
m_usMaxStaticVertices = 9216;
100+
m_iNumIndices = 0;
101+
m_iNumVertices = 0;
102+
m_uiFlags = 100;
103+
m_usMaxStaticIndices = 6144;
104+
m_usMaxStaticVertices = 9216;
106105
}
107106

108107
virtual TBOOL Create();
@@ -121,7 +120,7 @@ class TSpriteShader : public TShader
121120
}
122121

123122
protected:
124-
TVertexPoolResourceInterface::LockBuffer *m_pVertexLockBuffer; // 0xE0
123+
TVertexPoolResourceInterface::LockBuffer m_VertexLockBuffer; // 0xE0
125124
TNodeList<TNodeListNodeWrapper<TSpriteMesh>> m_aMeshes; // 0xDC
126125
TUSHORT m_iNumIndices; // 0x110
127126
TUSHORT m_iNumVertices; // 0x114

Toshi/Shaders/TSpriteShader/Source/D3D/TSpriteShaderD3D.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ TBOOL TSpriteShaderHAL::Validate()
238238

239239
void TSpriteShaderHAL::BeginMeshGeneration()
240240
{
241-
m_pVertexPool->Lock(m_pVertexLockBuffer);
241+
m_pVertexPool->Lock(&m_VertexLockBuffer);
242242
TSpriteShader::BeginMeshGeneration();
243243
}
244244

Toshi/Source/TRenderD3D/TD3DVertexBlockResource.cpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,50 @@ TBOOL TVertexBlockResource::CanFit(TVertexPoolResource *a_pPoolResource)
2424
return TFALSE;
2525
}
2626

27+
TBOOL TVertexBlockResource::Lock(TVertexPoolResourceInterface::LockBuffer *a_pLockBuffer, TUSHORT a_usNumVertices)
28+
{
29+
TVALIDADDRESS(a_pLockBuffer);
30+
TVertexFactoryFormat *vertexFormat = GetFactory()->GetVertexFormat();
31+
a_pLockBuffer->uiNumStreams = vertexFormat->m_uiNumStreams;
32+
DWORD uiFlags;
33+
TUINT uiNumVertices = 0;
34+
TUINT uiUnk1 = m_uiFlags & 7;
35+
if (uiUnk1 == 1) {
36+
uiFlags = D3DLOCK_NOSYSLOCK;
37+
a_pLockBuffer->uiOffset = 0;
38+
}
39+
else if (uiUnk1 == 2) {
40+
Validate();
41+
uiFlags = D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK;
42+
a_pLockBuffer->uiOffset = 0;
43+
}
44+
else if (uiUnk1 == 4) {
45+
TASSERT(m_uiLockCount==0);
46+
Validate();
47+
uiNumVertices = a_usNumVertices;
48+
if (m_uiMaxVertices < m_uiOffset + uiNumVertices) {
49+
uiFlags = D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK;
50+
a_pLockBuffer->uiOffset = 0;
51+
m_uiOffset = uiNumVertices;
52+
}
53+
else {
54+
uiFlags = D3DLOCK_NOOVERWRITE | D3DLOCK_NOSYSLOCK;
55+
a_pLockBuffer->uiOffset = m_uiOffset;
56+
m_uiOffset += uiNumVertices;
57+
}
58+
}
59+
for (TUINT i = 0; i < a_pLockBuffer->uiNumStreams; i++) {
60+
HRESULT hRes = m_HALBuffer.apVertexBuffers[i]->Lock(
61+
a_pLockBuffer->uiOffset * vertexFormat->m_aStreamFormats[i].m_uiVertexSize,
62+
uiNumVertices * vertexFormat->m_aStreamFormats[i].m_uiVertexSize,
63+
&a_pLockBuffer->apStreams[i],
64+
uiFlags);
65+
TRenderD3DInterface::TD3DAssert(hRes, "Couldn't lock stream vertex buffer");
66+
}
67+
m_uiLockCount++;
68+
return TTRUE;
69+
}
70+
2771
// $TRenderD3DInterface: FUNCTION 100090e0
2872
void TVertexBlockResource::Unlock()
2973
{
@@ -41,14 +85,11 @@ void TVertexBlockResource::Unlock()
4185
TBOOL TVertexBlockResource::AttachPool(TVertexPoolResource *a_pPool)
4286
{
4387
TVALIDADDRESS(a_pPool);
44-
4588
m_uiVerticesUsed += a_pPool->GetNumVertices();
4689
a_pPool->SetParent(this);
47-
48-
if (m_uiFlags & 1) {
90+
if (GetFlags() & 1) {
4991
Invalidate();
5092
}
51-
5293
return TTRUE;
5394
}
5495

Toshi/Source/TRenderD3D/TD3DVertexPoolResource.cpp

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "TRenderD3D/TD3DVertexPoolResource.h"
22
#include "TRenderD3D/TD3DVertexBlockResource.h"
33
#include "TRenderD3D/TD3DVertexFactoryResource.h"
4+
#include "TRenderD3D/TRenderD3DInterface.h"
45

56
//-----------------------------------------------------------------------------
67
// Enables memory debugging.
@@ -62,18 +63,47 @@ TBOOL TVertexPoolResource::Validate()
6263
// $TRenderD3DInterface: FUNCTION 10009c30
6364
void TVertexPoolResource::Invalidate()
6465
{
66+
TIMPLEMENT();
6567
}
6668

6769
// $TRenderD3DInterface: FUNCTION 1000a500
6870
void TVertexPoolResource::OnDestroy()
6971
{
72+
TIMPLEMENT();
7073
}
7174

7275
// $TRenderD3DInterface: FUNCTION 10009cd0
7376
TBOOL TVertexPoolResource::Lock(LockBuffer *a_pLockBuffer)
7477
{
7578
TVALIDADDRESS(a_pLockBuffer);
76-
return TBOOL();
79+
if ((m_uiLockCount++) == 0) {
80+
TUINT flags = GetFlags() & 7;
81+
if (flags == 1) {
82+
TASSERT(TFALSE==IsValid());
83+
a_pLockBuffer->uiNumStreams = GetFactory()->GetVertexFormat()->GetNumStreams();
84+
for (TUINT i = 0; i < a_pLockBuffer->uiNumStreams; i++) {
85+
a_pLockBuffer->apStreams[i] = m_apManagedStreams[i];
86+
}
87+
return TTRUE;
88+
}
89+
else if (flags == 2) {
90+
TASSERT(TTRUE==GetRenderer()->IsInScene());
91+
Validate();
92+
if (GetVertexBlock()->Lock(a_pLockBuffer, 0)) {
93+
m_uiVertexOffset = a_pLockBuffer->uiOffset;
94+
return TTRUE;
95+
}
96+
}
97+
else if (flags == 4) {
98+
TASSERT(TTRUE == GetRenderer()->IsInScene());
99+
Validate();
100+
if (GetVertexBlock()->Lock(a_pLockBuffer, GetMaxVertices())) {
101+
m_uiVertexOffset = a_pLockBuffer->uiOffset;
102+
return TTRUE;
103+
}
104+
}
105+
}
106+
return TFALSE;
77107
}
78108

79109
// $TRenderD3DInterface: FUNCTION 10009f60
@@ -105,5 +135,19 @@ void TVertexPoolResource::Unlock(TUSHORT a_uiNewNumVertices)
105135
// $TRenderD3DInterface: FUNCTION 1000a3c0
106136
TBOOL TVertexPoolResource::Create(TVertexFactoryResourceInterface *a_pFactory, TUINT a_uiMaxVertices, TUINT a_uiFlags)
107137
{
108-
return TBOOL();
138+
TASSERT(TFALSE==IsCreated());
139+
if (a_uiFlags & 4) {
140+
a_uiFlags = a_uiFlags & ~4 | 2;
141+
}
142+
if (!TVertexPoolResourceInterface::Create(a_pFactory, a_uiMaxVertices, a_uiFlags)) {
143+
return TFALSE;
144+
}
145+
if (GetFlags() & 1) {
146+
TVertexFactoryFormat *vertexFormat = GetFactory()->GetVertexFormat();
147+
for (TUINT i = 0; i < vertexFormat->m_uiNumStreams; i++) {
148+
m_apManagedStreams[i] = new TBYTE[a_uiMaxVertices * vertexFormat->m_aStreamFormats[i].m_uiVertexSize];
149+
TVALIDADDRESS(m_apManagedStreams[i]);
150+
}
151+
}
152+
return TTRUE;
109153
}

0 commit comments

Comments
 (0)