Skip to content

Commit 1bf73f3

Browse files
committed
Implement more stuff in TMaterialLibrary
1 parent 2ccf4db commit 1bf73f3

File tree

8 files changed

+186
-23
lines changed

8 files changed

+186
-23
lines changed

OpenJPOG/Source/GUI/AGUIMatLibPicture.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,17 @@ void AGUIMatLibPicture::LoadMaterialLibrary()
3333
supportscreendepth = lmh != AOptionsLogic::LMH_UNK3;
3434
}
3535
}
36+
// Should not be here!
37+
supportscreendepth = TFALSE;
3638
if (supportscreendepth) {
3739
TINT extensionidx = m_sFileName.FindReverse('.');
3840
TINT len = m_sFileName.Length();
3941
TCString fullname = m_sFileName.Mid(0, extensionidx) + sixteen + m_sFileName.Mid(extensionidx, len);
4042
m_tmlidx = TRenderInterface::GetRenderer()->GetMaterialLibraryManager()->LoadMaterialLibrary(fullname);
4143
}
44+
if (m_tmlidx == -1 || !supportscreendepth) {
45+
m_tmlidx = TRenderInterface::GetRenderer()->GetMaterialLibraryManager()->LoadMaterialLibrary(m_sFileName);
46+
}
4247
}
4348

4449
void AGUIMatLibPicture::UnloadMaterialLibrary()
@@ -60,6 +65,11 @@ void AGUIMatLibPicture::SetFile(TPCCHAR a_szFile)
6065
}
6166
}
6267

