All Projects → hexops → mach-glfw

hexops / mach-glfw

Licence: Unknown and 2 other licenses found Licenses found Unknown LICENSE Apache-2.0 LICENSE-APACHE MIT LICENSE-MIT
Ziggified GLFW bindings with 100% API coverage, zero-fuss installation, cross compilation, and more.

Programming Languages

Zig
133 projects

Projects that are alternatives of or similar to mach-glfw

ansi-term
Zig library for dealing with ANSI terminals
Stars: ✭ 25 (-86.56%)
Mutual labels:  ziglang, zig-package
qml zig
QML bindings for the Zig programming language
Stars: ✭ 25 (-86.56%)
Mutual labels:  ziglang, zig-package
zero-graphics
Application framework based on OpenGL ES 2.0. Runs on desktop machines, Android phones and the web
Stars: ✭ 72 (-61.29%)
Mutual labels:  ziglang, zig-package
SDL.zig
A shallow wrapper around SDL that provides object API and error handling
Stars: ✭ 102 (-45.16%)
Mutual labels:  ziglang, zig-package
IUPforZig
IUP (Portable User Interface Toolkit) bindings for the Zig language.
Stars: ✭ 56 (-69.89%)
Mutual labels:  ziglang, zig-package
zig-args
Simple-to-use argument parser with struct-based config
Stars: ✭ 106 (-43.01%)
Mutual labels:  ziglang, zig-package
zig-opengl
OpenGL binding generator based on the opengl registry
Stars: ✭ 29 (-84.41%)
Mutual labels:  ziglang, zig-package
zetaframe
lightweight zig game framework.
Stars: ✭ 14 (-92.47%)
Mutual labels:  ziglang, zig-package
zlm
Zig linear mathemathics
Stars: ✭ 67 (-63.98%)
Mutual labels:  ziglang, zig-package
glfw.github.io
Jekyll sources for GLFW website
Stars: ✭ 27 (-85.48%)
Mutual labels:  glfw
nuklear-glfw-vulkan
A nuklear adapter that does Vulkan rendering
Stars: ✭ 52 (-72.04%)
Mutual labels:  glfw
Berserk
[WIP] High performance 3D graphics game engine
Stars: ✭ 31 (-83.33%)
Mutual labels:  glfw
n8engine
An open-source C# game engine that's going to be the best thing ever.
Stars: ✭ 51 (-72.58%)
Mutual labels:  glfw
Spatial.Engine
[WIP] Spatial is a cross-platform C++ game engine.
Stars: ✭ 50 (-73.12%)
Mutual labels:  glfw
ImFrame
dear imgui + glfw framework
Stars: ✭ 86 (-53.76%)
Mutual labels:  glfw
sdk
TinyVG software development kit
Stars: ✭ 135 (-27.42%)
Mutual labels:  zig-package
Nimgl
NimGL is a Nim library that offers bindings for popular libraries used in computer graphics
Stars: ✭ 218 (+17.2%)
Mutual labels:  glfw
Glslviewer
Console-based GLSL Sandbox for 2D/3D shaders shaders
Stars: ✭ 2,834 (+1423.66%)
Mutual labels:  glfw
foxwren
Zig WebAssembly Runtime Engine
Stars: ✭ 126 (-32.26%)
Mutual labels:  ziglang
glfw-skeleton
💀 A skeleton OpenGL C++ app bootstrapped with glfw, glad, and glm.
Stars: ✭ 24 (-87.1%)
Mutual labels:  glfw

mach/glfw - Ziggified GLFW bindings CI Hexops logo

Ziggified GLFW bindings that Mach engine uses, with 100% API coverage, zero-fuss installation, cross compilation, and more.

This repository is a separate copy of the same library in the main Mach repository, and is automatically kept in sync, so that anyone can use this library in their own project / engine if they like!

Zero fuss installation, cross compilation, and more

Just as with Mach, you get zero fuss installation & cross compilation using these GLFW bindings. only zig and git are needed to build from any OS and produce binaries for every OS. No system dependencies at all.

100% API coverage, 130+ tests, etc.

