trueno/src/load.jai
2025-08-31 17:57:56 +03:00

122 lines
3.0 KiB
Plaintext

#scope_file
MAX_FILE_SIZE :: 2_000_000_000;
buf : [MAX_FILE_SIZE]u8;
g_asset_pack : Load_Package;
mandatory_loads_left : s32 = 0;
packcb :: (res: *sfetch_response_t) #c_call {
push_context,defer_pop default_context;
mem : []u8;
mem.count = res.data.size.(s64);
mem.data = res.data.ptr;
print("Mem count %\n", mem.count);
success := init_from_memory(*g_asset_pack, mem, "main_asset_pack");
print("Succesfully loaded main asset pack!\n");
mandatory_loads_left -= 1;
}
#scope_export
init_after_mandatory_done : bool = false;
mandatory_loads_done :: () -> bool {
return mandatory_loads_left <= 0;
}
init_asset_pack_load :: () {
mandatory_loads_left += 1;
sfetch_send(*(sfetch_request_t.{
path = "./packs/assets.pack".data,
callback = packcb,
buffer = .{
ptr = buf.data,
size = buf.count
}
}));
}
add_font_from_pack :: (path: string) {
ok, entry := table_find_new(*g_asset_pack.lookup, path);
if !ok {
print("Failed to find font % from pack...\n", path);
return;
}
state.font_default.fons_font = fonsAddFontMem(state.fons, "sans", entry.data.data, xx entry.data.count, 0);
}
create_texture_from_pack :: (path: string) -> sg_image {
ok, entry := table_find_new(*g_asset_pack.lookup, path);
if !ok {
print("Failed to find texture % from pack...\n", path);
img : sg_image;
return img;
}
x : s32;
y : s32;
channels : s32;
data := stbi.stbi_load_from_memory(entry.data.data, xx entry.data.count, *x, *y, *channels, 4);
img := sg_alloc_image();
subimg : [6][16]sg_range;
subimg[0][0] = .{
ptr = data,
size = xx (x * y * 4)
};
sg_init_image(*img, *(sg_image_desc.{
width = x,
height = y,
pixel_format = sg_pixel_format.RGBA8,
data = .{
subimage = subimg
}
}));
stbi.stbi_image_free(data);
return img;
}
load_string_from_pack :: (path: string) -> string {
ok, entry := table_find_new(*g_asset_pack.lookup, path);
if !ok {
print("Failed to load string from pack: %\n", path);
return "";
}
s: string;
s.data = entry.data.data;
s.count = entry.data.count;
return s;
}
asset_list :: () -> string #expand {
count := 0;
for v : g_asset_pack.lookup {
console_add_output_line(sprint("% (%)", v.name, format_size(v.size_of_entry)));
count += 1;
}
return tprint("> A total of % assets.", count);
} @Command
// Returns tprinted pointer, please copy it somewhere.
format_size :: (bytes: int) -> string {
bytes_counter := bytes;
bytes_float := cast(float) bytes;
names : []string = .["b", "kb", "mb", "gb", "tb"];
name_index := 0;
while bytes_counter / 1000 > 0 {
name_index += 1;
bytes_counter /= 1000;
bytes_float /= 1000.0;
if name_index > 4 then break;
}
return tprint("% %", bytes_float, names[name_index]);
}