Skip to content

Commit ceba8c5

Browse files
committed
wip stuff that isn't working
1 parent ca087f3 commit ceba8c5

7 files changed

+119
-35
lines changed

src/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ set(Source_Files__Window__Gui
251251
${CMAKE_CURRENT_SOURCE_DIR}/window/gui/resource/Font.cpp
252252
${CMAKE_CURRENT_SOURCE_DIR}/window/gui/resource/FontFactory.h
253253
${CMAKE_CURRENT_SOURCE_DIR}/window/gui/resource/FontFactory.cpp
254+
${CMAKE_CURRENT_SOURCE_DIR}/window/gui/resource/GuiTextureResource.h
255+
${CMAKE_CURRENT_SOURCE_DIR}/window/gui/resource/GuiTextureResource.cpp
256+
${CMAKE_CURRENT_SOURCE_DIR}/window/gui/resource/GuiTextureResourceFactory.h
257+
${CMAKE_CURRENT_SOURCE_DIR}/window/gui/resource/GuiTextureResourceFactory.cpp
254258
)
255259

256260
source_group("window/gui" FILES ${Source_Files__Window__Gui})

src/window/gui/Gui.cpp

+12-29
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "resource/File.h"
1616
#include <stb/stb_image.h>
1717
#include "window/gui/Fonts.h"
18+
#include "window/gui/resource/GuiTextureResourceFactory.h"
1819

