better DiligentEngine GLTF interface
s-ol
2 years ago
0 | 0 | const std = @import("std"); |
1 | 1 | const mem = std.mem; |
2 | 2 | |
3 | fn getImports(interfaces: []const []const u8) type { | |
3 | fn getImports(headers: []const []const u8) type { | |
4 | 4 | return @cImport({ |
5 | 5 | @cDefine("DILIGENT_C_API", "1"); |
6 | 6 | @cDefine("PLATFORM_LINUX", "1"); |
7 | 7 | @cInclude("vulkan/vulkan_core.h"); |
8 | for (interfaces) |interface| { | |
9 | @cInclude(interface); | |
8 | for (headers) |header| { | |
9 | @cInclude(header); | |
10 | 10 | } |
11 | 11 | }); |
12 | 12 | } |
13 | 13 | |
14 | fn generateCImport(writer: anytype, interfaces: []const []const u8) !void { | |
14 | fn generateCImport(writer: anytype, headers: []const []const u8) !void { | |
15 | 15 | try writer.writeAll( |
16 | 16 | \\usingnamespace @cImport({ |
17 | 17 | \\ @cDefine("DILIGENT_C_API", "1"); |
18 | 18 | \\ @cDefine("PLATFORM_LINUX", "1"); |
19 | 19 | \\ @cInclude("vulkan/vulkan_core.h"); |
20 | 20 | ); |
21 | for (interfaces) |interface| { | |
22 | try writer.print("\n @cInclude(\"{}\");", .{interface}); | |
21 | for (headers) |header| { | |
22 | try writer.print("\n @cInclude(\"{}\");", .{header}); | |
23 | 23 | } |
24 | 24 | try writer.writeAll("\n});\n"); |
25 | 25 | } |
94 | 94 | try writer.writeAll("};\n"); |
95 | 95 | } |
96 | 96 | |
97 | pub fn generate(comptime interfaces: []const []const u8, writer: anytype) !void { | |
98 | const c = getImports(interfaces); | |
99 | try generateCImport(writer, interfaces); | |
97 | pub fn generate( | |
98 | comptime headers: []const []const u8, | |
99 | comptime interfaces: []const []const u8, | |
100 | writer: anytype, | |
101 | ) !void { | |
102 | const c = getImports(headers); | |
103 | try generateCImport(writer, headers); | |
100 | 104 | |
101 | 105 | inline for (interfaces) |interface| { |
102 | 106 | @setEvalBranchQuota(10000); |
103 | 107 | |
104 | // e.g. "Graphics/GraphicsEngineVulkan/interface/EngineFactoryVk.h" | |
105 | const name = comptime blk: { | |
106 | const basename = std.fs.path.basenamePosix(interface); | |
107 | var name_buffer = [_]u8{0} ** 256; | |
108 | break :blk try std.fmt.bufPrint(name_buffer[0..], "I{}", .{basename[0 .. basename.len - 2]}); | |
109 | }; | |
110 | ||
111 | if (@hasDecl(c, name)) { | |
112 | try generateWrapper(@field(c, name), name, writer); | |
113 | } | |
108 | try generateWrapper(@field(c, interface), interface, writer); | |
114 | 109 | } |
115 | 110 | } |
116 | 111 | |
117 | 112 | pub fn main() !void { |
118 | comptime const interfaces = [_][]const u8{ | |
113 | comptime const headers = [_][]const u8{ | |
119 | 114 | "Graphics/GraphicsEngine/interface/DeviceContext.h", |
120 | 115 | "Graphics/GraphicsEngine/interface/PipelineState.h", |
121 | 116 | "Graphics/GraphicsEngine/interface/ShaderResourceVariable.h", |
128 | 123 | "Graphics/GraphicsEngineVulkan/interface/SwapChainVk.h", |
129 | 124 | "TextureLoader/interface/TextureLoader.h", |
130 | 125 | "TextureLoader/interface/TextureUtilities.h", |
131 | "AssetLoader/interface/GLTFModel.h", | |
126 | "AssetLoader/interface/GLTFLoader.h", | |
132 | 127 | "GLTF_PBR_Renderer/interface/GLTF_PBR_Renderer.h", |
128 | }; | |
129 | ||
130 | comptime const interfaces = [_][]const u8{ | |
131 | "IDeviceContext", | |
132 | "IPipelineState", | |
133 | "IShaderResourceVariable", | |
134 | "IShaderResourceBinding", | |
135 | "IPipelineResourceSignature", | |
136 | "IBuffer", | |
137 | "ITexture", | |
138 | "IRenderDeviceVk", | |
139 | "IEngineFactoryVk", | |
140 | "ISwapChainVk", | |
141 | "IGLTFModel", | |
142 | "IGLTF_PBR_Renderer", | |
133 | 143 | }; |
134 | 144 | |
135 | 145 | const first_arg = std.os.argv[1]; |
136 | 146 | const output_file = try std.fs.createFileAbsolute(first_arg[0..mem.len(first_arg)], .{ .truncate = true }); |
137 | 147 | defer output_file.close(); |
138 | 148 | |
139 | try generate(interfaces[0..], output_file.writer()); | |
149 | try generate(headers[0..], interfaces[0..], output_file.writer()); | |
140 | 150 | } |