These bindings have 100% API coverage of GLFW v3.3.4. Every function, type, constant, etc. has been wrapped in a ziggified API.

There are 130+ tests, and CI tests on all major platforms as well as cross-compilation between platforms:

platform support table

What does a ziggified GLFW API offer?

Why create a ziggified GLFW wrapper, instead of just using @cImport and interfacing with GLFW directly? You get:

  • Errors as zig errors instead of via a callback function.
  • true and false instead of c.GLFW_TRUE and c.GLFW_FALSE constants.
  • Generics, so you can just use window.hint instead of glfwWindowHint, glfwWindowHintString, etc.
  • Enums, always know what value a GLFW function can accept as everything is strictly typed. And use the nice Zig syntax to access enums, like window.getKey(.escape) instead of c.glfwGetKey(window, c.GLFW_KEY_ESCAPE)
  • Slices instead of C pointers and lengths.
  • packed structs represent bit masks, so you can use if (joystick.down and joystick.right) instead of if (joystick & c.GLFW_HAT_DOWN and joystick & c.GLFW_HAT_RIGHT), etc.
  • Methods, e.g. my_window.hint(...) instead of glfwWindowHint(my_window, ...)

How do I use OpenGL, Vulkan, WebGPU, etc. with this?

You'll need to bring your own library for this. Some are:

Examples

A minimal Vulkan example can be found in the mach-glfw-vulkan-example repository:

image

Getting started

Adding dependency (using Git)

In a libs subdirectory of the root of your project:

git clone https://github.com/hexops/mach-glfw

Then in your build.zig add:

...
const glfw = @import("libs/mach-glfw/build.zig");

pub fn build(b: *Builder) !void {
    ...
    exe.addPackage(glfw.pkg);
    try glfw.link(b, exe, .{});
}

(optional) Adding dependency using Gyro

gyro add --src github hexops/mach-glfw --root src/main.zig --alias glfw
gyro add --build_dep --src github hexops/mach-glfw --root build.zig --alias build-glfw

Then in your build.zig add:

...
const pkgs = @import("deps.zig").pkgs;
const glfw = @import("build-glfw");

pub fn build(b: *Builder) !void {
    ...

    exe.addPackage(pkgs.glfw);
    try glfw.link(b, exe, .{});
}

Note: You should use gyro build instead of zig build to use gyro

Next steps

Now in your code you may import and use GLFW:

const glfw = @import("glfw");

pub fn main() !void {
    try glfw.init(.{});
    defer glfw.terminate();

    // Create our window
    const window = try glfw.Window.create(640, 480, "Hello, mach-glfw!", null, null, .{});
    defer window.destroy();

    // Wait for the user to close the window.
    while (!window.shouldClose()) {
        try glfw.pollEvents();
    }
}

A warning about error handling

Unless the action you're performing is truly critical to your application continuing further, you should avoid using try.

This is because GLFW unfortunately must return errors for a large portion of its functionality on some platforms, but especially for Wayland - so ideally your application is resiliant to such errors and merely e.g. logs failures that are not critical.

Instead of try window.getPos() for example, you may use:

const pos = window.getPos() catch |err| {
    std.log.err("failed to get window position: error={}\n", .{err});
    return;
};

Here is a rough list of functionality Wayland does not support:

  • Window.setIcon
  • Window.setPos, Window.getPos
  • Window.iconify, Window.focus
  • Monitor.setGamma
  • Monitor.getGammaRamp, Monitor.setGammaRamp

Join the community

Join the Mach engine community on Matrix chat to discuss this project, ask questions, get help, etc.

Issues

Issues are tracked in the main Mach repository.

Contributing

Contributions are very welcome. Pull requests must be sent to the main repository to avoid some complex merge conflicts we'd get by accepting contributions in both repositories. Once the changes are merged there, they'll get sync'd to this repository automatically.

For now mach/glfw tracks the latest master revision of GLFW, as recorded in this file, as this version has critical undefined behavior fixes required for GLFW to work with Zig. We will switch to stable releases of GLFW once GLFW 3.4 is tagged.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].