From ce70efd771abfcc6b3c554c2025fcb6e8147a0c8 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 14 Apr 2022 17:44:40 -0700 Subject: [PATCH] render a rainbow grid --- shaders/cell.v.glsl | 9 ++++++++- src/App.zig | 2 +- src/Grid.zig | 46 +++++++++++++++++++++++++++++++++++++-------- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/shaders/cell.v.glsl b/shaders/cell.v.glsl index 5cc0c4c01..2696a8dde 100644 --- a/shaders/cell.v.glsl +++ b/shaders/cell.v.glsl @@ -12,6 +12,13 @@ flat out vec4 bg_color; uniform vec2 cell_dims; uniform mat4 projection; +vec3 hsv2rgb(vec3 c) +{ + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} + void main() { // Top-left cell coordinates converted to world space vec2 cell_pos = cell_dims * grid_coord; @@ -27,5 +34,5 @@ void main() { cell_pos = cell_pos + cell_dims * position; gl_Position = projection * vec4(cell_pos, 1.0, 1.0); - bg_color = bg_color_in; + bg_color = vec4(hsv2rgb(bg_color_in.rgb), 1.0); } diff --git a/src/App.zig b/src/App.zig index 4838f1ca8..f46ad09b0 100644 --- a/src/App.zig +++ b/src/App.zig @@ -58,7 +58,7 @@ pub fn init(alloc: Allocator) !App { var texter = try TextRenderer.init(alloc); errdefer texter.deinit(alloc); - const grid = try Grid.init(alloc); + var grid = try Grid.init(alloc); try grid.setScreenSize(.{ .width = 3000, .height = 1666 }); window.setSizeCallback((struct { diff --git a/src/Grid.zig b/src/Grid.zig index e01b6dcb5..88826a7ea 100644 --- a/src/Grid.zig +++ b/src/Grid.zig @@ -36,9 +36,14 @@ const ScreenDim = struct { height: i32, }; +alloc: std.mem.Allocator, + /// Current cell dimensions for this grid. cell_dims: CellDim, +columns: u32 = 0, +rows: u32 = 0, + /// Shader program for cell rendering. program: gl.Program, @@ -93,6 +98,7 @@ pub fn init(alloc: Allocator) !Grid { try program.setUniform("cell_dims", @Vector(2, f32){ cell_width, cell_height }); return Grid{ + .alloc = alloc, .cell_dims = .{ .width = cell_width, .height = cell_height }, .program = program, }; @@ -100,7 +106,7 @@ pub fn init(alloc: Allocator) !Grid { /// Set the screen size for rendering. This will update the projection /// used for the shader so that the scaling of the grid is correct. -pub fn setScreenSize(self: Grid, dim: ScreenDim) !void { +pub fn setScreenSize(self: *Grid, dim: ScreenDim) !void { // Create a 2D orthographic projection matrix with the full width/height. var projection: gb.gbMat4 = undefined; gb.gb_mat4_ortho2d( @@ -111,12 +117,18 @@ pub fn setScreenSize(self: Grid, dim: ScreenDim) !void { 0, ); + self.columns = @floatToInt(u32, @intToFloat(f32, dim.width) / self.cell_dims.width); + self.rows = @floatToInt(u32, @intToFloat(f32, dim.height) / self.cell_dims.width); + // Update the projection uniform within our shader const bind = try self.program.use(); defer bind.unbind(); try self.program.setUniform("projection", projection); - log.debug("screen size w={d} h={d}", .{ dim.width, dim.height }); + log.debug("screen size w={d} h={d} cols={d} rows={d}", .{ + dim.width, dim.height, + self.columns, self.rows, + }); } pub fn render(self: Grid) !void { @@ -138,16 +150,34 @@ pub fn render(self: Grid) !void { 1, 2, 3, }, .StaticDraw); + // Build our data + var vertices: std.ArrayListUnmanaged([6]f32) = .{}; + try vertices.ensureUnusedCapacity(self.alloc, self.columns * self.rows); + defer vertices.deinit(self.alloc); + var row: u32 = 0; + while (row < self.rows) : (row += 1) { + var col: u32 = 0; + while (col < self.columns) : (col += 1) { + const rowf = @intToFloat(f32, row); + const colf = @intToFloat(f32, col); + const hue = ((colf * @intToFloat(f32, self.rows)) + rowf) / @intToFloat(f32, self.columns * self.rows); + vertices.appendAssumeCapacity([6]f32{ + colf, + rowf, + hue, + 0.7, + 0.8, + 1.0, + }); + } + } + // Vertex buffer (VBO) const vbo = try gl.Buffer.create(); defer vbo.destroy(); var binding = try vbo.bind(.ArrayBuffer); defer binding.unbind(); - try binding.setData([_][6]f32{ - .{ 0, 0, 1, 0, 0, 1 }, - .{ 1, 0, 0, 1, 0, 1 }, - .{ 2, 0, 0, 0, 1, 1 }, - }, .StaticDraw); + try binding.setData(vertices.items, .StaticDraw); try binding.attribute(0, 2, [6]f32, 0); try binding.attribute(1, 4, [6]f32, 2); try binding.attributeDivisor(0, 1); @@ -157,7 +187,7 @@ pub fn render(self: Grid) !void { gl.c.GL_TRIANGLES, 6, gl.c.GL_UNSIGNED_INT, - 3, + vertices.items.len, ); try gl.VertexArray.unbind(); }