Skip to content

Commit c219a04

Browse files
committed
More progress in TSpriteShaderD3D
1 parent 2c854a6 commit c219a04

10 files changed

Lines changed: 203 additions & 29 deletions

File tree

Toshi/Include/TRender/TModel.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,31 @@ class TRENDERINTERFACE_EXPORTS TMesh : public TResource
5353
DECLARE_DYNAMIC(TMesh)
5454

5555
public:
56+
57+
TMesh()
58+
{
59+
m_pOwnerShader = TNULL;
60+
}
61+
5662
virtual TBOOL Render();
5763

64+
public:
65+
// $TRenderInterface: FUNCTION 10011590
66+
void SetShader(TShader *a_pShader)
67+
{
68+
TASSERT(TNULL==m_pOwnerShader);
69+
m_pOwnerShader = a_pShader;
70+
}
71+
72+
public:
73+
5874
TShader *GetShader()
5975
{
60-
return m_pShader;
76+
return m_pOwnerShader;
6177
}
6278

6379
private:
64-
TShader *m_pShader; // 0x34
80+
TShader *m_pOwnerShader; // 0x34
6581
};
6682

6783
TOSHI_NAMESPACE_END

Toshi/Include/TRender/TRenderInterface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ class TRENDERINTERFACE_EXPORTS TRenderInterface
118118

119119

120120
public:
121-
TResource *CreateResource(const TClass *a_pClass, TPCCHAR a_szResName, TResource *a_pResource);
121+
TResource *CreateResourceInPlace(const TClass *a_pClass, void *a_pData, TPCCHAR a_szResName, TResource *a_pParent);
122+
TResource *CreateResource(const TClass *a_pClass, TPCCHAR a_szResName, TResource *a_pParent);
122123
TResource *FindResource(TPCCHAR a_szResName, TResource *a_pResource);
123124

124125
const TRenderAdapter::Mode::Device *FindDevice(const DisplayParams *a_pDisplayParams);

Toshi/Include/TRender/TResource.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class TRENDERINTERFACE_EXPORTS TResource
1515
{
1616
DECLARE_DYNAMIC(TResource)
1717

18+
friend class TRenderInterface;
19+
1820
public:
1921
using t_RecurseCb = TBOOL (*)(TResource *a_pResource, void *a_pUserData);
2022

Toshi/Shaders/TSpriteShader/Include/D3D/TSpriteShaderD3D.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class TSPRITESHADERD3D_EXPORTS TSpriteShaderHAL : public TSpriteShader
4343
{
4444
m_dwVertexShaderHandle = INVALIDSHADERHANDLE;
4545
m_bMipMapLODBias = TTRUE;
46+
m_pVertexPool = TNULL;
4647
}
4748

4849
TRenderD3DInterface *GetRenderer() const
@@ -61,10 +62,14 @@ class TSPRITESHADERD3D_EXPORTS TSpriteShaderHAL : public TSpriteShader
6162
return m_pVertexPool;
6263
}
6364

65+
virtual TBOOL Create();
6466
virtual TSpriteMaterial *CreateMaterial(TPCCHAR a_szName);
67+
virtual TSpriteMesh *CreateMesh(TINT a_iCount, TINT &a_rMeshSize);
68+
virtual TBOOL OnResetDevice();
6569
virtual void Flush();
6670
virtual void Render(TRenderPacket *a_pRenderPacket);
6771
virtual TBOOL Validate();
72+
virtual void BeginMeshGeneration();
6873
virtual void EndMeshGeneration();
6974

7075
protected:
@@ -75,6 +80,8 @@ class TSPRITESHADERD3D_EXPORTS TSpriteShaderHAL : public TSpriteShader
7580

7681
private:
7782
TINT m_iNumVertices; // 0x114
83+
TSpriteMaterial *m_pLineMaterial; // 0x118
84+
TSpriteMaterial *m_pFillMaterial; // 0x11C
7885
DWORD m_dwVertexShaderHandle; // 0x128
7986
TSpriteShaderOrderTable m_oOrderTable; // 0x130
8087
TVertexPoolResource *m_pVertexPool; // 0x140
@@ -88,7 +95,7 @@ class TSPRITESHADERD3D_EXPORTS TSpriteMaterialHAL : public TSpriteMaterial
8895

