From f880b428ff5735afd5d625645443474a03eb315c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Yaroslav=20de=20la=20Pe=C3=B1a=20Smirnov?=
 <yps@yaroslavps.com>
Date: Sat, 21 Sep 2024 21:17:50 +0300
Subject: gl: square

---
 src/main.zig | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)

(limited to 'src')

diff --git a/src/main.zig b/src/main.zig
index 7543090..13ff58b 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -70,7 +70,7 @@ fn checkGlError(
     const err = success == 0;
     if (err) {
         getLogFn(obj, 512, null, &gl_log);
-        std.debug.print("Shader compilation error: {s}\n", .{gl_log});
+        std.debug.print("OpenGL shader error: {s}\n", .{gl_log});
     }
     return err;
 }
@@ -117,11 +117,23 @@ pub const Window = struct {
     /// OpenGl triangle shader program
     shader_prog: c_uint = undefined,
     /// Triangle vertices
-    vertices: [9]f32,
+    vertices: [12]f32 = .{
+        -0.5, -0.5, 0.0, // bl
+        0.5,  -0.5, 0.0, // br
+        0.5,   0.5, 0.0, // tr
+        -0.5,  0.5, 0.0, // tl
+    },
+    /// Triangles indices
+    indices: [6]c_uint = .{
+        0, 1, 2,
+        2, 3, 0,
+    },
     /// OpenGL vertex buffer object
     vbo: c_uint = undefined,
     /// OpenGL vertex array object
     vao: c_uint = undefined,
+    // OpenGL element buffer object
+    ebo: c_uint = undefined,
     /// This window's title
     title: [*:0]const u8,
     /// Width in pixels
@@ -147,11 +159,6 @@ pub const Window = struct {
             .allocator = allocator,
             .wl_surface = try compositor.createSurface(),
             .title = title,
-            .vertices = .{
-                -0.5, -0.5, 0.0,
-                0.5,  -0.5, 0.0,
-                0.0,  0.5,  0.0,
-            },
         };
         win.xdg_surface = try wm_base.getXdgSurface(win.wl_surface);
         errdefer win.xdg_surface.destroy();
@@ -187,6 +194,7 @@ pub const Window = struct {
 
         c.glGenVertexArrays(1, &win.vao);
         c.glGenBuffers(1, &win.vbo);
+        c.glGenBuffers(1, &win.ebo);
 
         c.glBindVertexArray(win.vao);
 
@@ -198,6 +206,14 @@ pub const Window = struct {
             c.GL_STATIC_DRAW,
         );
 
+        c.glBindBuffer(c.GL_ELEMENT_ARRAY_BUFFER, win.ebo);
+        c.glBufferData(
+            c.GL_ELEMENT_ARRAY_BUFFER,
+            @sizeOf(@TypeOf(win.indices)),
+            &win.indices,
+            c.GL_STATIC_DRAW,
+        );
+
         c.glVertexAttribPointer(0, 3, c.GL_FLOAT, c.GL_FALSE, 3 * @sizeOf(f32), null);
         c.glEnableVertexAttribArray(0);
 
@@ -240,7 +256,7 @@ pub const Window = struct {
 
         c.glUseProgram(win.shader_prog);
         c.glBindVertexArray(win.vao);
-        c.glDrawArrays(c.GL_TRIANGLES, 0, 3);
+        c.glDrawElements(c.GL_TRIANGLES, 6, c.GL_UNSIGNED_INT, null);
 
         try egl_display.swapBuffers(win.egl_surface);
     }
-- 
cgit v1.2.3