renderer-mvp/asset-pipeline #53

Merged
kayomn merged 6 commits from renderer-mvp/asset-pipeline into main 2024-06-23 04:37:40 +02:00
4 changed files with 43 additions and 30 deletions
Showing only changes of commit 4125aa0ddb - Show all commits

View File

@ -2,12 +2,12 @@ const App = @import("./App.zig");
const coral = @import("coral");
const formats = @import("./gfx/formats.zig");
const device = @import("./gfx/device.zig");
const ext = @import("./ext.zig");
const formats = @import("./gfx/formats.zig");
const msg = @import("./msg.zig");
const std = @import("std");
@ -19,10 +19,10 @@ pub const Assets = struct {
pub const Format = struct {
extension: []const u8,
open_file: *const fn (*std.heap.ArenaAllocator, []const u8) Error!Desc,
file_desc: *const fn (*std.heap.ArenaAllocator, []const u8) Error!Desc,
pub const Error = std.mem.Allocator.Error || coral.files.Error || error {
Unsupported,
FormatUnsupported,
};
};
@ -40,7 +40,7 @@ pub const Assets = struct {
continue;
}
return self.context.open(try format.open_file(&self.staging_arena, path));
return self.context.open(try format.file_desc(&self.staging_arena, path));
}
return .none;
@ -91,16 +91,12 @@ pub const Desc = union (enum) {
};
pub const Format = enum {
rgba8888,
bgra8888,
argb8888,
rgb888,
bgr888,
rgba8,
bgra8,
pub fn byte_size(self: Format) usize {
return switch (self) {
.rgba8888, .bgra8888, .argb8888 => 4,
.rgb888, .bgr888 => 3,
.rgba8, .bgra8 => 4,
};
}
};
@ -197,7 +193,7 @@ pub const Transform2D = extern struct {
const builtin_formats = [_]Assets.Format{
.{
.extension = "bmp",
.open_file = formats.load_bmp,
.file_desc = formats.bmp_file_desc,
},
};

View File

@ -253,6 +253,11 @@ const Loop = struct {
break: get subimage;
},
},
.pixel_format = switch (texture.format) {
.rgba8 => .RGBA8,
.bgra8 => .BGRA8,
},
});
errdefer sokol.gfx.destroyImage(image);

View File

@ -4,7 +4,7 @@ const gfx = @import("../gfx.zig");
const std = @import("std");
pub fn load_bmp(arena: *std.heap.ArenaAllocator, path: []const u8) gfx.Assets.Format.Error!gfx.Desc {
pub fn bmp_file_desc(arena: *std.heap.ArenaAllocator, path: []const u8) gfx.Assets.Format.Error!gfx.Desc {
const header = try coral.files.bundle.read_little(path, 0, extern struct {
type: [2]u8 align (1),
file_size: u32 align (1),
@ -22,15 +22,15 @@ pub fn load_bmp(arena: *std.heap.ArenaAllocator, path: []const u8) gfx.Assets.Fo
palette_colors_used: u32 align (1),
important_colors_used: u32 align (1),
}) orelse {
return error.Unsupported;
return error.FormatUnsupported;
};
if (!std.mem.eql(u8, &header.type, "BM")) {
return error.Unsupported;
return error.FormatUnsupported;
}
const pixel_width = std.math.cast(u16, header.pixel_width) orelse {
return error.Unsupported;
return error.FormatUnsupported;
};
const pixels = try arena.allocator().alloc(coral.io.Byte, header.image_size);
@ -42,27 +42,35 @@ pub fn load_bmp(arena: *std.heap.ArenaAllocator, path: []const u8) gfx.Assets.Fo
var buffer_offset: usize = 0;
var file_offset = @as(usize, header.image_offset);
switch (header.bits_per_pixel) {
32 => {
while (buffer_offset < pixels.len) {
const line = pixels[buffer_offset .. buffer_offset + byte_stride];
if (try coral.files.bundle.read_bytes(path, file_offset, line) != byte_stride) {
return error.Unsupported;
return error.FormatUnsupported;
}
file_offset = line.len + byte_padding;
for (0 .. pixel_width) |i| {
const line_offset = i * 4;
const pixel = line[line_offset .. line_offset + 4];
std.mem.swap(u8, &pixel[0], &pixel[2]);
}
file_offset += line.len + byte_padding;
buffer_offset += padded_byte_stride;
}
},
else => return error.FormatUnsupported,
}
return .{
.texture = .{
.format = switch (header.bits_per_pixel) {
24 => .bgr888,
32 => .bgra8888,
else => return error.Unsupported,
},
.width = pixel_width,
.data = pixels,
.format = .rgba8,
.access = .static,
}
};

View File

@ -51,6 +51,10 @@ out vec4 texel;
void main() {
texel = texture(sampler2D(tex, smp), uv) * color;
if (texel.a == 0) {
discard;
}
}
@end