mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
opengl: VertexArray
This commit is contained in:
10
src/main.zig
10
src/main.zig
@ -50,11 +50,11 @@ pub fn main() !void {
|
|||||||
0.5, -0.5, 0.0, // right
|
0.5, -0.5, 0.0, // right
|
||||||
0.0, 0.5, 0.0, // top
|
0.0, 0.5, 0.0, // top
|
||||||
};
|
};
|
||||||
var vao: c_uint = undefined;
|
const vao = try gl.VertexArray.create();
|
||||||
|
defer vao.destroy();
|
||||||
var vbo: c_uint = undefined;
|
var vbo: c_uint = undefined;
|
||||||
c.glGenVertexArrays(1, &vao);
|
|
||||||
c.glGenBuffers(1, &vbo);
|
c.glGenBuffers(1, &vbo);
|
||||||
c.glBindVertexArray(vao);
|
try vao.bind();
|
||||||
|
|
||||||
c.glBindBuffer(c.GL_ARRAY_BUFFER, vbo);
|
c.glBindBuffer(c.GL_ARRAY_BUFFER, vbo);
|
||||||
c.glBufferData(
|
c.glBufferData(
|
||||||
@ -83,8 +83,8 @@ pub fn main() !void {
|
|||||||
c.glClearColor(0.2, 0.3, 0.3, 1.0);
|
c.glClearColor(0.2, 0.3, 0.3, 1.0);
|
||||||
c.glClear(c.GL_COLOR_BUFFER_BIT);
|
c.glClear(c.GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
c.glUseProgram(program.id);
|
try program.use();
|
||||||
c.glBindVertexArray(vao);
|
try vao.bind();
|
||||||
c.glDrawArrays(c.GL_TRIANGLES, 0, 3);
|
c.glDrawArrays(c.GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
// const pos = try window.getCursorPos();
|
// const pos = try window.getCursorPos();
|
||||||
|
@ -1,3 +1,14 @@
|
|||||||
|
//! OpenGL bindings.
|
||||||
|
//!
|
||||||
|
//! These are pupose-built for usage within this program. While they closely
|
||||||
|
//! align with the OpenGL C APIs, they aren't meant to be general purpose.
|
||||||
|
//! Certain use cases will CERTAINLY be sub-optimal by using these helpers
|
||||||
|
//! and should use the C API directly.
|
||||||
|
//!
|
||||||
|
//! For performance-intensive or unsupported aspects of OpenGL, the C
|
||||||
|
//! API is exposed via the `c` constant.
|
||||||
|
|
||||||
pub const c = @import("opengl/c.zig");
|
pub const c = @import("opengl/c.zig");
|
||||||
pub const Program = @import("opengl/Program.zig");
|
pub const Program = @import("opengl/Program.zig");
|
||||||
pub const Shader = @import("opengl/Shader.zig");
|
pub const Shader = @import("opengl/Shader.zig");
|
||||||
|
pub const VertexArray = @import("opengl/VertexArray.zig");
|
||||||
|
@ -10,7 +10,7 @@ const errors = @import("errors.zig");
|
|||||||
|
|
||||||
id: c.GLuint,
|
id: c.GLuint,
|
||||||
|
|
||||||
pub fn create() !Program {
|
pub inline fn create() !Program {
|
||||||
const id = c.glCreateProgram();
|
const id = c.glCreateProgram();
|
||||||
if (id == 0) try errors.mustError();
|
if (id == 0) try errors.mustError();
|
||||||
|
|
||||||
@ -18,12 +18,12 @@ pub fn create() !Program {
|
|||||||
return Program{ .id = id };
|
return Program{ .id = id };
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn attachShader(p: Program, s: Shader) !void {
|
pub inline fn attachShader(p: Program, s: Shader) !void {
|
||||||
c.glAttachShader(p.id, s.id);
|
c.glAttachShader(p.id, s.id);
|
||||||
try errors.getError();
|
try errors.getError();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn link(p: Program) !void {
|
pub inline fn link(p: Program) !void {
|
||||||
c.glLinkProgram(p.id);
|
c.glLinkProgram(p.id);
|
||||||
|
|
||||||
// Check if linking succeeded
|
// Check if linking succeeded
|
||||||
@ -41,19 +41,23 @@ pub fn link(p: Program) !void {
|
|||||||
return error.CompileFailed;
|
return error.CompileFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub inline fn use(p: Program) !void {
|
||||||
|
c.glUseProgram(p.id);
|
||||||
|
}
|
||||||
|
|
||||||
/// getInfoLog returns the info log for this program. This attempts to
|
/// getInfoLog returns the info log for this program. This attempts to
|
||||||
/// keep the log fully stack allocated and is therefore limited to a max
|
/// keep the log fully stack allocated and is therefore limited to a max
|
||||||
/// amount of elements.
|
/// amount of elements.
|
||||||
//
|
//
|
||||||
// NOTE(mitchellh): we can add a dynamic version that uses an allocator
|
// NOTE(mitchellh): we can add a dynamic version that uses an allocator
|
||||||
// if we ever need it.
|
// if we ever need it.
|
||||||
pub fn getInfoLog(s: Program) [512]u8 {
|
pub inline fn getInfoLog(s: Program) [512]u8 {
|
||||||
var msg: [512]u8 = undefined;
|
var msg: [512]u8 = undefined;
|
||||||
c.glGetProgramInfoLog(s.id, msg.len, null, &msg);
|
c.glGetProgramInfoLog(s.id, msg.len, null, &msg);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn destroy(p: Program) void {
|
pub inline fn destroy(p: Program) void {
|
||||||
assert(p.id != 0);
|
assert(p.id != 0);
|
||||||
c.glDeleteProgram(p.id);
|
c.glDeleteProgram(p.id);
|
||||||
log.debug("program destroyed id={}", .{p.id});
|
log.debug("program destroyed id={}", .{p.id});
|
||||||
|
@ -9,7 +9,7 @@ const errors = @import("errors.zig");
|
|||||||
|
|
||||||
id: c.GLuint,
|
id: c.GLuint,
|
||||||
|
|
||||||
pub fn create(typ: c.GLenum) errors.Error!Shader {
|
pub inline fn create(typ: c.GLenum) errors.Error!Shader {
|
||||||
const id = c.glCreateShader(typ);
|
const id = c.glCreateShader(typ);
|
||||||
if (id == 0) {
|
if (id == 0) {
|
||||||
try errors.mustError();
|
try errors.mustError();
|
||||||
@ -21,7 +21,7 @@ pub fn create(typ: c.GLenum) errors.Error!Shader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Set the source and compile a shader.
|
/// Set the source and compile a shader.
|
||||||
pub fn setSourceAndCompile(s: Shader, source: [:0]const u8) !void {
|
pub inline fn setSourceAndCompile(s: Shader, source: [:0]const u8) !void {
|
||||||
c.glShaderSource(s.id, 1, &@ptrCast([*c]const u8, source), null);
|
c.glShaderSource(s.id, 1, &@ptrCast([*c]const u8, source), null);
|
||||||
c.glCompileShader(s.id);
|
c.glCompileShader(s.id);
|
||||||
|
|
||||||
@ -42,13 +42,13 @@ pub fn setSourceAndCompile(s: Shader, source: [:0]const u8) !void {
|
|||||||
//
|
//
|
||||||
// NOTE(mitchellh): we can add a dynamic version that uses an allocator
|
// NOTE(mitchellh): we can add a dynamic version that uses an allocator
|
||||||
// if we ever need it.
|
// if we ever need it.
|
||||||
pub fn getInfoLog(s: Shader) [512]u8 {
|
pub inline fn getInfoLog(s: Shader) [512]u8 {
|
||||||
var msg: [512]u8 = undefined;
|
var msg: [512]u8 = undefined;
|
||||||
c.glGetShaderInfoLog(s.id, msg.len, null, &msg);
|
c.glGetShaderInfoLog(s.id, msg.len, null, &msg);
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn destroy(s: Shader) void {
|
pub inline fn destroy(s: Shader) void {
|
||||||
assert(s.id != 0);
|
assert(s.id != 0);
|
||||||
c.glDeleteShader(s.id);
|
c.glDeleteShader(s.id);
|
||||||
log.debug("shader destroyed id={}", .{s.id});
|
log.debug("shader destroyed id={}", .{s.id});
|
||||||
|
21
src/opengl/VertexArray.zig
Normal file
21
src/opengl/VertexArray.zig
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const VertexArray = @This();
|
||||||
|
|
||||||
|
const c = @import("c.zig");
|
||||||
|
|
||||||
|
id: c.GLuint,
|
||||||
|
|
||||||
|
/// Create a single vertex array object.
|
||||||
|
pub inline fn create() !VertexArray {
|
||||||
|
var vao: c.GLuint = undefined;
|
||||||
|
c.glGenVertexArrays(1, &vao);
|
||||||
|
return VertexArray{ .id = vao };
|
||||||
|
}
|
||||||
|
|
||||||
|
/// glBindVertexArray
|
||||||
|
pub inline fn bind(v: VertexArray) !void {
|
||||||
|
c.glBindVertexArray(v.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub inline fn destroy(v: VertexArray) void {
|
||||||
|
c.glDeleteVertexArrays(1, &v.id);
|
||||||
|
}
|
Reference in New Issue
Block a user