2023-04-19 01:25:35 +02:00
|
|
|
const coral = @import("coral");
|
|
|
|
|
|
|
|
const kym = @import("kym");
|
|
|
|
|
|
|
|
const ona = @import("ona");
|
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
const transform_typeid = @typeName(ona.canvas.Transform);
|
2023-04-19 01:25:35 +02:00
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
fn new_canvas_item(environment: *kym.vm.Environment, canvas_item: ona.CanvasItem) !*kym.vm.Object {
|
|
|
|
const typeid = @typeName(ona.CanvasItem);
|
2023-05-06 03:47:52 +02:00
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
var object = try environment.new(.{
|
|
|
|
.userdata = coral.io.bytes_of(&canvas_item),
|
|
|
|
.identity = typeid,
|
2023-05-06 03:47:52 +02:00
|
|
|
});
|
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
errdefer environment.release(object);
|
2023-04-19 01:25:35 +02:00
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
return object;
|
2023-04-19 01:25:35 +02:00
|
|
|
}
|
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
fn new_transform(environment: *kym.Environment, transform: ona.canvas.Transform) !*kym.vm.Object {
|
|
|
|
var object = try environment.new(.{
|
|
|
|
.userdata = coral.io.bytes_of(&transform),
|
|
|
|
.identity = transform_typeid,
|
|
|
|
});
|
2023-05-06 03:47:52 +02:00
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
errdefer environment.release(object);
|
2023-05-06 03:47:52 +02:00
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
return object;
|
|
|
|
}
|
2023-05-06 03:47:52 +02:00
|
|
|
|
2023-04-19 01:25:35 +02:00
|
|
|
pub fn main() anyerror!void {
|
|
|
|
return ona.App.run(anyerror, start);
|
|
|
|
}
|
|
|
|
|
|
|
|
fn start(app: *ona.App) anyerror!void {
|
2023-05-10 00:57:19 +02:00
|
|
|
var kym_environment = try kym.vm.Environment.init(ona.allocator, .{
|
2023-04-19 01:25:35 +02:00
|
|
|
.stack_max = 256,
|
2023-05-06 03:47:52 +02:00
|
|
|
.calls_max = 256,
|
2023-04-19 01:25:35 +02:00
|
|
|
});
|
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
defer kym_environment.deinit();
|
2023-04-19 01:25:35 +02:00
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
const Ona = struct {
|
|
|
|
app: *ona.App,
|
|
|
|
|
|
|
|
const typeid = @typeName(ona.App);
|
|
|
|
};
|
|
|
|
|
|
|
|
var ona_lib = try kym_environment.new(.{
|
|
|
|
.userdata = coral.io.bytes_of(&Ona{
|
|
|
|
.app = app,
|
|
|
|
}),
|
|
|
|
|
|
|
|
.identity = Ona.typeid,
|
|
|
|
});
|
|
|
|
|
|
|
|
defer kym_environment.release(ona_lib);
|
|
|
|
|
|
|
|
try kym_environment.global_set("ona", ona_lib.as_value());
|
|
|
|
|
|
|
|
{
|
|
|
|
var sprite_creator = try kym_environment.new(.{.behavior = &.{.caller = struct {
|
|
|
|
fn call(context: kym.vm.Object.CallContext) kym.vm.RuntimeError!kym.vm.Value {
|
|
|
|
try context.env.check(context.args.len == 2, "2 arguments expected");
|
|
|
|
|
|
|
|
var item = try ona.CanvasItem.init((try context.env.user_cast(context.caller, Ona.typeid, Ona)).app, .{
|
|
|
|
.transform = (try context.env.user_cast(context.args[0].object, transform_typeid, ona.canvas.Transform)).*,
|
|
|
|
.options = .{.sprite = .{}},
|
|
|
|
});
|
|
|
|
|
|
|
|
errdefer item.deinit();
|
|
|
|
|
|
|
|
return (try new_canvas_item(context.env, item)).as_value();
|
|
|
|
}
|
|
|
|
}.call}});
|
|
|
|
|
|
|
|
defer kym_environment.release(sprite_creator);
|
|
|
|
|
|
|
|
try kym_environment.raw_set(ona_lib, "create_sprite", sprite_creator.as_value());
|
|
|
|
}
|
2023-04-19 01:25:35 +02:00
|
|
|
|
|
|
|
{
|
|
|
|
const index_path = "index.kym";
|
|
|
|
const index_file = try app.data_fs().open_readable(index_path);
|
|
|
|
|
|
|
|
defer if (!index_file.close()) ona.log_error(&.{.{.string = "failed to close "}, .{.string = index_path}});
|
|
|
|
|
|
|
|
const index_size = (try app.data_fs().query(index_path)).size;
|
2023-05-06 03:47:52 +02:00
|
|
|
const index_allocation = try coral.io.allocate_many(u8, index_size, ona.allocator);
|
2023-04-19 01:25:35 +02:00
|
|
|
|
2023-05-06 03:47:52 +02:00
|
|
|
defer coral.io.deallocate(ona.allocator, index_allocation);
|
2023-04-19 01:25:35 +02:00
|
|
|
|
|
|
|
var index_buffer = coral.buffer.Fixed{.data = index_allocation[0 .. index_size]};
|
|
|
|
|
|
|
|
{
|
|
|
|
var stream_buffer = [_]u8{0} ** 1024;
|
|
|
|
|
|
|
|
if ((try coral.io.stream(index_buffer.as_writer(), index_file.as_reader(), &stream_buffer)) != index_size)
|
|
|
|
return error.IoUnavailable;
|
|
|
|
}
|
|
|
|
|
2023-05-06 03:47:52 +02:00
|
|
|
{
|
2023-05-10 00:57:19 +02:00
|
|
|
const index_script = try kym_environment.new_script(.{
|
2023-05-06 03:47:52 +02:00
|
|
|
.name = index_path,
|
|
|
|
.data = index_buffer.data
|
|
|
|
});
|
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
defer kym_environment.release(index_script);
|
2023-05-06 03:47:52 +02:00
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
_ = try kym_environment.call(index_script, &.{});
|
2023-05-06 03:47:52 +02:00
|
|
|
}
|
2023-04-19 01:25:35 +02:00
|
|
|
}
|
|
|
|
|
2023-05-10 00:57:19 +02:00
|
|
|
app.loop();
|
2023-04-19 01:25:35 +02:00
|
|
|
}
|