Skip to content

Commit

Permalink
Update ZWidget to latest version from the ZWidget repository
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed Feb 10, 2025
1 parent 0467b5f commit f73fe21
Show file tree
Hide file tree
Showing 19 changed files with 364 additions and 173 deletions.
6 changes: 3 additions & 3 deletions SurrealEngine/GameWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
#include <zvulkan/vulkansurface.h>
#include <zvulkan/vulkancompatibledevice.h>
#include <zvulkan/vulkanbuilders.h>
#include <zwidget/window/zvulkanwidget.h>

GameWindow::GameWindow(GameWindowHost* windowHost) : Widget(nullptr, WidgetType::Window, RenderAPI::Vulkan), windowHost(windowHost)
{
std::shared_ptr<VulkanInstance> instance = CreateZVulkanInstanceBuilder(this)
std::shared_ptr<VulkanInstance> instance = VulkanInstanceBuilder()
.RequireExtensions(GetVulkanInstanceExtensions())
.OptionalSwapchainColorspace()
.DebugLayer(false)
.Create();

std::shared_ptr<VulkanSurface> surface = CreateZVulkanSurface(this, instance);
auto surface = std::make_shared<VulkanSurface>(instance, CreateVulkanSurface(instance->Instance));
if (!surface)
Exception::Throw("No vulkan surface found");

Expand Down
6 changes: 3 additions & 3 deletions SurrealEngine/UI/Editor/EditorMainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@
#include "RenderDevice/RenderDevice.h"
#include <zvulkan/vulkansurface.h>
#include <zvulkan/vulkanbuilders.h>
#include <zwidget/window/zvulkanwidget.h>
#include <zwidget/widgets/menubar/menubar.h>
#include <zwidget/widgets/toolbar/toolbar.h>

EditorMainWindow::EditorMainWindow() : MainWindow(RenderAPI::Vulkan)
{
std::shared_ptr<VulkanInstance> instance = CreateZVulkanInstanceBuilder(this)
std::shared_ptr<VulkanInstance> instance = VulkanInstanceBuilder()
.RequireExtensions(GetVulkanInstanceExtensions())
.OptionalSwapchainColorspace()
.DebugLayer(false)
.Create();

std::shared_ptr<VulkanSurface> surface = CreateZVulkanSurface(this, instance);
auto surface = std::make_shared<VulkanSurface>(instance, CreateVulkanSurface(instance->Instance));
if (!surface)
Exception::Throw("No vulkan surface found");

Expand Down
1 change: 0 additions & 1 deletion Thirdparty/ZWidget/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ set(ZWIDGET_INCLUDES
include/zwidget/window/waylandnativehandle.h
include/zwidget/window/win32nativehandle.h
include/zwidget/window/sdl2nativehandle.h
include/zwidget/window/zvulkanwidget.h
include/zwidget/systemdialogs/open_folder_dialog.h
include/zwidget/systemdialogs/open_file_dialog.h
include/zwidget/systemdialogs/save_file_dialog.h
Expand Down
6 changes: 5 additions & 1 deletion Thirdparty/ZWidget/include/zwidget/core/widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ class Widget : DisplayWindowHost
void SetVisible(bool enable) { if (enable) Show(); else Hide(); }
void Show();
void ShowFullscreen();
bool IsFullscreen();
void ShowMaximized();
void ShowMinimized();
void ShowNormal();
Expand All @@ -105,6 +104,7 @@ class Widget : DisplayWindowHost
bool IsEnabled();
bool IsVisible();
bool IsHidden();
bool IsFullscreen();

void SetFocus();
void SetEnabled(bool value);
Expand Down Expand Up @@ -155,6 +155,10 @@ class Widget : DisplayWindowHost
int GetNativePixelWidth();
int GetNativePixelHeight();

// Vulkan support:
std::vector<std::string> GetVulkanInstanceExtensions() { return Window()->DispWindow->GetVulkanInstanceExtensions(); }
VkSurfaceKHR CreateVulkanSurface(VkInstance instance) { return Window()->DispWindow->CreateVulkanSurface(instance); }

protected:
virtual void OnPaintFrame(Canvas* canvas);
virtual void OnPaint(Canvas* canvas) { }
Expand Down
18 changes: 0 additions & 18 deletions Thirdparty/ZWidget/include/zwidget/window/sdl2nativehandle.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,8 @@

struct SDL_Window;

#ifndef VULKAN_H_

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;

#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
#else
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
#endif

VK_DEFINE_HANDLE(VkInstance)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)

#endif

class SDL2NativeHandle
{
public:
SDL_Window* window = nullptr;

std::vector<std::string> VulkanGetInstanceExtensions();
VkSurfaceKHR VulkanCreateSurface(VkInstance instance);
};
18 changes: 18 additions & 0 deletions Thirdparty/ZWidget/include/zwidget/window/window.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@
#include <cstdlib>
#include "../core/rect.h"

#ifndef VULKAN_H_

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;

#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object;
#else
#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object;
#endif

VK_DEFINE_HANDLE(VkInstance)
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR)

#endif

class Widget;
class OpenFileDialog;
class SaveFileDialog;
Expand Down Expand Up @@ -187,6 +202,9 @@ class DisplayWindow
virtual void SetClipboardText(const std::string& text) = 0;

virtual void* GetNativeHandle() = 0;

virtual std::vector<std::string> GetVulkanInstanceExtensions() = 0;
virtual VkSurfaceKHR CreateVulkanSurface(VkInstance instance) = 0;
};

class DisplayBackend
Expand Down
87 changes: 0 additions & 87 deletions Thirdparty/ZWidget/include/zwidget/window/zvulkanwidget.h

This file was deleted.

