const std = @import("std"); const sokol = @import("sokol"); const sg = sokol.gfx; const shader = @import("shaders/triangle.glsl.zig"); var pass_action: sg.PassAction = .{}; const state = struct { var bind: sg.Bindings = .{}; var pip: sg.Pipeline = .{}; }; export fn init() void { sg.setup(.{ .logger = .{ .func = sokol.log.func }, .environment = sokol.glue.environment(), }); sokol.time.setup(); std.log.info("Vertex buffers len: {}", .{state.bind.vertex_buffers.len}); state.bind.vertex_buffers[0] = sg.makeBuffer(.{ .data = sg.asRange(&[_]f32{ // positions colors 0.0, 0.5, 0.5, 1.0, 0.0, 0.0, 1.0, 0.5, -0.5, 0.5, 0.0, 1.0, 0.0, 1.0, -0.5, -0.5, 0.5, 0.0, 0.0, 1.0, 1.0, }), }); var pip_desc: sg.PipelineDesc = .{ .shader = sg.makeShader(shader.triangleShaderDesc(sg.queryBackend())), }; pip_desc.layout.attrs[0].format = .FLOAT3; pip_desc.layout.attrs[1].format = .FLOAT4; state.pip = sg.makePipeline(pip_desc); pass_action.colors[0] = .{ .load_action = .CLEAR, .clear_value = .{ .r = 0, .g = 1, .b = 0, .a = 1 }, }; std.log.info("Backend: {}\n", .{sg.queryBackend()}); } fn timef() f32 { return @floatCast(sokol.time.sec(sokol.time.now())); } export fn frame() void { const col = &pass_action.colors[0].clear_value; col.g = @abs(@sin(timef())); col.r = @abs(@cos(timef())); sg.beginPass(.{ .action = pass_action, .swapchain = sokol.glue.swapchain() }); sg.endPass(); sg.commit(); } export fn cleanup() void {} pub fn main() !void { sokol.app.run(.{ .init_cb = init, .frame_cb = frame, .cleanup_cb = cleanup, .width = 800, .height = 600, .icon = .{ .sokol_default = true }, .window_title = "sokol hello", .logger = .{ .func = sokol.log.func }, }); }