8996
TSpriteMaterialHAL()
9097
{
91-
m_pTexture[0] = TNULL;
98+
m_pTexture = TNULL;
9299
}
93100

94101
TRenderD3DInterface* GetRenderer() const
@@ -102,6 +109,9 @@ class TSPRITESHADERD3D_EXPORTS TSpriteMaterialHAL : public TSpriteMaterial
102109

103110
class TSPRITESHADERD3D_EXPORTS TSpriteMeshHAL : public TSpriteMesh
104111
{
112+
DECLARE_DYNAMIC(TSpriteMeshHAL)
113+
114+
virtual TBOOL Create(TUINT a_uiFlags, TUSHORT a_usX, TUSHORT a_usY);
105115
virtual TBOOL Render();
106116

107117
public:

Toshi/Shaders/TSpriteShader/Include/TSpriteShader.h

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ class TSpriteShader;
1414

1515
class TSpriteMesh : public TMesh
1616
{
17+
DECLARE_DYNAMIC(TSpriteMaterial)
18+
19+
friend class TSpriteShader;
20+
1721
enum FLAGS
1822
{
1923
FLAGS_LOCKED = 0x8000
@@ -23,17 +27,31 @@ class TSpriteMesh : public TMesh
2327
TSpriteMesh()
2428
{
2529
m_uiFlags = 0;
30+
m_bRender = 0;
2631
m_pVertexPool = TNULL;
2732
m_pIndexPool = TNULL;
2833
}
2934

35+
virtual TBOOL Create(TUINT a_uiFlags, TUSHORT a_iX, TUSHORT a_iY) = 0;
3036
virtual TBOOL Validate();
3137
virtual void Unlock(TUSHORT a_iX, TUSHORT a_iY);
3238
virtual TBOOL Lock();
3339

34-
private:
35-
TSpriteShader *m_pShader; // 0x34
40+
// $TSpriteShaderD3D: FUNCTION 10001f20
41+
void SetVertexPool(TVertexPoolResourceInterface *a_pVertexPool)
42+
{
43+
m_pVertexPool = a_pVertexPool;
44+
}
45+
46+
// $TSpriteShaderD3D: FUNCTION 10001f10
47+
void SetIndexPool(TIndexPoolResourceInterface *a_pIndexPool)
48+
{
49+
m_pIndexPool = a_pIndexPool;
50+
}
51+
52+
protected:
3653
TUINT m_uiFlags; // 0x38
54+
TBOOL m_bRender; // 0x3E
3755
TVertexPoolResourceInterface *m_pVertexPool; // 0x40
3856
TIndexPoolResourceInterface *m_pIndexPool; // 0x44
3957
};
@@ -45,55 +63,71 @@ class TSpriteMaterial : public TMaterial
4563
public:
4664
TSpriteMaterial()
4765
{
48-
m_pTexture[0] = TNULL;
49-
m_pTexture[1] = TNULL;
66+
m_pTexture = TNULL;
5067
m_eBlendMode = 0;
68+
m_eBlendMode2 = 0;
5169
}
5270

5371
virtual void SetBlendMode(TINT a_eBlendMode)
5472
{
5573
m_eBlendMode = a_eBlendMode;
5674
}
5775

58-
void SetTexture1(TTextureResource *a_pTexture)
76+
virtual void SetBlendMode2(TINT a_eBlendMode)
5977
{
60-
m_pTexture[0] = a_pTexture;
78+
m_eBlendMode2 = m_eBlendMode2;
6179
}
6280

63-
void SetTexture2(TTextureResource *a_pTexture)
81+
void SetTexture(TTextureResource *a_pTexture)
6482
{
65-
m_pTexture[1] = a_pTexture;
83+
m_pTexture = a_pTexture;
6684
}
6785

6886
protected:
69-
TTextureResource *m_pTexture[2]; // 0x40
70-
TINT m_eBlendMode; // 0x48
87+
TTextureResource *m_pTexture; // 0x40
88+
TINT m_eBlendMode; // 0x44
89+
TINT m_eBlendMode2; // 0x48
7190
};
7291

7392
class TSpriteShader : public TShader
7493
{
7594
DECLARE_DYNAMIC(TSpriteShader)
95+
7696
public:
97+
7798
TSpriteShader()
7899
{
100+
m_pVertexLockBuffer = TNULL;
101+
m_iNumIndices = 0;
102+
m_iNumVertices = 0;
103+
m_uiFlags = 100;
104+
m_usMaxStaticIndices = 6144;
105+
m_usMaxStaticVertices = 9216;
79106
}
80107

108+
virtual TBOOL Create();
81109
virtual TSpriteMaterial *CreateMaterial(TPCCHAR a_szName) = 0;
110+
virtual TSpriteMesh *CreateMesh(TINT a_iCount, TINT &a_rMeshSize) = 0;
82111
virtual void SetMaterial(TSpriteMaterial *a_pMaterial);
83112
virtual void SetColour(const TGUIColour &a_rColour);
84113
virtual void BeginMeshGeneration();
85114
virtual void EndMeshGeneration();
86115

87116
public:
117+
88118
TSpriteMesh *GetMesh()
89119
{
90120
return m_aMeshes.Tail()->Get();
91121
}
92122

93-
private:
94-
TNodeList<TNodeListNodeWrapper<TSpriteMesh>> m_aMeshes; // 0xDC
95-
TUSHORT m_iWidth; // 0x110
96-
TUSHORT m_iHeight; // 0x114
123+
protected:
124+
TVertexPoolResourceInterface::LockBuffer *m_pVertexLockBuffer; // 0xE0
125+
TNodeList<TNodeListNodeWrapper<TSpriteMesh>> m_aMeshes; // 0xDC
126+
TUSHORT m_iNumIndices; // 0x110
127+
TUSHORT m_iNumVertices; // 0x114
128+
TUINT m_uiFlags; // 0x120
129+
TUSHORT m_usMaxStaticVertices; // 0x124
130+
TUSHORT m_usMaxStaticIndices; // 0x126
97131
};
98132

99133
TOSHI_NAMESPACE_END

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

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "D3D/TSpriteShaderD3D.h"
22
#include "TRenderD3D/TRenderD3DInterface.h"
3+
#include "TRenderD3D/TD3DVertexFactoryResource.h"
34

45
//-----------------------------------------------------------------------------
56
// Enables memory debugging.
@@ -15,7 +16,7 @@ void TSpriteMaterialHAL::PreRender()
1516
{
1617
TRenderD3DInterface *pRenderer = GetRenderer();
1718
IDirect3DDevice8 *pDevice = pRenderer->GetD3DDevice();
18-
TTextureResourceHAL *pResource = static_cast<TTextureResourceHAL *>(m_pTexture[0]);
19+
TTextureResourceHAL *pResource = static_cast<TTextureResourceHAL *>(m_pTexture);
1920
if (pResource) {
2021
pResource->Validate();
2122
if (pResource->GetD3DTexture()) {
@@ -94,15 +95,64 @@ const DWORD TSpriteShaderHAL::SHADERDECL[] = {
9495
0x20000000, 0x40020000, 0x40040001, 0x40010002, 0xFFFFFFFFF
9596
};
9697

98+
TBOOL TSpriteShaderHAL::Create()
99+
{
100+
OnResetDevice();
101+
if (!TSpriteShader::Create()) {
102+
return TFALSE;
103+
}
104+
m_pLineMaterial = CreateMaterial("LineMat");
105+
m_pLineMaterial->SetBlendMode2(1);
106+
m_pLineMaterial->SetBlendMode(1);
107+
m_pFillMaterial = CreateMaterial("FillMat");
108+
m_pLineMaterial->SetBlendMode(1);
109+
return TTRUE;
110+
}
111+
97112
TSpriteMaterial *TSpriteShaderHAL::CreateMaterial(TPCCHAR a_szName)
98113
{
99114
Validate();
100-
TSpriteMaterial *pMaterial = static_cast<TSpriteMaterial *>(GetRenderer()->CreateResource(&TGetClass(TSpriteShaderHAL), a_szName, this));
115+
TSpriteMaterial *pMaterial = static_cast<TSpriteMaterial *>(GetRenderer()->CreateResource(&TGetClass(TSpriteMaterialHAL), a_szName, this));
101116
pMaterial->SetShader(this);
102117
pMaterial->SetFlag(1, TTRUE);
103118
return pMaterial;
104119
}
105120

121+
TSpriteMesh *TSpriteShaderHAL::CreateMesh(TINT a_iCount, TINT &a_rMeshSize)
122+
{
123+
TSpriteMeshHAL *pMeshes = new TSpriteMeshHAL[a_iCount];
124+
for (TINT i = 0; i < a_iCount; i++) {
125+
TSpriteMeshHAL *pMesh = static_cast<TSpriteMeshHAL *>(GetRenderer()->CreateResourceInPlace(&TGetClass(TSpriteMeshHAL), &pMeshes[i], TNULL, this));
126+
pMesh->SetShader(this);
127+
}
128+
a_rMeshSize = sizeof(TSpriteMeshHAL);
129+
return pMeshes;
130+
}
131+
132+
TBOOL TSpriteShaderHAL::OnResetDevice()
133+
{
134+
TVertexFactoryResource *pVertexFactory = static_cast<TVertexFactoryResource *>(GetRenderer()->GetSystemResource(TRenderInterface::SYSRESOURCE_VFSYSSVNDUV1));
135+
TUINT uiFlags = 0;
136+
if ((m_uiFlags & 1) != 0) {
137+
uiFlags = 1;
138+
}
139+
else if ((m_uiFlags & 2) != 0) {
140+
uiFlags = 2;
141+
}
142+
else if ((m_uiFlags & 4) != 0) {
143+
uiFlags = 4;
144+
}
145+
m_pVertexPool = static_cast<TVertexPoolResource *>(pVertexFactory->CreatePoolResource(m_usMaxStaticVertices, uiFlags));
146+
// Same with IndexPool
147+
TIMPLEMENT();
148+
for (auto it = m_aMeshes.Begin(); it != m_aMeshes.End(); it++) {
149+
it->Get()->SetVertexPool(m_pVertexPool);
150+
// Same with IndexPool
151+
}
152+
Validate();
153+
return TTRUE;
154+
}
155+
106156
void TSpriteShaderHAL::Flush()
107157
{
108158
TRenderD3DInterface *pRenderer = GetRenderer();
@@ -170,7 +220,6 @@ static const char VERTEXSHADER[] = {
170220

171221
TBOOL TSpriteShaderHAL::Validate()
172222
{
173-
TASSERT(TTRUE == IsCreated());
174223
if (TResource::IsValid()) {
175224
return TTRUE;
176225
}
@@ -187,10 +236,26 @@ TBOOL TSpriteShaderHAL::Validate()
187236
return TResource::Validate();
188237
}
189238

239+
void TSpriteShaderHAL::BeginMeshGeneration()
240+
{
241+
m_pVertexPool->Lock(m_pVertexLockBuffer);
242+
TSpriteShader::BeginMeshGeneration();
243+
}
244+
190245
void TSpriteShaderHAL::EndMeshGeneration()
191246
{
192247
TSpriteShader::EndMeshGeneration();
193-
//m_pVertexPool->Unlock(m_iNumVertices);
248+
m_pVertexPool->Unlock(m_iNumVertices);
249+
}
250+
251+
IMPLEMENT_DYNCREATE(TSpriteMeshHAL, TSpriteMesh)
252+
253+
TBOOL TSpriteMeshHAL::Create(TUINT a_uiFlags, TUSHORT a_usX, TUSHORT a_usY)
254+
{
255+
m_uiFlags = a_uiFlags;
256+
m_pVertexPool = GetShader()->GetVertexPool();
257+
//m_pIndexPool = GetShader()->GetIndexPool();
258+
return TResource::Create();
194259
}
195260

196261
TBOOL TSpriteMeshHAL::Render()

0 commit comments

Comments
 (0)