68+
void AGUIMatLibPicture::Create(TSpriteShader *a_pShader)
69+
{
70+
m_pShader = a_pShader;
71+
}
72+
6373
void AGUIMatLibPicture::Flush()
6474
{
6575
if (m_iSplitTileCount == 0) {
@@ -76,10 +86,10 @@ void AGUIMatLibPicture::Flush()
7686

7787
void AGUIMatLibPicture::Cache()
7888
{
79-
if (m_iSplitTileCount == 0) {
89+
if (m_iSplitTileCount != 0) {
8090
return;
8191
}
82-
if (m_sFileName.IsEmpty()) {
92+
if (!m_sFileName.GetString()) {
8393
return;
8494
}
8595
m_iSplitTileCount = split_tile_count;

OpenJPOG/Source/GUI/AGUIMatLibPicture.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class AGUIMatLibPicture : public AGUIPicture
1818
void SetFile(TPCCHAR a_szFile);
1919

2020
public:
21+
virtual void Create(Toshi::TSpriteShader *a_pShader);
2122
virtual void Flush();
2223
virtual void Cache();
2324

OpenJPOG/Source/GUI/AGUIPicture.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ void AGUIPicture::Render()
4747
AGUISystem *system = AGUISystem::GetGUISystem();
4848
TFLOAT height = system->GetScreen()->GetHeight() / 447.0f;
4949
TFLOAT width = system->GetScreen()->GetWidth() / 638.0f;
50-
for (TUINT i = 0; i < m_iSplitTileCount; i++)
51-
{
50+
for (TUINT i = 0; i < m_iSplitTileCount; i++) {
5251
m_pShader->SetColour(TGUIColour());
5352
m_pShader->SetMaterial(*m_pTiles[i].ppMaterial);
5453
}

OpenJPOG/Source/GUI/AGUISystem.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,8 @@ TBOOL AGUISystem::OnCreate()
6464
}
6565
// m_pScreen->SetAudioContext
6666
// m_pScreen->SetInputContext
67-
TCString guiTexturePath = TCString("data/gui/textures");
6867
m_pMatLibPic = new AGUIMatLibPicture();
69-
m_pMatLibPic->Create(guiTexturePath, m_pSpriteShader);
68+
m_pMatLibPic->Create(m_pSpriteShader);
7069
return TTRUE;
7170
}
7271

OpenJPOG/Source/Tasks/ARootTask.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ TBOOL ARootTask::CreateRenderInterface()
153153
displayParams.eDepthStencilFormat = 0;
154154
CreateDisplayDevice(displayParams, TFALSE);
155155
m_pRenderInterface->CreateDisplay(displayParams);
156+
m_pRenderInterface->GetMaterialLibraryManager()->Create();
156157
return TTRUE;
157158
}
158159

Toshi/Include/TRender/TMaterialLibrary.h

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
TOSHI_NAMESPACE_BEGIN
99

10+
#define MAXTEXTURES 4
11+
1012
class TMaterialLibraryManager;
1113

1214
class TRENDERINTERFACE_EXPORTS TMaterialLibrary : public TNodeList<TMaterialLibrary>::TNode
@@ -18,13 +20,33 @@ class TRENDERINTERFACE_EXPORTS TMaterialLibrary : public TNodeList<TMaterialLibr
1820

1921
private:
2022

21-
struct Header
23+
24+
struct TMLDISKHEADER
2225
{
2326
TINT m_iMagic;
2427
TINT m_iType;
2528
};
29+
30+
typedef TCHAR MaterialName[32];
31+
32+
struct TMLDISKMATERIALHEADER
33+
{
34+
TINT id;
35+
TSHORT flags;
36+
TSHORT numtextures;
37+
};
38+
39+
enum TMLDISKMATERIALSHADERTYPE : short
40+
{
41+
TMLDISKMATERIALSHADERTYPE_SKIN = 0x0000,
42+
TMLDISKMATERIALSHADERTYPE_TERRAIN = 0x1000,
43+
TMLDISKMATERIALSHADERTYPE_TERRAINDECAL = 0x2000,
44+
TMLDISKMATERIALSHADERTYPE_SYSTEM = 0x3000,
45+
TMLDISKMATERIALSHADERTYPE_SPRITE = 0x4000,
46+
TMLDISKMATERIALSHADERTYPE_MASK = 0xF000
47+
};
2648

27-
struct TextureHeader
49+
struct TMLDISKTEXTUREHEADER
2850
{
2951
TINT id;
3052
TINT texturesize;
@@ -42,23 +64,33 @@ class TRENDERINTERFACE_EXPORTS TMaterialLibrary : public TNodeList<TMaterialLibr
4264

4365
TBOOL Create(TPCCHAR a_szFileName);
4466
void Destroy();
67+
TBOOL LoadSpriteMaterial(TINT a_iIndex, TFile *file, const TMLDISKMATERIALHEADER &dh);
68+
TBOOL LoadMaterial(TINT a_iIndex, TFile *file);
69+
TBOOL LoadMaterials(TFile *file);
4570
TBOOL ReadHeader(TFile *file);
4671
TBOOL LoadTexture(TINT a_iIndex, TFile *file);
4772
TBOOL LoadTextures(TFile *file);
4873

74+
TINT GetIndexForName(TPCCHAR a_szName, TPCHAR *a_pMaterialNames, TINT a_iMaterialCount);
4975
TMaterial *GetMaterial(TPCCHAR a_szMaterial);
5076
TTextureResource *GetTexture(TINT a_iIndex);
5177

5278
private:
5379
static const TTEXTURERESOURCEFORMAT gs_eRemapFormat[18];
5480

55-
TMaterialLibraryManager *m_pManager; // 0xC
56-
TINT m_iNumTextures; // 0x10
57-
TTextureResource **m_pTextures; // 0x14
81+
TMaterialLibraryManager *m_pManager; // 0xC
82+
TINT m_iNumTextures; // 0x10
83+
TTextureResource **m_pTextures; // 0x14
84+
TINT m_iNumMaterials; // 0x18
85+
TPCHAR *m_pTextureNames; // 0x1C
86+
TMaterial **m_pMaterials; // 0x20
87+
MaterialName *m_pMaterialNames; // 0x24
5888
};
5989

6090
class TRENDERINTERFACE_EXPORTS TMaterialLibraryManager
6191
{
92+
friend class TMaterialLibrary;
93+
6294
public:
6395
void Create();
6496
void Destroy();
@@ -69,12 +101,27 @@ class TRENDERINTERFACE_EXPORTS TMaterialLibraryManager
69101
}
70102
TMaterial *GetMaterial(TPCCHAR a_szMaterial);
71103

104+
protected:
105+
106+
TShader *GetShader(TINT a_iIndex)
107+
{
108+
return m_pShaders[a_iIndex];
109+
}
110+
111+
public:
112+
113+
void SetShader(TINT a_iIndex, TShader *a_pShader)
114+
{
115+
m_pShaders[a_iIndex] = a_pShader;
116+
}
117+
72118
TUINT LoadMaterialLibrary(TPCCHAR a_szFileName);
73119
void UnloadMaterialLibrary(TUINT a_iIndex);
74120

75121
private:
76122
TNodeList<TMaterialLibrary> m_oLibraries; // 0x0
77123
TMaterial *m_pInvalidMaterial; // 0x10
124+
TShader *m_pShaders[5]; // 0x14
78125
};
79126

80127
TOSHI_NAMESPACE_END

Toshi/Source/TRender/TMaterialLibrary.cpp

Lines changed: 116 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "TMaterialLibrary.h"
22
#include "TRender/TRenderInterface.h"
3+
#include "TKernel/TMemory.h"
4+
#include "TSpriteShader/Include/TSpriteShader.h"
35

46
//-----------------------------------------------------------------------------
57
// Enables memory debugging.
@@ -35,6 +37,10 @@ TMaterialLibrary::TMaterialLibrary(TMaterialLibraryManager *a_pManager)
3537
m_pManager = a_pManager;
3638
m_iNumTextures = 0;
3739
m_pTextures = TNULL;
40+
m_iNumMaterials = 0;
41+
m_pTextureNames = TNULL;
42+
m_pMaterials = TNULL;
43+
m_pMaterialNames = TNULL;
3844
}
3945

4046
TBOOL TMaterialLibrary::Create(TPCCHAR a_szFileName)
@@ -43,12 +49,15 @@ TBOOL TMaterialLibrary::Create(TPCCHAR a_szFileName)
4349
if (f) {
4450
if (ReadHeader(f)) {
4551
if (LoadTextures(f)) {
46-
52+
if (LoadMaterials(f)) {
53+
f->Destroy();
54+
return TTRUE;
55+
}
4756
}
4857
}
4958
}
5059
f->Destroy();
51-
TDPRINTF("Error loading material library %s\n");
60+
TDPRINTF("Error loading material library %s\n", a_szFileName);
5261
Destroy();
5362
return TFALSE;
5463
}
@@ -60,19 +69,93 @@ void TMaterialLibrary::Destroy()
6069
m_pTextures = TNULL;
6170
}
6271

