clone raylib.zig into libs
This commit is contained in:
parent
e3bed54ab7
commit
01f77a2e4b
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +1,6 @@
|
||||
[submodule "libs/zgltf"]
|
||||
path = libs/zgltf
|
||||
url = https://github.com/kooparse/zgltf.git
|
||||
[submodule "libs/raylib/raylib"]
|
||||
path = libs/raylib/raylib
|
||||
url = git@github.com:raysan5/raylib.git
|
||||
|
58
libs/raylib/.gitignore
vendored
Normal file
58
libs/raylib/.gitignore
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
zig-cache/
|
||||
|
||||
.vscode/settings.json
|
||||
|
||||
.DS_Store
|
21
libs/raylib/LICENSE
Normal file
21
libs/raylib/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Michael Scherbakow
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
116
libs/raylib/README.md
Normal file
116
libs/raylib/README.md
Normal file
@ -0,0 +1,116 @@
|
||||

|
||||
|
||||
# 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] Versions
|
||||
|
||||
For [raygui](https://github.com/raysan5/raygui) bindings see: https://github.com/ryupold/raygui.zig
|
||||
|
||||
## <a id="usage">usage</a>
|
||||
|
||||
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/`
|
17829
libs/raylib/bindings.json
Normal file
17829
libs/raylib/bindings.json
Normal file
File diff suppressed because it is too large
Load Diff
144
libs/raylib/build.zig
Normal file
144
libs/raylib/build.zig
Normal file
@ -0,0 +1,144 @@
|
||||
const std = @import("std");
|
||||
const generate = @import("generate.zig");
|
||||
|
||||
pub fn build(b: *std.Build) !void {
|
||||
const raylibSrc = "raylib/src/";
|
||||
|
||||
const target = b.standardTargetOptions(.{});
|
||||
|
||||
//--- parse raylib and generate JSONs for all signatures --------------------------------------
|
||||
const jsons = b.step("parse", "parse raylib headers and generate raylib jsons");
|
||||
const raylib_parser_build = b.addExecutable(.{
|
||||
.name = "raylib_parser",
|
||||
.root_source_file = std.build.FileSource.relative("raylib_parser.zig"),
|
||||
.target = target,
|
||||
.optimize = .ReleaseFast,
|
||||
});
|
||||
raylib_parser_build.addCSourceFile(.{ .file = .{ .path = "raylib/parser/raylib_parser.c" }, .flags = &.{} });
|
||||
raylib_parser_build.linkLibC();
|
||||
|
||||
//raylib
|
||||
const raylib_H = b.addRunArtifact(raylib_parser_build);
|
||||
raylib_H.addArgs(&.{
|
||||
"-i", raylibSrc ++ "raylib.h",
|
||||
"-o", "raylib.json",
|
||||
"-f", "JSON",
|
||||
"-d", "RLAPI",
|
||||
});
|
||||
jsons.dependOn(&raylib_H.step);
|
||||
|
||||
//raymath
|
||||
const raymath_H = b.addRunArtifact(raylib_parser_build);
|
||||
raymath_H.addArgs(&.{
|
||||
"-i", raylibSrc ++ "raymath.h",
|
||||
"-o", "raymath.json",
|
||||
"-f", "JSON",
|
||||
"-d", "RMAPI",
|
||||
});
|
||||
jsons.dependOn(&raymath_H.step);
|
||||
|
||||
//rlgl
|
||||
const rlgl_H = b.addRunArtifact(raylib_parser_build);
|
||||
rlgl_H.addArgs(&.{
|
||||
"-i", raylibSrc ++ "rlgl.h",
|
||||
"-o", "rlgl.json",
|
||||
"-f", "JSON",
|
||||
"-d", "RLAPI",
|
||||
});
|
||||
jsons.dependOn(&rlgl_H.step);
|
||||
|
||||
//--- Generate intermediate -------------------------------------------------------------------
|
||||
const intermediate = b.step("intermediate", "generate intermediate representation of the results from 'zig build parse' (keep custom=true)");
|
||||
var intermediateZigStep = b.addRunArtifact(b.addExecutable(.{
|
||||
.name = "intermediate",
|
||||
.root_source_file = std.build.FileSource.relative("intermediate.zig"),
|
||||
.target = target,
|
||||
}));
|
||||
intermediate.dependOn(&intermediateZigStep.step);
|
||||
|
||||
//--- Generate bindings -----------------------------------------------------------------------
|
||||
const bindings = b.step("bindings", "generate bindings in from bindings.json");
|
||||
var generateZigStep = b.addRunArtifact(b.addExecutable(.{
|
||||
.name = "generate",
|
||||
.root_source_file = std.build.FileSource.relative("generate.zig"),
|
||||
.target = target,
|
||||
}));
|
||||
const fmt = b.addFmt(.{ .paths = &.{generate.outputFile} });
|
||||
fmt.step.dependOn(&generateZigStep.step);
|
||||
bindings.dependOn(&fmt.step);
|
||||
|
||||
//--- just build raylib_parser.exe ------------------------------------------------------------
|
||||
const raylib_parser_install = b.step("raylib_parser", "build ./zig-out/bin/raylib_parser.exe");
|
||||
const generateBindings_install = b.addInstallArtifact(raylib_parser_build, .{});
|
||||
raylib_parser_install.dependOn(&generateBindings_install.step);
|
||||
}
|
||||
|
||||
// above: generate library
|
||||
// below: linking (use as dependency)
|
||||
|
||||
fn current_file() []const u8 {
|
||||
return @src().file;
|
||||
}
|
||||
|
||||
const cwd = std.fs.path.dirname(current_file()).?;
|
||||
const sep = std.fs.path.sep_str;
|
||||
const dir_raylib = cwd ++ sep ++ "raylib/src";
|
||||
|
||||
const raylib_build = @import("raylib/src/build.zig");
|
||||
|
||||
fn linkThisLibrary(b: *std.Build, target: std.zig.CrossTarget, optimize: std.builtin.Mode) *std.build.LibExeObjStep {
|
||||
const lib = b.addStaticLibrary(.{ .name = "raylib-zig", .target = target, .optimize = optimize });
|
||||
lib.addIncludePath(.{ .path = dir_raylib });
|
||||
lib.addIncludePath(.{ .path = cwd });
|
||||
lib.linkLibC();
|
||||
lib.addCSourceFile(.{ .file = .{ .path = cwd ++ sep ++ "marshal.c" }, .flags = &.{} });
|
||||
return lib;
|
||||
}
|
||||
|
||||
/// add this package to exe
|
||||
pub fn addTo(b: *std.Build, exe: *std.build.Step.Compile, target: std.zig.CrossTarget, optimize: std.builtin.Mode, raylibOptions: raylib_build.Options) void {
|
||||
exe.addAnonymousModule("raylib", .{ .source_file = .{ .path = cwd ++ sep ++ "raylib.zig" } });
|
||||
exe.addIncludePath(.{ .path = dir_raylib });
|
||||
exe.addIncludePath(.{ .path = cwd });
|
||||
const lib = linkThisLibrary(b, target, optimize);
|
||||
const lib_raylib = raylib_build.addRaylib(b, target, optimize, raylibOptions);
|
||||
exe.linkLibrary(lib_raylib);
|
||||
exe.linkLibrary(lib);
|
||||
}
|
||||
|
||||
pub fn linkSystemDependencies(exe: *std.build.Step.Compile) void {
|
||||
switch (exe.target.getOsTag()) {
|
||||
.macos => {
|
||||
exe.linkFramework("Foundation");
|
||||
exe.linkFramework("Cocoa");
|
||||
exe.linkFramework("OpenGL");
|
||||
exe.linkFramework("CoreAudio");
|
||||
exe.linkFramework("CoreVideo");
|
||||
exe.linkFramework("IOKit");
|
||||
},
|
||||
.linux => {
|
||||
exe.addLibraryPath(.{ .path = "/usr/lib" });
|
||||
exe.addIncludePath(.{ .path = "/usr/include" });
|
||||
exe.linkSystemLibrary("GL");
|
||||
exe.linkSystemLibrary("rt");
|
||||
exe.linkSystemLibrary("dl");
|
||||
exe.linkSystemLibrary("m");
|
||||
exe.linkSystemLibrary("X11");
|
||||
},
|
||||
.freebsd, .openbsd, .netbsd, .dragonfly => {
|
||||
exe.linkSystemLibrary("GL");
|
||||
exe.linkSystemLibrary("rt");
|
||||
exe.linkSystemLibrary("dl");
|
||||
exe.linkSystemLibrary("m");
|
||||
exe.linkSystemLibrary("X11");
|
||||
exe.linkSystemLibrary("Xrandr");
|
||||
exe.linkSystemLibrary("Xinerama");
|
||||
exe.linkSystemLibrary("Xi");
|
||||
exe.linkSystemLibrary("Xxf86vm");
|
||||
exe.linkSystemLibrary("Xcursor");
|
||||
},
|
||||
else => {},
|
||||
}
|
||||
|
||||
exe.linkLibC();
|
||||
}
|
24
libs/raylib/emscripten/entry.c
Normal file
24
libs/raylib/emscripten/entry.c
Normal file
@ -0,0 +1,24 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "emscripten/emscripten.h"
|
||||
#include "raylib.h"
|
||||
|
||||
// Zig compiles C code with -fstack-protector-strong which requires the following two symbols
|
||||
// which don't seem to be provided by the emscripten toolchain(?)
|
||||
void *__stack_chk_guard = (void *)0xdeadbeef;
|
||||
void __stack_chk_fail(void)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
// emsc_main() is the Zig entry function in main.zig
|
||||
extern int emsc_main(void);
|
||||
|
||||
extern void emsc_set_window_size(int width, int height);
|
||||
|
||||
int main()
|
||||
{
|
||||
return emsc_main();
|
||||
}
|
96
libs/raylib/emscripten/minshell.html
Normal file
96
libs/raylib/emscripten/minshell.html
Normal file
@ -0,0 +1,96 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en-us">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<!--no caching for now, the game is still pretty small-->
|
||||
<meta http-equiv="cache-control" content="no-cache" />
|
||||
<meta http-equiv="expires" content="0" />
|
||||
|
||||
<title>demo</title>
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="shortcut icon" href="/assets/_favicon.ico" />
|
||||
|
||||
<style>
|
||||
body {
|
||||
background-color: rgb(42, 42, 42);
|
||||
margin: 0px;
|
||||
padding: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
/* Internet Explorer 10+ */
|
||||
-ms-overflow-style: none;
|
||||
/*Firefox*/
|
||||
scrollbar-width: none;
|
||||
}
|
||||
|
||||
body::-webkit-scrollbar {
|
||||
/*Chrome and Safari*/
|
||||
display: none;
|
||||
}
|
||||
|
||||
canvas.emscripten {
|
||||
border: 0px none;
|
||||
background-color: transparent;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
function setResizeInterval(delay, repetitions) {
|
||||
let x = 0;
|
||||
let intervalID = window.setInterval(function () {
|
||||
|
||||
Module.resizeWindow(document.documentElement.clientWidth - 16, document.documentElement.clientHeight - 16);
|
||||
|
||||
if (++x === repetitions) {
|
||||
window.clearInterval(intervalID);
|
||||
}
|
||||
}, delay);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body onload="setResizeInterval(300, 5)"
|
||||
onresize="if(Module.resizeWindow) Module.resizeWindow(document.documentElement.clientWidth-16,document.documentElement.clientHeight-16)">
|
||||
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"
|
||||
tabindex="-1"></canvas>
|
||||
<!-- <p id="output" /> -->
|
||||
<script>
|
||||
var Module = {
|
||||
print: (function () {
|
||||
var element = document.getElementById("output");
|
||||
if (element) element.value = ""; // clear browser cache
|
||||
return function (text) {
|
||||
if (arguments.length > 1)
|
||||
text = Array.prototype.slice.call(arguments).join(" ");
|
||||
console.log(text);
|
||||
if (element) {
|
||||
element.value += text + "\n";
|
||||
element.scrollTop = element.scrollHeight; // focus on bottom
|
||||
}
|
||||
};
|
||||
})(),
|
||||
canvas: (function () {
|
||||
var canvas = document.getElementById("canvas");
|
||||
return canvas;
|
||||
})(),
|
||||
};
|
||||
|
||||
Module.onRuntimeInitialized = function () {
|
||||
Module.resizeWindow = function (w, h) {
|
||||
Module.ccall(
|
||||
"emsc_set_window_size",
|
||||
null,
|
||||
["number", "number"],
|
||||
[w, h]
|
||||
);
|
||||
};
|
||||
Module.resizeWindow(document.documentElement.clientWidth - 16, document.documentElement.clientHeight - 16);
|
||||
};
|
||||
</script>
|
||||
{{{ SCRIPT }}}
|
||||
</body>
|
||||
|
||||
</html>
|
328
libs/raylib/emscripten/shell.html
Normal file
328
libs/raylib/emscripten/shell.html
Normal file
@ -0,0 +1,328 @@
|
||||
<!doctype html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
|
||||
<title>raylib web game</title>
|
||||
|
||||
<meta name="title" content="raylib web game">
|
||||
<meta name="description" content="New raylib web videogame, developed using raylib videogames library">
|
||||
<meta name="keywords" content="raylib, games, html5, programming, C, C++, library, learn, videogames">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
|
||||
<!-- Open Graph metatags for sharing -->
|
||||
<meta property="og:title" content="raylib web game">
|
||||
<meta property="og:image:type" content="image/png">
|
||||
<meta property="og:image" content="https://www.raylib.com/common/img/raylib_logo.png">
|
||||
<meta property="og:site_name" content="raylib.com">
|
||||
<meta property="og:url" content="https://www.raylib.com/games.html">
|
||||
<meta property="og:description" content="New raylib web videogame, developed using raylib videogames library">
|
||||
|
||||
<!-- Twitter metatags for sharing -->
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:site" content="@raysan5">
|
||||
<meta name="twitter:title" content="raylib web game">
|
||||
<meta name="twitter:image" content="https://www.raylib.com/common/raylib_logo.png">
|
||||
<meta name="twitter:url" content="https://www.raylib.com/games.html">
|
||||
<meta name="twitter:description" content="New raylib web game, developed using raylib videogames library">
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="shortcut icon" href="https://www.raylib.com/favicon.ico">
|
||||
|
||||
<style>
|
||||
body {
|
||||
font-family: arial;
|
||||
margin: 0;
|
||||
padding: none;
|
||||
}
|
||||
|
||||
#header {
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
background-color: #888888;
|
||||
}
|
||||
|
||||
/* NOTE: raylib logo is embedded in the page as base64 png image */
|
||||
#logo {
|
||||
width:64px;
|
||||
height:64px;
|
||||
float:left;
|
||||
position:relative;
|
||||
margin:10px;
|
||||
background-image:url('data:image/png;base64,\
|
||||
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADs\
|
||||
MAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjExR/NCNwAAA7JJREFUaEPtk0FyWzEMQ+37X7fZhxX4\
|
||||
YY3AD1OKF1nkzTRlSBCCLeVBnvl/AUdaELOunPno1kts1kixdtEZKVs+xIxebBkZsVknn/L5nFGDLR8T4zVC9fX19S/+tTFijr\
|
||||
YK4jUjbPUtqBHpnEE6PkZD7jQZV8n5Recw1XQKciZuPaEtR6UjNs5ENVGMsBVqpPtER0ZMOhpyp8m4YL4OjD9yxsyZxnQycfMJ\
|
||||
ETNSzsRE1+dihK3YMiJmpHTW3xpmXPC6BXlCHfqnBlsjY5hxf/6EVEOM2BTEi0fYCX4ONSI6Kq3Blg/prIOMq2CsRur4KQ0x64\
|
||||
SdjOufEDEdHZGOhmz5RDHCVqhRuQ86YsVskbc+GXchLiHnFyYH+UigQDVGnImbT8hwFkgLg2qiM8JO6Ylx1FNLa3DmYwqCTsZd\
|
||||
4BPqGJG7MwKzpeiWKTKxXkLMVE3MSOmsdwxLH6Rd/wCCLSNDx6djeKfJuArGeoYamRHpaEjnCBYZVy8hZqo2GI36qPjsiOiMsB\
|
||||
XGcev4Mx9TLGTchbgEjN/uz6jGrBvDjg+LTNx8Qp2CbG2xMKgmOiPslJ4Yxx+eSnSkzlosZNwFPiHl7FRTkLNRJm4+IeVM0ymI\
|
||||
H42wE/wcKalQI4MRl4EW3p6VcRWMua8F6WjIlqZDxvVPiHQ6CjVbYkV9ohhhp/Rk1wiYgpyJ78i4CsZbjkb8Qx+ihvzu3RPaKo\
|
||||
gZkY6GlEeMsKdPSOFIC8VoOusg44L5c+T8ouOoGhWbdWJ8tMi4egkxo4hoh2yNTGf3iIyr5Lyic4bRENXo+lvDjAt4C1Hk/OKt\
|
||||
UaAj0+n4dMSZ2D+hrYJsaYh2SClG2jV9kJKKzhlGQ1SsW299Mq6C8dYZHTExo8fzieI5ivipYnYy7nwJqGKmOYyRwfiUBXITfh\
|
||||
5qSHRGWEkfqJqURgvsdHyWYv7Ko8DnYYegk3EB00cxprdrJRzFd7YQzawu8L1GMTYS/KpPaAFTkIn1EmJmspJSs5xBzSyGhlkB\
|
||||
mlxfNFiP5mw4wlbMh4F5Ddxp5jNINBdCEz9zPOC1zD7Q0HBdmXndwv0TMtydEdzlWJT4VZ8Qt9Qn4/onxMIwa5ZYGJU5yufBiC\
|
||||
jwE50AGjLCVuS8Yt4H7OgZLKK5EKOsLviEWJSL/+0uMi7gLUSBseYwqEbXvSHCec1CJvZPyHCmYQffaBBfOTCGHM2aEbZi1+gO\
|
||||
1XTWVXMnzrhAn5DSOZVsiQlHnSITKzGj6DeTcZWc/3oy7h9//PF4PL4BlvsWrb6RE+oAAAAASUVORK5CYII=');
|
||||
}
|
||||
|
||||
.emscripten { padding-right: 0; margin-left: auto; margin-right: auto; display: block; }
|
||||
div.emscripten { text-align: center; }
|
||||
div.emscripten_border { border: 1px solid black; }
|
||||
|
||||
/* NOTE: Canvas *must not* have any border or padding, or mouse coords will be wrong */
|
||||
canvas.emscripten {
|
||||
border: 0px none;
|
||||
background: black;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.spinner {
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
margin: 0;
|
||||
margin-top: 20px;
|
||||
margin-left: 20px;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
-webkit-animation: rotation .8s linear infinite;
|
||||
-moz-animation: rotation .8s linear infinite;
|
||||
-o-animation: rotation .8s linear infinite;
|
||||
animation: rotation 0.8s linear infinite;
|
||||
border-left: 5px solid black;
|
||||
border-right: 5px solid black;
|
||||
border-bottom: 5px solid black;
|
||||
border-top: 5px solid red;
|
||||
border-radius: 100%;
|
||||
background-color: rgb(245, 245, 245);
|
||||
}
|
||||
@-webkit-keyframes rotation {
|
||||
from {-webkit-transform: rotate(0deg);}
|
||||
to {-webkit-transform: rotate(360deg);}
|
||||
}
|
||||
@-moz-keyframes rotation {
|
||||
from {-moz-transform: rotate(0deg);}
|
||||
to {-moz-transform: rotate(360deg);}
|
||||
}
|
||||
@-o-keyframes rotation {
|
||||
from {-o-transform: rotate(0deg);}
|
||||
to {-o-transform: rotate(360deg);}
|
||||
}
|
||||
@keyframes rotation {
|
||||
from {transform: rotate(0deg);}
|
||||
to {transform: rotate(360deg);}
|
||||
}
|
||||
|
||||
#status {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
margin-top: 30px;
|
||||
margin-left: 20px;
|
||||
font-weight: bold;
|
||||
color: rgb(40, 40, 40);
|
||||
}
|
||||
|
||||
#progress {
|
||||
height: 0px;
|
||||
width: 0px;
|
||||
}
|
||||
|
||||
#controls {
|
||||
display: inline-block;
|
||||
float: right;
|
||||
vertical-align: top;
|
||||
margin-top: 15px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
#output {
|
||||
width: 100%;
|
||||
height: 140px;
|
||||
margin: 0 auto;
|
||||
margin-top: 10px;
|
||||
display: block;
|
||||
background-color: black;
|
||||
color: rgb(37, 174, 38);
|
||||
font-family: 'Lucida Console', Monaco, monospace;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
input[type=button] {
|
||||
background-color: lightgray;
|
||||
border: 4px solid darkgray;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
width: 140px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
input[type=button]:hover {
|
||||
background-color: #f5f5f5ff;
|
||||
border-color: black;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="header">
|
||||
<a id="logo" href="https://www.raylib.com"></a>
|
||||
|
||||
<div class="spinner" id='spinner'></div>
|
||||
<div class="emscripten" id="status">Downloading...</div>
|
||||
|
||||
<span id='controls'>
|
||||
<span><input type="button" value="🖵 FULLSCREEN" onclick="Module.requestFullscreen(false, false)"></span>
|
||||
<span><input type="button" id="btn-audio" value="🔇 SUSPEND" onclick="toggleAudio()"></span>
|
||||
</span>
|
||||
|
||||
<div class="emscripten">
|
||||
<progress value="0" max="100" id="progress" hidden=1></progress>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="emscripten_border">
|
||||
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()" tabindex=-1></canvas>
|
||||
</div>
|
||||
|
||||
<textarea id="output" rows="8"></textarea>
|
||||
|
||||
<script type='text/javascript' src="https://cdn.jsdelivr.net/gh/eligrey/FileSaver.js/dist/FileSaver.min.js"> </script>
|
||||
<script type='text/javascript'>
|
||||
function saveFileFromMEMFSToDisk(memoryFSname, localFSname) // This can be called by C/C++ code
|
||||
{
|
||||
var isSafari = false; // Not supported, navigator.userAgent access is being restricted
|
||||
//var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
||||
var data = FS.readFile(memoryFSname);
|
||||
var blob;
|
||||
|
||||
if (isSafari) blob = new Blob([data.buffer], { type: "application/octet-stream" });
|
||||
else blob = new Blob([data.buffer], { type: "application/octet-binary" });
|
||||
|
||||
// NOTE: SaveAsDialog is a browser setting. For example, in Google Chrome,
|
||||
// in Settings/Advanced/Downloads section you have a setting:
|
||||
// 'Ask where to save each file before downloading' - which you can set true/false.
|
||||
// If you enable this setting it would always ask you and bring the SaveAsDialog
|
||||
saveAs(blob, localFSname);
|
||||
}
|
||||
</script>
|
||||
<script type='text/javascript'>
|
||||
var statusElement = document.querySelector('#status');
|
||||
var progressElement = document.querySelector('#progress');
|
||||
var spinnerElement = document.querySelector('#spinner');
|
||||
var Module = {
|
||||
preRun: [],
|
||||
postRun: [],
|
||||
print: (function() {
|
||||
var element = document.querySelector('#output');
|
||||
|
||||
if (element) element.value = ''; // Clear browser cache
|
||||
|
||||
return function(text) {
|
||||
if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
|
||||
// These replacements are necessary if you render to raw HTML
|
||||
//text = text.replace(/&/g, "&");
|
||||
//text = text.replace(/</g, "<");
|
||||
//text = text.replace(/>/g, ">");
|
||||
//text = text.replace('\n', '<br>', 'g');
|
||||
console.log(text);
|
||||
|
||||
if (element) {
|
||||
element.value += text + "\n";
|
||||
element.scrollTop = element.scrollHeight; // focus on bottom
|
||||
}
|
||||
};
|
||||
})(),
|
||||
printErr: function(text) {
|
||||
if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
|
||||
|
||||
console.error(text);
|
||||
},
|
||||
canvas: (function() {
|
||||
var canvas = document.querySelector('#canvas');
|
||||
|
||||
// As a default initial behavior, pop up an alert when webgl context is lost.
|
||||
// To make your application robust, you may want to override this behavior before shipping!
|
||||
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
|
||||
canvas.addEventListener("webglcontextlost", function(e) { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false);
|
||||
|
||||
return canvas;
|
||||
})(),
|
||||
setStatus: function(text) {
|
||||
if (!Module.setStatus.last) Module.setStatus.last = { time: Date.now(), text: '' };
|
||||
if (text === Module.setStatus.last.text) return;
|
||||
|
||||
var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
|
||||
var now = Date.now();
|
||||
|
||||
if (m && now - Module.setStatus.last.time < 30) return; // If this is a progress update, skip it if too soon
|
||||
|
||||
Module.setStatus.last.time = now;
|
||||
Module.setStatus.last.text = text;
|
||||
|
||||
if (m) {
|
||||
text = m[1];
|
||||
progressElement.value = parseInt(m[2])*100;
|
||||
progressElement.max = parseInt(m[4])*100;
|
||||
progressElement.hidden = true;
|
||||
spinnerElement.hidden = false;
|
||||
} else {
|
||||
progressElement.value = null;
|
||||
progressElement.max = null;
|
||||
progressElement.hidden = true;
|
||||
if (!text) spinnerElement.style.display = 'none';
|
||||
}
|
||||
|
||||
statusElement.innerHTML = text;
|
||||
},
|
||||
totalDependencies: 0,
|
||||
monitorRunDependencies: function(left) {
|
||||
this.totalDependencies = Math.max(this.totalDependencies, left);
|
||||
Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
|
||||
},
|
||||
//noInitialRun: true
|
||||
};
|
||||
|
||||
Module.setStatus('Downloading...');
|
||||
|
||||
window.onerror = function() {
|
||||
Module.setStatus('Exception thrown, see JavaScript console');
|
||||
spinnerElement.style.display = 'none';
|
||||
Module.setStatus = function(text) { if (text) Module.printErr('[post-exception status] ' + text); };
|
||||
};
|
||||
</script>
|
||||
|
||||
<!-- REF: https://developers.google.com/web/updates/2018/11/web-audio-autoplay -->
|
||||
<script type='text/javascript'>
|
||||
var audioBtn = document.querySelector('#btn-audio');
|
||||
|
||||
// An array of all contexts to resume on the page
|
||||
const audioContexList = [];
|
||||
(function() {
|
||||
// A proxy object to intercept AudioContexts and
|
||||
// add them to the array for tracking and resuming later
|
||||
self.AudioContext = new Proxy(self.AudioContext, {
|
||||
construct(target, args) {
|
||||
const result = new target(...args);
|
||||
audioContexList.push(result);
|
||||
if (result.state == "suspended") audioBtn.value = "🔈 RESUME";
|
||||
return result;
|
||||
}
|
||||
});
|
||||
})();
|
||||
|
||||
function toggleAudio() {
|
||||
var resumed = false;
|
||||
audioContexList.forEach(ctx => {
|
||||
if (ctx.state == "suspended") { ctx.resume(); resumed = true; }
|
||||
else if (ctx.state == "running") ctx.suspend();
|
||||
});
|
||||
|
||||
if (resumed) audioBtn.value = "🔇 SUSPEND";
|
||||
else audioBtn.value = "🔈 RESUME";
|
||||
}
|
||||
</script>
|
||||
{{{ SCRIPT }}}
|
||||
</body>
|
||||
</html>
|
529
libs/raylib/generate.zig
Normal file
529
libs/raylib/generate.zig
Normal file
@ -0,0 +1,529 @@
|
||||
const std = @import("std");
|
||||
const fs = std.fs;
|
||||
const json = std.json;
|
||||
const allocPrint = std.fmt.allocPrint;
|
||||
const mapping = @import("type_mapping.zig");
|
||||
const intermediate = @import("intermediate.zig");
|
||||
|
||||
pub const outputFile = "raylib.zig";
|
||||
pub const injectFile = "inject.zig";
|
||||
|
||||
fn trim(s: []const u8) []const u8 {
|
||||
return std.mem.trim(u8, s, &[_]u8{ ' ', '\t', '\n' });
|
||||
}
|
||||
|
||||
pub fn main() !void {
|
||||
std.log.info("generating raylib.zig ...", .{});
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
defer {
|
||||
if (gpa.deinit() == .leak) {
|
||||
std.log.err("memory leak detected", .{});
|
||||
}
|
||||
}
|
||||
const allocator = gpa.allocator();
|
||||
var arena = std.heap.ArenaAllocator.init(allocator);
|
||||
defer arena.deinit();
|
||||
|
||||
const bindingsData = try fs.cwd().readFileAlloc(arena.allocator(), intermediate.bindingsJSON, std.math.maxInt(usize));
|
||||
|
||||
const bindings = try json.parseFromSliceLeaky(mapping.Intermediate, arena.allocator(), bindingsData, .{
|
||||
.ignore_unknown_fields = true,
|
||||
});
|
||||
|
||||
var file = try fs.cwd().createFile(outputFile, .{});
|
||||
defer file.close();
|
||||
|
||||
try file.writeAll("\n\n");
|
||||
|
||||
const inject = try Injections.load(arena.allocator());
|
||||
try writeInjections(arena.allocator(), &file, inject);
|
||||
|
||||
try writeFunctions(arena.allocator(), &file, bindings, inject);
|
||||
var h = try fs.cwd().createFile("marshal.h", .{});
|
||||
defer h.close();
|
||||
var c = try fs.cwd().createFile("marshal.c", .{});
|
||||
defer c.close();
|
||||
const raylib: mapping.CombinedRaylib = try mapping.CombinedRaylib.load(arena.allocator(), intermediate.jsonFiles);
|
||||
try writeCFunctions(arena.allocator(), &h, &c, inject, raylib);
|
||||
|
||||
try writeStructs(arena.allocator(), &file, bindings, inject);
|
||||
try writeEnums(arena.allocator(), &file, bindings, inject);
|
||||
try writeDefines(arena.allocator(), &file, bindings, inject);
|
||||
|
||||
std.log.info("... done", .{});
|
||||
}
|
||||
|
||||
const Injections = struct {
|
||||
lines: []const []const u8,
|
||||
symbols: []const []const u8,
|
||||
|
||||
pub fn load(allocator: std.mem.Allocator) !@This() {
|
||||
var injectZigLines = std.ArrayList([]const u8).init(allocator);
|
||||
var symbols = std.ArrayList([]const u8).init(allocator);
|
||||
|
||||
var file = try fs.cwd().openFile(injectFile, .{});
|
||||
var reader = file.reader();
|
||||
while (try reader.readUntilDelimiterOrEofAlloc(allocator, '\n', std.math.maxInt(usize))) |line| {
|
||||
if (std.mem.indexOf(u8, line, "pub const ")) |startIndex| {
|
||||
if (std.mem.indexOf(u8, line, " = extern struct {")) |endIndex| {
|
||||
const s = line["pub const ".len + startIndex .. endIndex];
|
||||
try symbols.append(s);
|
||||
std.log.debug("inject symbol: {s}", .{s});
|
||||
} else if (std.mem.indexOf(u8, line, " = packed struct(u32) {")) |endIndex| {
|
||||
const s = line["pub const ".len + startIndex .. endIndex];
|
||||
try symbols.append(s);
|
||||
std.log.debug("inject symbol: {s}", .{s});
|
||||
}
|
||||
}
|
||||
if (std.mem.indexOf(u8, line, "pub fn ")) |startIndex| {
|
||||
if (std.mem.indexOf(u8, line, "(")) |endIndex| {
|
||||
const s = line["pub fn ".len + startIndex .. endIndex];
|
||||
try symbols.append(s);
|
||||
std.log.debug("inject symbol: {s}", .{s});
|
||||
}
|
||||
}
|
||||
try injectZigLines.append(line);
|
||||
}
|
||||
|
||||
return @This(){
|
||||
.lines = try injectZigLines.toOwnedSlice(),
|
||||
.symbols = try symbols.toOwnedSlice(),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn containsSymbol(self: @This(), name: []const u8) bool {
|
||||
for (self.symbols) |s| {
|
||||
if (eql(s, name)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
fn writeFunctions(
|
||||
allocator: std.mem.Allocator,
|
||||
file: *fs.File,
|
||||
bindings: mapping.Intermediate,
|
||||
inject: Injections,
|
||||
) !void {
|
||||
var buf: [51200]u8 = undefined;
|
||||
var fba = std.heap.FixedBufferAllocator.init(&buf);
|
||||
|
||||
for (bindings.functions) |func| {
|
||||
if (inject.containsSymbol(func.name)) continue;
|
||||
defer fba.reset();
|
||||
|
||||
//--- signature -------------------------
|
||||
const funcDescription: []const u8 = func.description orelse "";
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
"\n/// {s}\npub fn {s} (\n",
|
||||
.{ funcDescription, func.name },
|
||||
),
|
||||
);
|
||||
|
||||
for (func.params) |param| {
|
||||
if (param.description) |description| {
|
||||
try file.writeAll(try allocPrint(
|
||||
allocator,
|
||||
"/// {s}\n",
|
||||
.{description},
|
||||
));
|
||||
}
|
||||
try file.writeAll(try allocPrint(
|
||||
allocator,
|
||||
"{s}: {s},\n",
|
||||
.{ param.name, param.typ },
|
||||
));
|
||||
}
|
||||
|
||||
if (func.custom) {
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
") {s} {{\n",
|
||||
.{func.returnType},
|
||||
),
|
||||
);
|
||||
} else if (isPointer(func.returnType)) {
|
||||
if (eql("u8", (stripType(func.returnType)))) {
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
") [*:0]const {s} {{\n",
|
||||
.{stripType(func.returnType)},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
") {s} {{\n",
|
||||
.{func.returnType},
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
") {s} {{\n",
|
||||
.{func.returnType},
|
||||
),
|
||||
);
|
||||
}
|
||||
const returnTypeIsVoid = eql(func.returnType, "void");
|
||||
|
||||
//--- body ------------------------------
|
||||
if (isPointer(func.returnType)) {
|
||||
try file.writeAll(try allocPrint(allocator, "return @ptrCast({s},\n", .{func.returnType}));
|
||||
} else if (isPrimitiveOrPointer(func.returnType)) {
|
||||
try file.writeAll("return ");
|
||||
} else if (!returnTypeIsVoid) {
|
||||
try file.writeAll(try allocPrint(allocator, "var out: {s} = undefined;\n", .{func.returnType}));
|
||||
}
|
||||
try file.writeAll(try allocPrint(allocator, "raylib.m{s}(\n", .{func.name}));
|
||||
|
||||
if (!isPrimitiveOrPointer(func.returnType)) {
|
||||
if (bindings.containsStruct(stripType(func.returnType))) {
|
||||
try file.writeAll(try allocPrint(allocator, "@ptrCast([*c]raylib.{s}, &out),\n", .{func.returnType}));
|
||||
} else if (!returnTypeIsVoid) {
|
||||
try file.writeAll(try allocPrint(allocator, "@ptrCast([*c]{s}, &out),\n", .{func.returnType}));
|
||||
}
|
||||
}
|
||||
|
||||
for (func.params) |param| {
|
||||
if (isFunctionPointer(param.typ)) {
|
||||
try file.writeAll(try allocPrint(allocator, "@ptrCast({s}),\n", .{param.name}));
|
||||
} else if (bindings.containsStruct(stripType(param.typ)) and isPointer(param.typ)) {
|
||||
try file.writeAll(try allocPrint(allocator, "@intToPtr([*c]raylib.{s}, @ptrToInt({s})),\n", .{ stripType(param.typ), param.name }));
|
||||
} else if (bindings.containsEnum(param.typ)) {
|
||||
try file.writeAll(try allocPrint(allocator, "@enumToInt({s}),\n", .{param.name}));
|
||||
} else if (bindings.containsStruct(stripType(param.typ))) {
|
||||
try file.writeAll(try allocPrint(allocator, "@intToPtr([*c]raylib.{s}, @ptrToInt(&{s})),\n", .{ stripType(param.typ), param.name }));
|
||||
} else if (isPointer(param.typ)) {
|
||||
if (std.mem.endsWith(u8, param.typ, "anyopaque")) {
|
||||
try file.writeAll(try allocPrint(allocator, "{s},\n", .{param.name}));
|
||||
} else if (isConst(param.typ)) {
|
||||
try file.writeAll(try allocPrint(allocator, "@intToPtr([*c]const {s}, @ptrToInt({s})),\n", .{ stripType(param.typ), param.name }));
|
||||
} else {
|
||||
try file.writeAll(try allocPrint(allocator, "@ptrCast([*c]{s}, {s}),\n", .{ stripType(param.typ), param.name }));
|
||||
}
|
||||
} else {
|
||||
try file.writeAll(try allocPrint(allocator, "{s},\n", .{param.name}));
|
||||
}
|
||||
}
|
||||
|
||||
if (isPointer(func.returnType)) {
|
||||
try file.writeAll("),\n);\n");
|
||||
} else {
|
||||
try file.writeAll(");\n");
|
||||
}
|
||||
|
||||
if (!isPrimitiveOrPointer(func.returnType) and !returnTypeIsVoid) {
|
||||
try file.writeAll("return out;\n");
|
||||
}
|
||||
|
||||
try file.writeAll("}\n");
|
||||
}
|
||||
|
||||
std.log.info("generated functions", .{});
|
||||
}
|
||||
|
||||
/// write: RETURN NAME(PARAMS...)
|
||||
/// or: void NAME(RETURN*, PARAMS...)
|
||||
fn writeCSignature(
|
||||
allocator: std.mem.Allocator,
|
||||
file: *fs.File,
|
||||
func: mapping.RaylibFunction,
|
||||
) !void {
|
||||
const returnType = func.returnType;
|
||||
|
||||
//return directly
|
||||
if (mapping.isPrimitiveOrPointer(returnType)) {
|
||||
try file.writeAll(try allocPrint(allocator, "{s} m{s}(", .{ returnType, func.name }));
|
||||
if (func.params == null or func.params.?.len == 0) {
|
||||
try file.writeAll("void");
|
||||
}
|
||||
}
|
||||
//wrap return type and put as first function parameter
|
||||
else {
|
||||
try file.writeAll(try allocPrint(allocator, "void m{s}({s} *out", .{ func.name, returnType }));
|
||||
if (func.params != null and func.params.?.len > 0) {
|
||||
try file.writeAll(", ");
|
||||
}
|
||||
}
|
||||
|
||||
if (func.params) |params| {
|
||||
for (params, 0..) |param, i| {
|
||||
const paramType = param.type;
|
||||
if (mapping.isPrimitiveOrPointer(paramType) or isFunctionPointer(paramType)) {
|
||||
try file.writeAll(try allocPrint(allocator, "{s} {s}", .{ paramType, param.name }));
|
||||
} else {
|
||||
try file.writeAll(try allocPrint(allocator, "{s} *{s}", .{ paramType, param.name }));
|
||||
}
|
||||
|
||||
if (i < params.len - 1) {
|
||||
try file.writeAll(", ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try file.writeAll(")");
|
||||
}
|
||||
|
||||
fn writeCFunctions(
|
||||
allocator: std.mem.Allocator,
|
||||
h: *fs.File,
|
||||
c: *fs.File,
|
||||
inject: Injections,
|
||||
rl: mapping.CombinedRaylib,
|
||||
) !void {
|
||||
var hInject = try fs.cwd().openFile("inject.h", .{});
|
||||
defer hInject.close();
|
||||
try h.writeFileAll(hInject, .{});
|
||||
var cInject = try fs.cwd().openFile("inject.c", .{});
|
||||
defer cInject.close();
|
||||
try c.writeFileAll(cInject, .{});
|
||||
|
||||
for (rl.functions.values()) |func| {
|
||||
if (inject.containsSymbol(func.name)) continue;
|
||||
|
||||
//--- C-HEADER -----------------------------
|
||||
|
||||
try h.writeAll(try allocPrint(allocator, "// {s}\n", .{func.description}));
|
||||
try writeCSignature(allocator, h, func);
|
||||
try h.writeAll(";\n\n");
|
||||
|
||||
try writeCSignature(allocator, c, func);
|
||||
try c.writeAll("\n{\n");
|
||||
|
||||
//--- C-IMPLEMENT -----------------------------
|
||||
|
||||
if (eql(func.returnType, "void")) {
|
||||
try c.writeAll("\t");
|
||||
} else if (mapping.isPrimitiveOrPointer(func.returnType)) {
|
||||
try c.writeAll("\treturn ");
|
||||
} else {
|
||||
try c.writeAll("\t*out = ");
|
||||
}
|
||||
|
||||
try c.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
"{s}(",
|
||||
.{func.name},
|
||||
),
|
||||
);
|
||||
|
||||
if (func.params) |params| {
|
||||
for (params, 0..) |param, i| {
|
||||
if (mapping.isPrimitiveOrPointer(param.type) or isFunctionPointer(param.type)) {
|
||||
try c.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
"{s}",
|
||||
.{param.name},
|
||||
),
|
||||
);
|
||||
} else {
|
||||
try c.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
"*{s}",
|
||||
.{param.name},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (i < params.len - 1) {
|
||||
try c.writeAll(", ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try c.writeAll(");\n}\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
fn writeStructs(
|
||||
allocator: std.mem.Allocator,
|
||||
file: *fs.File,
|
||||
bindings: mapping.Intermediate,
|
||||
inject: Injections,
|
||||
) !void {
|
||||
var buf: [51200]u8 = undefined;
|
||||
var fba = std.heap.FixedBufferAllocator.init(&buf);
|
||||
|
||||
for (bindings.structs) |s| {
|
||||
if (inject.containsSymbol(s.name)) continue;
|
||||
defer fba.reset();
|
||||
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
"\n/// {?s}\npub const {s} = extern struct {{\n",
|
||||
.{ s.description, s.name },
|
||||
),
|
||||
);
|
||||
|
||||
for (s.fields) |field| {
|
||||
try file.writeAll(try allocPrint(allocator, "/// {?s}\n\t{s}: {s},\n", .{
|
||||
field.description,
|
||||
field.name,
|
||||
field.typ,
|
||||
}));
|
||||
}
|
||||
|
||||
try file.writeAll("\n};\n");
|
||||
}
|
||||
|
||||
std.log.info("generated structs", .{});
|
||||
}
|
||||
|
||||
fn writeEnums(
|
||||
allocator: std.mem.Allocator,
|
||||
file: *fs.File,
|
||||
bindings: mapping.Intermediate,
|
||||
inject: Injections,
|
||||
) !void {
|
||||
var buf: [51200]u8 = undefined;
|
||||
var fba = std.heap.FixedBufferAllocator.init(&buf);
|
||||
|
||||
for (bindings.enums) |e| {
|
||||
if (inject.containsSymbol(e.name)) continue;
|
||||
defer fba.reset();
|
||||
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
"\n/// {?s}\npub const {s} = enum(i32) {{\n",
|
||||
.{ e.description, e.name },
|
||||
),
|
||||
);
|
||||
|
||||
for (e.values) |value| {
|
||||
try file.writeAll(try allocPrint(allocator, "/// {?s}\n{s} = {d},\n", .{
|
||||
value.description,
|
||||
value.name,
|
||||
value.value,
|
||||
}));
|
||||
}
|
||||
|
||||
try file.writeAll("\n};\n");
|
||||
}
|
||||
|
||||
std.log.info("generated enums", .{});
|
||||
}
|
||||
|
||||
fn writeDefines(
|
||||
allocator: std.mem.Allocator,
|
||||
file: *fs.File,
|
||||
bindings: mapping.Intermediate,
|
||||
inject: Injections,
|
||||
) !void {
|
||||
var buf: [51200]u8 = undefined;
|
||||
var fba = std.heap.FixedBufferAllocator.init(&buf);
|
||||
|
||||
for (bindings.defines) |d| {
|
||||
if (inject.containsSymbol(d.name)) continue;
|
||||
defer fba.reset();
|
||||
|
||||
try file.writeAll(
|
||||
try allocPrint(
|
||||
allocator,
|
||||
"\n/// {?s}\npub const {s}: {s} = {s};\n",
|
||||
.{ d.description, d.name, d.typ, d.value },
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
std.log.info("generated defines", .{});
|
||||
}
|
||||
|
||||
fn writeInjections(
|
||||
_: std.mem.Allocator,
|
||||
file: *fs.File,
|
||||
inject: Injections,
|
||||
) !void {
|
||||
var buf: [51200]u8 = undefined;
|
||||
var fba = std.heap.FixedBufferAllocator.init(&buf);
|
||||
|
||||
for (inject.lines) |line| {
|
||||
defer fba.reset();
|
||||
|
||||
try file.writeAll(try allocPrint(fba.allocator(), "{s}\n", .{line}));
|
||||
}
|
||||
|
||||
std.log.info("written inject.zig", .{});
|
||||
}
|
||||
|
||||
fn eql(a: []const u8, b: []const u8) bool {
|
||||
return std.mem.eql(u8, a, b);
|
||||
}
|
||||
|
||||
fn startsWith(haystack: []const u8, needle: []const u8) bool {
|
||||
return std.mem.startsWith(u8, haystack, needle);
|
||||
}
|
||||
|
||||
fn endsWith(haystack: []const u8, needle: []const u8) bool {
|
||||
return std.mem.endsWith(u8, haystack, needle);
|
||||
}
|
||||
|
||||
/// is pointer type
|
||||
fn isPointer(z: []const u8) bool {
|
||||
return pointerOffset(z) > 0;
|
||||
}
|
||||
|
||||
fn isFunctionPointer(z: []const u8) bool {
|
||||
return std.mem.indexOf(u8, z, "fn(") != null or std.mem.endsWith(u8, z, "Callback");
|
||||
}
|
||||
|
||||
fn pointerOffset(z: []const u8) usize {
|
||||
if (startsWith(z, "*")) return 1;
|
||||
if (startsWith(z, "?*")) return 2;
|
||||
if (startsWith(z, "[*]")) return 3;
|
||||
if (startsWith(z, "?[*]")) return 4;
|
||||
if (startsWith(z, "[*c]")) return 4;
|
||||
if (startsWith(z, "[*:0]")) return 5;
|
||||
if (startsWith(z, "?[*:0]")) return 6;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fn isConst(z: []const u8) bool {
|
||||
return startsWith(z[pointerOffset(z)..], "const ");
|
||||
}
|
||||
|
||||
fn isVoid(z: []const u8) bool {
|
||||
return eql(stripType(z), "void");
|
||||
}
|
||||
|
||||
/// strips const and pointer annotations
|
||||
/// *const TName -> TName
|
||||
fn stripType(z: []const u8) []const u8 {
|
||||
var name = z[pointerOffset(z)..];
|
||||
name = if (startsWith(name, "const ")) name["const ".len..] else name;
|
||||
|
||||
return std.mem.trim(u8, name, " \t\n");
|
||||
}
|
||||
|
||||
/// true if Zig type is primitive or a pointer to anything
|
||||
/// this means we don't need to wrap it in a pointer
|
||||
pub fn isPrimitiveOrPointer(z: []const u8) bool {
|
||||
const primitiveTypes = std.ComptimeStringMap(void, .{
|
||||
// .{ "void", {} }, // zig void is zero sized while C void is >= 1 byte
|
||||
.{ "bool", {} },
|
||||
.{ "u8", {} },
|
||||
.{ "i8", {} },
|
||||
.{ "i16", {} },
|
||||
.{ "u16", {} },
|
||||
.{ "i32", {} },
|
||||
.{ "u32", {} },
|
||||
.{ "i64", {} },
|
||||
.{ "u64", {} },
|
||||
.{ "f32", {} },
|
||||
.{ "f64", {} },
|
||||
});
|
||||
return primitiveTypes.has(stripType(z)) or pointerOffset(z) > 0;
|
||||
}
|
547
libs/raylib/gui_icons.h
Normal file
547
libs/raylib/gui_icons.h
Normal file
@ -0,0 +1,547 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
// //
|
||||
// raygui Icons exporter v1.1 - Icons data exported as a values array //
|
||||
// //
|
||||
// more info and bugs-report: github.com/raysan5/raygui //
|
||||
// feedback and support: ray[at]raylibtech.com //
|
||||
// //
|
||||
// Copyright (c) 2019-2021 raylib technologies (@raylibtech) //
|
||||
// //
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Defines and Macros
|
||||
//----------------------------------------------------------------------------------
|
||||
#define RAYGUI_ICON_SIZE 16 // Size of icons (squared)
|
||||
#define RAYGUI_ICON_MAX_ICONS 256 // Maximum number of icons
|
||||
#define RAYGUI_ICON_MAX_NAME_LENGTH 32 // Maximum length of icon name id
|
||||
|
||||
// Icons data is defined by bit array (every bit represents one pixel)
|
||||
// Those arrays are stored as unsigned int data arrays, so every array
|
||||
// element defines 32 pixels (bits) of information
|
||||
// Number of elemens depend on RAYGUI_ICON_SIZE (by default 16x16 pixels)
|
||||
#define RAYGUI_ICON_DATA_ELEMENTS (RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32)
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Icons enumeration
|
||||
//----------------------------------------------------------------------------------
|
||||
typedef enum {
|
||||
RAYGUI_ICON_NONE = 0,
|
||||
RAYGUI_ICON_FOLDER_FILE_OPEN = 1,
|
||||
RAYGUI_ICON_FILE_SAVE_CLASSIC = 2,
|
||||
RAYGUI_ICON_FOLDER_OPEN = 3,
|
||||
RAYGUI_ICON_FOLDER_SAVE = 4,
|
||||
RAYGUI_ICON_FILE_OPEN = 5,
|
||||
RAYGUI_ICON_FILE_SAVE = 6,
|
||||
RAYGUI_ICON_FILE_EXPORT = 7,
|
||||
RAYGUI_ICON_FILE_NEW = 8,
|
||||
RAYGUI_ICON_FILE_DELETE = 9,
|
||||
RAYGUI_ICON_FILETYPE_TEXT = 10,
|
||||
RAYGUI_ICON_FILETYPE_AUDIO = 11,
|
||||
RAYGUI_ICON_FILETYPE_IMAGE = 12,
|
||||
RAYGUI_ICON_FILETYPE_PLAY = 13,
|
||||
RAYGUI_ICON_FILETYPE_VIDEO = 14,
|
||||
RAYGUI_ICON_FILETYPE_INFO = 15,
|
||||
RAYGUI_ICON_FILE_COPY = 16,
|
||||
RAYGUI_ICON_FILE_CUT = 17,
|
||||
RAYGUI_ICON_FILE_PASTE = 18,
|
||||
RAYGUI_ICON_CURSOR_HAND = 19,
|
||||
RAYGUI_ICON_CURSOR_POINTER = 20,
|
||||
RAYGUI_ICON_CURSOR_CLASSIC = 21,
|
||||
RAYGUI_ICON_PENCIL = 22,
|
||||
RAYGUI_ICON_PENCIL_BIG = 23,
|
||||
RAYGUI_ICON_BRUSH_CLASSIC = 24,
|
||||
RAYGUI_ICON_BRUSH_PAINTER = 25,
|
||||
RAYGUI_ICON_WATER_DROP = 26,
|
||||
RAYGUI_ICON_COLOR_PICKER = 27,
|
||||
RAYGUI_ICON_RUBBER = 28,
|
||||
RAYGUI_ICON_COLOR_BUCKET = 29,
|
||||
RAYGUI_ICON_TEXT_T = 30,
|
||||
RAYGUI_ICON_TEXT_A = 31,
|
||||
RAYGUI_ICON_SCALE = 32,
|
||||
RAYGUI_ICON_RESIZE = 33,
|
||||
RAYGUI_ICON_FILTER_POINT = 34,
|
||||
RAYGUI_ICON_FILTER_BILINEAR = 35,
|
||||
RAYGUI_ICON_CROP = 36,
|
||||
RAYGUI_ICON_CROP_ALPHA = 37,
|
||||
RAYGUI_ICON_SQUARE_TOGGLE = 38,
|
||||
RAYGUI_ICON_SIMMETRY = 39,
|
||||
RAYGUI_ICON_SIMMETRY_HORIZONTAL = 40,
|
||||
RAYGUI_ICON_SIMMETRY_VERTICAL = 41,
|
||||
RAYGUI_ICON_LENS = 42,
|
||||
RAYGUI_ICON_LENS_BIG = 43,
|
||||
RAYGUI_ICON_EYE_ON = 44,
|
||||
RAYGUI_ICON_EYE_OFF = 45,
|
||||
RAYGUI_ICON_FILTER_TOP = 46,
|
||||
RAYGUI_ICON_FILTER = 47,
|
||||
RAYGUI_ICON_TARGET_POINT = 48,
|
||||
RAYGUI_ICON_TARGET_SMALL = 49,
|
||||
RAYGUI_ICON_TARGET_BIG = 50,
|
||||
RAYGUI_ICON_TARGET_MOVE = 51,
|
||||
RAYGUI_ICON_CURSOR_MOVE = 52,
|
||||
RAYGUI_ICON_CURSOR_SCALE = 53,
|
||||
RAYGUI_ICON_CURSOR_SCALE_RIGHT = 54,
|
||||
RAYGUI_ICON_CURSOR_SCALE_LEFT = 55,
|
||||
RAYGUI_ICON_UNDO = 56,
|
||||
RAYGUI_ICON_REDO = 57,
|
||||
RAYGUI_ICON_REREDO = 58,
|
||||
RAYGUI_ICON_MUTATE = 59,
|
||||
RAYGUI_ICON_ROTATE = 60,
|
||||
RAYGUI_ICON_REPEAT = 61,
|
||||
RAYGUI_ICON_SHUFFLE = 62,
|
||||
RAYGUI_ICON_EMPTYBOX = 63,
|
||||
RAYGUI_ICON_TARGET = 64,
|
||||
RAYGUI_ICON_TARGET_SMALL_FILL = 65,
|
||||
RAYGUI_ICON_TARGET_BIG_FILL = 66,
|
||||
RAYGUI_ICON_TARGET_MOVE_FILL = 67,
|
||||
RAYGUI_ICON_CURSOR_MOVE_FILL = 68,
|
||||
RAYGUI_ICON_CURSOR_SCALE_FILL = 69,
|
||||
RAYGUI_ICON_CURSOR_SCALE_RIGHT_FILL = 70,
|
||||
RAYGUI_ICON_CURSOR_SCALE_LEFT_FILL = 71,
|
||||
RAYGUI_ICON_UNDO_FILL = 72,
|
||||
RAYGUI_ICON_REDO_FILL = 73,
|
||||
RAYGUI_ICON_REREDO_FILL = 74,
|
||||
RAYGUI_ICON_MUTATE_FILL = 75,
|
||||
RAYGUI_ICON_ROTATE_FILL = 76,
|
||||
RAYGUI_ICON_REPEAT_FILL = 77,
|
||||
RAYGUI_ICON_SHUFFLE_FILL = 78,
|
||||
RAYGUI_ICON_EMPTYBOX_SMALL = 79,
|
||||
RAYGUI_ICON_BOX = 80,
|
||||
RAYGUI_ICON_BOX_TOP = 81,
|
||||
RAYGUI_ICON_BOX_TOP_RIGHT = 82,
|
||||
RAYGUI_ICON_BOX_RIGHT = 83,
|
||||
RAYGUI_ICON_BOX_BOTTOM_RIGHT = 84,
|
||||
RAYGUI_ICON_BOX_BOTTOM = 85,
|
||||
RAYGUI_ICON_BOX_BOTTOM_LEFT = 86,
|
||||
RAYGUI_ICON_BOX_LEFT = 87,
|
||||
RAYGUI_ICON_BOX_TOP_LEFT = 88,
|
||||
RAYGUI_ICON_BOX_CENTER = 89,
|
||||
RAYGUI_ICON_BOX_CIRCLE_MASK = 90,
|
||||
RAYGUI_ICON_POT = 91,
|
||||
RAYGUI_ICON_ALPHA_MULTIPLY = 92,
|
||||
RAYGUI_ICON_ALPHA_CLEAR = 93,
|
||||
RAYGUI_ICON_DITHERING = 94,
|
||||
RAYGUI_ICON_MIPMAPS = 95,
|
||||
RAYGUI_ICON_BOX_GRID = 96,
|
||||
RAYGUI_ICON_GRID = 97,
|
||||
RAYGUI_ICON_BOX_CORNERS_SMALL = 98,
|
||||
RAYGUI_ICON_BOX_CORNERS_BIG = 99,
|
||||
RAYGUI_ICON_FOUR_BOXES = 100,
|
||||
RAYGUI_ICON_GRID_FILL = 101,
|
||||
RAYGUI_ICON_BOX_MULTISIZE = 102,
|
||||
RAYGUI_ICON_ZOOM_SMALL = 103,
|
||||
RAYGUI_ICON_ZOOM_MEDIUM = 104,
|
||||
RAYGUI_ICON_ZOOM_BIG = 105,
|
||||
RAYGUI_ICON_ZOOM_ALL = 106,
|
||||
RAYGUI_ICON_ZOOM_CENTER = 107,
|
||||
RAYGUI_ICON_BOX_DOTS_SMALL = 108,
|
||||
RAYGUI_ICON_BOX_DOTS_BIG = 109,
|
||||
RAYGUI_ICON_BOX_CONCENTRIC = 110,
|
||||
RAYGUI_ICON_BOX_GRID_BIG = 111,
|
||||
RAYGUI_ICON_OK_TICK = 112,
|
||||
RAYGUI_ICON_CROSS = 113,
|
||||
RAYGUI_ICON_ARROW_LEFT = 114,
|
||||
RAYGUI_ICON_ARROW_RIGHT = 115,
|
||||
RAYGUI_ICON_ARROW_BOTTOM = 116,
|
||||
RAYGUI_ICON_ARROW_TOP = 117,
|
||||
RAYGUI_ICON_ARROW_LEFT_FILL = 118,
|
||||
RAYGUI_ICON_ARROW_RIGHT_FILL = 119,
|
||||
RAYGUI_ICON_ARROW_BOTTOM_FILL = 120,
|
||||
RAYGUI_ICON_ARROW_TOP_FILL = 121,
|
||||
RAYGUI_ICON_AUDIO = 122,
|
||||
RAYGUI_ICON_FX = 123,
|
||||
RAYGUI_ICON_WAVE = 124,
|
||||
RAYGUI_ICON_WAVE_SINUS = 125,
|
||||
RAYGUI_ICON_WAVE_SQUARE = 126,
|
||||
RAYGUI_ICON_WAVE_TRIANGULAR = 127,
|
||||
RAYGUI_ICON_CROSS_SMALL = 128,
|
||||
RAYGUI_ICON_PLAYER_PREVIOUS = 129,
|
||||
RAYGUI_ICON_PLAYER_PLAY_BACK = 130,
|
||||
RAYGUI_ICON_PLAYER_PLAY = 131,
|
||||
RAYGUI_ICON_PLAYER_PAUSE = 132,
|
||||
RAYGUI_ICON_PLAYER_STOP = 133,
|
||||
RAYGUI_ICON_PLAYER_NEXT = 134,
|
||||
RAYGUI_ICON_PLAYER_RECORD = 135,
|
||||
RAYGUI_ICON_MAGNET = 136,
|
||||
RAYGUI_ICON_LOCK_CLOSE = 137,
|
||||
RAYGUI_ICON_LOCK_OPEN = 138,
|
||||
RAYGUI_ICON_CLOCK = 139,
|
||||
RAYGUI_ICON_TOOLS = 140,
|
||||
RAYGUI_ICON_GEAR = 141,
|
||||
RAYGUI_ICON_GEAR_BIG = 142,
|
||||
RAYGUI_ICON_BIN = 143,
|
||||
RAYGUI_ICON_HAND_POINTER = 144,
|
||||
RAYGUI_ICON_LASER = 145,
|
||||
RAYGUI_ICON_COIN = 146,
|
||||
RAYGUI_ICON_EXPLOSION = 147,
|
||||
RAYGUI_ICON_1UP = 148,
|
||||
RAYGUI_ICON_PLAYER = 149,
|
||||
RAYGUI_ICON_PLAYER_JUMP = 150,
|
||||
RAYGUI_ICON_KEY = 151,
|
||||
RAYGUI_ICON_DEMON = 152,
|
||||
RAYGUI_ICON_TEXT_POPUP = 153,
|
||||
RAYGUI_ICON_GEAR_EX = 154,
|
||||
RAYGUI_ICON_CRACK = 155,
|
||||
RAYGUI_ICON_CRACK_POINTS = 156,
|
||||
RAYGUI_ICON_STAR = 157,
|
||||
RAYGUI_ICON_DOOR = 158,
|
||||
RAYGUI_ICON_EXIT = 159,
|
||||
RAYGUI_ICON_MODE_2D = 160,
|
||||
RAYGUI_ICON_MODE_3D = 161,
|
||||
RAYGUI_ICON_CUBE = 162,
|
||||
RAYGUI_ICON_CUBE_FACE_TOP = 163,
|
||||
RAYGUI_ICON_CUBE_FACE_LEFT = 164,
|
||||
RAYGUI_ICON_CUBE_FACE_FRONT = 165,
|
||||
RAYGUI_ICON_CUBE_FACE_BOTTOM = 166,
|
||||
RAYGUI_ICON_CUBE_FACE_RIGHT = 167,
|
||||
RAYGUI_ICON_CUBE_FACE_BACK = 168,
|
||||
RAYGUI_ICON_CAMERA = 169,
|
||||
RAYGUI_ICON_SPECIAL = 170,
|
||||
RAYGUI_ICON_LINK_NET = 171,
|
||||
RAYGUI_ICON_LINK_BOXES = 172,
|
||||
RAYGUI_ICON_LINK_MULTI = 173,
|
||||
RAYGUI_ICON_LINK = 174,
|
||||
RAYGUI_ICON_LINK_BROKE = 175,
|
||||
RAYGUI_ICON_TEXT_NOTES = 176,
|
||||
RAYGUI_ICON_NOTEBOOK = 177,
|
||||
RAYGUI_ICON_SUITCASE = 178,
|
||||
RAYGUI_ICON_SUITCASE_ZIP = 179,
|
||||
RAYGUI_ICON_MAILBOX = 180,
|
||||
RAYGUI_ICON_MONITOR = 181,
|
||||
RAYGUI_ICON_PRINTER = 182,
|
||||
RAYGUI_ICON_PHOTO_CAMERA = 183,
|
||||
RAYGUI_ICON_PHOTO_CAMERA_FLASH = 184,
|
||||
RAYGUI_ICON_HOUSE = 185,
|
||||
RAYGUI_ICON_HEART = 186,
|
||||
RAYGUI_ICON_CORNER = 187,
|
||||
RAYGUI_ICON_VERTICAL_BARS = 188,
|
||||
RAYGUI_ICON_VERTICAL_BARS_FILL = 189,
|
||||
RAYGUI_ICON_LIFE_BARS = 190,
|
||||
RAYGUI_ICON_INFO = 191,
|
||||
RAYGUI_ICON_CROSSLINE = 192,
|
||||
RAYGUI_ICON_HELP = 193,
|
||||
RAYGUI_ICON_FILETYPE_ALPHA = 194,
|
||||
RAYGUI_ICON_FILETYPE_HOME = 195,
|
||||
RAYGUI_ICON_LAYERS_VISIBLE = 196,
|
||||
RAYGUI_ICON_LAYERS = 197,
|
||||
RAYGUI_ICON_WINDOW = 198,
|
||||
RAYGUI_ICON_199 = 199,
|
||||
RAYGUI_ICON_200 = 200,
|
||||
RAYGUI_ICON_201 = 201,
|
||||
RAYGUI_ICON_202 = 202,
|
||||
RAYGUI_ICON_203 = 203,
|
||||
RAYGUI_ICON_204 = 204,
|
||||
RAYGUI_ICON_205 = 205,
|
||||
RAYGUI_ICON_206 = 206,
|
||||
RAYGUI_ICON_207 = 207,
|
||||
RAYGUI_ICON_208 = 208,
|
||||
RAYGUI_ICON_209 = 209,
|
||||
RAYGUI_ICON_210 = 210,
|
||||
RAYGUI_ICON_211 = 211,
|
||||
RAYGUI_ICON_212 = 212,
|
||||
RAYGUI_ICON_213 = 213,
|
||||
RAYGUI_ICON_214 = 214,
|
||||
RAYGUI_ICON_215 = 215,
|
||||
RAYGUI_ICON_216 = 216,
|
||||
RAYGUI_ICON_217 = 217,
|
||||
RAYGUI_ICON_218 = 218,
|
||||
RAYGUI_ICON_219 = 219,
|
||||
RAYGUI_ICON_220 = 220,
|
||||
RAYGUI_ICON_221 = 221,
|
||||
RAYGUI_ICON_222 = 222,
|
||||
RAYGUI_ICON_223 = 223,
|
||||
RAYGUI_ICON_224 = 224,
|
||||
RAYGUI_ICON_225 = 225,
|
||||
RAYGUI_ICON_226 = 226,
|
||||
RAYGUI_ICON_227 = 227,
|
||||
RAYGUI_ICON_228 = 228,
|
||||
RAYGUI_ICON_229 = 229,
|
||||
RAYGUI_ICON_230 = 230,
|
||||
RAYGUI_ICON_231 = 231,
|
||||
RAYGUI_ICON_232 = 232,
|
||||
RAYGUI_ICON_233 = 233,
|
||||
RAYGUI_ICON_234 = 234,
|
||||
RAYGUI_ICON_235 = 235,
|
||||
RAYGUI_ICON_236 = 236,
|
||||
RAYGUI_ICON_237 = 237,
|
||||
RAYGUI_ICON_238 = 238,
|
||||
RAYGUI_ICON_239 = 239,
|
||||
RAYGUI_ICON_240 = 240,
|
||||
RAYGUI_ICON_241 = 241,
|
||||
RAYGUI_ICON_242 = 242,
|
||||
RAYGUI_ICON_243 = 243,
|
||||
RAYGUI_ICON_244 = 244,
|
||||
RAYGUI_ICON_245 = 245,
|
||||
RAYGUI_ICON_246 = 246,
|
||||
RAYGUI_ICON_247 = 247,
|
||||
RAYGUI_ICON_248 = 248,
|
||||
RAYGUI_ICON_249 = 249,
|
||||
RAYGUI_ICON_250 = 250,
|
||||
RAYGUI_ICON_251 = 251,
|
||||
RAYGUI_ICON_252 = 252,
|
||||
RAYGUI_ICON_253 = 253,
|
||||
RAYGUI_ICON_254 = 254,
|
||||
RAYGUI_ICON_255 = 255,
|
||||
} guiIconName;
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Icons data
|
||||
//----------------------------------------------------------------------------------
|
||||
static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] = {
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_NONE
|
||||
0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // RAYGUI_ICON_FOLDER_FILE_OPEN
|
||||
0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // RAYGUI_ICON_FILE_SAVE_CLASSIC
|
||||
0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024002, 0x44424282, 0x793e4102, 0x00000100, // RAYGUI_ICON_FOLDER_OPEN
|
||||
0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024102, 0x44424102, 0x793e4282, 0x00000000, // RAYGUI_ICON_FOLDER_SAVE
|
||||
0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x24442284, 0x21042104, 0x20042104, 0x00003ffc, // RAYGUI_ICON_FILE_OPEN
|
||||
0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x21042104, 0x22842444, 0x20042104, 0x00003ffc, // RAYGUI_ICON_FILE_SAVE
|
||||
0x3ff00000, 0x201c2010, 0x00042004, 0x20041004, 0x20844784, 0x00841384, 0x20042784, 0x00003ffc, // RAYGUI_ICON_FILE_EXPORT
|
||||
0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x22042204, 0x22042f84, 0x20042204, 0x00003ffc, // RAYGUI_ICON_FILE_NEW
|
||||
0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x25042884, 0x25042204, 0x20042884, 0x00003ffc, // RAYGUI_ICON_FILE_DELETE
|
||||
0x3ff00000, 0x201c2010, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // RAYGUI_ICON_FILETYPE_TEXT
|
||||
0x3ff00000, 0x201c2010, 0x27042004, 0x244424c4, 0x26442444, 0x20642664, 0x20042004, 0x00003ffc, // RAYGUI_ICON_FILETYPE_AUDIO
|
||||
0x3ff00000, 0x201c2010, 0x26042604, 0x20042004, 0x35442884, 0x2414222c, 0x20042004, 0x00003ffc, // RAYGUI_ICON_FILETYPE_IMAGE
|
||||
0x3ff00000, 0x201c2010, 0x20c42004, 0x22442144, 0x22442444, 0x20c42144, 0x20042004, 0x00003ffc, // RAYGUI_ICON_FILETYPE_PLAY
|
||||
0x3ff00000, 0x3ffc2ff0, 0x3f3c2ff4, 0x3dbc2eb4, 0x3dbc2bb4, 0x3f3c2eb4, 0x3ffc2ff4, 0x00002ff4, // RAYGUI_ICON_FILETYPE_VIDEO
|
||||
0x3ff00000, 0x201c2010, 0x21842184, 0x21842004, 0x21842184, 0x21842184, 0x20042184, 0x00003ffc, // RAYGUI_ICON_FILETYPE_INFO
|
||||
0x0ff00000, 0x381c0810, 0x28042804, 0x28042804, 0x28042804, 0x28042804, 0x20102ffc, 0x00003ff0, // RAYGUI_ICON_FILE_COPY
|
||||
0x00000000, 0x701c0000, 0x079c1e14, 0x55a000f0, 0x079c00f0, 0x701c1e14, 0x00000000, 0x00000000, // RAYGUI_ICON_FILE_CUT
|
||||
0x01c00000, 0x13e41bec, 0x3f841004, 0x204420c4, 0x20442044, 0x20442044, 0x207c2044, 0x00003fc0, // RAYGUI_ICON_FILE_PASTE
|
||||
0x00000000, 0x3aa00fe0, 0x2abc2aa0, 0x2aa42aa4, 0x20042aa4, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_CURSOR_HAND
|
||||
0x00000000, 0x003c000c, 0x030800c8, 0x30100c10, 0x10202020, 0x04400840, 0x01800280, 0x00000000, // RAYGUI_ICON_CURSOR_POINTER
|
||||
0x00000000, 0x00180000, 0x01f00078, 0x03e007f0, 0x07c003e0, 0x04000e40, 0x00000000, 0x00000000, // RAYGUI_ICON_CURSOR_CLASSIC
|
||||
0x00000000, 0x04000000, 0x11000a00, 0x04400a80, 0x01100220, 0x00580088, 0x00000038, 0x00000000, // RAYGUI_ICON_PENCIL
|
||||
0x04000000, 0x15000a00, 0x50402880, 0x14102820, 0x05040a08, 0x015c028c, 0x007c00bc, 0x00000000, // RAYGUI_ICON_PENCIL_BIG
|
||||
0x01c00000, 0x01400140, 0x01400140, 0x0ff80140, 0x0ff80808, 0x0aa80808, 0x0aa80aa8, 0x00000ff8, // RAYGUI_ICON_BRUSH_CLASSIC
|
||||
0x1ffc0000, 0x5ffc7ffe, 0x40004000, 0x00807f80, 0x01c001c0, 0x01c001c0, 0x01c001c0, 0x00000080, // RAYGUI_ICON_BRUSH_PAINTER
|
||||
0x00000000, 0x00800000, 0x01c00080, 0x03e001c0, 0x07f003e0, 0x036006f0, 0x000001c0, 0x00000000, // RAYGUI_ICON_WATER_DROP
|
||||
0x00000000, 0x3e003800, 0x1f803f80, 0x0c201e40, 0x02080c10, 0x00840104, 0x00380044, 0x00000000, // RAYGUI_ICON_COLOR_PICKER
|
||||
0x00000000, 0x07800300, 0x1fe00fc0, 0x3f883fd0, 0x0e021f04, 0x02040402, 0x00f00108, 0x00000000, // RAYGUI_ICON_RUBBER
|
||||
0x00c00000, 0x02800140, 0x08200440, 0x20081010, 0x2ffe3004, 0x03f807fc, 0x00e001f0, 0x00000040, // RAYGUI_ICON_COLOR_BUCKET
|
||||
0x00000000, 0x21843ffc, 0x01800180, 0x01800180, 0x01800180, 0x01800180, 0x03c00180, 0x00000000, // RAYGUI_ICON_TEXT_T
|
||||
0x00800000, 0x01400180, 0x06200340, 0x0c100620, 0x1ff80c10, 0x380c1808, 0x70067004, 0x0000f80f, // RAYGUI_ICON_TEXT_A
|
||||
0x78000000, 0x50004000, 0x00004800, 0x03c003c0, 0x03c003c0, 0x00100000, 0x0002000a, 0x0000000e, // RAYGUI_ICON_SCALE
|
||||
0x75560000, 0x5e004002, 0x54001002, 0x41001202, 0x408200fe, 0x40820082, 0x40820082, 0x00006afe, // RAYGUI_ICON_RESIZE
|
||||
0x00000000, 0x3f003f00, 0x3f003f00, 0x3f003f00, 0x00400080, 0x001c0020, 0x001c001c, 0x00000000, // RAYGUI_ICON_FILTER_POINT
|
||||
0x6d800000, 0x00004080, 0x40804080, 0x40800000, 0x00406d80, 0x001c0020, 0x001c001c, 0x00000000, // RAYGUI_ICON_FILTER_BILINEAR
|
||||
0x40080000, 0x1ffe2008, 0x14081008, 0x11081208, 0x10481088, 0x10081028, 0x10047ff8, 0x00001002, // RAYGUI_ICON_CROP
|
||||
0x00100000, 0x3ffc0010, 0x2ab03550, 0x22b02550, 0x20b02150, 0x20302050, 0x2000fff0, 0x00002000, // RAYGUI_ICON_CROP_ALPHA
|
||||
0x40000000, 0x1ff82000, 0x04082808, 0x01082208, 0x00482088, 0x00182028, 0x35542008, 0x00000002, // RAYGUI_ICON_SQUARE_TOGGLE
|
||||
0x00000000, 0x02800280, 0x06c006c0, 0x0ea00ee0, 0x1e901eb0, 0x3e883e98, 0x7efc7e8c, 0x00000000, // RAYGUI_ICON_SIMMETRY
|
||||
0x01000000, 0x05600100, 0x1d480d50, 0x7d423d44, 0x3d447d42, 0x0d501d48, 0x01000560, 0x00000100, // RAYGUI_ICON_SIMMETRY_HORIZONTAL
|
||||
0x01800000, 0x04200240, 0x10080810, 0x00001ff8, 0x00007ffe, 0x0ff01ff8, 0x03c007e0, 0x00000180, // RAYGUI_ICON_SIMMETRY_VERTICAL
|
||||
0x00000000, 0x010800f0, 0x02040204, 0x02040204, 0x07f00308, 0x1c000e00, 0x30003800, 0x00000000, // RAYGUI_ICON_LENS
|
||||
0x00000000, 0x061803f0, 0x08240c0c, 0x08040814, 0x0c0c0804, 0x23f01618, 0x18002400, 0x00000000, // RAYGUI_ICON_LENS_BIG
|
||||
0x00000000, 0x00000000, 0x1c7007c0, 0x638e3398, 0x1c703398, 0x000007c0, 0x00000000, 0x00000000, // RAYGUI_ICON_EYE_ON
|
||||
0x00000000, 0x10002000, 0x04700fc0, 0x610e3218, 0x1c703098, 0x001007a0, 0x00000008, 0x00000000, // RAYGUI_ICON_EYE_OFF
|
||||
0x00000000, 0x00007ffc, 0x40047ffc, 0x10102008, 0x04400820, 0x02800280, 0x02800280, 0x00000100, // RAYGUI_ICON_FILTER_TOP
|
||||
0x00000000, 0x40027ffe, 0x10082004, 0x04200810, 0x02400240, 0x02400240, 0x01400240, 0x000000c0, // RAYGUI_ICON_FILTER
|
||||
0x00800000, 0x00800080, 0x00000080, 0x3c9e0000, 0x00000000, 0x00800080, 0x00800080, 0x00000000, // RAYGUI_ICON_TARGET_POINT
|
||||
0x00800000, 0x00800080, 0x00800080, 0x3f7e01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // RAYGUI_ICON_TARGET_SMALL
|
||||
0x00800000, 0x00800080, 0x03e00080, 0x3e3e0220, 0x03e00220, 0x00800080, 0x00800080, 0x00000000, // RAYGUI_ICON_TARGET_BIG
|
||||
0x01000000, 0x04400280, 0x01000100, 0x43842008, 0x43849ab2, 0x01002008, 0x04400100, 0x01000280, // RAYGUI_ICON_TARGET_MOVE
|
||||
0x01000000, 0x04400280, 0x01000100, 0x41042108, 0x41049ff2, 0x01002108, 0x04400100, 0x01000280, // RAYGUI_ICON_CURSOR_MOVE
|
||||
0x781e0000, 0x500a4002, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x4002500a, 0x0000781e, // RAYGUI_ICON_CURSOR_SCALE
|
||||
0x00000000, 0x20003c00, 0x24002800, 0x01000200, 0x00400080, 0x00140024, 0x003c0004, 0x00000000, // RAYGUI_ICON_CURSOR_SCALE_RIGHT
|
||||
0x00000000, 0x0004003c, 0x00240014, 0x00800040, 0x02000100, 0x28002400, 0x3c002000, 0x00000000, // RAYGUI_ICON_CURSOR_SCALE_LEFT
|
||||
0x00000000, 0x00100020, 0x10101fc8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // RAYGUI_ICON_UNDO
|
||||
0x00000000, 0x08000400, 0x080813f8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // RAYGUI_ICON_REDO
|
||||
0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3f902020, 0x00400020, 0x00000000, // RAYGUI_ICON_REREDO
|
||||
0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3fc82010, 0x00200010, 0x00000000, // RAYGUI_ICON_MUTATE
|
||||
0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18101020, 0x00100fc8, 0x00000020, // RAYGUI_ICON_ROTATE
|
||||
0x00000000, 0x04000200, 0x240429fc, 0x20042204, 0x20442004, 0x3f942024, 0x00400020, 0x00000000, // RAYGUI_ICON_REPEAT
|
||||
0x00000000, 0x20001000, 0x22104c0e, 0x00801120, 0x11200040, 0x4c0e2210, 0x10002000, 0x00000000, // RAYGUI_ICON_SHUFFLE
|
||||
0x7ffe0000, 0x50024002, 0x44024802, 0x41024202, 0x40424082, 0x40124022, 0x4002400a, 0x00007ffe, // RAYGUI_ICON_EMPTYBOX
|
||||
0x00800000, 0x03e00080, 0x08080490, 0x3c9e0808, 0x08080808, 0x03e00490, 0x00800080, 0x00000000, // RAYGUI_ICON_TARGET
|
||||
0x00800000, 0x00800080, 0x00800080, 0x3ffe01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // RAYGUI_ICON_TARGET_SMALL_FILL
|
||||
0x00800000, 0x00800080, 0x03e00080, 0x3ffe03e0, 0x03e003e0, 0x00800080, 0x00800080, 0x00000000, // RAYGUI_ICON_TARGET_BIG_FILL
|
||||
0x01000000, 0x07c00380, 0x01000100, 0x638c2008, 0x638cfbbe, 0x01002008, 0x07c00100, 0x01000380, // RAYGUI_ICON_TARGET_MOVE_FILL
|
||||
0x01000000, 0x07c00380, 0x01000100, 0x610c2108, 0x610cfffe, 0x01002108, 0x07c00100, 0x01000380, // RAYGUI_ICON_CURSOR_MOVE_FILL
|
||||
0x781e0000, 0x6006700e, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x700e6006, 0x0000781e, // RAYGUI_ICON_CURSOR_SCALE_FILL
|
||||
0x00000000, 0x38003c00, 0x24003000, 0x01000200, 0x00400080, 0x000c0024, 0x003c001c, 0x00000000, // RAYGUI_ICON_CURSOR_SCALE_RIGHT_FILL
|
||||
0x00000000, 0x001c003c, 0x0024000c, 0x00800040, 0x02000100, 0x30002400, 0x3c003800, 0x00000000, // RAYGUI_ICON_CURSOR_SCALE_LEFT_FILL
|
||||
0x00000000, 0x00300020, 0x10301ff8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // RAYGUI_ICON_UNDO_FILL
|
||||
0x00000000, 0x0c000400, 0x0c081ff8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // RAYGUI_ICON_REDO_FILL
|
||||
0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3ff02060, 0x00400060, 0x00000000, // RAYGUI_ICON_REREDO_FILL
|
||||
0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3ff82030, 0x00200030, 0x00000000, // RAYGUI_ICON_MUTATE_FILL
|
||||
0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18301020, 0x00300ff8, 0x00000020, // RAYGUI_ICON_ROTATE_FILL
|
||||
0x00000000, 0x06000200, 0x26042ffc, 0x20042204, 0x20442004, 0x3ff42064, 0x00400060, 0x00000000, // RAYGUI_ICON_REPEAT_FILL
|
||||
0x00000000, 0x30001000, 0x32107c0e, 0x00801120, 0x11200040, 0x7c0e3210, 0x10003000, 0x00000000, // RAYGUI_ICON_SHUFFLE_FILL
|
||||
0x00000000, 0x30043ffc, 0x24042804, 0x21042204, 0x20442084, 0x20142024, 0x3ffc200c, 0x00000000, // RAYGUI_ICON_EMPTYBOX_SMALL
|
||||
0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_BOX
|
||||
0x00000000, 0x23c43ffc, 0x23c423c4, 0x200423c4, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_BOX_TOP
|
||||
0x00000000, 0x3e043ffc, 0x3e043e04, 0x20043e04, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_BOX_TOP_RIGHT
|
||||
0x00000000, 0x20043ffc, 0x20042004, 0x3e043e04, 0x3e043e04, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_BOX_RIGHT
|
||||
0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x3e042004, 0x3e043e04, 0x3ffc3e04, 0x00000000, // RAYGUI_ICON_BOX_BOTTOM_RIGHT
|
||||
0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x23c42004, 0x23c423c4, 0x3ffc23c4, 0x00000000, // RAYGUI_ICON_BOX_BOTTOM
|
||||
0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x207c2004, 0x207c207c, 0x3ffc207c, 0x00000000, // RAYGUI_ICON_BOX_BOTTOM_LEFT
|
||||
0x00000000, 0x20043ffc, 0x20042004, 0x207c207c, 0x207c207c, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_BOX_LEFT
|
||||
0x00000000, 0x207c3ffc, 0x207c207c, 0x2004207c, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_BOX_TOP_LEFT
|
||||
0x00000000, 0x20043ffc, 0x20042004, 0x23c423c4, 0x23c423c4, 0x20042004, 0x3ffc2004, 0x00000000, // RAYGUI_ICON_BOX_CENTER
|
||||
0x7ffe0000, 0x40024002, 0x47e24182, 0x4ff247e2, 0x47e24ff2, 0x418247e2, 0x40024002, 0x00007ffe, // RAYGUI_ICON_BOX_CIRCLE_MASK
|
||||
0x7fff0000, 0x40014001, 0x40014001, 0x49555ddd, 0x4945495d, 0x400149c5, 0x40014001, 0x00007fff, // RAYGUI_ICON_POT
|
||||
0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x404e40ce, 0x48125432, 0x4006540e, 0x00007ffe, // RAYGUI_ICON_ALPHA_MULTIPLY
|
||||
0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x5c4e40ce, 0x44124432, 0x40065c0e, 0x00007ffe, // RAYGUI_ICON_ALPHA_CLEAR
|
||||
0x7ffe0000, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x00007ffe, // RAYGUI_ICON_DITHERING
|
||||
0x07fe0000, 0x1ffa0002, 0x7fea000a, 0x402a402a, 0x5b2a512a, 0x5128552a, 0x40205128, 0x00007fe0, // RAYGUI_ICON_MIPMAPS
|
||||
0x00000000, 0x1ff80000, 0x12481248, 0x12481ff8, 0x1ff81248, 0x12481248, 0x00001ff8, 0x00000000, // RAYGUI_ICON_BOX_GRID
|
||||
0x12480000, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x00001248, // RAYGUI_ICON_GRID
|
||||
0x00000000, 0x1c380000, 0x1c3817e8, 0x08100810, 0x08100810, 0x17e81c38, 0x00001c38, 0x00000000, // RAYGUI_ICON_BOX_CORNERS_SMALL
|
||||
0x700e0000, 0x700e5ffa, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x5ffa700e, 0x0000700e, // RAYGUI_ICON_BOX_CORNERS_BIG
|
||||
0x3f7e0000, 0x21422142, 0x21422142, 0x00003f7e, 0x21423f7e, 0x21422142, 0x3f7e2142, 0x00000000, // RAYGUI_ICON_FOUR_BOXES
|
||||
0x00000000, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x00000000, // RAYGUI_ICON_GRID_FILL
|
||||
0x7ffe0000, 0x7ffe7ffe, 0x77fe7000, 0x77fe77fe, 0x777e7700, 0x777e777e, 0x777e777e, 0x0000777e, // RAYGUI_ICON_BOX_MULTISIZE
|
||||
0x781e0000, 0x40024002, 0x00004002, 0x01800000, 0x00000180, 0x40020000, 0x40024002, 0x0000781e, // RAYGUI_ICON_ZOOM_SMALL
|
||||
0x781e0000, 0x40024002, 0x00004002, 0x03c003c0, 0x03c003c0, 0x40020000, 0x40024002, 0x0000781e, // RAYGUI_ICON_ZOOM_MEDIUM
|
||||
0x781e0000, 0x40024002, 0x07e04002, 0x07e007e0, 0x07e007e0, 0x400207e0, 0x40024002, 0x0000781e, // RAYGUI_ICON_ZOOM_BIG
|
||||
0x781e0000, 0x5ffa4002, 0x1ff85ffa, 0x1ff81ff8, 0x1ff81ff8, 0x5ffa1ff8, 0x40025ffa, 0x0000781e, // RAYGUI_ICON_ZOOM_ALL
|
||||
0x00000000, 0x2004381c, 0x00002004, 0x00000000, 0x00000000, 0x20040000, 0x381c2004, 0x00000000, // RAYGUI_ICON_ZOOM_CENTER
|
||||
0x00000000, 0x1db80000, 0x10081008, 0x10080000, 0x00001008, 0x10081008, 0x00001db8, 0x00000000, // RAYGUI_ICON_BOX_DOTS_SMALL
|
||||
0x35560000, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x35562002, 0x00000000, // RAYGUI_ICON_BOX_DOTS_BIG
|
||||
0x7ffe0000, 0x40024002, 0x48124ff2, 0x49924812, 0x48124992, 0x4ff24812, 0x40024002, 0x00007ffe, // RAYGUI_ICON_BOX_CONCENTRIC
|
||||
0x00000000, 0x10841ffc, 0x10841084, 0x1ffc1084, 0x10841084, 0x10841084, 0x00001ffc, 0x00000000, // RAYGUI_ICON_BOX_GRID_BIG
|
||||
0x00000000, 0x00000000, 0x10000000, 0x04000800, 0x01040200, 0x00500088, 0x00000020, 0x00000000, // RAYGUI_ICON_OK_TICK
|
||||
0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // RAYGUI_ICON_CROSS
|
||||
0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // RAYGUI_ICON_ARROW_LEFT
|
||||
0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // RAYGUI_ICON_ARROW_RIGHT
|
||||
0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // RAYGUI_ICON_ARROW_BOTTOM
|
||||
0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_ARROW_TOP
|
||||
0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // RAYGUI_ICON_ARROW_LEFT_FILL
|
||||
0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // RAYGUI_ICON_ARROW_RIGHT_FILL
|
||||
0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // RAYGUI_ICON_ARROW_BOTTOM_FILL
|
||||
0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_ARROW_TOP_FILL
|
||||
0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // RAYGUI_ICON_AUDIO
|
||||
0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // RAYGUI_ICON_FX
|
||||
0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // RAYGUI_ICON_WAVE
|
||||
0x00000000, 0x00600000, 0x01080090, 0x02040108, 0x42044204, 0x24022402, 0x00001800, 0x00000000, // RAYGUI_ICON_WAVE_SINUS
|
||||
0x00000000, 0x07f80000, 0x04080408, 0x04080408, 0x04080408, 0x7c0e0408, 0x00000000, 0x00000000, // RAYGUI_ICON_WAVE_SQUARE
|
||||
0x00000000, 0x00000000, 0x00a00040, 0x22084110, 0x08021404, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_WAVE_TRIANGULAR
|
||||
0x00000000, 0x00000000, 0x04200000, 0x01800240, 0x02400180, 0x00000420, 0x00000000, 0x00000000, // RAYGUI_ICON_CROSS_SMALL
|
||||
0x00000000, 0x18380000, 0x12281428, 0x10a81128, 0x112810a8, 0x14281228, 0x00001838, 0x00000000, // RAYGUI_ICON_PLAYER_PREVIOUS
|
||||
0x00000000, 0x18000000, 0x11801600, 0x10181060, 0x10601018, 0x16001180, 0x00001800, 0x00000000, // RAYGUI_ICON_PLAYER_PLAY_BACK
|
||||
0x00000000, 0x00180000, 0x01880068, 0x18080608, 0x06081808, 0x00680188, 0x00000018, 0x00000000, // RAYGUI_ICON_PLAYER_PLAY
|
||||
0x00000000, 0x1e780000, 0x12481248, 0x12481248, 0x12481248, 0x12481248, 0x00001e78, 0x00000000, // RAYGUI_ICON_PLAYER_PAUSE
|
||||
0x00000000, 0x1ff80000, 0x10081008, 0x10081008, 0x10081008, 0x10081008, 0x00001ff8, 0x00000000, // RAYGUI_ICON_PLAYER_STOP
|
||||
0x00000000, 0x1c180000, 0x14481428, 0x15081488, 0x14881508, 0x14281448, 0x00001c18, 0x00000000, // RAYGUI_ICON_PLAYER_NEXT
|
||||
0x00000000, 0x03c00000, 0x08100420, 0x10081008, 0x10081008, 0x04200810, 0x000003c0, 0x00000000, // RAYGUI_ICON_PLAYER_RECORD
|
||||
0x00000000, 0x0c3007e0, 0x13c81818, 0x14281668, 0x14281428, 0x1c381c38, 0x08102244, 0x00000000, // RAYGUI_ICON_MAGNET
|
||||
0x07c00000, 0x08200820, 0x3ff80820, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // RAYGUI_ICON_LOCK_CLOSE
|
||||
0x07c00000, 0x08000800, 0x3ff80800, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // RAYGUI_ICON_LOCK_OPEN
|
||||
0x01c00000, 0x0c180770, 0x3086188c, 0x60832082, 0x60034781, 0x30062002, 0x0c18180c, 0x01c00770, // RAYGUI_ICON_CLOCK
|
||||
0x0a200000, 0x1b201b20, 0x04200e20, 0x04200420, 0x04700420, 0x0e700e70, 0x0e700e70, 0x04200e70, // RAYGUI_ICON_TOOLS
|
||||
0x01800000, 0x3bdc318c, 0x0ff01ff8, 0x7c3e1e78, 0x1e787c3e, 0x1ff80ff0, 0x318c3bdc, 0x00000180, // RAYGUI_ICON_GEAR
|
||||
0x01800000, 0x3ffc318c, 0x1c381ff8, 0x781e1818, 0x1818781e, 0x1ff81c38, 0x318c3ffc, 0x00000180, // RAYGUI_ICON_GEAR_BIG
|
||||
0x00000000, 0x08080ff8, 0x08081ffc, 0x0aa80aa8, 0x0aa80aa8, 0x0aa80aa8, 0x08080aa8, 0x00000ff8, // RAYGUI_ICON_BIN
|
||||
0x00000000, 0x00000000, 0x20043ffc, 0x08043f84, 0x04040f84, 0x04040784, 0x000007fc, 0x00000000, // RAYGUI_ICON_HAND_POINTER
|
||||
0x00000000, 0x24400400, 0x00001480, 0x6efe0e00, 0x00000e00, 0x24401480, 0x00000400, 0x00000000, // RAYGUI_ICON_LASER
|
||||
0x00000000, 0x03c00000, 0x08300460, 0x11181118, 0x11181118, 0x04600830, 0x000003c0, 0x00000000, // RAYGUI_ICON_COIN
|
||||
0x00000000, 0x10880080, 0x06c00810, 0x366c07e0, 0x07e00240, 0x00001768, 0x04200240, 0x00000000, // RAYGUI_ICON_EXPLOSION
|
||||
0x00000000, 0x3d280000, 0x2528252c, 0x3d282528, 0x05280528, 0x05e80528, 0x00000000, 0x00000000, // RAYGUI_ICON_1UP
|
||||
0x01800000, 0x03c003c0, 0x018003c0, 0x0ff007e0, 0x0bd00bd0, 0x0a500bd0, 0x02400240, 0x02400240, // RAYGUI_ICON_PLAYER
|
||||
0x01800000, 0x03c003c0, 0x118013c0, 0x03c81ff8, 0x07c003c8, 0x04400440, 0x0c080478, 0x00000000, // RAYGUI_ICON_PLAYER_JUMP
|
||||
0x3ff80000, 0x30183ff8, 0x30183018, 0x3ff83ff8, 0x03000300, 0x03c003c0, 0x03e00300, 0x000003e0, // RAYGUI_ICON_KEY
|
||||
0x3ff80000, 0x3ff83ff8, 0x33983ff8, 0x3ff83398, 0x3ff83ff8, 0x00000540, 0x0fe00aa0, 0x00000fe0, // RAYGUI_ICON_DEMON
|
||||
0x00000000, 0x0ff00000, 0x20041008, 0x25442004, 0x10082004, 0x06000bf0, 0x00000300, 0x00000000, // RAYGUI_ICON_TEXT_POPUP
|
||||
0x00000000, 0x11440000, 0x07f00be8, 0x1c1c0e38, 0x1c1c0c18, 0x07f00e38, 0x11440be8, 0x00000000, // RAYGUI_ICON_GEAR_EX
|
||||
0x00000000, 0x20080000, 0x0c601010, 0x07c00fe0, 0x07c007c0, 0x0c600fe0, 0x20081010, 0x00000000, // RAYGUI_ICON_CRACK
|
||||
0x00000000, 0x20080000, 0x0c601010, 0x04400fe0, 0x04405554, 0x0c600fe0, 0x20081010, 0x00000000, // RAYGUI_ICON_CRACK_POINTS
|
||||
0x00000000, 0x00800080, 0x01c001c0, 0x1ffc3ffe, 0x03e007f0, 0x07f003e0, 0x0c180770, 0x00000808, // RAYGUI_ICON_STAR
|
||||
0x0ff00000, 0x08180810, 0x08100818, 0x0a100810, 0x08180810, 0x08100818, 0x08100810, 0x00001ff8, // RAYGUI_ICON_DOOR
|
||||
0x0ff00000, 0x08100810, 0x08100810, 0x10100010, 0x4f902010, 0x10102010, 0x08100010, 0x00000ff0, // RAYGUI_ICON_EXIT
|
||||
0x00040000, 0x001f000e, 0x0ef40004, 0x12f41284, 0x0ef41214, 0x10040004, 0x7ffc3004, 0x10003000, // RAYGUI_ICON_MODE_2D
|
||||
0x78040000, 0x501f600e, 0x0ef44004, 0x12f41284, 0x0ef41284, 0x10140004, 0x7ffc300c, 0x10003000, // RAYGUI_ICON_MODE_3D
|
||||
0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // RAYGUI_ICON_CUBE
|
||||
0x7fe00000, 0x5ff87ff0, 0x47fe4ffc, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // RAYGUI_ICON_CUBE_FACE_TOP
|
||||
0x7fe00000, 0x50386030, 0x47fe483c, 0x443e443e, 0x443e443e, 0x241e75fe, 0x0c06140e, 0x000007fe, // RAYGUI_ICON_CUBE_FACE_LEFT
|
||||
0x7fe00000, 0x50286030, 0x47fe4804, 0x47fe47fe, 0x47fe47fe, 0x27fe77fe, 0x0ffe17fe, 0x000007fe, // RAYGUI_ICON_CUBE_FACE_FRONT
|
||||
0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x3ff27fe2, 0x0ffe1ffa, 0x000007fe, // RAYGUI_ICON_CUBE_FACE_BOTTOM
|
||||
0x7fe00000, 0x70286030, 0x7ffe7804, 0x7c227c02, 0x7c227c22, 0x3c127de2, 0x0c061c0a, 0x000007fe, // RAYGUI_ICON_CUBE_FACE_RIGHT
|
||||
0x7fe00000, 0x7fe87ff0, 0x7ffe7fe4, 0x7fe27fe2, 0x7fe27fe2, 0x24127fe2, 0x0c06140a, 0x000007fe, // RAYGUI_ICON_CUBE_FACE_BACK
|
||||
0x00000000, 0x2a0233fe, 0x22022602, 0x22022202, 0x2a022602, 0x00a033fe, 0x02080110, 0x00000000, // RAYGUI_ICON_CAMERA
|
||||
0x00000000, 0x200c3ffc, 0x000c000c, 0x3ffc000c, 0x30003000, 0x30003000, 0x3ffc3004, 0x00000000, // RAYGUI_ICON_SPECIAL
|
||||
0x00000000, 0x0022003e, 0x012201e2, 0x0100013e, 0x01000100, 0x79000100, 0x4f004900, 0x00007800, // RAYGUI_ICON_LINK_NET
|
||||
0x00000000, 0x44007c00, 0x45004600, 0x00627cbe, 0x00620022, 0x45007cbe, 0x44004600, 0x00007c00, // RAYGUI_ICON_LINK_BOXES
|
||||
0x00000000, 0x0044007c, 0x0010007c, 0x3f100010, 0x3f1021f0, 0x3f100010, 0x3f0021f0, 0x00000000, // RAYGUI_ICON_LINK_MULTI
|
||||
0x00000000, 0x0044007c, 0x00440044, 0x0010007c, 0x00100010, 0x44107c10, 0x440047f0, 0x00007c00, // RAYGUI_ICON_LINK
|
||||
0x00000000, 0x0044007c, 0x00440044, 0x0000007c, 0x00000010, 0x44007c10, 0x44004550, 0x00007c00, // RAYGUI_ICON_LINK_BROKE
|
||||
0x02a00000, 0x22a43ffc, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // RAYGUI_ICON_TEXT_NOTES
|
||||
0x3ffc0000, 0x20042004, 0x245e27c4, 0x27c42444, 0x2004201e, 0x201e2004, 0x20042004, 0x00003ffc, // RAYGUI_ICON_NOTEBOOK
|
||||
0x00000000, 0x07e00000, 0x04200420, 0x24243ffc, 0x24242424, 0x24242424, 0x3ffc2424, 0x00000000, // RAYGUI_ICON_SUITCASE
|
||||
0x00000000, 0x0fe00000, 0x08200820, 0x40047ffc, 0x7ffc5554, 0x40045554, 0x7ffc4004, 0x00000000, // RAYGUI_ICON_SUITCASE_ZIP
|
||||
0x00000000, 0x20043ffc, 0x3ffc2004, 0x13c81008, 0x100813c8, 0x10081008, 0x1ff81008, 0x00000000, // RAYGUI_ICON_MAILBOX
|
||||
0x00000000, 0x40027ffe, 0x5ffa5ffa, 0x5ffa5ffa, 0x40025ffa, 0x03c07ffe, 0x1ff81ff8, 0x00000000, // RAYGUI_ICON_MONITOR
|
||||
0x0ff00000, 0x6bfe7ffe, 0x7ffe7ffe, 0x68167ffe, 0x08106816, 0x08100810, 0x0ff00810, 0x00000000, // RAYGUI_ICON_PRINTER
|
||||
0x3ff80000, 0xfffe2008, 0x870a8002, 0x904a888a, 0x904a904a, 0x870a888a, 0xfffe8002, 0x00000000, // RAYGUI_ICON_PHOTO_CAMERA
|
||||
0x0fc00000, 0xfcfe0cd8, 0x8002fffe, 0x84428382, 0x84428442, 0x80028382, 0xfffe8002, 0x00000000, // RAYGUI_ICON_PHOTO_CAMERA_FLASH
|
||||
0x00000000, 0x02400180, 0x08100420, 0x20041008, 0x23c42004, 0x22442244, 0x3ffc2244, 0x00000000, // RAYGUI_ICON_HOUSE
|
||||
0x00000000, 0x1c700000, 0x3ff83ef8, 0x3ff83ff8, 0x0fe01ff0, 0x038007c0, 0x00000100, 0x00000000, // RAYGUI_ICON_HEART
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0xe000c000, // RAYGUI_ICON_CORNER
|
||||
0x00000000, 0x14001c00, 0x15c01400, 0x15401540, 0x155c1540, 0x15541554, 0x1ddc1554, 0x00000000, // RAYGUI_ICON_VERTICAL_BARS
|
||||
0x00000000, 0x03000300, 0x1b001b00, 0x1b601b60, 0x1b6c1b60, 0x1b6c1b6c, 0x1b6c1b6c, 0x00000000, // RAYGUI_ICON_VERTICAL_BARS_FILL
|
||||
0x00000000, 0x00000000, 0x403e7ffe, 0x7ffe403e, 0x7ffe0000, 0x43fe43fe, 0x00007ffe, 0x00000000, // RAYGUI_ICON_LIFE_BARS
|
||||
0x7ffc0000, 0x43844004, 0x43844284, 0x43844004, 0x42844284, 0x42844284, 0x40044384, 0x00007ffc, // RAYGUI_ICON_INFO
|
||||
0x40008000, 0x10002000, 0x04000800, 0x01000200, 0x00400080, 0x00100020, 0x00040008, 0x00010002, // RAYGUI_ICON_CROSSLINE
|
||||
0x00000000, 0x1ff01ff0, 0x18301830, 0x1f001830, 0x03001f00, 0x00000300, 0x03000300, 0x00000000, // RAYGUI_ICON_HELP
|
||||
0x3ff00000, 0x2abc3550, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x00003ffc, // RAYGUI_ICON_FILETYPE_ALPHA
|
||||
0x3ff00000, 0x201c2010, 0x22442184, 0x28142424, 0x29942814, 0x2ff42994, 0x20042004, 0x00003ffc, // RAYGUI_ICON_FILETYPE_HOME
|
||||
0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // RAYGUI_ICON_LAYERS_VISIBLE
|
||||
0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // RAYGUI_ICON_LAYERS
|
||||
0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // RAYGUI_ICON_WINDOW
|
||||
0x09100000, 0x09f00910, 0x09100910, 0x00000910, 0x24a2779e, 0x27a224a2, 0x709e20a2, 0x00000000, // RAYGUI_ICON_199
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_200
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_201
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_202
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_203
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_204
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_205
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_206
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_207
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_208
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_209
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_210
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_211
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_212
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_213
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_214
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_215
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_216
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_217
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_218
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_219
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_220
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_221
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_222
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_223
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_224
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_225
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_226
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_227
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_228
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_229
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_230
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_231
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_232
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_233
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_234
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_235
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_236
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_237
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_238
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_239
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_240
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_241
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_242
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_243
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_244
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_245
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_246
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_247
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_248
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_249
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_250
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_251
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_252
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_253
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_254
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // RAYGUI_ICON_255
|
||||
};
|
5
libs/raylib/inject.c
Normal file
5
libs/raylib/inject.c
Normal file
@ -0,0 +1,5 @@
|
||||
#define GRAPHICS_API_OPENGL_11
|
||||
// #define RLGL_IMPLEMENTATION
|
||||
#include "raylib.h"
|
||||
#include "rlgl.h"
|
||||
#include "raymath.h"
|
12
libs/raylib/inject.h
Normal file
12
libs/raylib/inject.h
Normal file
@ -0,0 +1,12 @@
|
||||
//--- CORE ----------------------------------------------------------------------------------------
|
||||
#define GRAPHICS_API_OPENGL_11
|
||||
// #define RLGL_IMPLEMENTATION
|
||||
#include "raylib.h"
|
||||
#include "rlgl.h"
|
||||
#include "raymath.h"
|
||||
|
||||
// Enable vertex state pointer
|
||||
void rlEnableStatePointer(int vertexAttribType, void *buffer);
|
||||
|
||||
// Disable vertex state pointer
|
||||
void rlDisableStatePointer(int vertexAttribType);
|
999
libs/raylib/inject.zig
Normal file
999
libs/raylib/inject.zig
Normal file
@ -0,0 +1,999 @@
|
||||
const std = @import("std");
|
||||
const raylib = @cImport({
|
||||
@cInclude("raylib.h");
|
||||
|
||||
@cDefine("GRAPHICS_API_OPENGL_11", {});
|
||||
// @cDefine("RLGL_IMPLEMENTATION", {});
|
||||
@cInclude("rlgl.h");
|
||||
|
||||
@cDefine("RAYMATH_IMPLEMENTATION", {});
|
||||
@cInclude("raymath.h");
|
||||
|
||||
@cInclude("marshal.h");
|
||||
});
|
||||
|
||||
//--- structs -------------------------------------------------------------------------------------
|
||||
|
||||
/// System/Window config flags
|
||||
pub const ConfigFlags = packed struct(u32) {
|
||||
FLAG_UNKNOWN_1: bool = false, // 0x0001
|
||||
/// Set to run program in fullscreen
|
||||
FLAG_FULLSCREEN_MODE: bool = false, // 0x0002,
|
||||
/// Set to allow resizable window
|
||||
FLAG_WINDOW_RESIZABLE: bool = false, // 0x0004,
|
||||
/// Set to disable window decoration (frame and buttons)
|
||||
FLAG_WINDOW_UNDECORATED: bool = false, // 0x0008,
|
||||
/// Set to allow transparent framebuffer
|
||||
FLAG_WINDOW_TRANSPARENT: bool = false, // 0x0010,
|
||||
/// Set to try enabling MSAA 4X
|
||||
FLAG_MSAA_4X_HINT: bool = false, // 0x0020,
|
||||
/// Set to try enabling V-Sync on GPU
|
||||
FLAG_VSYNC_HINT: bool = false, // 0x0040,
|
||||
/// Set to hide window
|
||||
FLAG_WINDOW_HIDDEN: bool = false, // 0x0080,
|
||||
/// Set to allow windows running while minimized
|
||||
FLAG_WINDOW_ALWAYS_RUN: bool = false, // 0x0100,
|
||||
/// Set to minimize window (iconify)
|
||||
FLAG_WINDOW_MINIMIZED: bool = false, // 0x0200,
|
||||
/// Set to maximize window (expanded to monitor)
|
||||
FLAG_WINDOW_MAXIMIZED: bool = false, // 0x0400,
|
||||
/// Set to window non focused
|
||||
FLAG_WINDOW_UNFOCUSED: bool = false, // 0x0800,
|
||||
/// Set to window always on top
|
||||
FLAG_WINDOW_TOPMOST: bool = false, // 0x1000,
|
||||
/// Set to support HighDPI
|
||||
FLAG_WINDOW_HIGHDPI: bool = false, // 0x2000,
|
||||
/// Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED
|
||||
FLAG_WINDOW_MOUSE_PASSTHROUGH: bool = false, // 0x4000,
|
||||
FLAG_UNKNOWN_2: bool = false, // 0x8000
|
||||
/// Set to try enabling interlaced video format (for V3D)
|
||||
FLAG_INTERLACED_HINT: bool = false, // 0x10000
|
||||
FLAG_PADDING: u15 = 0, // 0xFFFE0000
|
||||
};
|
||||
|
||||
/// Transform, vectex transformation data
|
||||
pub const Transform = extern struct {
|
||||
/// Translation
|
||||
translation: Vector3,
|
||||
/// Rotation
|
||||
rotation: Vector4,
|
||||
/// Scale
|
||||
scale: Vector3,
|
||||
};
|
||||
|
||||
/// Matrix, 4x4 components, column major, OpenGL style, right handed
|
||||
pub const Matrix = extern struct {
|
||||
/// Matrix first row (4 components) [m0, m4, m8, m12]
|
||||
m0: f32,
|
||||
m4: f32,
|
||||
m8: f32,
|
||||
m12: f32,
|
||||
/// Matrix second row (4 components) [m1, m5, m9, m13]
|
||||
m1: f32,
|
||||
m5: f32,
|
||||
m9: f32,
|
||||
m13: f32,
|
||||
/// Matrix third row (4 components) [m2, m6, m10, m14]
|
||||
m2: f32,
|
||||
m6: f32,
|
||||
m10: f32,
|
||||
m14: f32,
|
||||
/// Matrix fourth row (4 components) [m3, m7, m11, m15]
|
||||
m3: f32,
|
||||
m7: f32,
|
||||
m11: f32,
|
||||
m15: f32,
|
||||
|
||||
pub fn zero() @This() {
|
||||
return @This(){
|
||||
.m0 = 0,
|
||||
.m1 = 0,
|
||||
.m2 = 0,
|
||||
.m3 = 0,
|
||||
.m4 = 0,
|
||||
.m5 = 0,
|
||||
.m6 = 0,
|
||||
.m7 = 0,
|
||||
.m8 = 0,
|
||||
.m9 = 0,
|
||||
.m10 = 0,
|
||||
.m11 = 0,
|
||||
.m12 = 0,
|
||||
.m13 = 0,
|
||||
.m14 = 0,
|
||||
.m15 = 0,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn identity() @This() {
|
||||
return MatrixIdentity();
|
||||
}
|
||||
};
|
||||
|
||||
pub const Rectangle = extern struct {
|
||||
x: f32 = 0,
|
||||
y: f32 = 0,
|
||||
width: f32 = 0,
|
||||
height: f32 = 0,
|
||||
|
||||
pub fn toI32(self: @This()) RectangleI {
|
||||
return .{
|
||||
.x = @as(i32, @intFromFloat(self.x)),
|
||||
.y = @as(i32, @intFromFloat(self.y)),
|
||||
.width = @as(i32, @intFromFloat(self.width)),
|
||||
.height = @as(i32, @intFromFloat(self.height)),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn pos(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x,
|
||||
.y = self.y,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn size(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.width,
|
||||
.y = self.height,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn topLeft(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x,
|
||||
.y = self.y,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn topCenter(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x + self.width / 2,
|
||||
.y = self.y,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn topRight(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x + self.width,
|
||||
.y = self.y,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn centerLeft(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x,
|
||||
.y = self.y + self.height / 2,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn center(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x + self.width / 2,
|
||||
.y = self.y + self.height / 2,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn centerRight(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x + self.width,
|
||||
.y = self.y + self.height / 2,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn bottomLeft(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x + 0,
|
||||
.y = self.y + self.height,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn bottomCenter(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x + self.width / 2,
|
||||
.y = self.y + self.height,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn bottomRight(self: @This()) Vector2 {
|
||||
return .{
|
||||
.x = self.x + self.width,
|
||||
.y = self.y + self.height,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn area(self: @This()) f32 {
|
||||
return self.width * self.height;
|
||||
}
|
||||
|
||||
pub fn include(self: @This(), other: @This()) @This() {
|
||||
return self.includePoint(other.topLeft()).includePoint(other.bottomRight());
|
||||
}
|
||||
|
||||
pub fn includePoint(self: @This(), point: Vector2) @This() {
|
||||
const minX = @min(self.x, point.x);
|
||||
const minY = @min(self.y, point.y);
|
||||
const maxX = @max(self.x + self.width, point.x);
|
||||
const maxY = @max(self.y + self.height, point.y);
|
||||
|
||||
return .{
|
||||
.x = minX,
|
||||
.y = minY,
|
||||
.width = maxX - minX,
|
||||
.height = maxY - minY,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
pub const RectangleI = extern struct {
|
||||
x: i32 = 0,
|
||||
y: i32 = 0,
|
||||
width: i32 = 0,
|
||||
height: i32 = 0,
|
||||
|
||||
pub fn toF32(self: @This()) Rectangle {
|
||||
return .{
|
||||
.x = @as(f32, @floatFromInt(self.x)),
|
||||
.y = @as(f32, @floatFromInt(self.y)),
|
||||
.width = @as(f32, @floatFromInt(self.width)),
|
||||
.height = @as(f32, @floatFromInt(self.height)),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn pos(self: @This()) Vector2i {
|
||||
return .{
|
||||
.x = self.x,
|
||||
.y = self.y,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
pub const Vector2 = extern struct {
|
||||
x: f32 = 0,
|
||||
y: f32 = 0,
|
||||
|
||||
pub fn zero() @This() {
|
||||
return .{ .x = 0, .y = 0 };
|
||||
}
|
||||
|
||||
pub fn setZero(self: *@This()) void {
|
||||
self.x = 0;
|
||||
self.y = 0;
|
||||
}
|
||||
|
||||
pub fn one() @This() {
|
||||
return @This(){ .x = 1, .y = 1 };
|
||||
}
|
||||
|
||||
pub fn neg(self: @This()) @This() {
|
||||
return @This(){ .x = -self.x, .y = -self.y };
|
||||
}
|
||||
|
||||
pub fn length2(self: @This()) f32 {
|
||||
var sum = self.x * self.x;
|
||||
sum += self.y * self.y;
|
||||
return sum;
|
||||
}
|
||||
|
||||
pub fn length(self: @This()) f32 {
|
||||
return std.math.sqrt(self.length2());
|
||||
}
|
||||
|
||||
pub fn distanceTo(self: @This(), other: @This()) f32 {
|
||||
return self.sub(other).length();
|
||||
}
|
||||
|
||||
pub fn distanceToSquared(self: @This(), other: @This()) f32 {
|
||||
return self.sub(other).length2();
|
||||
}
|
||||
|
||||
pub fn normalize(self: @This()) @This() {
|
||||
const l = self.length();
|
||||
if (l == 0.0) return @This().zero();
|
||||
return self.scale(1.0 / l);
|
||||
}
|
||||
|
||||
pub fn scale(self: @This(), factor: f32) @This() {
|
||||
return @This(){
|
||||
.x = self.x * factor,
|
||||
.y = self.y * factor,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn add(self: @This(), other: @This()) @This() {
|
||||
return @This(){
|
||||
.x = self.x + other.x,
|
||||
.y = self.y + other.y,
|
||||
};
|
||||
}
|
||||
|
||||
/// same as add but assign result directly to this
|
||||
pub fn addSet(self: *@This(), other: @This()) void {
|
||||
self.x += other.x;
|
||||
self.y += other.y;
|
||||
}
|
||||
|
||||
pub fn sub(self: @This(), other: @This()) @This() {
|
||||
return @This(){
|
||||
.x = self.x - other.x,
|
||||
.y = self.y - other.y,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn lerp(self: @This(), other: @This(), t: f32) @This() {
|
||||
return self.scale(1 - t).add(other.scale(t));
|
||||
}
|
||||
|
||||
pub fn randomInUnitCircle(rng: std.rand.Random) @This() {
|
||||
return randomOnUnitCircle(rng).scale(randomF32(rng, 0, 1));
|
||||
}
|
||||
|
||||
pub fn randomOnUnitCircle(rng: std.rand.Random) @This() {
|
||||
return (Vector2{ .x = 1 }).rotate(randomF32(rng, -PI, PI));
|
||||
}
|
||||
|
||||
pub fn clampX(self: @This(), minX: f32, maxX: f32) @This() {
|
||||
return .{
|
||||
.x = std.math.clamp(self.x, minX, maxX),
|
||||
.y = self.y,
|
||||
};
|
||||
}
|
||||
pub fn clampY(self: @This(), minY: f32, maxY: f32) @This() {
|
||||
return .{
|
||||
.x = self.x,
|
||||
.y = std.math.clamp(self.y, minY, maxY),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn int(self: @This()) Vector2i {
|
||||
return .{ .x = @as(i32, @intFromFloat(self.x)), .y = @as(i32, @intFromFloat(self.y)) };
|
||||
}
|
||||
|
||||
/// Cross product
|
||||
pub fn cross(self: @This(), other: @This()) f32 {
|
||||
return self.x * other.y - self.y * other.x;
|
||||
}
|
||||
|
||||
/// Dot product.
|
||||
pub fn dot(self: @This(), other: @This()) f32 {
|
||||
return self.x * other.x + self.y * other.y;
|
||||
}
|
||||
|
||||
pub fn rotate(self: @This(), a: f32) @This() {
|
||||
return Vector2Rotate(self, a);
|
||||
}
|
||||
|
||||
pub fn fromAngle(a: f32) @This() {
|
||||
return Vector2Rotate(.{ .x = 1 }, a);
|
||||
}
|
||||
|
||||
pub fn angle(this: @This()) f32 {
|
||||
const zeroRotation: Vector2 = .{ .x = 1, .y = 0 };
|
||||
if (this.x == zeroRotation.x and this.y == zeroRotation.y) return 0;
|
||||
|
||||
const c = zeroRotation.cross(this);
|
||||
const d = zeroRotation.dot(this);
|
||||
return std.math.atan2(f32, c, d);
|
||||
}
|
||||
|
||||
pub fn xy0(self: @This()) Vector3 {
|
||||
return .{ .x = self.x, .y = self.y };
|
||||
}
|
||||
|
||||
pub fn x0z(self: @This()) Vector3 {
|
||||
return .{ .x = self.x, .z = self.y };
|
||||
}
|
||||
|
||||
pub fn set(self: @This(), setter: struct { x: ?f32 = null, y: ?f32 = null }) Vector2 {
|
||||
var copy = self;
|
||||
if (setter.x) |x| copy.x = x;
|
||||
if (setter.y) |y| copy.y = y;
|
||||
return copy;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Vector2i = extern struct {
|
||||
x: i32 = 0,
|
||||
y: i32 = 0,
|
||||
|
||||
pub fn float(self: @This()) Vector2 {
|
||||
return .{ .x = @as(f32, @floatFromInt(self.x)), .y = @as(f32, @floatFromInt(self.y)) };
|
||||
}
|
||||
};
|
||||
|
||||
pub const Vector3 = extern struct {
|
||||
x: f32 = 0,
|
||||
y: f32 = 0,
|
||||
z: f32 = 0,
|
||||
|
||||
pub fn new(x: f32, y: f32, z: f32) @This() {
|
||||
return @This(){ .x = x, .y = y, .z = z };
|
||||
}
|
||||
|
||||
pub fn zero() @This() {
|
||||
return @This(){ .x = 0, .y = 0, .z = 0 };
|
||||
}
|
||||
|
||||
pub fn one() @This() {
|
||||
return @This(){ .x = 1, .y = 1, .z = 1 };
|
||||
}
|
||||
|
||||
pub fn length2(self: @This()) f32 {
|
||||
var sum = self.x * self.x;
|
||||
sum += self.y * self.y;
|
||||
sum += self.z * self.z;
|
||||
return sum;
|
||||
}
|
||||
|
||||
pub fn length(self: @This()) f32 {
|
||||
return std.math.sqrt(self.length2());
|
||||
}
|
||||
|
||||
pub fn normalize(self: @This()) @This() {
|
||||
const l = self.length();
|
||||
if (l == 0.0) return @This().zero();
|
||||
return self.scale(1.0 / l);
|
||||
}
|
||||
|
||||
pub fn scale(self: @This(), factor: f32) @This() {
|
||||
return @This(){
|
||||
.x = self.x * factor,
|
||||
.y = self.y * factor,
|
||||
.z = self.z * factor,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn add(self: @This(), other: @This()) @This() {
|
||||
return @This(){
|
||||
.x = self.x + other.x,
|
||||
.y = self.y + other.y,
|
||||
.z = self.z + other.z,
|
||||
};
|
||||
}
|
||||
pub fn sub(self: @This(), other: @This()) @This() {
|
||||
return @This(){
|
||||
.x = self.x - other.x,
|
||||
.y = self.y - other.y,
|
||||
.z = self.z - other.z,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn neg(this: @This()) @This() {
|
||||
return .{
|
||||
.x = -this.x,
|
||||
.y = -this.y,
|
||||
.z = -this.z,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn lerp(self: @This(), other: @This(), t: f32) @This() {
|
||||
return self.scale(1 - t).add(other.scale(t));
|
||||
}
|
||||
|
||||
pub fn forward() @This() {
|
||||
return @This().new(0, 0, 1);
|
||||
}
|
||||
|
||||
pub fn rotate(self: @This(), quaternion: Vector4) @This() {
|
||||
return Vector3RotateByQuaternion(self, quaternion);
|
||||
}
|
||||
|
||||
pub fn angleBetween(self: @This(), other: Vector3) f32 {
|
||||
return Vector3Angle(self, other);
|
||||
// return std.math.acos(self.dot(other) / (self.length() * other.length()));
|
||||
}
|
||||
|
||||
/// Dot product.
|
||||
pub fn dot(self: @This(), other: @This()) f32 {
|
||||
return self.x * other.x + self.y * other.y + self.z * other.z;
|
||||
}
|
||||
|
||||
pub fn xy(self: @This()) Vector2 {
|
||||
return .{ .x = self.x, .y = self.y };
|
||||
}
|
||||
|
||||
pub fn set(self: @This(), setter: struct { x: ?f32 = null, y: ?f32 = null, z: ?f32 = null }) Vector3 {
|
||||
var copy = self;
|
||||
if (setter.x) |x| copy.x = x;
|
||||
if (setter.y) |y| copy.y = y;
|
||||
if (setter.z) |z| copy.z = z;
|
||||
return copy;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Vector4 = extern struct {
|
||||
x: f32 = 0,
|
||||
y: f32 = 0,
|
||||
z: f32 = 0,
|
||||
w: f32 = 0,
|
||||
|
||||
pub fn zero() @This() {
|
||||
return @This(){ .x = 0, .y = 0, .z = 0 };
|
||||
}
|
||||
|
||||
pub fn one() @This() {
|
||||
return @This(){ .x = 1, .y = 1, .z = 1 };
|
||||
}
|
||||
|
||||
pub fn length2(self: @This()) f32 {
|
||||
var sum = self.x * self.x;
|
||||
sum += self.y * self.y;
|
||||
sum += self.z * self.z;
|
||||
sum += self.w * self.w;
|
||||
return sum;
|
||||
}
|
||||
|
||||
pub fn length(self: @This()) f32 {
|
||||
return std.math.sqrt(self.length2());
|
||||
}
|
||||
|
||||
pub fn normalize(self: @This()) @This() {
|
||||
const l = self.length();
|
||||
if (l == 0.0) return @This().zero();
|
||||
return self.scale(1.0 / l);
|
||||
}
|
||||
|
||||
pub fn scale(self: @This(), factor: f32) @This() {
|
||||
return @This(){
|
||||
.x = self.x * factor,
|
||||
.y = self.y * factor,
|
||||
.z = self.z * factor,
|
||||
.w = self.w * factor,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn add(self: @This(), other: @This()) @This() {
|
||||
return @This(){
|
||||
.x = self.x + other.x,
|
||||
.y = self.y + other.y,
|
||||
.z = self.z + other.z,
|
||||
.w = self.w + other.w,
|
||||
};
|
||||
}
|
||||
pub fn sub(self: @This(), other: @This()) @This() {
|
||||
return @This(){
|
||||
.x = self.x - other.x,
|
||||
.y = self.y - other.y,
|
||||
.z = self.z - other.z,
|
||||
.w = self.w - other.w,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn lerp(self: @This(), other: @This(), t: f32) @This() {
|
||||
return self.scale(1 - t).add(other.scale(t));
|
||||
}
|
||||
|
||||
pub fn toColor(self: @This()) Color {
|
||||
return .{
|
||||
.r = @as(u8, @intFromFloat(std.math.clamp(self.x * 255, 0, 255))),
|
||||
.g = @as(u8, @intFromFloat(std.math.clamp(self.y * 255, 0, 255))),
|
||||
.b = @as(u8, @intFromFloat(std.math.clamp(self.z * 255, 0, 255))),
|
||||
.a = @as(u8, @intFromFloat(std.math.clamp(self.w * 255, 0, 255))),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn fromAngleAxis(axis: Vector3, angle: f32) @This() {
|
||||
return QuaternionFromAxisAngle(axis, angle);
|
||||
}
|
||||
};
|
||||
|
||||
/// Color type, RGBA (32bit)
|
||||
pub const Color = extern struct {
|
||||
r: u8 = 0,
|
||||
g: u8 = 0,
|
||||
b: u8 = 0,
|
||||
a: u8 = 255,
|
||||
|
||||
pub const ColorChangeConfig = struct {
|
||||
r: ?u8 = null,
|
||||
g: ?u8 = null,
|
||||
b: ?u8 = null,
|
||||
a: ?u8 = null,
|
||||
};
|
||||
|
||||
pub fn set(self: @This(), c: ColorChangeConfig) Color {
|
||||
return .{
|
||||
.r = if (c.r) |_r| _r else self.r,
|
||||
.g = if (c.g) |_g| _g else self.g,
|
||||
.b = if (c.b) |_b| _b else self.b,
|
||||
.a = if (c.a) |_a| _a else self.a,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn lerp(self: @This(), other: @This(), t: f32) @This() {
|
||||
return self.toVector4().lerp(other.toVector4(), t).toColor();
|
||||
}
|
||||
|
||||
pub fn lerpA(self: @This(), targetAlpha: u8, t: f32) @This() {
|
||||
var copy = self;
|
||||
const a = @as(f32, @floatFromInt(self.a));
|
||||
copy.a = @as(u8, @intFromFloat(a * (1 - t) + @as(f32, @floatFromInt(targetAlpha)) * t));
|
||||
return copy;
|
||||
}
|
||||
|
||||
pub fn toVector4(self: @This()) Vector4 {
|
||||
return .{
|
||||
.x = @as(f32, @floatFromInt(self.r)) / 255.0,
|
||||
.y = @as(f32, @floatFromInt(self.g)) / 255.0,
|
||||
.z = @as(f32, @floatFromInt(self.b)) / 255.0,
|
||||
.w = @as(f32, @floatFromInt(self.a)) / 255.0,
|
||||
};
|
||||
}
|
||||
|
||||
/// negate color (keep alpha)
|
||||
pub fn neg(self: @This()) @This() {
|
||||
return .{
|
||||
.r = 255 - self.r,
|
||||
.g = 255 - self.g,
|
||||
.b = 255 - self.b,
|
||||
.a = self.a,
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/// Camera2D, defines position/orientation in 2d space
|
||||
pub const Camera2D = extern struct {
|
||||
/// Camera offset (displacement from target)
|
||||
offset: Vector2 = Vector2.zero(),
|
||||
/// Camera target (rotation and zoom origin)
|
||||
target: Vector2,
|
||||
/// Camera rotation in degrees
|
||||
rotation: f32 = 0,
|
||||
/// Camera zoom (scaling), should be 1.0f by default
|
||||
zoom: f32 = 1,
|
||||
};
|
||||
|
||||
pub const MATERIAL_MAP_DIFFUSE = @as(usize, @intCast(@intFromEnum(MaterialMapIndex.MATERIAL_MAP_ALBEDO)));
|
||||
pub const MATERIAL_MAP_SPECULAR = @as(usize, @intCast(@intFromEnum(MaterialMapIndex.MATERIAL_MAP_METALNESS)));
|
||||
|
||||
//--- callbacks -----------------------------------------------------------------------------------
|
||||
|
||||
/// Logging: Redirect trace log messages
|
||||
pub const TraceLogCallback = *const fn (logLevel: c_int, text: [*c]const u8, args: ?*anyopaque) void;
|
||||
|
||||
/// FileIO: Load binary data
|
||||
pub const LoadFileDataCallback = *const fn (fileName: [*c]const u8, bytesRead: [*c]c_uint) [*c]u8;
|
||||
|
||||
/// FileIO: Save binary data
|
||||
pub const SaveFileDataCallback = *const fn (fileName: [*c]const u8, data: ?*anyopaque, bytesToWrite: c_uint) bool;
|
||||
|
||||
/// FileIO: Load text data
|
||||
pub const LoadFileTextCallback = *const fn (fileName: [*c]const u8) [*c]u8;
|
||||
|
||||
/// FileIO: Save text data
|
||||
pub const SaveFileTextCallback = *const fn (fileName: [*c]const u8, text: [*c]const u8) bool;
|
||||
|
||||
/// Audio Loading and Playing Functions (Module: audio)
|
||||
pub const AudioCallback = *const fn (bufferData: ?*anyopaque, frames: u32) void;
|
||||
|
||||
//--- utils ---------------------------------------------------------------------------------------
|
||||
|
||||
// Camera global state context data [56 bytes]
|
||||
pub const CameraData = extern struct {
|
||||
/// Current camera mode
|
||||
mode: u32,
|
||||
/// Camera distance from position to target
|
||||
targetDistance: f32,
|
||||
/// Player eyes position from ground (in meters)
|
||||
playerEyesPosition: f32,
|
||||
/// Camera angle in plane XZ
|
||||
angle: Vector2,
|
||||
/// Previous mouse position
|
||||
previousMousePosition: Vector2,
|
||||
|
||||
// Camera movement control keys
|
||||
|
||||
/// Move controls (CAMERA_FIRST_PERSON)
|
||||
moveControl: i32[6],
|
||||
/// Smooth zoom control key
|
||||
smoothZoomControl: i32,
|
||||
/// Alternative control key
|
||||
altControl: i32,
|
||||
/// Pan view control key
|
||||
panControl: i32,
|
||||
};
|
||||
|
||||
pub fn randomF32(rng: std.rand.Random, min: f32, max: f32) f32 {
|
||||
return rng.float(f32) * (max - min) + min;
|
||||
}
|
||||
|
||||
//--- functions -----------------------------------------------------------------------------------
|
||||
|
||||
/// Setup init configuration flags (view FLAGS)
|
||||
pub fn SetConfigFlags(
|
||||
flags: ConfigFlags,
|
||||
) void {
|
||||
raylib.SetConfigFlags(@as(c_uint, @bitCast(flags)));
|
||||
}
|
||||
|
||||
/// Load file data as byte array (read)
|
||||
pub fn LoadFileData(fileName: [*:0]const u8) ![]const u8 {
|
||||
var bytesRead: u32 = undefined;
|
||||
const data = raylib.LoadFileData(
|
||||
@as([*c]const u8, @ptrFromInt(@intFromPtr(fileName))),
|
||||
@as([*c]c_int, @ptrCast(&bytesRead)),
|
||||
);
|
||||
|
||||
if (data == null) return error.FileNotFound;
|
||||
|
||||
return data[0..bytesRead];
|
||||
}
|
||||
|
||||
/// Unload file data allocated by LoadFileData()
|
||||
pub fn UnloadFileData(
|
||||
data: []const u8,
|
||||
) void {
|
||||
raylib.UnloadFileData(
|
||||
@as([*c]u8, @ptrFromInt(@intFromPtr(data.ptr))),
|
||||
);
|
||||
}
|
||||
|
||||
/// Set custom trace log
|
||||
pub fn SetTraceLogCallback(
|
||||
_: TraceLogCallback,
|
||||
) void {
|
||||
@panic("use log.zig for that");
|
||||
}
|
||||
|
||||
/// Generate image font atlas using chars info
|
||||
pub fn GenImageFontAtlas(
|
||||
chars: [*]const GlyphInfo,
|
||||
recs: [*]const [*]const Rectangle,
|
||||
glyphCount: i32,
|
||||
fontSize: i32,
|
||||
padding: i32,
|
||||
packMethod: i32,
|
||||
) Image {
|
||||
var out: Image = undefined;
|
||||
mGenImageFontAtlas(
|
||||
@as([*c]raylib.Image, @ptrCast(&out)),
|
||||
@as([*c]raylib.GlyphInfo, @ptrCast(chars)),
|
||||
@as([*c][*c]raylib.Rectangle, @ptrCast(recs)),
|
||||
glyphCount,
|
||||
fontSize,
|
||||
padding,
|
||||
packMethod,
|
||||
);
|
||||
return out;
|
||||
}
|
||||
export fn mGenImageFontAtlas(
|
||||
out: [*c]raylib.Image,
|
||||
chars: [*c]raylib.GlyphInfo,
|
||||
recs: [*c][*c]raylib.Rectangle,
|
||||
glyphCount: i32,
|
||||
fontSize: i32,
|
||||
padding: i32,
|
||||
packMethod: i32,
|
||||
) void {
|
||||
out.* = raylib.GenImageFontAtlas(
|
||||
chars,
|
||||
recs,
|
||||
glyphCount,
|
||||
fontSize,
|
||||
padding,
|
||||
packMethod,
|
||||
);
|
||||
}
|
||||
|
||||
/// Get native window handle
|
||||
pub fn GetWindowHandle() ?*anyopaque {
|
||||
return raylib.GetWindowHandle();
|
||||
}
|
||||
|
||||
/// Internal memory allocator
|
||||
pub fn MemAlloc(
|
||||
size: i32,
|
||||
) ?*anyopaque {
|
||||
return raylib.MemAlloc(size);
|
||||
}
|
||||
|
||||
/// Internal memory reallocator
|
||||
pub fn MemRealloc(
|
||||
ptr: ?*anyopaque,
|
||||
size: i32,
|
||||
) ?*anyopaque {
|
||||
return raylib.MemRealloc(ptr, size);
|
||||
}
|
||||
|
||||
/// Internal memory free
|
||||
pub fn MemFree(
|
||||
ptr: ?*anyopaque,
|
||||
) void {
|
||||
raylib.MemFree(ptr);
|
||||
}
|
||||
|
||||
/// Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...)
|
||||
pub fn TraceLog(
|
||||
logLevel: i32,
|
||||
text: [*:0]const u8,
|
||||
) void {
|
||||
raylib.TraceLog(logLevel, text);
|
||||
}
|
||||
|
||||
/// Text formatting with variables (sprintf() style)
|
||||
/// caller owns memory
|
||||
pub fn TextFormat(allocator: std.mem.Allocator, comptime fmt: []const u8, args: anytype) std.fmt.AllocPrintError![*:0]const u8 {
|
||||
return (try std.fmt.allocPrintZ(allocator, fmt, args)).ptr;
|
||||
}
|
||||
|
||||
/// Split text into multiple strings
|
||||
pub fn TextSplit(allocator: std.mem.Allocator, text: []const u8, delimiter: []const u8, count: i32) ![]const []const u8 {
|
||||
var list = std.ArrayList([]const u8).init(allocator);
|
||||
var it = std.mem.split(u8, text, delimiter);
|
||||
var i = 0;
|
||||
var n = 0;
|
||||
while (it.next()) |slice| : (i += 1) {
|
||||
if (i >= count) {
|
||||
break;
|
||||
}
|
||||
|
||||
try list.append(slice);
|
||||
n += slice.len;
|
||||
}
|
||||
if (n < text.len) {
|
||||
try list.append(text[n..]);
|
||||
}
|
||||
return list.toOwnedSlice();
|
||||
}
|
||||
|
||||
/// Join text strings with delimiter
|
||||
pub fn TextJoin(allocator: std.mem.Allocator, textList: []const []const u8, delimiter: []const u8) ![:0]const u8 {
|
||||
return (try std.mem.joinZ(allocator, delimiter, textList)).ptr;
|
||||
}
|
||||
|
||||
/// Append text at specific position and move cursor!
|
||||
pub fn TextAppend(allocator: std.mem.Allocator, text: []const u8, append: []const u8, position: i32) std.fmt.AllocPrintError![:0]u8 {
|
||||
return (try std.fmt.allocPrintZ(allocator, "{s}{s}{s}", .{
|
||||
text[0..position],
|
||||
append,
|
||||
text[position..],
|
||||
})).ptr;
|
||||
}
|
||||
|
||||
//--- RLGL ----------------------------------------------------------------------------------------
|
||||
|
||||
pub const DEG2RAD: f32 = PI / 180;
|
||||
pub const RAD2DEG: f32 = 180 / PI;
|
||||
|
||||
///
|
||||
pub const rlglData = extern struct {
|
||||
/// Current render batch
|
||||
currentBatch: ?*rlRenderBatch,
|
||||
/// Default internal render batch
|
||||
defaultBatch: rlRenderBatch,
|
||||
|
||||
pub const State = extern struct {
|
||||
/// Current active render batch vertex counter (generic, used for all batches)
|
||||
vertexCounter: i32,
|
||||
/// Current active texture coordinate X (added on glVertex*())
|
||||
texcoordx: f32,
|
||||
/// Current active texture coordinate Y (added on glVertex*())
|
||||
texcoordy: f32,
|
||||
/// Current active normal X (added on glVertex*())
|
||||
normalx: f32,
|
||||
/// Current active normal Y (added on glVertex*())
|
||||
normaly: f32,
|
||||
/// Current active normal Z (added on glVertex*())
|
||||
normalz: f32,
|
||||
/// Current active color R (added on glVertex*())
|
||||
colorr: u8,
|
||||
/// Current active color G (added on glVertex*())
|
||||
colorg: u8,
|
||||
/// Current active color B (added on glVertex*())
|
||||
colorb: u8,
|
||||
/// Current active color A (added on glVertex*())
|
||||
colora: u8,
|
||||
/// Current matrix mode
|
||||
currentMatrixMode: i32,
|
||||
/// Current matrix pointer
|
||||
currentMatrix: ?*Matrix,
|
||||
/// Default modelview matrix
|
||||
modelview: Matrix,
|
||||
/// Default projection matrix
|
||||
projection: Matrix,
|
||||
/// Transform matrix to be used with rlTranslate, rlRotate, rlScale
|
||||
transform: Matrix,
|
||||
/// Require transform matrix application to current draw-call vertex (if required)
|
||||
transformRequired: bool,
|
||||
/// Matrix stack for push/pop
|
||||
stack: [RL_MAX_MATRIX_STACK_SIZE]Matrix,
|
||||
/// Matrix stack counter
|
||||
stackCounter: i32,
|
||||
/// Default texture used on shapes/poly drawing (required by shader)
|
||||
defaultTextureId: u32,
|
||||
/// Active texture ids to be enabled on batch drawing (0 active by default)
|
||||
activeTextureId: [RL_DEFAULT_BATCH_MAX_TEXTURE_UNITS]u32,
|
||||
/// Default vertex shader id (used by default shader program)
|
||||
defaultVShaderId: u32,
|
||||
/// Default fragment shader id (used by default shader program)
|
||||
defaultFShaderId: u32,
|
||||
/// Default shader program id, supports vertex color and diffuse texture
|
||||
defaultShaderId: u32,
|
||||
/// Default shader locations pointer to be used on rendering
|
||||
defaultShaderLocs: [*]i32,
|
||||
/// Current shader id to be used on rendering (by default, defaultShaderId)
|
||||
currentShaderId: u32,
|
||||
/// Current shader locations pointer to be used on rendering (by default, defaultShaderLocs)
|
||||
currentShaderLocs: [*]i32,
|
||||
/// Stereo rendering flag
|
||||
stereoRender: bool,
|
||||
/// VR stereo rendering eyes projection matrices
|
||||
projectionStereo: [2]Matrix,
|
||||
/// VR stereo rendering eyes view offset matrices
|
||||
viewOffsetStereo: [2]Matrix,
|
||||
/// Blending mode active
|
||||
currentBlendMode: i32,
|
||||
/// Blending source factor
|
||||
glBlendSrcFactor: i32,
|
||||
/// Blending destination factor
|
||||
glBlendDstFactor: i32,
|
||||
/// Blending equation
|
||||
glBlendEquation: i32,
|
||||
/// Current framebuffer width
|
||||
framebufferWidth: i32,
|
||||
/// Current framebuffer height
|
||||
framebufferHeight: i32,
|
||||
};
|
||||
|
||||
pub const ExtSupported = extern struct {
|
||||
/// VAO support (OpenGL ES2 could not support VAO extension) (GL_ARB_vertex_array_object)
|
||||
vao: bool,
|
||||
/// Instancing supported (GL_ANGLE_instanced_arrays, GL_EXT_draw_instanced + GL_EXT_instanced_arrays)
|
||||
instancing: bool,
|
||||
/// NPOT textures full support (GL_ARB_texture_non_power_of_two, GL_OES_texture_npot)
|
||||
texNPOT: bool,
|
||||
/// Depth textures supported (GL_ARB_depth_texture, GL_WEBGL_depth_texture, GL_OES_depth_texture)
|
||||
texDepth: bool,
|
||||
/// float textures support (32 bit per channel) (GL_OES_texture_float)
|
||||
texFloat32: bool,
|
||||
/// DDS texture compression support (GL_EXT_texture_compression_s3tc, GL_WEBGL_compressed_texture_s3tc, GL_WEBKIT_WEBGL_compressed_texture_s3tc)
|
||||
texCompDXT: bool,
|
||||
/// ETC1 texture compression support (GL_OES_compressed_ETC1_RGB8_texture, GL_WEBGL_compressed_texture_etc1)
|
||||
texCompETC1: bool,
|
||||
/// ETC2/EAC texture compression support (GL_ARB_ES3_compatibility)
|
||||
texCompETC2: bool,
|
||||
/// PVR texture compression support (GL_IMG_texture_compression_pvrtc)
|
||||
texCompPVRT: bool,
|
||||
/// ASTC texture compression support (GL_KHR_texture_compression_astc_hdr, GL_KHR_texture_compression_astc_ldr)
|
||||
texCompASTC: bool,
|
||||
/// Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp)
|
||||
texMirrorClamp: bool,
|
||||
/// Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic)
|
||||
texAnisoFilter: bool,
|
||||
/// Compute shaders support (GL_ARB_compute_shader)
|
||||
computeShader: bool,
|
||||
/// Shader storage buffer object support (GL_ARB_shader_storage_buffer_object)
|
||||
ssbo: bool,
|
||||
/// Maximum anisotropy level supported (minimum is 2.0f)
|
||||
maxAnisotropyLevel: f32,
|
||||
/// Maximum bits for depth component
|
||||
maxDepthBits: i32,
|
||||
};
|
||||
};
|
||||
|
||||
/// Enable attribute state pointer
|
||||
pub fn rlEnableStatePointer(
|
||||
vertexAttribType: i32,
|
||||
buffer: *anyopaque,
|
||||
) void {
|
||||
raylib.rlEnableStatePointer(
|
||||
vertexAttribType,
|
||||
@as([*c]anyopaque, @ptrCast(buffer)),
|
||||
);
|
||||
}
|
||||
|
||||
/// Disable attribute state pointer
|
||||
pub fn rlDisableStatePointer(
|
||||
vertexAttribType: i32,
|
||||
) void {
|
||||
raylib.rlDisableStatePointer(
|
||||
vertexAttribType,
|
||||
);
|
||||
}
|
||||
|
||||
/// Get the last gamepad button pressed
|
||||
pub fn GetGamepadButtonPressed() ?GamepadButton {
|
||||
if (raylib.GetGamepadButtonPressed() == -1) return null;
|
||||
|
||||
return @as(GamepadButton, @enumFromInt(raylib.GetGamepadButtonPressed()));
|
||||
}
|
48
libs/raylib/intermediate.zig
Normal file
48
libs/raylib/intermediate.zig
Normal file
@ -0,0 +1,48 @@
|
||||
const std = @import("std");
|
||||
const fs = std.fs;
|
||||
const mapping = @import("type_mapping.zig");
|
||||
const json = std.json;
|
||||
|
||||
pub const jsonFiles: []const []const u8 = &.{
|
||||
"raylib.json",
|
||||
"rlgl.json",
|
||||
"raymath.json",
|
||||
};
|
||||
pub const bindingsJSON = "bindings.json";
|
||||
|
||||
pub fn main() !void {
|
||||
std.log.info("updating bindings.json ...", .{});
|
||||
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||
defer {
|
||||
if (gpa.deinit() == .leak) {
|
||||
std.log.err("memory leak detected", .{});
|
||||
}
|
||||
}
|
||||
const allocator = gpa.allocator();
|
||||
var arena = std.heap.ArenaAllocator.init(allocator);
|
||||
defer arena.deinit();
|
||||
|
||||
const raylib: mapping.CombinedRaylib = try mapping.CombinedRaylib.load(arena.allocator(), jsonFiles);
|
||||
|
||||
var bindings: mapping.Intermediate = mapping.Intermediate.loadCustoms(arena.allocator(), bindingsJSON) catch |err| Catch: {
|
||||
std.log.warn("could not open {s}: {?}\n", .{ bindingsJSON, err });
|
||||
break :Catch mapping.Intermediate{
|
||||
.enums = &[_]mapping.Enum{},
|
||||
.structs = &[_]mapping.Struct{},
|
||||
.functions = &[_]mapping.Function{},
|
||||
.defines = &[_]mapping.Define{},
|
||||
};
|
||||
};
|
||||
|
||||
try bindings.addNonCustom(arena.allocator(), raylib);
|
||||
|
||||
var file = try fs.cwd().createFile(bindingsJSON, .{});
|
||||
defer file.close();
|
||||
|
||||
try json.stringify(bindings, .{
|
||||
.emit_null_optional_fields = false,
|
||||
.whitespace = .indent_2,
|
||||
}, file.writer());
|
||||
|
||||
std.log.info("... done", .{});
|
||||
}
|
BIN
libs/raylib/logo.png
Normal file
BIN
libs/raylib/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
4035
libs/raylib/marshal.c
Normal file
4035
libs/raylib/marshal.c
Normal file
File diff suppressed because it is too large
Load Diff
2429
libs/raylib/marshal.h
Normal file
2429
libs/raylib/marshal.h
Normal file
File diff suppressed because it is too large
Load Diff
1
libs/raylib/raylib
Submodule
1
libs/raylib/raylib
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit e46b6147fc30e69dd300bbda90ff0a62bf8a4df0
|
11660
libs/raylib/raylib.json
Normal file
11660
libs/raylib/raylib.json
Normal file
File diff suppressed because it is too large
Load Diff
12171
libs/raylib/raylib.zig
Normal file
12171
libs/raylib/raylib.zig
Normal file
File diff suppressed because it is too large
Load Diff
6
libs/raylib/raylib_parser.zig
Normal file
6
libs/raylib/raylib_parser.zig
Normal file
@ -0,0 +1,6 @@
|
||||
//! run 'zig build jsons' to generate bindings for raylib
|
||||
//! run 'zig build raylib_parser' to build the raylib_parser.exe
|
||||
|
||||
/// this needs to be here so the zig compiler won't complain that there is no entry point
|
||||
/// but actually we are using main() of 'raylib/src/parser/raylib_parser.c'
|
||||
pub extern fn main() c_int;
|
1954
libs/raylib/raymath.json
Normal file
1954
libs/raylib/raymath.json
Normal file
File diff suppressed because it is too large
Load Diff
3928
libs/raylib/rlgl.json
Normal file
3928
libs/raylib/rlgl.json
Normal file
File diff suppressed because it is too large
Load Diff
691
libs/raylib/type_mapping.zig
Normal file
691
libs/raylib/type_mapping.zig
Normal file
@ -0,0 +1,691 @@
|
||||
//! Strategy:
|
||||
//! 1. generate raylib JSONs
|
||||
//! 2. combine in a union RaylibJson
|
||||
//! 3. convert to intermediate representation
|
||||
//! 4. read adjusted intermediate JSONs
|
||||
//! 5. generate raylib.zig // wrap paramters and pass them to marshall versions of the raylib functions
|
||||
//! 6. generate marshall.c // unwrap parameters from zig function and call the actual raylib function
|
||||
//! 7. generate marshall.h // C signatures for all marshalled functions
|
||||
|
||||
const std = @import("std");
|
||||
const json = std.json;
|
||||
const memoryConstrain: usize = 1024 * 1024 * 1024; // 1 GiB
|
||||
const Allocator = std.mem.Allocator;
|
||||
const fmt = std.fmt.allocPrint;
|
||||
const talloc = std.testing.allocator;
|
||||
const expect = std.testing.expect;
|
||||
const expectEqualStrings = std.testing.expectEqualStrings;
|
||||
|
||||
//--- Intermediate Format -------------------------------------------------------------------------
|
||||
|
||||
pub const Intermediate = struct {
|
||||
functions: []Function,
|
||||
enums: []Enum,
|
||||
structs: []Struct,
|
||||
defines: []Define,
|
||||
|
||||
pub fn loadCustoms(allocator: Allocator, jsonFile: []const u8) !@This() {
|
||||
var enums = std.ArrayList(Enum).init(allocator);
|
||||
var structs = std.ArrayList(Struct).init(allocator);
|
||||
var functions = std.ArrayList(Function).init(allocator);
|
||||
var defines = std.ArrayList(Define).init(allocator);
|
||||
|
||||
const jsonData = try std.fs.cwd().readFileAlloc(allocator, jsonFile, memoryConstrain);
|
||||
|
||||
const bindingJson = try json.parseFromSliceLeaky(Intermediate, allocator, jsonData, .{
|
||||
.ignore_unknown_fields = true,
|
||||
});
|
||||
|
||||
for (bindingJson.enums) |t| {
|
||||
if (t.custom) {
|
||||
try enums.append(t);
|
||||
}
|
||||
}
|
||||
|
||||
for (bindingJson.structs) |t| {
|
||||
if (t.custom) {
|
||||
try structs.append(t);
|
||||
}
|
||||
}
|
||||
|
||||
for (bindingJson.functions) |f| {
|
||||
if (f.custom) {
|
||||
try functions.append(f);
|
||||
}
|
||||
}
|
||||
|
||||
for (bindingJson.defines) |f| {
|
||||
if (f.custom) {
|
||||
try defines.append(f);
|
||||
}
|
||||
}
|
||||
|
||||
return @This(){
|
||||
.enums = try enums.toOwnedSlice(),
|
||||
.structs = try structs.toOwnedSlice(),
|
||||
.functions = try functions.toOwnedSlice(),
|
||||
.defines = try defines.toOwnedSlice(),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn addNonCustom(self: *@This(), allocator: Allocator, rlJson: CombinedRaylib) !void {
|
||||
var enums = std.ArrayList(Enum).init(allocator);
|
||||
try enums.appendSlice(self.enums);
|
||||
var structs = std.ArrayList(Struct).init(allocator);
|
||||
try structs.appendSlice(self.structs);
|
||||
var functions = std.ArrayList(Function).init(allocator);
|
||||
try functions.appendSlice(self.functions);
|
||||
var defines = std.ArrayList(Define).init(allocator);
|
||||
try defines.appendSlice(self.defines);
|
||||
|
||||
outer: for (rlJson.defines.values(), 0..) |d, i| {
|
||||
for (defines.items) |added| {
|
||||
if (eql(added.name, d.name)) {
|
||||
std.log.debug("{s} is customized", .{d.name});
|
||||
continue :outer;
|
||||
}
|
||||
}
|
||||
const define = parseRaylibDefine(allocator, d) orelse continue :outer;
|
||||
|
||||
if (i < defines.items.len) {
|
||||
try defines.insert(i, define);
|
||||
} else {
|
||||
try defines.append(define);
|
||||
}
|
||||
}
|
||||
outer: for (rlJson.enums.values(), 0..) |e, i| {
|
||||
const name = if (alias.get(e.name)) |n| n else e.name;
|
||||
for (enums.items) |added| {
|
||||
if (eql(added.name, name)) {
|
||||
std.log.debug("{s} is customized", .{name});
|
||||
continue :outer;
|
||||
}
|
||||
}
|
||||
|
||||
if (i < enums.items.len) {
|
||||
try enums.insert(i, try parseRaylibEnum(allocator, e));
|
||||
} else {
|
||||
try enums.append(try parseRaylibEnum(allocator, e));
|
||||
}
|
||||
}
|
||||
outer: for (rlJson.structs.values(), 0..) |s, i| {
|
||||
const name = if (alias.get(s.name)) |n| n else s.name;
|
||||
for (structs.items) |added| {
|
||||
if (eql(added.name, name)) {
|
||||
std.log.debug("{s} is customized", .{name});
|
||||
continue :outer;
|
||||
}
|
||||
}
|
||||
if (i < structs.items.len) {
|
||||
try structs.insert(i, try parseRaylibStruct(allocator, s));
|
||||
} else {
|
||||
try structs.append(try parseRaylibStruct(allocator, s));
|
||||
}
|
||||
}
|
||||
for (rlJson.defines.values()) |_| {}
|
||||
|
||||
outer: for (rlJson.functions.values(), 0..) |f, i| {
|
||||
for (functions.items) |added| {
|
||||
if (eql(added.name, f.name)) {
|
||||
std.log.debug("{s} is customized", .{f.name});
|
||||
continue :outer;
|
||||
}
|
||||
}
|
||||
if (i < functions.items.len) {
|
||||
try functions.insert(i, try parseRaylibFunction(allocator, f));
|
||||
} else {
|
||||
try functions.append(try parseRaylibFunction(allocator, f));
|
||||
}
|
||||
}
|
||||
|
||||
self.enums = try enums.toOwnedSlice();
|
||||
self.structs = try structs.toOwnedSlice();
|
||||
self.functions = try functions.toOwnedSlice();
|
||||
self.defines = try defines.toOwnedSlice();
|
||||
}
|
||||
|
||||
pub fn containsStruct(self: @This(), name: []const u8) bool {
|
||||
for (self.structs) |s| {
|
||||
if (eql(s.name, name)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
pub fn containsEnum(self: @This(), name: []const u8) bool {
|
||||
for (self.enums) |e| {
|
||||
if (eql(e.name, name)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
pub fn containsDefine(self: @This(), name: []const u8) bool {
|
||||
for (self.defines) |d| {
|
||||
if (eql(d.name, name)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Function = struct {
|
||||
name: []const u8,
|
||||
params: []FunctionParameter,
|
||||
returnType: []const u8,
|
||||
description: ?[]const u8 = null,
|
||||
custom: bool = false,
|
||||
};
|
||||
|
||||
pub const FunctionParameter = struct {
|
||||
name: []const u8,
|
||||
typ: []const u8,
|
||||
description: ?[]const u8 = null,
|
||||
};
|
||||
|
||||
pub fn parseRaylibFunction(allocator: Allocator, func: RaylibFunction) !Function {
|
||||
var args = std.ArrayList(FunctionParameter).init(allocator);
|
||||
if (func.params) |params| {
|
||||
for (params) |p| {
|
||||
const t = try toZig(allocator, p.type);
|
||||
|
||||
try args.append(.{
|
||||
.name = p.name,
|
||||
.typ = t,
|
||||
.description = p.description,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const returnType = try toZig(allocator, func.returnType);
|
||||
|
||||
return Function{
|
||||
.name = func.name,
|
||||
.params = try args.toOwnedSlice(),
|
||||
.returnType = returnType,
|
||||
.description = func.description,
|
||||
};
|
||||
}
|
||||
|
||||
pub const Struct = struct {
|
||||
name: []const u8,
|
||||
fields: []const StructField,
|
||||
description: ?[]const u8 = null,
|
||||
custom: bool = false,
|
||||
};
|
||||
|
||||
pub const StructField = struct {
|
||||
name: []const u8,
|
||||
typ: []const u8,
|
||||
description: ?[]const u8 = null,
|
||||
};
|
||||
|
||||
pub fn parseRaylibStruct(allocator: Allocator, s: RaylibStruct) !Struct {
|
||||
var fields = std.ArrayList(StructField).init(allocator);
|
||||
for (s.fields) |field| {
|
||||
var typ = try toZig(allocator, getTypeWithoutArrayNotation(field.type));
|
||||
|
||||
if (getArraySize(field.type)) |size| {
|
||||
typ = try std.fmt.allocPrint(allocator, "[{d}]{s}", .{ size, typ });
|
||||
}
|
||||
|
||||
try fields.append(.{
|
||||
.name = field.name,
|
||||
.typ = typ,
|
||||
.description = field.description,
|
||||
});
|
||||
}
|
||||
|
||||
return Struct{
|
||||
.name = if (alias.get(s.name)) |a| a else s.name,
|
||||
.fields = try fields.toOwnedSlice(),
|
||||
.description = s.description,
|
||||
};
|
||||
}
|
||||
|
||||
pub const Define = struct {
|
||||
name: []const u8,
|
||||
typ: []const u8,
|
||||
value: []const u8,
|
||||
description: ?[]const u8 = null,
|
||||
custom: bool = false,
|
||||
};
|
||||
|
||||
pub fn parseRaylibDefine(allocator: Allocator, s: RaylibDefine) ?Define {
|
||||
var typ: []const u8 = undefined;
|
||||
var value: []const u8 = undefined;
|
||||
|
||||
if (eql("INT", s.type)) {
|
||||
typ = "i32";
|
||||
value = std.fmt.allocPrint(allocator, "{s}", .{s.value}) catch return null;
|
||||
} else if (eql("LONG", s.type)) {
|
||||
typ = "i64";
|
||||
value = std.fmt.allocPrint(allocator, "{s}", .{s.value}) catch return null;
|
||||
} else if (eql("FLOAT", s.type)) {
|
||||
typ = "f32";
|
||||
value = std.fmt.allocPrint(allocator, "{s}", .{s.value}) catch return null;
|
||||
} else if (eql("DOUBLE", s.type)) {
|
||||
typ = "f64";
|
||||
value = std.fmt.allocPrint(allocator, "{s}", .{s.value}) catch return null;
|
||||
} else if (eql("STRING", s.type)) {
|
||||
typ = "[]const u8";
|
||||
value = std.fmt.allocPrint(allocator, "\"{s}\"", .{s.value}) catch return null;
|
||||
} else if (eql("COLOR", s.type)) {
|
||||
typ = "Color";
|
||||
std.debug.assert(startsWith(s.value, "CLITERAL(Color){"));
|
||||
std.debug.assert(endsWith(s.value, "}"));
|
||||
|
||||
const componentString = s.value["CLITERAL(Color){".len .. s.value.len - 1];
|
||||
var spliterator = std.mem.split(u8, componentString, ",");
|
||||
var r = spliterator.next() orelse return null;
|
||||
r = std.mem.trim(u8, r, " \t\r\n");
|
||||
var g = spliterator.next() orelse return null;
|
||||
g = std.mem.trim(u8, g, " \t\r\n");
|
||||
var b = spliterator.next() orelse return null;
|
||||
b = std.mem.trim(u8, b, " \t\r\n");
|
||||
var a = spliterator.next() orelse return null;
|
||||
a = std.mem.trim(u8, a, " \t\r\n");
|
||||
value = std.fmt.allocPrint(allocator, ".{{.r={s}, .g={s}, .b={s}, .a={s}}}", .{ r, g, b, a }) catch return null;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Define{
|
||||
.name = s.name,
|
||||
.typ = typ,
|
||||
.value = value,
|
||||
.description = s.description,
|
||||
};
|
||||
}
|
||||
|
||||
pub const Enum = struct {
|
||||
name: []const u8,
|
||||
values: []const EnumValue,
|
||||
description: ?[]const u8 = null,
|
||||
custom: bool = false,
|
||||
};
|
||||
|
||||
pub const EnumValue = struct {
|
||||
name: []const u8,
|
||||
value: c_int,
|
||||
description: ?[]const u8 = null,
|
||||
};
|
||||
|
||||
pub fn parseRaylibEnum(allocator: Allocator, e: RaylibEnum) !Enum {
|
||||
var values = std.ArrayList(EnumValue).init(allocator);
|
||||
for (e.values) |value| {
|
||||
try values.append(.{
|
||||
.name = value.name,
|
||||
.value = value.value,
|
||||
.description = value.description,
|
||||
});
|
||||
}
|
||||
|
||||
return Enum{
|
||||
.name = e.name,
|
||||
.values = try values.toOwnedSlice(),
|
||||
.description = e.description,
|
||||
};
|
||||
}
|
||||
|
||||
/// is c const type
|
||||
pub fn isConst(c: []const u8) bool {
|
||||
return startsWith(c, "const ");
|
||||
}
|
||||
test "isConst" {
|
||||
try expect(!isConst("char *"));
|
||||
try expect(!isConst("unsigned char *"));
|
||||
try expect(isConst("const unsigned char *"));
|
||||
try expect(isConst("const unsigned int *"));
|
||||
try expect(isConst("const void *"));
|
||||
try expect(!isConst("Vector2 *"));
|
||||
try expect(!isConst("Vector2"));
|
||||
try expect(!isConst("int"));
|
||||
}
|
||||
|
||||
/// is c pointer type
|
||||
pub fn isPointer(c: []const u8) bool {
|
||||
return endsWith(c, "*");
|
||||
}
|
||||
test "isPointer" {
|
||||
try expect(isPointer("char *"));
|
||||
try expect(isPointer("unsigned char *"));
|
||||
try expect(isPointer("const unsigned char *"));
|
||||
try expect(isPointer("const unsigned int *"));
|
||||
try expect(isPointer("Vector2 *"));
|
||||
try expect(!isPointer("Vector2"));
|
||||
try expect(!isPointer("int"));
|
||||
}
|
||||
|
||||
pub fn isPointerToPointer(c: []const u8) bool {
|
||||
return endsWith(c, "**");
|
||||
}
|
||||
test "isPointerToPointer" {
|
||||
try expect(!isPointerToPointer("char *"));
|
||||
try expect(!isPointerToPointer("unsigned char *"));
|
||||
try expect(isPointerToPointer("const unsigned char **"));
|
||||
try expect(isPointerToPointer("const unsigned int **"));
|
||||
try expect(isPointerToPointer("Vector2 **"));
|
||||
try expect(!isPointerToPointer("Vector2*"));
|
||||
try expect(!isPointerToPointer("int"));
|
||||
}
|
||||
|
||||
pub fn isVoid(c: []const u8) bool {
|
||||
return eql(stripType(c), "void");
|
||||
}
|
||||
test "isVoid" {
|
||||
try expect(!isVoid("char *"));
|
||||
try expect(!isVoid("unsigned char *"));
|
||||
try expect(!isVoid("const unsigned char *"));
|
||||
try expect(isVoid("const void *"));
|
||||
try expect(isVoid("void *"));
|
||||
try expect(isVoid("void"));
|
||||
try expect(isVoid("void **"));
|
||||
}
|
||||
|
||||
/// strips const and pointer annotations
|
||||
/// const TName * -> TName
|
||||
pub fn stripType(c: []const u8) []const u8 {
|
||||
var name = if (isConst(c)) c["const ".len..] else c;
|
||||
name = if (isPointer(name)) name[0 .. name.len - 1] else name;
|
||||
// double pointer?
|
||||
name = if (isPointer(name)) name[0 .. name.len - 1] else name;
|
||||
name = std.mem.trim(u8, name, " \t\n");
|
||||
if (alias.get(name)) |ali| {
|
||||
name = ali;
|
||||
}
|
||||
return name;
|
||||
}
|
||||
test "stripType" {
|
||||
try expectEqualStrings("void", stripType("const void *"));
|
||||
try expectEqualStrings("unsinged int", stripType("unsinged int *"));
|
||||
try expectEqualStrings("Vector2", stripType("const Vector2 *"));
|
||||
}
|
||||
|
||||
pub fn getArraySize(typ: []const u8) ?usize {
|
||||
if (std.mem.indexOf(u8, typ, "[")) |open| {
|
||||
if (std.mem.indexOf(u8, typ, "]")) |close| {
|
||||
return std.fmt.parseInt(usize, typ[open + 1 .. close], 10) catch null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
test "getArraySize" {
|
||||
const expectEqual = std.testing.expectEqual;
|
||||
|
||||
try expectEqual(@as(?usize, 4), getArraySize("float[4]"));
|
||||
try expectEqual(@as(?usize, 44), getArraySize("int[44]"));
|
||||
try expectEqual(@as(?usize, 123456), getArraySize("a[123456]"));
|
||||
try expectEqual(@as(?usize, 1), getArraySize("test[1] "));
|
||||
try expectEqual(@as(?usize, null), getArraySize("foo[]"));
|
||||
try expectEqual(@as(?usize, null), getArraySize("bar"));
|
||||
try expectEqual(@as(?usize, null), getArraySize("foo["));
|
||||
try expectEqual(@as(?usize, null), getArraySize("bar]"));
|
||||
try expectEqual(@as(?usize, 42), getArraySize(" lol this is ok[42] "));
|
||||
}
|
||||
|
||||
pub fn getTypeWithoutArrayNotation(typ: []const u8) []const u8 {
|
||||
if (std.mem.indexOf(u8, typ, "[")) |open| {
|
||||
return typ[0..open];
|
||||
}
|
||||
return typ;
|
||||
}
|
||||
|
||||
fn toZig(allocator: Allocator, c: []const u8) ![]const u8 {
|
||||
if (fixedMapping.get(c)) |fixed| {
|
||||
return fixed;
|
||||
}
|
||||
|
||||
const consT = if (isConst(c)) "const " else "";
|
||||
const pointeR = if (isPointer(c)) "?[*]" else "";
|
||||
const stripped = stripType(c);
|
||||
|
||||
const name = if (raylibToZigType.get(stripped)) |primitive| primitive else stripped;
|
||||
|
||||
if (isPointer(c)) {
|
||||
return try fmt(allocator, "{s}{s}{s}", .{ pointeR, consT, name });
|
||||
}
|
||||
return name;
|
||||
}
|
||||
test "toZig" {
|
||||
var arena = std.heap.ArenaAllocator.init(talloc);
|
||||
defer arena.deinit();
|
||||
const a = arena.allocator();
|
||||
|
||||
try expectEqualStrings("i32", try toZig(a, "int"));
|
||||
try expectEqualStrings("const i32", try toZig(a, "const int"));
|
||||
try expectEqualStrings("?[*]Vector2", try toZig(a, "Vector2 *"));
|
||||
}
|
||||
|
||||
const raylibToZigType = std.ComptimeStringMap([]const u8, .{
|
||||
.{ "void", "void" },
|
||||
.{ "bool", "bool" },
|
||||
.{ "char", "u8" },
|
||||
.{ "unsigned char", "u8" },
|
||||
.{ "short", "i16" },
|
||||
.{ "unsigned short", "u16" },
|
||||
.{ "int", "i32" },
|
||||
.{ "unsigned int", "u32" },
|
||||
.{ "long", "i64" },
|
||||
.{ "unsigned long", "u64" },
|
||||
.{ "unsigned long long", "u64" },
|
||||
.{ "float", "f32" },
|
||||
.{ "double", "f64" },
|
||||
});
|
||||
|
||||
const fixedMapping = std.ComptimeStringMap([]const u8, .{
|
||||
.{ "void *", "*anyopaque" },
|
||||
.{ "const void *", "*const anyopaque" },
|
||||
.{ "const unsigned char *", "[*:0]const u8" },
|
||||
.{ "const char *", "[*:0]const u8" },
|
||||
.{ "const char **", "[*]const [*:0]const u8" },
|
||||
.{ "char **", "[*][*:0]u8" },
|
||||
.{ "rAudioBuffer *", "*anyopaque" },
|
||||
.{ "rAudioProcessor *", "*anyopaque" },
|
||||
.{ "Image *", "*Image" },
|
||||
});
|
||||
|
||||
//--- Raylib parser JSONs -------------------------------------------------------------------------
|
||||
|
||||
const alias = std.ComptimeStringMap([]const u8, .{
|
||||
.{ "Camera", "Camera3D" },
|
||||
.{ "Texture", "Texture2D" },
|
||||
.{ "TextureCubemap", "Texture2D" },
|
||||
.{ "RenderTexture", "RenderTexture2D" },
|
||||
.{ "GuiStyle", "u32" },
|
||||
.{ "Quaternion", "Vector4" },
|
||||
.{ "PhysicsBody", "*PhysicsBodyData" },
|
||||
});
|
||||
|
||||
const cAlias = std.ComptimeStringMap([]const u8, .{
|
||||
.{ "Camera", "Camera3D" },
|
||||
.{ "Texture", "Texture2D" },
|
||||
.{ "TextureCubemap", "Texture2D" },
|
||||
.{ "RenderTexture", "RenderTexture2D" },
|
||||
.{ "Quaternion", "Vector4" },
|
||||
.{ "PhysicsBody", "PhysicsBodyData *" },
|
||||
});
|
||||
|
||||
pub const CombinedRaylib = struct {
|
||||
structs: std.StringArrayHashMap(RaylibStruct),
|
||||
enums: std.StringArrayHashMap(RaylibEnum),
|
||||
defines: std.StringArrayHashMap(RaylibDefine),
|
||||
functions: std.StringArrayHashMap(RaylibFunction),
|
||||
|
||||
pub fn load(allocator: Allocator, jsonFiles: []const []const u8) !@This() {
|
||||
var structs = std.StringArrayHashMap(RaylibStruct).init(allocator);
|
||||
var enums = std.StringArrayHashMap(RaylibEnum).init(allocator);
|
||||
var defines = std.StringArrayHashMap(RaylibDefine).init(allocator);
|
||||
var functions = std.StringArrayHashMap(RaylibFunction).init(allocator);
|
||||
|
||||
for (jsonFiles) |jsonFile| {
|
||||
std.log.info("parsing {s}", .{jsonFile});
|
||||
const jsonData = try std.fs.cwd().readFileAlloc(allocator, jsonFile, memoryConstrain);
|
||||
|
||||
const bindingJson = try json.parseFromSliceLeaky(RaylibJson, allocator, jsonData, .{
|
||||
.ignore_unknown_fields = true,
|
||||
.duplicate_field_behavior = .use_last,
|
||||
});
|
||||
|
||||
for (bindingJson.structs) |*s| {
|
||||
for (s.fields) |*f| {
|
||||
f.type = cAlias.get(f.type) orelse f.type;
|
||||
}
|
||||
try structs.put(s.name, s.*);
|
||||
}
|
||||
|
||||
for (bindingJson.enums) |e| {
|
||||
try enums.put(e.name, e);
|
||||
}
|
||||
|
||||
for (bindingJson.defines) |d| {
|
||||
try defines.put(d.name, d);
|
||||
}
|
||||
|
||||
for (bindingJson.functions) |*f| {
|
||||
f.returnType = cAlias.get(f.returnType) orelse f.returnType;
|
||||
if (f.params) |params| {
|
||||
for (params) |*p| {
|
||||
p.type = cAlias.get(p.type) orelse p.type;
|
||||
}
|
||||
}
|
||||
try functions.put(f.name, f.*);
|
||||
}
|
||||
}
|
||||
|
||||
return @This(){
|
||||
.structs = structs,
|
||||
.enums = enums,
|
||||
.defines = defines,
|
||||
.functions = functions,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn toIntermediate(self: @This(), allocator: Allocator, customs: Intermediate) !Intermediate {
|
||||
var functions = std.ArrayList(Function).init(allocator);
|
||||
var enums = std.ArrayList(Enum).init(allocator);
|
||||
var structs = std.ArrayList(Struct).init(allocator);
|
||||
|
||||
enums: for (self.enums.values()) |e| {
|
||||
for (customs.enums) |tt| {
|
||||
if (eql(tt.name, e.name)) break :enums;
|
||||
}
|
||||
try enums.append(try parseRaylibEnum(allocator, e));
|
||||
}
|
||||
structs: for (self.structs.values()) |s| {
|
||||
for (customs.structs) |tt| {
|
||||
if (eql(tt.name, s.name)) break :structs;
|
||||
}
|
||||
try structs.append(try parseRaylibStruct(allocator, s, customs));
|
||||
}
|
||||
for (self.defines.values()) |_| {}
|
||||
|
||||
funcs: for (self.functions.values()) |f| {
|
||||
for (customs.functions) |ff| {
|
||||
if (eql(ff.name, f.name)) break :funcs;
|
||||
}
|
||||
try functions.append(try parseRaylibFunction(allocator, f, customs.types));
|
||||
}
|
||||
|
||||
return Intermediate{
|
||||
.functions = try functions.toOwnedSlice(),
|
||||
.enums = try enums.toOwnedSlice(),
|
||||
.structs = try structs.toOwnedSlice(),
|
||||
};
|
||||
}
|
||||
|
||||
fn containsStruct(self: @This(), name: []const u8) bool {
|
||||
return self.structs.contains(name);
|
||||
}
|
||||
|
||||
fn containsEnum(self: @This(), name: []const u8) bool {
|
||||
return self.enums.contains(name);
|
||||
}
|
||||
|
||||
fn containsFunction(self: @This(), name: []const u8) bool {
|
||||
return self.functions.contains(name);
|
||||
}
|
||||
};
|
||||
|
||||
const RaylibJson = struct {
|
||||
structs: []RaylibStruct,
|
||||
enums: []RaylibEnum,
|
||||
defines: []RaylibDefine,
|
||||
functions: []RaylibFunction,
|
||||
};
|
||||
|
||||
pub const RaylibStruct = struct {
|
||||
name: []const u8,
|
||||
description: []const u8,
|
||||
fields: []RaylibField,
|
||||
};
|
||||
|
||||
pub const RaylibField = struct {
|
||||
name: []const u8,
|
||||
description: []const u8,
|
||||
type: []const u8,
|
||||
};
|
||||
|
||||
pub const RaylibEnum = struct {
|
||||
name: []const u8,
|
||||
description: []const u8,
|
||||
values: []RaylibEnumValue,
|
||||
};
|
||||
|
||||
pub const RaylibEnumValue = struct {
|
||||
name: []const u8,
|
||||
description: []const u8,
|
||||
value: c_int,
|
||||
};
|
||||
|
||||
pub const RaylibFunction = struct {
|
||||
name: []const u8,
|
||||
description: []const u8,
|
||||
returnType: []const u8,
|
||||
params: ?[]RaylibFunctionParam = null,
|
||||
};
|
||||
|
||||
pub const RaylibFunctionParam = struct {
|
||||
name: []const u8,
|
||||
type: []const u8,
|
||||
description: ?[]const u8 = null,
|
||||
};
|
||||
|
||||
pub const RaylibDefine = struct {
|
||||
name: []const u8,
|
||||
type: []const u8,
|
||||
value: []const u8,
|
||||
description: ?[]const u8 = null,
|
||||
};
|
||||
|
||||
//--- Helpers -------------------------------------------------------------------------------------
|
||||
|
||||
/// true if C type is primitive or a pointer to anything
|
||||
/// this means we don't need to wrap it in a pointer
|
||||
pub fn isPrimitiveOrPointer(c: []const u8) bool {
|
||||
const primitiveTypes = std.ComptimeStringMap(void, .{
|
||||
.{ "void", {} },
|
||||
.{ "bool", {} },
|
||||
.{ "char", {} },
|
||||
.{ "unsigned char", {} },
|
||||
.{ "short", {} },
|
||||
.{ "unsigned short", {} },
|
||||
.{ "int", {} },
|
||||
.{ "unsigned int", {} },
|
||||
.{ "long", {} },
|
||||
.{ "unsigned long", {} },
|
||||
.{ "unsigned long long", {} },
|
||||
.{ "float", {} },
|
||||
.{ "double", {} },
|
||||
});
|
||||
return primitiveTypes.has(stripType(c)) or endsWith(c, "*");
|
||||
}
|
||||
|
||||
fn eql(a: []const u8, b: []const u8) bool {
|
||||
return std.mem.eql(u8, a, b);
|
||||
}
|
||||
|
||||
fn startsWith(haystack: []const u8, needle: []const u8) bool {
|
||||
return std.mem.startsWith(u8, haystack, needle);
|
||||
}
|
||||
|
||||
fn endsWith(haystack: []const u8, needle: []const u8) bool {
|
||||
return std.mem.endsWith(u8, haystack, needle);
|
||||
}
|
Loading…
Reference in New Issue
Block a user