Skip to content

Commit 3b1ff93

Browse files
committed
Implement more stuff to draw Matlibs 2
1 parent 6012097 commit 3b1ff93

24 files changed

+570
-34
lines changed

OpenJPOG/Source/AOptions.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,15 @@ TBOOL AOptionsLogic::GetOption(OPTION a_eOption, AScreenRes &a_rScreenRes)
7979
return setting.m_bFetched;
8080
}
8181

82+
TBOOL AOptionsLogic::GetOption(OPTION a_eOption, LMH &a_rLMH)
83+
{
84+
AOptionSetting setting;
85+
setting.m_eOption = a_eOption;
86+
OptionGet(setting);
87+
a_rLMH = *(LMH *)(&setting + 1);
88+
return setting.m_bFetched;
89+
}
90+
8291
TBOOL AOptionsLogic::SetOption(OPTION a_eOption, AScreenRes &a_rScreenRes)
8392
{
8493
return TBOOL();

OpenJPOG/Source/AOptions.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,15 @@ class AOptionsLogic
77
public:
88
enum OPTION
99
{
10-
OPTION_SCREENRES
10+
OPTION_SCREENRES,
11+
OPTION_SCREENDEPTH
12+
};
13+
14+
enum LMH
15+
{
16+
LMH_UNK,
17+
LMH_UNK2,
18+
LMH_UNK3
1119
};
1220

1321
struct AOptionSetting
@@ -28,6 +36,7 @@ class AOptionsLogic
2836
AOptionsLogic();
2937

3038
TBOOL GetOption(OPTION a_eOption, AScreenRes &a_rScreenRes);
39+
TBOOL GetOption(OPTION a_eOption, LMH &a_rLMH);
3140
TBOOL SetOption(OPTION a_eOption, AScreenRes &a_rScreenRes);
3241
void OptionGet(AOptionSetting &a_rSetting);
3342

OpenJPOG/Source/GUI/AGUIGameHUD.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,6 @@ class AGUIGameHUD
5555
private:
5656
Toshi::TLString m_LSHintMessage; // 0x4
5757
HUDComponents m_eHUDComponents; // 0x8
58+
public:
5859
Toshi::TCString m_szBKGMatLib; // 0x2C
5960
};
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include "AGUIMatLibPicture.h"
2+
#include "TRender/TRenderInterface.h"
3+
#include "AOptions.h"
4+
#include "main.h"
5+
6+
//-----------------------------------------------------------------------------
7+
// Enables memory debugging.
8+
// Note: Should be the last include!
9+
//-----------------------------------------------------------------------------
10+
#include <TKernel/TMemoryDebugOn.h>
11+
12+
TOSHI_NAMESPACE_USING
13+
14+
IMPLEMENT_DYNCREATE(AGUIMatLibPicture, AGUIPicture)
15+
16+
AGUIMatLibPicture::AGUIMatLibPicture()
17+
{
18+
m_tmlidx = -1;
19+
}
20+
21+
void AGUIMatLibPicture::LoadMaterialLibrary()
22+
{
23+
TCString sixteen = TCString("16");
24+
TINT screendepth = 32;
25+
AOptionsLogic::LMH lmh;
26+
AOptionsLogic options;
27+
g_oTheApp.GetRootTask()->GetOptions()->GetOption("ScreenDepth", screendepth);
28+
options.GetOption(AOptionsLogic::OPTION_SCREENDEPTH, lmh);
29+
TBOOL supportscreendepth = TTRUE;
30+
if (screendepth != 16) {
31+
supportscreendepth = TRenderInterface::GetRenderer()->Supports32BitTextures();
32+
if (supportscreendepth) {
33+
supportscreendepth = lmh != AOptionsLogic::LMH_UNK3;
34+
}
35+
}
36+
if (supportscreendepth) {
37+
TINT extensionidx = m_sFileName.FindReverse('.');
38+
TINT len = m_sFileName.Length();
39+
TCString fullname = m_sFileName.Mid(0, extensionidx) + sixteen + m_sFileName.Mid(extensionidx, len);
40+
m_tmlidx = TRenderInterface::GetRenderer()->GetMaterialLibraryManager()->LoadMaterialLibrary(fullname);
41+
}
42+
}
43+
44+
void AGUIMatLibPicture::UnloadMaterialLibrary()
45+
{
46+
TRenderInterface::GetRenderer()->GetMaterialLibraryManager()->UnloadMaterialLibrary(m_tmlidx);
47+
m_tmlidx = -1;
48+
}
49+
50+
void AGUIMatLibPicture::SetFile(TPCCHAR a_szFile)
51+
{
52+
53+
}
54+
55+
void AGUIMatLibPicture::Flush()
56+
{
57+
if (m_iSplitTileCount == 0) {
58+
return;
59+
}
60+
delete m_pTextures;
61+
m_pTextures = TNULL;
62+
m_iSplitTextureCount = 0;
63+
delete m_pTiles;
64+
m_pTiles = TNULL;
65+
m_iSplitTileCount = 0;
66+
67+
}
68+
69+
void AGUIMatLibPicture::Cache()
70+
{
71+
if (m_iSplitTileCount == 0) {
72+
return;
73+
}
74+
if (m_sFileName.IsEmpty()) {
75+
return;
76+
}
77+
m_pTiles = new Tile[split_tile_count];
78+
m_pTextures = new Texture[split_texture_count];
79+
LoadMaterialLibrary();
80+
TCString format;
81+
for (TINT i = 0; i < m_iSplitTextureCount; i++) {
82+
Toshi::TMaterial *pMat = Toshi::TRenderInterface::GetRenderer()->GetMaterialLibraryManager()->GetMaterial(format.Format("%s_%d", m_sPrefix, i));
83+
m_pTextures[i].pMaterial = static_cast<TSpriteMaterial *>(pMat);
84+
m_pTextures[i].pTexture = TNULL;
85+
}
86+
for (TINT i = 0; i < m_iSplitTileCount; i++) {
87+
m_pTiles[i].ppMaterial = &m_pTextures[split_rules[i].index].pMaterial;
88+
m_pTiles[i].pos1 = split_rules[i].pos1;
89+
m_pTiles[i].pos2 = split_rules[i].pos2;
90+
m_pTiles[i].uv1 = split_rules[i].uv1;
91+
m_pTiles[i].uv2 = split_rules[i].uv2;
92+
}
93+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,27 @@
11
#pragma once
2+
#include "AGUIPicture.h"
3+
#include "TKernel/TCString.h"
4+
5+
class AGUIMatLibPicture : public AGUIPicture
6+
{
7+
DECLARE_DYNAMIC(AGUIMatLibPicture, AGUIPicture);
8+
9+
public:
10+
11+
AGUIMatLibPicture();
12+
13+
protected:
14+
void LoadMaterialLibrary();
15+
void UnloadMaterialLibrary();
16+
17+
public:
18+
void SetFile(TPCCHAR a_szFile);
19+
20+
public:
21+
virtual void Flush();
22+
virtual void Cache();
23+
24+
private:
25+
TINT m_tmlidx; // 0x20
26+
Toshi::TCString m_sPrefix; // 0x24
27+
};

OpenJPOG/Source/GUI/AGUIPicture.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "AGUIPicture.h"
2+
#include "AGUISystem.h"
23

34
//-----------------------------------------------------------------------------
45
// Enables memory debugging.
@@ -10,7 +11,45 @@ TOSHI_NAMESPACE_USING
1011

1112
IMPLEMENT_DYNAMIC(AGUIPicture, TObject)
1213

14+
const AGUIPicture::SplitRule AGUIPicture::split_rules[6] = {
15+
SplitRule{ TVector2(0.0f, 256.0f), TVector2(0.0f, 256.0f), TVector2(0.0f, 1.0f), TVector2(0.0f, 1.0f), 0, 0, 0 },
16+
SplitRule{ TVector2(255.0f, 511.0f), TVector2(0.0f, 256.0f), TVector2(0.0f, 1.0f), TVector2(0.0f, 1.0f), 1, 0, 0 },
17+
SplitRule{ TVector2(510.0f, 638.0f), TVector2(0.0f, 256.0f), TVector2(0.0f, 1.0f), TVector2(0.0f, 1.0f), 2, 0, 0 },
18+
SplitRule{ TVector2(0.0f, 256.0f), TVector2(255.0f, 447.0f), TVector2(0.0f, 1.0f), TVector2(0.0f, 0.75f), 3, 0, 0 },
19+
SplitRule{ TVector2(255.0f, 511.0f), TVector2(255.0f, 447.0f), TVector2(0.0f, 1.0f), TVector2(0.0f, 0.75f), 4, 0, 0 },
20+
SplitRule{ TVector2(510.0f, 638.0f), TVector2(255.0f, 447.0f), TVector2(0.0f, 1.0f), TVector2(0.0f, 0.75f), 5, 0, 0 }
21+
};
22+
1323
AGUIPicture::AGUIPicture()
1424
{
25+
m_iSplitTileCount = 0;
26+
m_iSplitTextureCount = 0;
27+
m_pTiles = TNULL;
28+
m_pTextures = TNULL;
29+
m_pShader = TNULL;
30+
}
31+
32+
void AGUIPicture::Delete()
33+
{
34+
Flush();
35+
delete this;
36+
}
1537

38+
void AGUIPicture::Create(TPCCHAR a_szFileName, Toshi::TSpriteShader *a_pShader)
39+
{
40+
m_sFileName = a_szFileName;
41+
m_pShader = a_pShader;
42+
Cache();
43+
}
44+
45+
void AGUIPicture::Render()
46+
{
47+
AGUISystem *system = AGUISystem::GetGUISystem();
48+
TFLOAT height = system->GetScreen()->GetHeight() / 447.0f;
49+
TFLOAT width = system->GetScreen()->GetWidth() / 638.0f;
50+
for (TUINT i = 0; i < m_iSplitTileCount; i++)
51+
{
52+
m_pShader->SetColour(TGUIColour());
53+
m_pShader->SetMaterial(*m_pTiles[i].ppMaterial);
54+
}
1655
}

OpenJPOG/Source/GUI/AGUIPicture.h

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#pragma once
22
#include "TKernel/TObject.h"
3+
#include "TKernel/TVector2.h"
4+
#include "TSpriteShader/Include/TSpriteShader.h"
35

46
class AGUIPicture : public Toshi::TObject
57
{
@@ -9,9 +11,58 @@ class AGUIPicture : public Toshi::TObject
911

1012
AGUIPicture();
1113

14+
struct Tile
15+
{
16+
Toshi::TVector2 pos1;
17+
Toshi::TVector2 pos2;
18+
Toshi::TVector2 uv1;
19+
Toshi::TVector2 uv2;
20+
Toshi::TSpriteMaterial **ppMaterial;
21+
};
22+
23+
struct Texture
24+
{
25+
Toshi::TSpriteMaterial *pMaterial;
26+
Toshi::TSpriteMesh *pTexture;
27+
};
28+
29+
struct SplitRule
30+
{
31+
Toshi::TVector2 pos1;
32+
Toshi::TVector2 pos2;
33+
Toshi::TVector2 uv1;
34+
Toshi::TVector2 uv2;
35+
TINT index;
36+
TINT unk;
37+
TINT unk2;
38+
};
39+
40+
public:
41+
42+
virtual void Delete();
43+
virtual void Create(TPCCHAR a_szFileName, Toshi::TSpriteShader *a_pShader);
44+
virtual void Render();
45+
virtual void Flush() = 0;
46+
virtual void Cache() = 0;
47+
48+
public:
49+
// $JPOG: FUNCTION 00673160
50+
const Toshi::TCString& GetFileName()
51+
{
52+
return m_sFileName;
53+
}
54+
1255
protected:
1356
static const int split_tile_count = 6;
1457
static const int split_texture_count = 6;
1558
static const int *split_texture_size[2];
16-
static void* split_rules[6];
59+
static const SplitRule split_rules[6];
60+
61+
protected:
62+
TSHORT m_iSplitTileCount; // 0x8
63+
TSHORT m_iSplitTextureCount; // 0xA
64+
Tile *m_pTiles; // 0xC
65+
Texture *m_pTextures; // 0x10
66+
Toshi::TCString m_sFileName; // 0x14
67+
Toshi::TSpriteShader *m_pShader; // 0x18
1768
};

OpenJPOG/Source/GUI/AGUISystem.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,29 @@ TBOOL AGUISystem::OnCreate()
2222
{
2323
auto pRenderer = g_oTheApp.GetRootTask()->GetRenderInterface();
2424
m_pNullResource = (TNullResource *)pRenderer->CreateResource(&TGetClass(TNullResource), TNULL, TNULL);
25+
m_pSpriteShader = (TSpriteShader *)pRenderer->CreateResource(TFindClass(TSpriteShaderHAL, TNULL), "SHSPRITE", pRenderer->GetSystemResource(TRenderInterface::SYSRESOURCE_SHADERS));
2526
m_pGUIInterface->Create();
2627
m_pDisplayContext = new PGUITRDisplayContext();
2728
m_pDisplayContext->Create(g_oTheApp.GetRootTask()->GetRenderInterface(), m_pTextureFactory, m_pFontFactory);
2829
m_pScreen = new TGUIScreen();
30+
TCString guiTexturePath = TCString("data/gui/textures");
31+
//m_oPaintListener.Connect(*m_pScreen->GetPaintEmitter(), this, OnScreenPaint, -0x8000);
32+
m_pMatLibPic = new AGUIMatLibPicture();
33+
m_pMatLibPic->Create(guiTexturePath, m_pSpriteShader);
2934
return true;
3035
}
3136

3237
// $JPOG: FUNCTION 0067c1f0
3338
TBOOL AGUISystem::OnUpdate(TFLOAT a_fDeltaTime)
3439
{
35-
return TBOOL();
40+
TCString &rCurFileName = g_oTheApp.GetRootTask()->GetRootStateController()->GetCurrentGameState().GetHUDState().m_szBKGMatLib;
41+
if (rCurFileName != m_pMatLibPic->GetFileName()) {
42+
m_pMatLibPic->SetFile(rCurFileName);
43+
if (!rCurFileName.IsEmpty()) {
44+
m_pMatLibPic->Cache();
45+
}
46+
}
47+
return TTRUE;
3648
}
3749

3850
void AGUISystem::UpdateHUDComponets()
@@ -44,3 +56,21 @@ AGUISystem *TOSHI_API AGUISystem::GetGUISystem()
4456
{
4557
return g_oTheApp.GetRootTask()->GetGUISystem();
4658
}
59+
60+
// $JPOG: FUNCTION 0067de10
61+
TBOOL AGUISystem::OnScreenPaint(AGUISystem *a_pGUISystem, TGUIScreen *a_pScreen, TGUIScreenPaintEvent *a_pEvent)
62+
{
63+
static TBOOL paint = TTRUE;
64+
if (!paint) {
65+
return TTRUE;
66+
}
67+
if (!a_pEvent) {
68+
return TTRUE;
69+
}
70+
a_pGUISystem->m_pMatLibPic->Render();
71+
AMoviePlayer *movieplayer = g_oTheApp.GetRootTask()->GetMoviePlayer();
72+
if (movieplayer) {
73+
movieplayer->Render();
74+
}
75+
return TTRUE;
76+
}

OpenJPOG/Source/GUI/AGUISystem.h

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22
#include "TKernel/TCString.h"
33
#include "TKernel/TTask.h"
44
#include "TKernel/TManagedPointer.h"
5+
#include "TKernel/TEvent.h"
56
#include "TRender/TNullResource.h"
67
#include "TGui/TGUIInterface.h"
78
#include "TGUI/TGUIScreen.h"
89
#include "PGuiRenderer/PGUITRDisplayContext.h"
10+
#include "TSpriteShader/Include/TSpriteShader.h"
11+
#include "AGUIMatLibPicture.h"
912

1013
class AGUISystem : public Toshi::TTask
1114
{
@@ -16,20 +19,34 @@ class AGUISystem : public Toshi::TTask
1619
virtual TBOOL OnCreate() override;
1720
virtual TBOOL OnUpdate(TFLOAT a_fDeltaTime) override;
1821

22+
public:
23+
24+
1925
void UpdateHUDComponets();
2026
// $JPOG: FUNCTION 0067e5e0
2127
Toshi::TManagedPtr<Toshi::TGUIInterface> GetGUIInterface() const
2228
{
2329
return m_pGUIInterface;
2430
}
31+
// $JPOG: FUNCTION 0046e340
32+
Toshi::TGUIScreen *GetScreen() const
33+
{
34+
return m_pScreen;
35+
}
2536

2637
static AGUISystem *TOSHI_API GetGUISystem();
2738

39+
protected:
40+
static TBOOL OnScreenPaint(AGUISystem *a_pGUISystem, Toshi::TGUIScreen *a_pScreen, Toshi::TGUIScreenPaintEvent *a_pEvent);
41+
2842
private:
29-
Toshi::TGUIInterface *m_pGUIInterface; // 0x24
30-
Toshi::TGUIScreen *m_pScreen; // 0x28
31-
PGUITRDisplayContext *m_pDisplayContext; // 0xA4
32-
PGUITRTextureFactory *m_pTextureFactory; // 0xA8
33-
PGUITRFontFactory *m_pFontFactory; // 0xAC
34-
Toshi::TNullResource *m_pNullResource; // 0x140
43+
Toshi::TGUIInterface *m_pGUIInterface; // 0x24
44+
Toshi::TGUIScreen *m_pScreen; // 0x28
45+
PGUITRDisplayContext *m_pDisplayContext; // 0xA4
46+
PGUITRTextureFactory *m_pTextureFactory; // 0xA8
47+
PGUITRFontFactory *m_pFontFactory; // 0xAC
48+
Toshi::TListener<Toshi::TGUIScreen, Toshi::TGUIScreenPaintEvent, AGUISystem> m_oPaintListener; // 0x118
49+
Toshi::TNullResource *m_pNullResource; // 0x140
50+
Toshi::TSpriteShader *m_pSpriteShader; // 0x144
51+
AGUIMatLibPicture *m_pMatLibPic; // 0x19C
3552
};

0 commit comments

Comments
 (0)