Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ryupold/raylib.zig
Idiomatic Zig bindings for raylib utilizing raylib_parser
https://github.com/ryupold/raylib.zig
bindings raylib zig
Last synced: 30 days ago
JSON representation
Idiomatic Zig bindings for raylib utilizing raylib_parser
- Host: GitHub
- URL: https://github.com/ryupold/raylib.zig
- Owner: ryupold
- License: mit
- Created: 2022-04-06T21:03:44.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-06-12T19:48:59.000Z (5 months ago)
- Last Synced: 2024-10-01T03:21:18.608Z (about 1 month ago)
- Topics: bindings, raylib, zig
- Language: Zig
- Homepage:
- Size: 2.17 MB
- Stars: 215
- Watchers: 3
- Forks: 35
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![logo](logo.png)
# raylib.zig
Idiomatic [raylib](https://www.raylib.com/) (5.1-dev) bindings for [Zig](https://ziglang.org/) (master).[Example Usage](#usage)
Additional infos and WebGL examples [here](https://github.com/ryupold/examples-raylib.zig).
## supported platforms
- Windows
- macOS
- Linux
- HTML5/WebGL (emscripten)## supported APIs
- [x] RLAPI (raylib.h)
- [x] RLAPI (rlgl.h)
- [x] RMAPI (raymath.h)
- [x] Constants
- [x] int, float, string
- [x] Colors
- [x] VersionsFor [raygui](https://github.com/raysan5/raygui) bindings see: https://github.com/ryupold/raygui.zig
## usage
The easy way would be adding this as submodule directly in your source folder.
Thats what I do until there is an official package manager for Zig.```sh
cd $YOUR_SRC_FOLDER
git submodule add https://github.com/ryupold/raylib.zig raylib
git submodule update --init --recursive
```The bindings have been prebuilt so you just need to add raylib as module
build.zig:
```zig
const raylib = @import("path/to/raylib.zig/build.zig");pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const mode = b.standardOptimizeOption(.{});
const exe = ...;
raylib.addTo(b, exe, target, mode, .{});
}
```and import in main.zig:
```zig
const raylib = @import("raylib");pub fn main() void {
raylib.SetConfigFlags(raylib.ConfigFlags{ .FLAG_WINDOW_RESIZABLE = true });
raylib.InitWindow(800, 800, "hello world!");
raylib.SetTargetFPS(60);defer raylib.CloseWindow();
while (!raylib.WindowShouldClose()) {
raylib.BeginDrawing();
defer raylib.EndDrawing();
raylib.ClearBackground(raylib.BLACK);
raylib.DrawFPS(10, 10);raylib.DrawText("hello world!", 100, 100, 20, raylib.YELLOW);
}
}
```### WebGL (emscripten) builds
For Webassembly builds see [examples-raylib.zig/build.zig](https://github.com/ryupold/examples-raylib.zig/blob/main/build.zig)
This weird workaround with `marshal.h/marshal.c` I actually had to make for Webassembly builds to work, because passing structs as function parameters or returning them cannot be done on the Zig side somehow. If I try it, I get a runtime error "index out of bounds". This happens only in WebAssembly builds. So `marshal.c` must be compiled with `emcc`. See [build.zig](https://github.com/ryupold/examples-raylib.zig/blob/main/build.zig) in the examples.
## custom definitions
An easy way to fix binding mistakes is to edit them in `bindings.json` and setting the custom flag to true. This way the binding will not be overriden when calling `zig build intermediate`.
Additionally you can add custom definitions into `inject.zig, inject.h, inject.c` these files will be prepended accordingly.## disclaimer
I have NOT tested most of the generated functions, so there might be bugs. Especially when it comes to pointers as it is not decidable (for the generator) what a pointer to C means. Could be single item, array, sentinel terminated and/or nullable. If you run into crashes using one of the functions or types in `raylib.zig` feel free to [create an issue](https://github.com/ryupold/raylib.zig/issues) and I will look into it.## memory
Some of the functions may return pointers to memory allocated within raylib.
Usually there will be a corresponding Unload/Free function to dispose it. You cannot use a Zig allocator to free that:```zig
const data = LoadFileData("test.png");
defer UnloadFileData(data);// using data...
```## generate bindings
for current raylib source (submodule)```sh
zig build parse # create JSON files with raylib_parser
zig build intermediate # generate bindings.json (keeps definitions with custom=true)
zig build bindings # write all intermediate bindings to raylib.zig
```For easier diffing and to follow changes to the raylib repository I commit also the generated json files.
## build raylib_parser (executable)
If you want to build the raylib_parser executable without a C compiler.
```sh
zig build raylib_parser
```you can then find the executable in `./zig-out/bin/`