1920
#ifdef __WIIU__
2021
#include <gx2/registers.h> // GX2SetViewport / GX2SetScissor
@@ -150,6 +151,10 @@ void Gui::Init(GuiWindowInitData windowImpl) {
150151
GetGuiWindow("Console")->Init();
151152
GetGameOverlay()->Init();
152153

154+
Context::GetInstance()->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(
155+
std::make_shared<ResourceFactoryBinaryGuiTextureResourceV0>(), RESOURCE_FORMAT_BINARY, "GuiTexture",
156+
static_cast<uint32_t>(RESOURCE_TYPE_GUI_TEXTURE), 0);
157+
153158
ImGuiWMInit();
154159
ImGuiBackendInit();
155160
#ifdef __SWITCH__
@@ -230,39 +235,17 @@ void Gui::ImGuiBackendInit() {
230235
}
231236

232237
void Gui::LoadTextureFromRawImage(const std::string& name, const std::string& path) {
233-
// GuiTexture (put in Gui)
234-
const auto res = Context::GetInstance()->GetResourceManager()->GetArchiveManager()->LoadFileRaw(path);
235-
236-
if (!res) {
237-
SPDLOG_ERROR("Failed to load resource");
238-
return;
239-
}
240-
if (!res->Buffer || res->Buffer->empty()) {
241-
SPDLOG_ERROR("Buffer is null or empty");
242-
return;
243-
}
244-
245-
GuiTexture asset;
246-
asset.Width = 0;
247-
asset.Height = 0;
248-
uint8_t* imgData = stbi_load_from_memory(reinterpret_cast<const stbi_uc*>(res->Buffer->data()), res->Buffer->size(),
249-
&asset.Width, &asset.Height, nullptr, 4);
238+
auto initData = std::make_shared<ResourceInitData>();
239+
initData->Format = RESOURCE_FORMAT_BINARY;
240+
initData->Type = static_cast<uint32_t>(RESOURCE_TYPE_GUI_TEXTURE);
241+
initData->ResourceVersion = 0;
242+
auto guiTextureResource = std::static_pointer_cast<GuiTextureResource>(Context::GetInstance()->GetResourceManager()->LoadResource(path, false, initData));
250243

251-
if (imgData == nullptr) {
252-
SPDLOG_ERROR("Error loading imgui texture {}", stbi_failure_reason());
244+
if (guiTextureResource == nullptr) {
253245
return;
254246
}
255247

256-
GfxRenderingAPI* api = gfx_get_current_rendering_api();
257-
258-
// TODO: Nothing ever unloads the texture from Fast3D here.
259-
asset.RendererTextureId = api->new_texture();
260-
api->select_texture(0, asset.RendererTextureId);
261-
api->set_sampler_parameters(0, false, 0, 0);
262-
api->upload_texture(imgData, asset.Width, asset.Height);
263-
264-
mGuiTextures[name] = asset;
265-
stbi_image_free(imgData);
248+
mGuiTextures[name] = guiTextureResource->GuiTextureData;
266249
}
267250

268251
bool Gui::SupportsViewports() {

src/window/gui/Gui.h

+1-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "window/gui/GuiWindow.h"
1919
#include "window/gui/GuiMenuBar.h"
2020
#include "libultraship/libultra/controller.h"
21+
#include "window/gui/resource/GuiTextureResource.h"
2122

2223
namespace LUS {
2324

@@ -100,12 +101,6 @@ class Gui {
100101
int16_t GetIntegerScaleFactor();
101102

102103
private:
103-
struct GuiTexture {
104-
uint32_t RendererTextureId;
105-
int32_t Width;
106-
int32_t Height;
107-
};
108-
109104
GuiWindowInitData mImpl;
110105
ImGuiIO* mImGuiIo;
111106
bool mNeedsConsoleVariableSave;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#include "GuiTextureResource.h"
2+
3+
namespace LUS {
4+
GuiTextureResource::GuiTextureResource() : Resource(std::shared_ptr<ResourceInitData>()) {
5+
}
6+
7+
void* GuiTextureResource::GetPointer() {
8+
return ImageData.data();
9+
}
10+
11+
size_t GuiTextureResource::GetPointerSize() {
12+
return ImageData.size() * sizeof(uint8_t);
13+
}
14+
} // namespace LUS
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include "resource/Resource.h"
4+
5+
namespace LUS {
6+
#define RESOURCE_TYPE_GUI_TEXTURE 0x47544558 //GTEX
7+
8+
struct GuiTexture {
9+
uint32_t RendererTextureId;
10+
int32_t Width;
11+
int32_t Height;
12+
};
13+
14+
class GuiTextureResource : public Resource<void> {
15+
public:
16+
using Resource::Resource;
17+
18+
GuiTextureResource();
19+
20+
void* GetPointer() override;
21+
size_t GetPointerSize() override;
22+
23+
std::vector<uint8_t> ImageData;
24+
GuiTexture GuiTextureData;
25+
};
26+
}; // namespace LUS
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include "window/gui/resource/GuiTextureResourceFactory.h"
2+
#include "window/gui/resource/GuiTextureResource.h"
3+
#include "spdlog/spdlog.h"
4+
#include <stb/stb_image.h>
5+
#include "graphic/Fast3D/gfx_rendering_api.h"
6+
#include "graphic/Fast3D/gfx_pc.h"
7+
8+
namespace LUS {
9+
std::shared_ptr<IResource> ResourceFactoryBinaryGuiTextureResourceV0::ReadResource(std::shared_ptr<File> file) {
10+
if (!FileHasValidFormatAndReader(file)) {
11+
return nullptr;
12+
}
13+
14+
auto guiTextureResource = std::make_shared<GuiTextureResource>(file->InitData);
15+
auto reader = std::get<std::shared_ptr<BinaryReader>>(file->Reader);
16+
17+
uint32_t dataSize = file->Buffer->size();
18+
guiTextureResource->ImageData.reserve(dataSize);
19+
for (uint32_t i = 0; i < dataSize; i++) {
20+
guiTextureResource->ImageData.push_back(reader->ReadUByte());
21+
}
22+
23+
guiTextureResource->GuiTextureData.Width = 0;
24+
guiTextureResource->GuiTextureData.Height = 0;
25+
uint8_t* imgData = stbi_load_from_memory(reinterpret_cast<const stbi_uc*>(guiTextureResource->ImageData.data()), dataSize,
26+
&guiTextureResource->GuiTextureData.Width, &guiTextureResource->GuiTextureData.Height, nullptr, 4);
27+
28+
if (imgData == nullptr) {
29+
SPDLOG_ERROR("Error loading imgui texture {}", stbi_failure_reason());
30+
return nullptr;
31+
}
32+
33+
// todo: figure out why this doesn't work
34+
// guiTextureResource->ImageData.reserve(dataSize);
35+
// for (uint32_t i = 0; i < dataSize; i++) {
36+
// guiTextureResource->ImageData.push_back(imgData[i]);
37+
// }
38+
39+
GfxRenderingAPI* api = gfx_get_current_rendering_api();
40+
41+
// TODO: Nothing ever unloads the texture from Fast3D here.
42+
guiTextureResource->GuiTextureData.RendererTextureId = api->new_texture();
43+
api->select_texture(0, guiTextureResource->GuiTextureData.RendererTextureId);
44+
api->set_sampler_parameters(0, false, 0, 0);
45+
api->upload_texture(/* guiTextureResource->ImageData.data() */ imgData, guiTextureResource->GuiTextureData.Width, guiTextureResource->GuiTextureData.Height);
46+
47+
stbi_image_free(imgData);
48+
49+
return guiTextureResource;
50+
}
51+
} // namespace LUS
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
#include "resource/Resource.h"
4+
#include "resource/ResourceFactoryBinary.h"
5+
6+
namespace LUS {
7+
class ResourceFactoryBinaryGuiTextureResourceV0 : public ResourceFactoryBinary {
8+
public:
9+
std::shared_ptr<IResource> ReadResource(std::shared_ptr<File> file) override;
10+
};
11+
}; // namespace LUS

0 commit comments

Comments
 (0)