Compare commits
5 Commits
af559317fb
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
b9e39139bc | ||
|
ac6cb02184 | ||
|
2524dbf206 | ||
|
fc91b57f33 | ||
|
1c49ffa07f |
23
build.zig
23
build.zig
@@ -6,6 +6,8 @@ pub fn build(b: *std.Build) void {
|
|||||||
|
|
||||||
const dep_sokol = b.dependency("sokol", .{ .target = target, .optimize = optimize });
|
const dep_sokol = b.dependency("sokol", .{ .target = target, .optimize = optimize });
|
||||||
|
|
||||||
|
// Exe
|
||||||
|
|
||||||
const exe = b.addExecutable(.{
|
const exe = b.addExecutable(.{
|
||||||
.name = "sok",
|
.name = "sok",
|
||||||
.root_source_file = b.path("src/main.zig"),
|
.root_source_file = b.path("src/main.zig"),
|
||||||
@@ -15,8 +17,27 @@ pub fn build(b: *std.Build) void {
|
|||||||
|
|
||||||
exe.root_module.addImport("sokol", dep_sokol.module("sokol"));
|
exe.root_module.addImport("sokol", dep_sokol.module("sokol"));
|
||||||
|
|
||||||
|
// Set this to hide console on windows
|
||||||
|
//exe.subsystem = .Windows;
|
||||||
|
|
||||||
b.installArtifact(exe);
|
b.installArtifact(exe);
|
||||||
|
|
||||||
|
// Check step (for ZLS)
|
||||||
|
|
||||||
|
const exe_check = b.addExecutable(.{
|
||||||
|
.name = "check_step",
|
||||||
|
.root_source_file = b.path("src/main.zig"),
|
||||||
|
.target = target,
|
||||||
|
.optimize = optimize,
|
||||||
|
});
|
||||||
|
|
||||||
|
exe_check.root_module.addImport("sokol", dep_sokol.module("sokol"));
|
||||||
|
|
||||||
|
const check = b.step("check", "Check if project compiles");
|
||||||
|
check.dependOn(&exe_check.step);
|
||||||
|
|
||||||
|
// Run
|
||||||
|
|
||||||
const run_cmd = b.addRunArtifact(exe);
|
const run_cmd = b.addRunArtifact(exe);
|
||||||
|
|
||||||
run_cmd.step.dependOn(b.getInstallStep());
|
run_cmd.step.dependOn(b.getInstallStep());
|
||||||
@@ -28,6 +49,8 @@ pub fn build(b: *std.Build) void {
|
|||||||
const run_step = b.step("run", "Run the app");
|
const run_step = b.step("run", "Run the app");
|
||||||
run_step.dependOn(&run_cmd.step);
|
run_step.dependOn(&run_cmd.step);
|
||||||
|
|
||||||
|
// Tests
|
||||||
|
|
||||||
const exe_unit_tests = b.addTest(.{
|
const exe_unit_tests = b.addTest(.{
|
||||||
.root_source_file = b.path("src/main.zig"),
|
.root_source_file = b.path("src/main.zig"),
|
||||||
.target = target,
|
.target = target,
|
||||||
|
@@ -1,18 +1,17 @@
|
|||||||
.{
|
.{
|
||||||
.name = "sok",
|
.name = "sok",
|
||||||
.version = "0.0.0",
|
.version = "0.0.0",
|
||||||
.minimum_zig_version = "0.13.0",
|
.minimum_zig_version = "0.14.0-dev.144+a31fe8aa3",
|
||||||
|
|
||||||
.dependencies = .{
|
|
||||||
.sokol = .{
|
|
||||||
.url = "git+https://github.com/floooh/sokol-zig.git#d3e21f76498213d6d58179065756f5f2ed9b90cf",
|
|
||||||
.hash = "122052a192829b377c637ce242ee8c9121e03d8cd10c889758dc6fb176368de7d67b",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
.paths = .{
|
.paths = .{
|
||||||
"build.zig",
|
"build.zig",
|
||||||
"build.zig.zon",
|
"build.zig.zon",
|
||||||
"src",
|
"src",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.dependencies = .{
|
||||||
|
.sokol = .{
|
||||||
|
.url = "git+https://github.com/floooh/sokol-zig.git#ed91d03b62ef9e5850f33a98a3f703c01d86798d",
|
||||||
|
.hash = "12208af0258178372af254d34e32e7f6cdf2e0f6a51bfb8d6706aff159e2ec6d2c65",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
38
readme.md
38
readme.md
@@ -1,3 +1,39 @@
|
|||||||
A little learning playground of [sokol](https://github.com/floooh/sokol) in [zig](https://ziglang.org/). Started on the gamejam at Decentrala, 9th June 2024.
|
A little learning playground of [sokol](https://github.com/floooh/sokol) in [zig](https://ziglang.org/). Started on the gamejam at Decentrala, 9th June 2024.
|
||||||
|
|
||||||
To build, you need to have zig master. Then just `zig build run` and that should be it!
|
The goal of this project is not fixed, and is just to try out some sokol features. But here's a few things I'd like to try out:
|
||||||
|
- [x] Draw a circle
|
||||||
|
- [ ] Load and render textures
|
||||||
|
- [ ] Render a 3D object
|
||||||
|
- [ ] Compile it for WebAssembly and run it in the browser
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
To build, you need to have zig master (you can use [zvm](https://www.zvm.app/) to help you with this). Then just `zig build run` and that should be it!
|
||||||
|
|
||||||
|
Note that if you change shaders, you have to recompile them manually - run compile_shaders.bat.
|
||||||
|
|
||||||
|
### Live error checking
|
||||||
|
|
||||||
|
This project has been configured so that zls can show live compile errors on save. To make it work, you need to set these zls config params (in VSCode just copy these to your preferences):
|
||||||
|
```
|
||||||
|
"zig.zls.enableBuildOnSave": true,
|
||||||
|
"zig.zls.buildOnSaveStep": "check"
|
||||||
|
```
|
||||||
|
|
||||||
|
Also, if you're in VSCode, install ErrorLens extension so you can see the errors inline.
|
||||||
|
|
||||||
|
## Why zig?
|
||||||
|
|
||||||
|
Zig is a low level language and toolchain that is designed as a "better C". Its main goal is to be simple, robust and fast. A few strong points:
|
||||||
|
- It can cross-compile from any platform to any platform.
|
||||||
|
- It can include C headers and you can use it in zig directly.
|
||||||
|
- It has a built-in build system that is also written in zig, so no other build systems like cmake are needed.
|
||||||
|
- Unlike C++, it's not OOP, there are no hidden constructor and destructor calls and overcomplicated copy/move rules.
|
||||||
|
- Unlike C, it solves A LOT of problems of C, and is MUCH harder to shoot yourself in the foot.
|
||||||
|
- There are no hidden allocations, everything that is heap-allocating has to be done explicitely.
|
||||||
|
- It has a powerful metaprogramming facility "comptime", which provides full static reflection.
|
||||||
|
- I can go on listing more cool features, but that is enough for now.. :)
|
||||||
|
|
||||||
|
## Why sokol?
|
||||||
|
|
||||||
|
Sokol is a cross platform graphics library with minimal footprint that can compile to any backend like DirectX, OpenGL, Vulcan, Metal or even WebAssembly.
|
31
src/main.zig
31
src/main.zig
@@ -1,7 +1,7 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const sokol = @import("sokol");
|
const sokol = @import("sokol");
|
||||||
|
|
||||||
const sg = sokol.gfx;
|
const sg = sokol.gfx;
|
||||||
|
const Event = sokol.app.Event;
|
||||||
|
|
||||||
const shader = @import("shaders/triangle2.glsl.zig");
|
const shader = @import("shaders/triangle2.glsl.zig");
|
||||||
|
|
||||||
@@ -104,20 +104,27 @@ export fn init() void {
|
|||||||
|
|
||||||
pass_action.colors[0] = .{
|
pass_action.colors[0] = .{
|
||||||
.load_action = .CLEAR,
|
.load_action = .CLEAR,
|
||||||
.clear_value = .{ .r = 0, .g = 1, .b = 0, .a = 1 },
|
.clear_value = .{},
|
||||||
};
|
};
|
||||||
|
|
||||||
std.log.info("Backend: {}\n", .{sg.queryBackend()});
|
std.log.info("Backend: {}\n", .{sg.queryBackend()});
|
||||||
|
|
||||||
|
sokol.app.showMouse(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn timef() f32 {
|
fn timef() f32 {
|
||||||
return @floatCast(sokol.time.sec(sokol.time.now()));
|
return @floatCast(sokol.time.sec(sokol.time.now()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var time: f32 = 0;
|
||||||
|
|
||||||
export fn frame() void {
|
export fn frame() void {
|
||||||
|
const dt: f32 = @floatCast(sokol.app.frameDuration());
|
||||||
|
time += dt;
|
||||||
|
|
||||||
const col = &pass_action.colors[0].clear_value;
|
const col = &pass_action.colors[0].clear_value;
|
||||||
col.g = @abs(@sin(timef()));
|
col.g = @abs(@sin(time));
|
||||||
col.r = @abs(@cos(timef()));
|
col.r = @abs(@cos(time));
|
||||||
|
|
||||||
state.vsParams.aspectRatio = sokol.app.heightf() / sokol.app.widthf();
|
state.vsParams.aspectRatio = sokol.app.heightf() / sokol.app.widthf();
|
||||||
|
|
||||||
@@ -133,13 +140,27 @@ export fn frame() void {
|
|||||||
sg.commit();
|
sg.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
export fn cleanup() void {}
|
export fn cleanup() void {
|
||||||
|
std.log.info("Ended", .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
export fn event(eptr: [*c]const Event) void {
|
||||||
|
const e: *const Event = @ptrCast(eptr);
|
||||||
|
|
||||||
|
const buttonPressed = e.type == .MOUSE_DOWN or e.type == .KEY_DOWN;
|
||||||
|
const mouseMoved = e.type == .MOUSE_MOVE and (@abs(e.mouse_dx) > 2 or @abs(e.mouse_dy) > 2);
|
||||||
|
|
||||||
|
if (buttonPressed or mouseMoved) {
|
||||||
|
sokol.app.quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main() !void {
|
pub fn main() !void {
|
||||||
sokol.app.run(.{
|
sokol.app.run(.{
|
||||||
.init_cb = init,
|
.init_cb = init,
|
||||||
.frame_cb = frame,
|
.frame_cb = frame,
|
||||||
.cleanup_cb = cleanup,
|
.cleanup_cb = cleanup,
|
||||||
|
.event_cb = event,
|
||||||
.width = 800,
|
.width = 800,
|
||||||
.height = 600,
|
.height = 600,
|
||||||
.fullscreen = true,
|
.fullscreen = true,
|
||||||
|
Reference in New Issue
Block a user