Files
armorpaint/base/sources/ts/data.ts
T
luboslenco 6b3222e30a Cleanup
2025-09-28 19:38:08 +02:00

313 lines
8.5 KiB
TypeScript

// Global data list
let data_cached_scene_raws: map_t<string, scene_t> = map_create();
let data_cached_meshes: map_t<string, mesh_data_t> = map_create();
let data_cached_cameras: map_t<string, camera_data_t> = map_create();
let data_cached_materials: map_t<string, material_data_t> = map_create();
let data_cached_worlds: map_t<string, world_data_t> = map_create();
let data_cached_shaders: map_t<string, shader_data_t> = map_create();
let data_cached_blobs: map_t<string, buffer_t> = map_create();
let data_cached_images: map_t<string, gpu_texture_t> = map_create();
let data_cached_videos: map_t<string, video_t> = map_create();
let data_cached_fonts: map_t<string, draw_font_t> = map_create();
///if arm_audio
let data_cached_sounds: map_t<string, sound_t> = map_create();
///end
let data_assets_loaded: i32 = 0;
function data_get_mesh(file: string, name: string): mesh_data_t {
let handle: string = file + name;
let cached: mesh_data_t = map_get(data_cached_meshes, handle);
if (cached != null) {
return cached;
}
let b: mesh_data_t = mesh_data_parse(file, name);
map_set(data_cached_meshes, handle, b);
b._.handle = handle;
return b;
}
function data_get_camera(file: string, name: string): camera_data_t {
let handle: string = file + name;
let cached: camera_data_t = map_get(data_cached_cameras, handle);
if (cached != null) {
return cached;
}
let b: camera_data_t = camera_data_parse(file, name);
map_set(data_cached_cameras, handle, b);
return b;
}
function data_get_material(file: string, name: string): material_data_t {
let handle: string = file + name;
let cached: material_data_t = map_get(data_cached_materials, handle);
if (cached != null) {
return cached;
}
let b: material_data_t = material_data_parse(file, name);
map_set(data_cached_materials, handle, b);
return b;
}
function data_get_world(file: string, name: string): world_data_t {
if (name == null) { // No world defined in scene
return null;
}
let handle: string = file + name;
let cached: world_data_t = map_get(data_cached_worlds, handle);
if (cached != null) {
return cached;
}
let b: world_data_t = world_data_parse(file, name);
map_set(data_cached_worlds, handle, b);
return b;
}
function data_get_shader(file: string, name: string): shader_data_t {
// Only one context override per shader data for now
let handle: string = name;
let cached: shader_data_t = map_get(data_cached_shaders, handle); // Shader must have unique name
if (cached != null) {
return cached;
}
let b: shader_data_t = shader_data_parse(file, name);
map_set(data_cached_shaders, handle, b);
return b;
}
function data_get_scene_raw(file: string): scene_t {
let cached: scene_t = map_get(data_cached_scene_raws, file);
if (cached != null) {
return cached;
}
// If no extension specified, set to .arm
let ext: string = ends_with(file, ".arm") ? "" : ".arm";
let b: buffer_t = data_get_blob(file + ext);
let parsed: scene_t = armpack_decode(b);
map_set(data_cached_scene_raws, file, parsed);
return parsed;
}
// Raw assets
function data_get_blob(file: string): buffer_t {
let cached: buffer_t = map_get(data_cached_blobs, file);
if (cached != null) {
return cached;
}
let b: buffer_t = iron_load_blob(data_resolve_path(file));
map_set(data_cached_blobs, file, b);
data_assets_loaded++;
return b;
}
function data_get_image(file: string): gpu_texture_t {
let cached: gpu_texture_t = map_get(data_cached_images, file);
if (cached != null) {
return cached;
}
let image_: any = iron_load_texture(data_resolve_path(file));
if (image_ == null) {
return null;
}
let b: gpu_texture_t = image_;
map_set(data_cached_images, file, b);
data_assets_loaded++;
return b;
}
function data_get_video(file: string): video_t {
file = substring(file, 0, file.length - 4) + ".webm";
let cached: video_t = map_get(data_cached_videos, file);
if (cached != null) {
return cached;
}
// let b: video_t = iron_load_video(data_resolve_path(file));
// map_set(data_cached_videos, file, b);
// data_assets_loaded++;
// return b;
return null;
}
function data_get_font(file: string): draw_font_t {
let cached: draw_font_t = map_get(data_cached_fonts, file);
if (cached != null) {
return cached;
}
let blob: buffer_t = iron_load_blob(data_resolve_path(file));
let b: draw_font_t = { buf: blob, index: 0 };
map_set(data_cached_fonts, file, b);
data_assets_loaded++;
return b;
}
///if arm_audio
function data_get_sound(file: string): sound_t {
let cached: sound_t = map_get(data_cached_sounds, file);
if (cached != null) {
return cached;
}
let b: sound_t = sound_create(iron_load_sound(data_resolve_path(file)));
map_set(data_cached_sounds, file, b);
data_assets_loaded++;
return b;
}
///end
function data_delete_mesh(handle: string) {
let mesh: mesh_data_t = map_get(data_cached_meshes, handle);
if (mesh == null) {
return;
}
mesh_data_delete(mesh);
map_delete(data_cached_meshes, handle);
}
function data_delete_blob(handle: string) {
let blob: buffer_t = map_get(data_cached_blobs, handle);
if (blob == null) {
return;
}
map_delete(data_cached_blobs, handle);
}
function data_delete_image(handle: string) {
let image: gpu_texture_t = map_get(data_cached_images, handle);
if (image == null) {
return;
}
gpu_delete_texture(image);
map_delete(data_cached_images, handle);
}
function data_delete_video(handle: string) {
let video: video_t = map_get(data_cached_videos, handle);
if (video == null) {
return;
}
video_unload(video);
map_delete(data_cached_videos, handle);
}
function data_delete_font(handle: string) {
let font: draw_font_t = map_get(data_cached_fonts, handle);
if (font == null) {
return;
}
draw_font_destroy(font);
map_delete(data_cached_fonts, handle);
}
///if arm_audio
function data_delete_sound(handle: string) {
let sound: sound_t = map_get(data_cached_sounds, handle);
if (sound == null) {
return;
}
sound_unload(sound);
map_delete(data_cached_sounds, handle);
}
///end
function data_delete_all() {
let cached_meshes_keys: string[] = map_keys(data_cached_meshes);
for (let i: i32 = 0; i < cached_meshes_keys.length; ++i) {
let c: mesh_data_t = map_get(data_cached_meshes, cached_meshes_keys[i]);
mesh_data_delete(c);
}
data_cached_meshes = map_create();
let cached_shaders_keys: string[] = map_keys(data_cached_shaders);
for (let i: i32 = 0; i < cached_shaders_keys.length; ++i) {
let c: shader_data_t = map_get(data_cached_shaders, cached_shaders_keys[i]);
shader_data_delete(c);
}
data_cached_shaders = map_create();
data_cached_scene_raws = map_create();
data_cached_cameras = map_create();
data_cached_materials = map_create();
data_cached_worlds = map_create();
render_path_unload();
data_cached_blobs = map_create();
let cached_images_keys: string[] = map_keys(data_cached_images);
for (let i: i32 = 0; i < cached_images_keys.length; ++i) {
let c: gpu_texture_t = map_get(data_cached_images, cached_images_keys[i]);
gpu_delete_texture(c);
}
data_cached_images = map_create();
///if arm_audio
let cached_sounds_keys: string[] = map_keys(data_cached_sounds);
for (let i: i32 = 0; i < cached_sounds_keys.length; ++i) {
let c: sound_t = map_get(data_cached_sounds, cached_sounds_keys[i]);
sound_unload(c);
}
data_cached_sounds = map_create();
///end
let cached_videos_keys: string[] = map_keys(data_cached_videos);
for (let i: i32 = 0; i < cached_videos_keys.length; ++i) {
let c: video_t = map_get(data_cached_videos, cached_videos_keys[i]);
video_unload(c);
}
data_cached_videos = map_create();
let cached_fonts_keys: string[] = map_keys(data_cached_fonts);
for (let i: i32 = 0; i < cached_fonts_keys.length; ++i) {
let c: draw_font_t = map_get(data_cached_fonts, cached_fonts_keys[i]);
draw_font_destroy(c);
}
data_cached_fonts = map_create();
}
function data_sep(): string {
///if arm_windows
return "\\";
///else
return "/";
///end
}
function data_path(): string {
///if arm_android
return "data" + data_sep();
///else
return "." + data_sep() + "data" + data_sep();
///end
}
function data_is_abs(file: string): bool {
return char_at(file, 0) == "/" || char_at(file, 1) == ":" || (char_at(file, 0) == "\\" && char_at(file, 1) == "\\");
}
function data_is_up(file: string): bool {
return char_at(file, 0) == "." && char_at(file, 1) == ".";
}
function data_base_name(path: string): string {
let slash: i32 = string_last_index_of(path, data_sep());
return slash >= 0 ? substring(path, slash + 1, path.length) : path;
}
function data_resolve_path(file: string): string {
if (data_is_abs(file) || data_is_up(file)) {
return file;
}
return data_path() + file;
}