Compare commits

...

7 Commits

Author SHA1 Message Date
nothke
f032509b12 Added note about running wasm but doesnt build 2024-07-04 17:08:10 +02:00
nothke
2a10ffc55c Now switches on target set to wasm 2024-07-04 16:57:48 +02:00
nothke
de7b29c458 Added a build for web option 2024-07-04 16:56:17 +02:00
nothke
b9e39139bc Updated sokol to latest 2024-07-04 16:33:12 +02:00
nothke
ac6cb02184 Added live error checking 2024-07-04 16:23:16 +02:00
nothke
2524dbf206 Slightly better time management 2024-07-04 16:02:52 +02:00
nothke
fc91b57f33 Events. Quit on mouse move or press like a screensaver 2024-06-16 14:50:36 +02:00
4 changed files with 115 additions and 28 deletions

View File

@@ -1,4 +1,7 @@
const std = @import("std"); const std = @import("std");
const sokol = @import("sokol");
const title = "sok";
pub fn build(b: *std.Build) void { pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{}); const target = b.standardTargetOptions(.{});
@@ -6,27 +9,79 @@ 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 });
const exe = b.addExecutable(.{ if (!target.result.isWasm()) {
.name = "sok", // Native exe
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
exe.root_module.addImport("sokol", dep_sokol.module("sokol")); const exe = b.addExecutable(.{
.name = title,
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
b.installArtifact(exe); exe.root_module.addImport("sokol", dep_sokol.module("sokol"));
const run_cmd = b.addRunArtifact(exe); // Set this to hide console on windows
//exe.subsystem = .Windows;
run_cmd.step.dependOn(b.getInstallStep()); b.installArtifact(exe);
if (b.args) |args| { // Check step (for ZLS)
run_cmd.addArgs(args);
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);
run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| {
run_cmd.addArgs(args);
}
const run_step = b.step("run", "Run" ++ title ++ " as native app");
run_step.dependOn(&run_cmd.step);
} else {
// Web
const wasmLib = b.addStaticLibrary(.{
.name = title,
.target = target,
.optimize = optimize,
.root_source_file = b.path("src/pacman.zig"),
});
wasmLib.root_module.addImport("sokol", dep_sokol.module("sokol"));
// create a build step which invokes the Emscripten linker
const emsdk = dep_sokol.builder.dependency("emsdk", .{});
const link_step = try sokol.emLinkStep(b, .{
.lib_main = wasmLib,
.target = target,
.optimize = optimize,
.emsdk = emsdk,
.use_webgl2 = true,
.use_emmalloc = true,
.use_filesystem = false,
.shell_file_path = dep_sokol.path("src/sokol/web/shell.html").getPath(b),
});
// ...and a special run step to start the web build output via 'emrun'
const run = sokol.emRunStep(b, .{ .name = "sok", .emsdk = emsdk });
run.step.dependOn(&link_step.step);
b.step("run", "Run " ++ title ++ " as wasm").dependOn(&run.step);
} }
const run_step = b.step("run", "Run the app"); // Tests
run_step.dependOn(&run_cmd.step);
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"),

View File

@@ -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",
},
},
} }

View File

@@ -10,8 +10,20 @@ The goal of this project is not fixed, and is just to try out some sokol feature
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! 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!
To build for wasm, use `zig build -Dtarget=wasm32-emscripten run`
Note that if you change shaders, you have to recompile them manually - run compile_shaders.bat. 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? ## 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: 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:

View File

@@ -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,