2 changes: 1 addition & 1 deletion Thirdparty/ZWidget/src/core/nanosvg/nanosvgrast.h
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ static float nsvg__normalize(float *x, float* y)
}

static float nsvg__absf(float x) { return x < 0 ? -x : x; }
static float nsvg__roundf(float x) { return (x >= 0) ? floorf(x + 0.5) : ceilf(x - 0.5); }
static float nsvg__roundf(float x) { return (x >= 0) ? (float)floorf(x + 0.5f) : (float)ceilf(x - 0.5f); }

static void nsvg__flattenCubicBez(NSVGrasterizer* r,
float x1, float y1, float x2, float y2,
Expand Down
20 changes: 13 additions & 7 deletions Thirdparty/ZWidget/src/core/widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ Widget::Widget(Widget* parent, WidgetType type, RenderAPI renderAPI) : Type(type
{
Widget* owner = parent ? parent->Window() : nullptr;
DispWindow = DisplayWindow::Create(this, type == WidgetType::Popup, owner ? owner->DispWindow.get() : nullptr, renderAPI);
DispCanvas = Canvas::create();
DispCanvas->attach(DispWindow.get());
if (renderAPI == RenderAPI::Unspecified || renderAPI == RenderAPI::Bitmap)
{
DispCanvas = Canvas::create();
DispCanvas->attach(DispWindow.get());
}
SetStyleState("root");

SetWindowBackground(GetStyleColor("window-background"));
Expand Down Expand Up @@ -47,7 +50,8 @@ void Widget::SetCanvas(std::unique_ptr<Canvas> canvas)
{
if (DispWindow)
{
DispCanvas->detach();
if (DispCanvas)
DispCanvas->detach();
DispCanvas = std::move(canvas);
DispCanvas->attach(DispWindow.get());
}
Expand Down Expand Up @@ -224,7 +228,6 @@ bool Widget::IsFullscreen()
{
return DispWindow->IsWindowFullscreen();
}

return false;
}

Expand Down Expand Up @@ -331,9 +334,12 @@ void Widget::Update()
void Widget::Repaint()
{
Widget* w = Window();
w->DispCanvas->begin(WindowBackground);
w->Paint(w->DispCanvas.get());
w->DispCanvas->end();
if (w->DispCanvas)
{
w->DispCanvas->begin(WindowBackground);
w->Paint(w->DispCanvas.get());
w->DispCanvas->end();
}
}

void Widget::Paint(Canvas* canvas)
Expand Down
2 changes: 1 addition & 1 deletion Thirdparty/ZWidget/src/widgets/listview/listview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void ListView::RemoveItem(int index)

if (selectedItem == items.size())
{
selectedItem = !items.empty() ? items.size() - 1 : 0;
selectedItem = !items.empty() ? (int)items.size() - 1 : 0;
}
}

Expand Down
26 changes: 26 additions & 0 deletions Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

#include "sdl2_display_window.h"
#include <stdexcept>
#include <SDL2/SDL_vulkan.h>

Uint32 SDL2DisplayWindow::PaintEventNumber = 0xffffffff;
bool SDL2DisplayWindow::ExitRunLoop;
Expand Down Expand Up @@ -33,8 +34,10 @@ SDL2DisplayWindow::SDL2DisplayWindow(DisplayWindowHost* windowHost, bool popupWi
flags |= SDL_WINDOW_VULKAN;
else if (renderAPI == RenderAPI::OpenGL)
flags |= SDL_WINDOW_OPENGL;
#if defined(__APPLE__)
else if (renderAPI == RenderAPI::Metal)
flags |= SDL_WINDOW_METAL;
#endif
if (popupWindow)
flags |= SDL_WINDOW_BORDERLESS;

Expand Down Expand Up @@ -73,6 +76,29 @@ SDL2DisplayWindow::~SDL2DisplayWindow()
Handle.window = nullptr;
}

std::vector<std::string> SDL2DisplayWindow::GetVulkanInstanceExtensions()
{
unsigned int extCount = 0;
SDL_Vulkan_GetInstanceExtensions(Handle.window, &extCount, nullptr);
std::vector<const char*> extNames(extCount);
SDL_Vulkan_GetInstanceExtensions(Handle.window, &extCount, extNames.data());

std::vector<std::string> result;
result.reserve(extNames.size());
for (const char* ext : extNames)
result.emplace_back(ext);
return result;
}

VkSurfaceKHR SDL2DisplayWindow::CreateVulkanSurface(VkInstance instance)
{
VkSurfaceKHR surfaceHandle = {};
SDL_Vulkan_CreateSurface(Handle.window, instance, &surfaceHandle);
if (surfaceHandle)
throw std::runtime_error("Could not create vulkan surface");
return surfaceHandle;
}

void SDL2DisplayWindow::SetWindowTitle(const std::string& text)
{
SDL_SetWindowTitle(Handle.window, text.c_str());
Expand Down
6 changes: 4 additions & 2 deletions Thirdparty/ZWidget/src/window/sdl2/sdl2_display_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ class SDL2DisplayWindow : public DisplayWindow

void* GetNativeHandle() override { return &Handle; }

std::vector<std::string> GetVulkanInstanceExtensions() override;
VkSurfaceKHR CreateVulkanSurface(VkInstance instance) override;

static void DispatchEvent(const SDL_Event& event);
static SDL2DisplayWindow* FindEventWindow(const SDL_Event& event);

Expand Down Expand Up @@ -93,10 +96,9 @@ class SDL2DisplayWindow : public DisplayWindow
int BackBufferHeight = 0;

bool CursorLocked = false;
bool isFullscreen = false;

static bool ExitRunLoop;
static Uint32 PaintEventNumber;
static std::unordered_map<int, SDL2DisplayWindow*> WindowList;

bool isFullscreen = false;
};
Loading

0 comments on commit f73fe21

Please sign in to comment.