72+
TBOOL TMaterialLibrary::LoadSpriteMaterial(TINT a_iIndex, TFile *file, const TMLDISKMATERIALHEADER &dh)
73+
{
74+
TSpriteShader *pShader = static_cast<TSpriteShader *>(m_pManager->GetShader(4));
75+
TVALIDADDRESS(pShader);
76+
TSpriteMaterial *pMat = pShader->CreateMaterial(TNULL);
77+
if (!pMat) {
78+
TDPRINTF("TMaterialLibrary::LoadSpriteMaterial(): CreateMaterial() failed for %d\n", a_iIndex);
79+
return TFALSE;
80+
}
81+
return TTRUE;
82+
}
83+
84+
TBOOL TMaterialLibrary::LoadMaterial(TINT a_iIndex, TFile *file)
85+
{
86+
TMLDISKMATERIALHEADER dh;
87+
TINT read = file->Read(&dh, sizeof(TMLDISKMATERIALHEADER));
88+
if (read != sizeof(TMLDISKMATERIALHEADER)) {
89+
TDPRINTF("TMaterialLibrary::LoadMaterial(): Failed to read material header\n");
90+
return TFALSE;
91+
}
92+
TDPRINTF("Loading material \"%s\" (id %d)\n", m_pMaterialNames[a_iIndex], dh.id);
93+
TMLDISKMATERIALSHADERTYPE eShaderType = (TMLDISKMATERIALSHADERTYPE)(dh.flags & TMLDISKMATERIALSHADERTYPE_MASK);
94+
switch (eShaderType)
95+
{
96+
case Toshi::TMaterialLibrary::TMLDISKMATERIALSHADERTYPE_SKIN:
97+
break;
98+
case Toshi::TMaterialLibrary::TMLDISKMATERIALSHADERTYPE_TERRAIN:
99+
break;
100+
case Toshi::TMaterialLibrary::TMLDISKMATERIALSHADERTYPE_TERRAINDECAL:
101+
break;
102+
case Toshi::TMaterialLibrary::TMLDISKMATERIALSHADERTYPE_SYSTEM:
103+
break;
104+
case Toshi::TMaterialLibrary::TMLDISKMATERIALSHADERTYPE_SPRITE:
105+
LoadSpriteMaterial(a_iIndex, file, dh);
106+
break;
107+
case Toshi::TMaterialLibrary::TMLDISKMATERIALSHADERTYPE_MASK:
108+
break;
109+
default:
110+
TASSERT(!"************* TMaterialLibrary::LoadMaterial(): Unrecognised shader type");
111+
}
112+
}
113+
114+
TBOOL TMaterialLibrary::LoadMaterials(TFile *file)
115+
{
116+
if (file->Read(&m_iNumMaterials, 4) != 4) {
117+
TDPRINTF("TMaterialLibrary::LoadMaterials(): Failed to read number of materials\n");
118+
return TFALSE;
119+
}
120+
m_pTextureNames = new TCHAR *[m_iNumMaterials];
121+
m_pMaterialNames = new MaterialName[m_iNumMaterials];
122+
if (file->Read(m_pMaterialNames, m_iNumMaterials * sizeof(MaterialName)) != m_iNumMaterials * sizeof(MaterialName)) {
123+
TDPRINTF("TMaterialLibrary::LoadMaterials(): Failed to read number of materials\n");
124+
return TFALSE;
125+
}
126+
m_pMaterials = new TMaterial *[m_iNumMaterials];
127+
for (TINT i = 0; i < m_iNumMaterials; i++) {
128+
m_pMaterials[i] = TNULL;
129+
m_pTextureNames[i] = m_pMaterialNames[i];
130+
}
131+
for (TINT i = 0; i < m_iNumMaterials; i++) {
132+
TMaterialLibraryManager *pManager = TRenderInterface::GetRenderer()->GetMaterialLibraryManager();
133+
for (auto it = pManager->m_oLibraries.Begin(); it != pManager->m_oLibraries.End(); it++) {
134+
TMaterial *pMat = it->GetMaterial(m_pMaterialNames[i]);
135+
if (pMat) {
136+
TDPRINTF("******** TMaterialLibraryManager::LoadMaterials() MATERIAL \"%s\" ALREADY LOADED BY ANOTHER LIBRARY!!!!!!! **********\n", m_pMaterialNames[i]);
137+
}
138+
}
139+
if (!LoadMaterial(i, file)) {
140+
return TFALSE;
141+
}
142+
}
143+
return TTRUE;
144+
}
145+
63146
TBOOL TMaterialLibrary::ReadHeader(TFile *file)
64147
{
65-
Header header;
66-
TINT read = file->Read(&header, sizeof(Header));
67-
if (read != sizeof(Header)) {
148+
TMLDISKHEADER dh;
149+
TINT read = file->Read(&dh, sizeof(TMLDISKHEADER));
150+
if (read != sizeof(TMLDISKHEADER)) {
68151
TDPRINTF("TMaterialLibrary::ReadHeader(): Error failed to read header\n");
69152
return TFALSE;
70153
}
71-
if (header.m_iMagic != MAKEFOURCC('T', 'M', 'L', '1')) {
154+
if (dh.m_iMagic != MAKEFOURCC('T', 'M', 'L', '1')) {
72155
TDPRINTF("TMaterialLibrary::ReadHeader(): Error incorrect magic number in header\n");
73156
return TFALSE;
74157
}
75-
if (header.m_iType != 0) {
158+
if (dh.m_iType != 0) {
76159
TDPRINTF("TMaterialLibrary::ReadHeader(): Error incorrect type number in header\n");
77160
return TFALSE;
78161
}
@@ -82,8 +165,8 @@ TBOOL TMaterialLibrary::ReadHeader(TFile *file)
82165
// $TRenderInterface: FUNCTION 100100b0
83166
TBOOL TMaterialLibrary::LoadTexture(TINT a_iIndex, TFile *file)
84167
{
85-
TextureHeader dh;
86-
if (file->Read(&dh, sizeof(TextureHeader)) != sizeof(TextureHeader)) {
168+
TMLDISKTEXTUREHEADER dh;
169+
if (file->Read(&dh, sizeof(TMLDISKTEXTUREHEADER)) != sizeof(TMLDISKTEXTUREHEADER)) {
87170
TDPRINTF("TMaterialLibrary::LoadTexture(): Failed to read texture header %d\n");
88171
return TFALSE;
89172
}
@@ -117,7 +200,7 @@ TBOOL TMaterialLibrary::LoadTextures(TFile *file)
117200
return TFALSE;
118201
}
119202
m_pTextures = new TTextureResource *[m_iNumTextures];
120-
TSystem::MemSet(m_pTextures, 0, sizeof(m_iNumTextures * 4));
203+
TSystem::MemSet(m_pTextures, 0, m_iNumTextures * 4);
121204
for (TINT i = 0; i < m_iNumTextures; i++) {
122205
if (!LoadTexture(i, file)) {
123206
return TFALSE;
@@ -126,9 +209,30 @@ TBOOL TMaterialLibrary::LoadTextures(TFile *file)
126209
return TTRUE;
127210
}
128211

212+
// $TRenderInterface: FUNCTION 10010f60
213+
TINT TMaterialLibrary::GetIndexForName(TPCCHAR a_szName, TPCHAR *a_pMaterialNames, TINT a_iNumMaterials)
214+
{
215+
for (TINT i = 0; i < a_iNumMaterials; i++) {
216+
if (i + 1 == a_iNumMaterials) {
217+
if (TSystem::StringCompareNoCase(a_szName, a_pMaterialNames[i], 32) != 0) {
218+
return -1;
219+
}
220+
return i;
221+
}
222+
if (TSystem::StringCompareNoCase(a_szName, a_pMaterialNames[(a_iNumMaterials - (i / 2)) + i], 32) <= 0) {
223+
return (a_iNumMaterials - (i / 2)) + i;
224+
}
225+
}
226+
return -1;
227+
}
228+
129229
// $TRenderInterface: FUNCTION 1000ff40
130230
TMaterial *TMaterialLibrary::GetMaterial(TPCCHAR a_szMaterial)
131231
{
232+
TINT iIndex = GetIndexForName(a_szMaterial, m_pTextureNames, m_iNumMaterials);
233+
if (iIndex >= 0 && iIndex < m_iNumMaterials) {
234+
return m_pMaterials[iIndex];
235+
}
132236
return TNULL;
133237
}
134238

@@ -141,7 +245,8 @@ TTextureResource *TMaterialLibrary::GetTexture(TINT a_iIndex)
141245
// $TRenderInterface: FUNCTION 10011020
142246
void TMaterialLibraryManager::Create()
143247
{
144-
TMaterial *pSkin = reinterpret_cast<TMaterial *>(TRenderInterface::GetRenderer()->GetSystemResource(TRenderInterface::SYSRESOURCE_SHSKIN));
248+
//TMaterial *pSkin = reinterpret_cast<TMaterial *>(TRenderInterface::GetRenderer()->GetSystemResource(TRenderInterface::SYSRESOURCE_SHSKIN));
249+
145250
}
146251

147252
// $TRenderInterface: FUNCTION 100110a0

Toshi/premake5.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ project ("TRenderInterface")
109109
"Include",
110110
"Include/TKernel",
111111
"Include/TRender",
112-
"Plugins/Include"
112+
"Plugins/Include",
113+
"Shaders"
113114
}
114115

115116
defines

0 commit comments

Comments
 (0)