2025-04-26 10:51:41 +03:00

76 lines
2.3 KiB
Plaintext

//------------------------------------------------------------------------------
// triangle/module.jai
//
// Hello Triangle sample.
//------------------------------------------------------------------------------
#import "Basic";
#import,dir "../../sokol/log"(USE_GL=USE_GL);
#import,dir "../../sokol/gfx"(USE_GL=USE_GL);
#import,dir "../../sokol/app"(USE_GL=USE_GL);
#import,dir "../../sokol/glue"(USE_GL=USE_GL);
#load "./shader.jai";
state: struct {
pip: sg_pipeline;
bind: sg_bindings;
pass_action: sg_pass_action;
}
init :: () #c_call {
push_context,defer_pop;
sg_setup(*(sg_desc.{
environment = xx,force sglue_environment(),
logger = .{ func = slog_func },
}));
// a vertex buffer with 3 vertices
vertices := float.[
// 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,
];
buffer := sg_buffer_desc.{ data = .{ ptr = *vertices, size = size_of(type_of(vertices)) } };
state.bind.vertex_buffers[0] = sg_make_buffer(*buffer);
// create shader from code-generated sg_shader_desc
shd := sg_make_shader(*triangle_shader_desc(sg_query_backend()));
// create a shader and pipeline object (default render states are fine for triangle)
pipeline: sg_pipeline_desc;
pipeline.shader = shd;
pipeline.layout.attrs[ATTR_triangle_position] = .{ format = .FLOAT3 };
pipeline.layout.attrs[ATTR_triangle_color0] = .{ format = .FLOAT4 };
state.pip = sg_make_pipeline(*pipeline);
// a pass action to clear framebuffer to black
state.pass_action.colors[0] = .{ load_action = .CLEAR, clear_value = .{ 0, 0, 0,1 } };
}
frame :: () #c_call {
sg_begin_pass(*(sg_pass.{ action = state.pass_action, swapchain = xx,force sglue_swapchain() }));
sg_apply_pipeline(state.pip);
sg_apply_bindings(*state.bind);
sg_draw(0, 3, 1);
sg_end_pass();
sg_commit();
}
cleanup :: () #c_call {
sg_shutdown();
}
main :: () {
sapp_run(*(sapp_desc.{
init_cb = init,
frame_cb = frame,
cleanup_cb = cleanup,
width = 640,
height = 480,
window_title = "triangle",
icon = .{ sokol_default = true },
logger = .{ func = slog_func },
}));
}