Giter Site home page Giter Site logo

raylib.zig's Introduction

logo

raylib.zig

Idiomatic raylib (4.6-dev) bindings for Zig (master).

Example Usage

Additional infos and WebGL examples here.

supported platforms

  • Windows
  • macOS
  • Linux
  • HTML5/WebGL (emscripten)

supported APIs

  • RLAPI (raylib.h)
  • RLAPI (rlgl.h)
  • RMAPI (raymath.h)
  • Constants
    • int, float, string
    • Colors
    • Versions

For raygui bindings see: https://github.com/ryupold/raygui.zig

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.

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 import raylib.zig

build.zig:

const raylib = @import("path/to/raylib.zig/build.zig");

pub fn build(b: *std.Build) !void {
    const target = b.standardTargetOptions(.{});
    const exe = ...;
    raylib.addTo(b, exe, target);
}

main.zig:

const raylib = @import("raylib");

pub fn main() void {
    raylib.InitWindow(800, 800, "hello world!");
    raylib.SetConfigFlags(raylib.ConfigFlags{ .FLAG_WINDOW_RESIZABLE = true });
    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

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 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 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:

const data = LoadFileData("test.png");
defer UnloadFileData(data);

// using data...

generate bindings

for current raylib source (submodule)

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.

zig build raylib_parser

you can then find the executable in ./zig-out/bin/

raylib.zig's People

Contributors

ryupold avatar iacore avatar deevus avatar gamersenior avatar schobers avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.