metaforce/aurora/lib/imgui.cpp

104 lines
3.1 KiB
C++
Raw Normal View History

2022-02-18 21:33:56 -08:00
#include "imgui.hpp"
2022-02-15 21:21:24 -08:00
2022-02-18 21:33:56 -08:00
#include "gpu.hpp"
2022-02-16 22:03:00 -08:00
#include <SDL.h>
#include <aurora/aurora.hpp>
2022-02-18 21:33:56 -08:00
#include <aurora/imgui.hpp>
#include <dawn/webgpu_cpp.h>
2022-02-16 22:03:00 -08:00
#include "../extern/imgui/backends/imgui_impl_sdl.cpp"
#include "../extern/imgui/backends/imgui_impl_wgpu.cpp"
2022-02-15 21:21:24 -08:00
namespace aurora::imgui {
2022-02-18 21:33:56 -08:00
using gpu::g_device;
using gpu::g_queue;
static float g_scale;
2022-02-18 21:33:56 -08:00
void create_context() noexcept {
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.IniFilename = nullptr;
}
void initialize(SDL_Window* window) noexcept {
ImGui_ImplSDL2_Init(window, nullptr);
// Disable MouseCanUseGlobalState for scaling purposes
ImGui_ImplSDL2_GetBackendData()->MouseCanUseGlobalState = false;
2022-02-18 21:33:56 -08:00
ImGui_ImplWGPU_Init(g_device.Get(), 1, static_cast<WGPUTextureFormat>(gpu::g_graphicsConfig.colorFormat));
}
void shutdown() noexcept {
ImGui_ImplWGPU_Shutdown();
ImGui_ImplSDL2_Shutdown();
ImGui::DestroyContext();
}
void process_event(const SDL_Event& event) noexcept {
auto newEvent = event;
if (newEvent.type == SDL_MOUSEMOTION) {
auto& io = ImGui::GetIO();
// Scale up mouse coordinates
io.AddMousePosEvent(static_cast<float>(newEvent.motion.x) * g_scale,
static_cast<float>(newEvent.motion.y) * g_scale);
return;
}
ImGui_ImplSDL2_ProcessEvent(&newEvent);
}
2022-02-18 21:33:56 -08:00
void new_frame(const WindowSize& size) noexcept {
2022-02-18 21:33:56 -08:00
ImGui_ImplWGPU_NewFrame();
ImGui_ImplSDL2_NewFrame();
// Render at full DPI
g_scale = size.scale;
ImGui::GetIO().DisplaySize = ImVec2{static_cast<float>(size.fb_width), static_cast<float>(size.fb_height)};
2022-02-18 21:33:56 -08:00
ImGui::NewFrame();
}
void render(const wgpu::RenderPassEncoder& pass) noexcept {
ImGui::Render();
auto* data = ImGui::GetDrawData();
// io.DisplayFramebufferScale is informational; we're rendering at full DPI
data->FramebufferScale = {1.f, 1.f};
ImGui_ImplWGPU_RenderDrawData(data, pass.Get());
2022-02-18 21:33:56 -08:00
}
2022-02-15 21:21:24 -08:00
ImTextureID add_texture(uint32_t width, uint32_t height, ArrayRef<uint8_t> data) noexcept {
2022-02-16 22:03:00 -08:00
const auto size = wgpu::Extent3D{
.width = width,
.height = height,
};
const auto textureDescriptor = wgpu::TextureDescriptor{
.label = "imgui texture",
.usage = wgpu::TextureUsage::TextureBinding | wgpu::TextureUsage::CopyDst,
.size = size,
.format = wgpu::TextureFormat::RGBA8Unorm,
};
const auto textureViewDescriptor = wgpu::TextureViewDescriptor{
.label = "imgui texture view",
.format = wgpu::TextureFormat::RGBA8Unorm,
.dimension = wgpu::TextureViewDimension::e2D,
.mipLevelCount = 1,
.arrayLayerCount = 1,
};
2022-02-18 21:33:56 -08:00
auto texture = g_device.CreateTexture(&textureDescriptor);
2022-02-16 22:03:00 -08:00
auto textureView = texture.CreateView(&textureViewDescriptor);
{
const auto dstView = wgpu::ImageCopyTexture{
.texture = texture,
};
const auto dataLayout = wgpu::TextureDataLayout{
.bytesPerRow = 4 * width,
.rowsPerImage = height,
};
2022-02-18 21:33:56 -08:00
g_queue.WriteTexture(&dstView, data.data(), data.size(), &dataLayout, &size);
2022-02-16 22:03:00 -08:00
}
texture.Release(); // leak some memory!
return textureView.Release();
2022-02-15 21:21:24 -08:00
}
} // namespace aurora::imgui