add Quad struct utilities

This commit is contained in:
Rokas Puzonas 2026-07-10 02:16:37 +03:00
parent 963041cd4c
commit 6a894ac4b2

View File

@ -252,16 +252,6 @@ pub fn endFrame() void {
sg.commit();
}
pub fn drawQuad(quad: Quad) void {
const self = &g_state;
if (self.quads.items.len == self.quads.capacity) {
flush();
}
self.quads.appendAssumeCapacity(quad);
}
pub fn drawRectangle(pos: Vec2, size: Vec2, color: Color) void {
const self = &g_state;
@ -269,6 +259,8 @@ pub fn drawRectangle(pos: Vec2, size: Vec2, color: Color) void {
}
pub fn drawLine(from: Vec2, to: Vec2, color: Vec4, width: f32) void {
const self = &g_state;
const step = to.sub(from).normalized().multiplyScalar(width/2);
const top_left = from.add(step.rotateLeft90());
@ -276,27 +268,17 @@ pub fn drawLine(from: Vec2, to: Vec2, color: Vec4, width: f32) void {
const top_right = to.add(step.rotateLeft90());
const bottom_right = to.add(step.rotateRight90());
drawQuad(Quad{
Vertex{
.position = top_right,
.color = color,
.texcoord = .init(0, 0)
},
Vertex{
.position = top_left,
.color = color,
.texcoord = .init(1, 0)
},
Vertex{
.position = bottom_right,
.color = color,
.texcoord = .init(0, 1)
},
Vertex{
.position = bottom_left,
.color = color,
.texcoord = .init(1, 1)
},
var quad: Quad = undefined;
quad.setColor(color);
quad.setUVRect(.init(0, 0), .init(1, 1));
quad.vertices[0] = top_right;
quad.vertices[1] = top_left;
quad.vertices[2] = bottom_right;
quad.vertices[3] = bottom_left;
draw(.{
.texture = self.default_texture,
.quad = quad
});
}
@ -366,13 +348,30 @@ pub fn setTexture(id: TextureId, rgba8_pixels: [*]const u8, width: u32, height:
}
pub fn drawTexture(id: TextureId, pos: Vec2, size: Vec2, color: Color) void {
var quad: Quad = undefined;
quad.setColor(color);
quad.setRect(pos, size);
quad.setUVRect(.init(0, 0), .init(1, 1));
draw(.{
.texture = id,
.quad = quad
});
}
const DrawOptions = struct {
texture: TextureId,
quad: Quad
};
pub fn draw(opts: DrawOptions) void {
const self = &g_state;
if (!self.textures_slotmap.exists(id)) {
if (!self.textures_slotmap.exists(opts.texture)) {
// TODO: Draw purple-black texture
return;
}
const texture = self.textures_buffer[id.index];
const texture = self.textures_buffer[opts.texture.index];
const bound_view = &self.bindings.views[shd.VIEW_tex];
if (bound_view.id != texture.view.id) {
@ -380,34 +379,11 @@ pub fn drawTexture(id: TextureId, pos: Vec2, size: Vec2, color: Color) void {
bound_view.* = texture.view;
}
const color_vec4 = Vec4{
.x = color.r,
.y = color.g,
.z = color.b,
.w = color.a,
};
drawQuad(Quad{
Vertex{
.position = pos,
.color = color_vec4,
.texcoord = .init(0, 0)
},
Vertex{
.position = pos.add(.{ .x = size.x, .y = 0 }),
.color = color_vec4,
.texcoord = .init(1, 0)
},
Vertex{
.position = pos.add(.{ .x = 0, .y = size.y }),
.color = color_vec4,
.texcoord = .init(0, 1)
},
Vertex{
.position = pos.add(size),
.color = color_vec4,
.texcoord = .init(1, 1)
},
});
if (self.quads.items.len == self.quads.capacity) {
flush();
}
self.quads.appendAssumeCapacity(opts.quad);
}
const Texture = struct {
@ -415,53 +391,43 @@ const Texture = struct {
view: sg.View,
};
// const SlotMap = SlotMapType(u16, u8);
//
// const TextureId = u64;
//
// pub const Interface = struct {
// clear_color: Color,
//
// quads: std.ArrayList(Quad),
// quads_overflow: bool,
//
// commands: std.ArrayList(Command),
// commands_overflow: bool,
//
// // blob: std.ArrayList(u8),
// // blob_overflow: bool,
//
// fn pushCommand(self: *Interface, cmd: Command) void {
// self.commands.appendBounded(cmd) catch {
// if (!self.commands_overflow) {
// log.err("max commands reached, limit: {}", .{self.commands.capacity});
// }
// self.commands_overflow = true;
// };
// }
//
// pub fn createTexture(self: *Interface) void {
// _ = self; // autofix
// }
//
// pub fn destroyTexture(self: *Interface) void {
// _ = self; // autofix
// }
//
// pub fn setTextureData(self: *Interface, rgba8_pixels: [*]u8, width: u32, height: u32) void {
// _ = rgba8_pixels; // autofix
// _ = width; // autofix
// _ = height; // autofix
// _ = self; // autofix
// }
//
// }
// };
pub const Vertex = extern struct {
position: Vec2,
texcoord: Vec2,
color: Vec4,
};
pub const Quad = [4]Vertex;
pub const Quad = extern struct {
vertices: [4]Vertex,
pub fn init(vertices: [4]Vertex) Quad {
return Quad{
.vertices = vertices
};
}
pub fn setColor(self: *Quad, color: Color) void {
for (&self.vertices) |*vertex| {
vertex.color = Vec4{
.x = color.r,
.y = color.g,
.z = color.b,
.w = color.a,
};
}
}
pub fn setUVRect(self: *Quad, pos: Vec2, size: Vec2) void {
self.vertices[0].texcoord = pos;
self.vertices[1].texcoord = pos.add(.init(size.x, 0));
self.vertices[2].texcoord = pos.add(.init(0, size.y));
self.vertices[3].texcoord = pos.add(size);
}
pub fn setRect(self: *Quad, pos: Vec2, size: Vec2) void {
self.vertices[0].position = pos;
self.vertices[1].position = pos.add(.init(size.x, 0));
self.vertices[2].position = pos.add(.init(0, size.y));
self.vertices[3].position = pos.add(size);
}
};