Adds SDL3 backend

This commit is contained in:
Mason Remaley 2025-09-07 18:20:13 -07:00
parent cfa032b789
commit fb66226b4a
6 changed files with 59 additions and 4 deletions

View file

@ -18,7 +18,9 @@ The static library for Dear ImGui, and supported backends, are provided as artif
## How to use the backends ## How to use the backends
Right now, this package only exports the Vulkan backend: `dear_imgui_vulkan`. Right now, this package only exports the following backends:
* `dear_imgui_vulkan`
* `dear_imgui_sdl3`
Contributions are welcome if you'd like to add others. The process should be fairly straightforward. Contributions are welcome if you'd like to add others. The process should be fairly straightforward.

View file

@ -69,6 +69,26 @@ pub fn build(b: *std.Build) void {
dear_imgui_vulkan_lib.installHeadersDirectory(vulkan_headers.path("include"), "", .{}); dear_imgui_vulkan_lib.installHeadersDirectory(vulkan_headers.path("include"), "", .{});
b.installArtifact(dear_imgui_vulkan_lib); b.installArtifact(dear_imgui_vulkan_lib);
// Compile the SDL3 backend as a static library
const dear_imgui_sdl3_lib = b.addLibrary(.{
.name = "dear_imgui_vulkan",
.root_module = b.createModule(.{
.target = target,
.optimize = optimize_external,
}),
});
dear_imgui_sdl3_lib.linkLibrary(dear_imgui_lib);
dear_imgui_sdl3_lib.addCSourceFile(.{ .file = upstream.path("backends/imgui_impl_sdl3.cpp"), .flags = flags });
dear_imgui_sdl3_lib.addCSourceFile(.{ .file = b.path("src/cached/dcimgui_impl_sdl3.cpp"), .flags = flags });
dear_imgui_sdl3_lib.addIncludePath(upstream.path(""));
dear_imgui_sdl3_lib.addIncludePath(upstream.path("backends"));
const sdl = b.dependency("sdl", .{});
dear_imgui_sdl3_lib.addIncludePath(sdl.path("include"));
// dear_imgui_sdl3_lib.root_module.addCMacro("IMGUI_IMPL_VULKAN_NO_PROTOTYPES", "1"); // Assumed in generator // XXX: ...
dear_imgui_sdl3_lib.installHeadersDirectory(upstream.path("backends"), "", .{});
// dear_imgui_sdl3_lib.installHeadersDirectory(vulkan_headers.path("include"), "", .{}); // XXX: ...
b.installArtifact(dear_imgui_sdl3_lib);
// Compile the generator // Compile the generator
const generate_exe = b.addExecutable(.{ const generate_exe = b.addExecutable(.{
.name = "generate", .name = "generate",
@ -114,4 +134,17 @@ pub fn build(b: *std.Build) void {
}); });
dear_imgui_vulkan_zig_module.linkLibrary(dear_imgui_vulkan_lib); dear_imgui_vulkan_zig_module.linkLibrary(dear_imgui_vulkan_lib);
dear_imgui_vulkan_zig_module.addImport("dear_imgui", dear_imgui_zig_module); dear_imgui_vulkan_zig_module.addImport("dear_imgui", dear_imgui_zig_module);
// Generate Zig bindings for the SDL3 backend
const generate_sdl3 = b.addRunArtifact(generate_exe);
generate_sdl3.addFileArg(b.path("src/cached/dcimgui_impl_sdl3.json"));
const dear_imgui_sdl3_zig = generate_sdl3.addOutputFileArg("dear_imgui_impl_sdl3.zig");
generate_sdl3.addFileArg(b.path("src/templates/impl_sdl3_prefix.zig.template"));
generate_sdl3.addFileArg(b.path("src/templates/impl_sdl3_postfix.zig.template"));
const dear_imgui_sdl3_zig_module = b.addModule("dear_imgui_sdl3", .{
.root_source_file = dear_imgui_sdl3_zig,
.target = target,
.optimize = optimize,
});
dear_imgui_sdl3_zig_module.linkLibrary(dear_imgui_sdl3_lib);
} }

View file

@ -12,6 +12,11 @@
.url = "https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v1.4.313.tar.gz", .url = "https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/v1.4.313.tar.gz",
.hash = "N-V-__8AAPLT7gH4vgN7Xo6yZlOMrzllGbdvVxxhrwUvgI9r", .hash = "N-V-__8AAPLT7gH4vgN7Xo6yZlOMrzllGbdvVxxhrwUvgI9r",
}, },
.sdl = .{
.url = "https://github.com/libsdl-org/SDL/archive/refs/tags/release-3.2.14.tar.gz",
.hash = "N-V-__8AAHRriwPslozjEw46IksOzPlNxJRXM087krt8ynXh",
.version = "3.2.14",
},
}, },
.paths = .{ .paths = .{

View file

@ -97,6 +97,7 @@ const Header = struct {
const Type = struct { const Type = struct {
type_details: ?Details = null, type_details: ?Details = null,
description: Description, description: Description,
declaration: ?[]const u8 = null,
const Details = struct { const Details = struct {
flavour: enum { function_pointer }, flavour: enum { function_pointer },
@ -300,7 +301,11 @@ fn writeTypedefs(writer: anytype, header: *const Header, declarations: *const De
// Skip duplicate declarations (e.g. naming enums as ints in C) // Skip duplicate declarations (e.g. naming enums as ints in C)
if (declarations.contains(typedef.name)) continue; if (declarations.contains(typedef.name)) continue;
// Write the typedef // Skip redundant typedefs (comes up with `SDL_Event`)
if (typedef.type.declaration != null and
std.mem.eql(u8, typedef.name, typedef.type.declaration.?)) continue;
// Write the typedef prefix
try writer.writeAll("const "); try writer.writeAll("const ");
try writeTypeName(writer, typedef.name); try writeTypeName(writer, typedef.name);
try writer.writeAll(" = "); try writer.writeAll(" = ");
@ -893,7 +898,7 @@ fn writeTypeName(writer: anytype, raw: []const u8) !void {
// Backend prefixes // Backend prefixes
{ {
const prefixes: []const []const u8 = &.{ "_ImplVulkanH", "_ImplVulkan" }; const prefixes: []const []const u8 = &.{ "_ImplVulkanH", "_ImplVulkan", "_ImplSDL3" };
for (prefixes) |prefix| { for (prefixes) |prefix| {
if (std.mem.startsWith(u8, name, prefix)) { if (std.mem.startsWith(u8, name, prefix)) {
name = name[prefix.len..]; name = name[prefix.len..];
@ -956,7 +961,7 @@ fn writeFunctionName(writer: anytype, raw: []const u8) !void {
// Imgui prefixes // Imgui prefixes
{ {
const prefixes: []const []const u8 = &.{ "cImGui_ImplVulkan", "ImGui", "Im" }; const prefixes: []const []const u8 = &.{ "cImGui_ImplVulkan", "cImGui_ImplSDL3", "ImGui", "Im" };
for (prefixes) |prefix| { for (prefixes) |prefix| {
if (std.mem.startsWith(u8, name, prefix)) { if (std.mem.startsWith(u8, name, prefix)) {
name = name[prefix.len..]; name = name[prefix.len..];

View file

@ -0,0 +1,2 @@
};
}

View file

@ -0,0 +1,8 @@
const Options = struct {
SDLEvent: type,
};
pub fn get(options: Options) type {
const SDLEvent = options.SDLEvent;
return struct {