diff --git a/Graphics/src/lib.rs b/Graphics/src/lib.rs index 708dcb47a..b9e42f624 100644 --- a/Graphics/src/lib.rs +++ b/Graphics/src/lib.rs @@ -166,11 +166,16 @@ mod ffi { TriggerRight, MAX, } + pub struct Icon { + pub data: Vec, + pub width: u32, + pub height: u32, + } extern "Rust" { type WindowContext; type App; - fn app_run(mut delegate: UniquePtr); + fn app_run(mut delegate: UniquePtr, icon: Icon); fn get_args() -> Vec; fn get_window_size() -> WindowSize; fn set_window_title(title: &CxxString); @@ -232,14 +237,19 @@ pub struct WindowContext { static mut APP: Option = None; -fn app_run(mut delegate: cxx::UniquePtr) { +fn app_run(mut delegate: cxx::UniquePtr, icon: ffi::Icon) { if delegate.is_null() { return; } env_logger::init(); log::info!("Running app"); let event_loop = winit::event_loop::EventLoop::new(); - let window = winit::window::WindowBuilder::new().build(&event_loop).unwrap(); + let window_icon = winit::window::Icon::from_rgba(icon.data, icon.width, icon.height).expect("Failed to load icon"); + let window = winit::window::WindowBuilder::new() + .with_inner_size(winit::dpi::LogicalSize::new(1280, 720)) + .with_window_icon(Some(window_icon)) + .build(&event_loop) + .unwrap(); let sdl = sdl2::init().unwrap(); let sdl_events = sdl.event_pump().unwrap(); let controller = sdl.game_controller().unwrap(); diff --git a/Runtime/CMain.cpp b/Runtime/CMain.cpp index 21ce561e9..8be2c5c54 100644 --- a/Runtime/CMain.cpp +++ b/Runtime/CMain.cpp @@ -566,6 +566,8 @@ static bool IsClientLoggingEnabled(int argc, char** argv) { } #if !WINDOWS_STORE +extern "C" void cxxbridge1$rust_vec$u8$set_len(rust::Vec* ptr, std::size_t len) noexcept; + int main(int argc, char** argv) { //TODO: This seems to fix a lot of weird issues with rounding // but breaks animations, need to research why this is the case @@ -609,7 +611,17 @@ int main(int argc, char** argv) { hecl::SetCpuCountOverride(argc, argv); auto app = std::make_unique(fileMgr, cvarMgr, cvarCmns); - aurora::app_run(std::move(app)); + auto data = aurora::Icon{}; + { + auto icon = metaforce::GetIcon(); + data.data.reserve(icon.size); + std::memcpy(data.data.data(), icon.data.get(), icon.size); + // terrible hack: https://github.com/dtolnay/cxx/issues/990 + cxxbridge1$rust_vec$u8$set_len(&data.data, icon.size); + data.width = icon.width; + data.height = icon.height; + } + aurora::app_run(std::move(app), data); return 0; } #endif diff --git a/imgui/ImGuiEngine.cpp b/imgui/ImGuiEngine.cpp index 83d544ac9..c89cd1571 100644 --- a/imgui/ImGuiEngine.cpp +++ b/imgui/ImGuiEngine.cpp @@ -45,13 +45,22 @@ void ImGuiEngine_Initialize(float scale) { ImGui::GetStyle().ScaleAllSizes(scale); } -void ImGuiEngine_AddTextures(ImGuiState& state, const DeviceHolder& gpu) { +Icon GetIcon() { int iconWidth = 0; int iconHeight = 0; - auto* iconData = stbi_load_from_memory(static_cast(METAFORCE_ICON), int(METAFORCE_ICON_SZ), - &iconWidth, &iconHeight, nullptr, 4); - ImGuiEngine::metaforceIcon = ImGuiEngine_AddTexture(state, gpu, iconWidth, iconHeight, - {iconData, static_cast(iconWidth * iconHeight * 4)}); - stbi_image_free(iconData); + auto* data = stbi_load_from_memory(static_cast(METAFORCE_ICON), int(METAFORCE_ICON_SZ), &iconWidth, + &iconHeight, nullptr, 4); + return Icon{ + std::unique_ptr{data}, + static_cast(iconWidth) * static_cast(iconHeight) * 4, + static_cast(iconWidth), + static_cast(iconHeight), + }; +} + +void ImGuiEngine_AddTextures(ImGuiState& state, const DeviceHolder& gpu) { + auto icon = GetIcon(); + ImGuiEngine::metaforceIcon = + ImGuiEngine_AddTexture(state, gpu, icon.width, icon.height, {icon.data.get(), icon.size}); } } // namespace metaforce diff --git a/imgui/ImGuiEngine.hpp b/imgui/ImGuiEngine.hpp index 15ba0af2c..00725e15d 100644 --- a/imgui/ImGuiEngine.hpp +++ b/imgui/ImGuiEngine.hpp @@ -21,6 +21,14 @@ struct ImGuiState; struct DeviceHolder; void ImGuiEngine_AddTextures(ImGuiState& state, const DeviceHolder& gpu); +struct Icon { + std::unique_ptr data; + size_t size; + uint32_t width; + uint32_t height; +}; +Icon GetIcon(); + enum class KeyCode { /// The '1' key over the letters. Key1,