paint: add sounds tab

This commit is contained in:
luboslenco
2026-07-05 17:24:59 +02:00
parent 054677afbb
commit 57a77f38e0
24 changed files with 419 additions and 81 deletions
+1 -1
View File
@@ -14,7 +14,7 @@ flags.with_plugins = true;
flags.with_kong = true;
flags.with_raytrace = true;
flags.with_bc7 = true;
flags.with_audio = false; // platform == "linux";
flags.with_audio = platform == "linux";
flags.idle_sleep = true;
flags.export_version_info = true;
flags.export_data_list = platform == "android"; // .apk contents
+16
View File
@@ -243,6 +243,22 @@ void context_select_font(i32 i) {
context_set_font(g_project->_->fonts->buffer[i]);
}
void context_set_sound(slot_sound_t *s) {
if (array_index_of(g_project->_->sounds, s) == -1) {
return;
}
g_context->sound = s;
ui_base_hwnds->buffer[TAB_AREA_STATUS]->redraws = 2;
ui_view2d_hwnd->redraws = 2;
}
void context_select_sound(i32 i) {
if (g_project->_->sounds->length <= i) {
return;
}
context_set_sound(g_project->_->sounds->buffer[i]);
}
void context_select_layer(i32 i) {
if (g_project->_->layers->length <= i) {
return;
+6 -1
View File
@@ -82,6 +82,7 @@ void layers_on_resized();
void layers_create_filter();
void layers_create_image_layer(asset_t *asset);
slot_font_t *slot_font_create(char *name, draw_font_t *font, char *file);
slot_sound_t *slot_sound_create(char *name, sound_t *sound, char *file);
scene_t *startup_get_scene(void);
buffer_t *util_encode_scene(scene_t *raw);
buffer_t *util_encode_project(project_t *raw);
@@ -229,7 +230,10 @@ void context_select_material(i32 i);
void context_set_material(slot_material_t *m);
void context_select_brush(i32 i);
void context_set_brush(slot_brush_t *b);
void context_set_font(slot_font_t *f);
void context_select_font(i32 i);
void context_set_sound(slot_sound_t *s);
void context_select_sound(i32 i);
void context_select_layer(i32 i);
void context_set_layer(slot_layer_t *l);
void context_select_tool(i32 i);
@@ -335,7 +339,7 @@ void render_path_preview_commands_decal();
node_shader_context_t *make_paint_run(material_t *data, material_context_t *matcon);
node_shader_context_t *make_mesh_preview_run(material_t *data, material_context_t *matcon, bool viewport);
material_data_t *make_mesh_preview_viewport(slot_material_t *slot);
void import_audio_run(char *path);
void import_sound_run(char *path);
void import_mesh_run(char *path, bool _clear_layers, bool replace_existing, bool keep_camera);
void import_mesh_finish_import(void *_);
void import_mesh_make_mesh(raw_mesh_t *mesh);
@@ -377,6 +381,7 @@ void viewport_save_texture(gpu_texture_t *screenshot);
void viewport_capture_video_begin();
void viewport_capture_video_end();
void tab_fonts_draw(ui_handle_t *htab);
void tab_sounds_draw(ui_handle_t *htab);
physics_world_t *physics_world_create();
void physics_world_update(physics_world_t *world);
physics_pair_t_array_t *physics_world_get_contact_pairs(physics_world_t *world, physics_body_t *body);
+3 -2
View File
@@ -7,7 +7,7 @@
char *manifest_title = "ArmorPaint";
char *manifest_version = "1.0 alpha";
char *manifest_version_project = "10";
char *manifest_version_project = "11";
char *manifest_version_config = "1";
char *manifest_url = "https://armorpaint.org";
char *manifest_url_android = "https://play.google.com/store/apps/details?id=org.armorpaint";
@@ -135,6 +135,7 @@ slot_material_t *base_drag_material = NULL;
slot_layer_t *base_drag_layer = NULL;
slot_brush_t *base_drag_brush = NULL;
slot_font_t *base_drag_font = NULL;
slot_sound_t *base_drag_sound = NULL;
mesh_object_t *base_drag_mesh = NULL;
bool base_player_lock = false;
@@ -196,7 +197,7 @@ f32 ui_view2d_pan_scale = 1.0;
bool ui_view2d_tiled_show = false;
bool ui_view2d_grid_redraw = true;
ui_handle_t *ui_view2d_htab;
bool sim_running = false;
bool sim_running = false;
bool sim_record = false;
bool viewport_recording = false;
bool node_shader_dump_to_script = false;
+24 -2
View File
@@ -95,6 +95,26 @@ string_array_t *export_arm_fonts_to_files(char *project_path, slot_font_t_array_
return font_files;
}
string_array_t *export_arm_sounds_to_files(char *project_path, slot_sound_t_array_t *sounds) {
string_array_t *sound_files = any_array_create_from_raw((void *[]){}, 0);
for (i32 i = 0; i < sounds->length; ++i) {
slot_sound_t *f = sounds->buffer[i];
#ifdef IRON_IOS
bool same_drive = false;
#else
bool same_drive = char_at(project_path, 0) == char_at(f->file, 0);
#endif
// Convert sound path from absolute to relative
if (same_drive) {
any_array_push(sound_files, path_to_relative(project_path, f->file));
}
else {
any_array_push(sound_files, f->file);
}
}
return sound_files;
}
void export_arm_run_project() {
tab_timeline_prepare_save();
@@ -172,8 +192,9 @@ void export_arm_run_project() {
string_array_t *texture_files = export_arm_assets_to_files(g_project->_->filepath, g_project->_->assets);
string_array_t *font_files = export_arm_fonts_to_files(g_project->_->filepath, g_project->_->fonts);
string_array_t *mesh_files = export_arm_meshes_to_files(g_project->_->filepath);
string_array_t *font_files = export_arm_fonts_to_files(g_project->_->filepath, g_project->_->fonts);
string_array_t *sound_files = export_arm_sounds_to_files(g_project->_->filepath, g_project->_->sounds);
string_array_t *mesh_files = export_arm_meshes_to_files(g_project->_->filepath);
i32 bits_pos = base_bits_handle->i;
i32 bpp = bits_pos == TEXTURE_BITS_BITS8 ? 8 : bits_pos == TEXTURE_BITS_BITS16 ? 16 : 32;
@@ -288,6 +309,7 @@ void export_arm_run_project() {
g_project->brush_nodes = bnodes;
g_project->layer_datas = ld;
g_project->font_assets = font_files;
g_project->sound_assets = sound_files;
g_project->mesh_assets = mesh_files;
tab_timeline_export(g_project);
+16
View File
@@ -359,6 +359,22 @@ void import_arm_run_project(char *path) {
}
}
if (g_project->sound_assets != NULL) {
for (i32 i = 0; i < g_project->sound_assets->length; ++i) {
char *file = g_project->sound_assets->buffer[i];
#ifdef IRON_WINDOWS
file = string_copy(string_replace_all(file, "/", "\\"));
#else
file = string_copy(string_replace_all(file, "\\", "/"));
#endif
// Convert sound path from relative to absolute
char *abs = data_is_abs(file) ? file : string("%s%s", base, file);
if (iron_file_exists(abs)) {
import_sound_run(abs);
}
}
}
mesh_data_t *md = mesh_data_create(g_project->mesh_datas->buffer[0]);
mesh_object_set_data(g_context->paint_object, md);
+2 -2
View File
@@ -63,8 +63,8 @@ void import_asset_run(char *path, f32 drop_x, f32 drop_y, bool show_box, bool hd
g_context->ddirty = 2;
}
}
else if (path_is_audio(path)) {
import_audio_run(path);
else if (path_is_sound(path)) {
import_sound_run(path);
}
else if (path_is_lut(path)) {
box_preferences_lut_picked(path);
-14
View File
@@ -1,14 +0,0 @@
#include "../global.h"
void import_audio_run(char *path) {
#ifdef IRON_AUDIO
sound_t *s = data_get_sound(path);
iron_a1_play_sound(s->sound_, false, 1, false);
string_array_t *ar = string_split(path, PATH_SEP);
char *name = ar->buffer[ar->length - 1];
console_info(string("%s %s", tr("Audio imported:"), name));
#endif
}
+11 -4
View File
@@ -172,7 +172,8 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) {
}
}
project->font_assets = any_map_get(old, "font_assets");
project->font_assets = any_map_get(old, "font_assets");
project->sound_assets = any_map_get(old, "sound_assets");
any_array_t *lds = any_map_get(old, "layer_datas");
if (lds != NULL) {
@@ -299,6 +300,11 @@ project_t *import_arm_from_map_to_arm(any_map_t *old) {
return project;
}
project_t *import_arm_from_version_10(any_map_t *old) {
any_map_set(old, "sound_assets", NULL);
return import_arm_from_map_to_arm(old);
}
project_t *import_arm_from_version_9(any_map_t *old) {
any_array_t *lds = any_map_get(old, "layer_datas");
if (lds != NULL) {
@@ -307,7 +313,7 @@ project_t *import_arm_from_version_9(any_map_t *old) {
any_map_set(ld, "texpaint_sculpt", NULL);
}
}
return import_arm_from_map_to_arm(old);
return import_arm_from_version_10(old);
}
project_t *import_arm_from_version_8(any_map_t *old) {
@@ -412,8 +418,9 @@ project_t *import_arm_from_version_0(any_map_t *old) {
project_t *import_arm_from_old(buffer_t *b) {
any_map_t *old = armpack_decode_to_map(b);
project_t *(*fns[])(any_map_t *) = {
import_arm_from_version_0, import_arm_from_version_1, import_arm_from_version_2, import_arm_from_version_3, import_arm_from_version_4,
import_arm_from_version_5, import_arm_from_version_6, import_arm_from_version_7, import_arm_from_version_8, import_arm_from_version_9,
import_arm_from_version_0, import_arm_from_version_1, import_arm_from_version_2, import_arm_from_version_3,
import_arm_from_version_4, import_arm_from_version_5, import_arm_from_version_6, import_arm_from_version_7,
import_arm_from_version_8, import_arm_from_version_9, import_arm_from_version_10,
};
for (i32 v = sizeof(fns) / sizeof(fns[0]) - 1; v >= 0; --v) {
if (import_arm_is_version(b, i32_to_string(v))) {
+22
View File
@@ -0,0 +1,22 @@
#include "../global.h"
void import_sound_run(char *path) {
for (i32 i = 0; i < g_project->_->sounds->length; ++i) {
slot_font_t *f = g_project->_->sounds->buffer[i];
if (string_equals(f->file, path)) {
console_info(strings_asset_already_imported());
return;
}
}
string_array_t *ar = string_split(path, PATH_SEP);
char *name = ar->buffer[ar->length - 1];
sound_t *sound = data_get_sound(path);
slot_font_t *s = slot_sound_create(name, sound, path);
g_context->sound = s;
any_array_push(g_project->_->sounds, s);
console_info(string("%s %s", tr("Sound imported:"), name));
}
+4 -1
View File
@@ -9,7 +9,6 @@
#include "io/export_texture.c"
#include "io/import_arm.c"
#include "io/import_asset.c"
#include "io/import_audio.c"
#include "io/import_blend_material.c"
#include "io/import_blend_mesh.c"
#include "io/import_envmap.c"
@@ -21,6 +20,7 @@
#include "io/import_mesh.c"
#include "io/import_obj.c"
#include "io/import_plugin.c"
#include "io/import_sound.c"
#include "io/import_texture.c"
#include "io/import_theme.c"
@@ -156,6 +156,7 @@
#include "ui/tab_meshes.c"
#include "ui/tab_plugins.c"
#include "ui/tab_scripts.c"
#include "ui/tab_sounds.c"
#include "ui/tab_swatches.c"
#include "ui/tab_textures.c"
#include "ui/tab_timeline.c"
@@ -223,6 +224,7 @@
#include "slot_font.c"
#include "slot_layer.c"
#include "slot_material.c"
#include "slot_sound.c"
#include "strings.c"
#include "translator.c"
#include "uniforms.c"
@@ -388,6 +390,7 @@ void _kickstart() {
g_project->_->brushes = any_array_create_from_raw((void *[]){}, 0);
g_project->_->layers = any_array_create_from_raw((void *[]){}, 0);
g_project->_->fonts = any_array_create_from_raw((void *[]){}, 0);
g_project->_->sounds = any_array_create_from_raw((void *[]){}, 0);
ui_view2d_hwnd = ui_handle_create();
gc_root(ui_view2d_hwnd);
+4
View File
@@ -816,6 +816,7 @@ void minic_register_builtins() {
R(data_get_blob, "p(p)");
R(data_get_video, "p(p)");
R(data_get_font, "p(p)");
R(data_get_sound, "p(p)");
R(data_delete_mesh, "v(p)");
R(data_delete_blob, "v(p)");
R(data_delete_texture, "v(p)");
@@ -999,6 +1000,9 @@ void minic_register_builtins() {
R(draw_circle, "v(f,f,f,i,f)");
R(draw_cubic_bezier, "v(p,p,i,f)");
// iron_audio
R(audio_play, "v(p,i)");
// iron_string
R(string_alloc, "p(i)");
R(string_copy, "p(p)");
+20
View File
@@ -0,0 +1,20 @@
#include "global.h"
slot_sound_t *slot_sound_create(char *name, sound_t *sound, char *file) {
slot_sound_t *raw = GC_ALLOC_INIT(slot_sound_t, {0});
raw->id = 0;
for (i32 i = 0; i < g_project->_->sounds->length; ++i) {
slot_sound_t *slot = g_project->_->sounds->buffer[i];
if (slot->id >= raw->id) {
raw->id = slot->id + 1;
}
}
raw->name = string_copy(name);
raw->sound = sound;
raw->file = string_copy(file);
return raw;
}
+17
View File
@@ -63,6 +63,14 @@ typedef struct slot_font {
char *file;
} slot_font_t;
typedef struct slot_sound {
struct gpu_texture *image; // 200px
i32 id;
sound_t *sound;
char *name;
char *file;
} slot_sound_t;
typedef struct config {
char *version;
char *sha; // Commit id
@@ -250,6 +258,7 @@ typedef struct context {
struct slot_layer *layer;
struct slot_brush *brush;
struct slot_font *font;
struct slot_sound *sound;
tool_type_t tool;
bool layer_preview_dirty;
bool layers_preview_dirty;
@@ -532,6 +541,7 @@ typedef struct {
struct slot_brush_t_array *brushes;
struct slot_layer_t_array *layers;
struct slot_font_t_array *fonts;
struct slot_sound_t_array *sounds;
struct node_group_t_array *material_groups;
char *filepath;
i32 next_asset_id;
@@ -558,6 +568,7 @@ typedef struct project {
struct buffer_t_array *material_icons;
struct material_data2_t_array *material_datas;
struct string_array *font_assets;
struct string_array *sound_assets;
struct layer_data_t_array *layer_datas;
struct mesh_data_t_array *mesh_datas;
struct string_array *mesh_assets;
@@ -793,6 +804,12 @@ typedef struct slot_font_t_array {
int capacity;
} slot_font_t_array_t;
typedef struct slot_sound_t_array {
slot_sound_t **buffer;
int length;
int capacity;
} slot_sound_t_array_t;
typedef struct slot_layer_t_array {
slot_layer_t **buffer;
int length;
+220
View File
@@ -0,0 +1,220 @@
#include "../global.h"
i32 _tab_sounds_draw_i;
i32 tab_sounds_drag_pos = -1;
void tab_sounds_delete_sound_on_next_frame(slot_sound_t *sound) {
i32 i = array_index_of(g_project->_->sounds, sound);
context_select_sound(i == g_project->_->sounds->length - 1 ? i - 1 : i + 1);
data_delete_sound(g_project->_->sounds->buffer[i]->file);
array_splice(g_project->_->sounds, i, 1);
}
void tab_sounds_delete_sound(slot_sound_t *sound) {
sys_notify_on_next_frame(&tab_sounds_delete_sound_on_next_frame, sound);
ui_base_hwnds->buffer[2]->redraws = 2;
}
void tab_sounds_draw_context_menu_draw() {
i32 i = _tab_sounds_draw_i;
if (ui_menu_button(tr("Delete"), "delete", ICON_DELETE)) {
tab_sounds_delete_sound(g_project->_->sounds->buffer[i]);
}
}
void tab_sounds_draw_context_menu(void *_) {
context_select_sound(_tab_sounds_draw_i);
ui_menu_draw(&tab_sounds_draw_context_menu_draw, -1, -1);
}
void tab_sounds_draw_select_sound(void *_) {
i32 i = _tab_sounds_draw_i;
context_select_sound(i);
}
void tab_sounds_draw(ui_handle_t *htab) {
if (ui_tab(htab, tr("Sounds"), false, -1, false) && g_ui->_window_h > ui_statusbar_default_h * UI_SCALE()) {
ui_begin_sticky();
f32_array_t *row = f32_array_create_from_raw(
(f32[]){
-100,
},
1);
ui_row(row);
if (ui_icon_button(tr("Import"), ICON_IMPORT, UI_ALIGN_CENTER)) {
project_import_asset("wav,ogg", true);
}
ui_end_sticky();
ui_separator(3, false);
i32 slotw = math_floor(51 * UI_SCALE());
i32 num = math_floor(g_ui->_window_w / (float)slotw);
if (num == 0) {
return;
}
bool drag_pos_set = false;
f32 uix = 0.0;
f32 uiy = 0.0;
i32 imgw_val = math_floor(50 * UI_SCALE());
for (i32 row = 0; row < math_floor(math_ceil(g_project->_->sounds->length / (float)num)); ++row) {
i32 mult = g_config->show_asset_names ? 2 : 1;
f32_array_t *ar = f32_array_create_from_raw((f32[]){}, 0);
for (i32 i = 0; i < num * mult; ++i) {
f32_array_push(ar, 1 / (float)num);
}
ui_row(ar);
g_ui->_x += 2;
f32 off = g_config->show_asset_names ? UI_ELEMENT_OFFSET() * 10.0 : 6;
if (row > 0) {
g_ui->_y += off;
}
for (i32 j = 0; j < num; ++j) {
i32 imgw = math_floor(50 * UI_SCALE());
i32 i = j + row * num;
if (i >= g_project->_->sounds->length) {
ui_end_element_of_size(imgw);
if (g_config->show_asset_names) {
ui_end_element_of_size(0);
}
continue;
}
gpu_texture_t *img = g_project->_->sounds->buffer[i]->image;
if (g_context->sound == g_project->_->sounds->buffer[i]) {
// ui_fill(1, -2, img.width + 3, img.height + 3, ui.ops.theme.HIGHLIGHT_COL); // TODO
i32 off = row % 2 == 1 ? 1 : 0;
i32 w = 50;
if (g_config->window_scale > 1) {
w += math_floor(g_config->window_scale * 2);
}
ui_fill(-1, -2, w + 3, 2, g_theme->HIGHLIGHT_COL);
ui_fill(-1, w - off, w + 3, 2 + off, g_theme->HIGHLIGHT_COL);
ui_fill(-1, -2, 2, w + 3, g_theme->HIGHLIGHT_COL);
ui_fill(w + 1, -2, 2, w + 4, g_theme->HIGHLIGHT_COL);
}
uix = g_ui->_x;
uiy = g_ui->_y;
i32 tile = UI_SCALE() > 1 ? 100 : 50;
if (base_drag_sound != NULL && tab_sounds_drag_pos == i) {
ui_fill(-1, -2, 2, imgw_val + 4, g_theme->HIGHLIGHT_COL);
}
ui_state_t state = UI_STATE_IDLE;
// if (g_project->_->sounds->buffer[i]->preview_ready) {
// state = ui_image(img, 0xffffffff, -1.0);
// }
// else {
state = ui_sub_image(resource_get("icons.k"), -1, -1.0, tile * 7, tile * 9, tile, tile);
// }
if (state == UI_STATE_HOVERED && base_drag_sound != NULL) {
tab_sounds_drag_pos = (mouse_x > uix + g_ui->_window_x + imgw_val / 2.0) ? i + 1 : i;
drag_pos_set = true;
}
if (state == UI_STATE_STARTED) {
if (g_context->sound != g_project->_->sounds->buffer[i]) {
_tab_sounds_draw_i = i;
sys_notify_on_next_frame(&tab_sounds_draw_select_sound, NULL);
}
base_drag_off_x = -(mouse_x - uix - g_ui->_window_x - 3);
base_drag_off_y = -(mouse_y - uiy - g_ui->_window_y + 1);
gc_unroot(base_drag_sound);
base_drag_sound = g_project->_->sounds->buffer[i];
gc_root(base_drag_sound);
// if (sys_time() - g_context->select_time < 0.2) {
// ui_base_show_2d_view(VIEW_2D_TYPE_FONT);
// gc_unroot(base_drag_sound);
// base_drag_sound = NULL;
// base_is_dragging = false;
// }
g_context->select_time = sys_time();
}
if (g_ui->is_hovered && g_ui->input_released_r) {
_tab_sounds_draw_i = i;
sys_notify_on_next_frame(&tab_sounds_draw_context_menu, NULL);
}
if (g_ui->is_hovered) {
// if (img == NULL) {
// _tab_sounds_draw_i = i;
// sys_notify_on_next_frame(&tab_sounds_draw_make_font_preview, NULL);
// }
// else {
ui_tooltip_image(img, 0);
ui_tooltip(g_project->_->sounds->buffer[i]->name);
// }
}
if (g_config->show_asset_names) {
g_ui->_x = uix;
g_ui->_y += slotw * 0.9;
ui_text(g_project->_->sounds->buffer[i]->name, UI_ALIGN_CENTER, 0x00000000);
if (g_ui->is_hovered) {
ui_tooltip(g_project->_->sounds->buffer[i]->name);
}
g_ui->_y -= slotw * 0.9;
if (i == g_project->_->sounds->length - 1) {
g_ui->_y += j == num - 1 ? imgw : imgw + UI_ELEMENT_H() + UI_ELEMENT_OFFSET();
}
}
}
g_ui->_y += 6;
}
if (base_drag_sound != NULL && tab_sounds_drag_pos == g_project->_->sounds->length) {
g_ui->_x = uix;
g_ui->_y = uiy;
ui_fill(imgw_val + 1, -2, 2, imgw_val + 4, g_theme->HIGHLIGHT_COL);
}
if (!drag_pos_set) {
tab_sounds_drag_pos = -1;
}
bool in_focus = g_ui->input_x > g_ui->_window_x && g_ui->input_x < g_ui->_window_x + g_ui->_window_w && g_ui->input_y > g_ui->_window_y &&
g_ui->input_y < g_ui->_window_y + g_ui->_window_h;
if (in_focus && g_ui->is_delete_down && g_project->_->sounds->length > 1 && !string_equals(g_context->sound->file, "")) {
g_ui->is_delete_down = false;
tab_sounds_delete_sound(g_context->sound);
}
if (in_focus) {
i32 i = array_index_of(g_project->_->sounds, g_context->sound);
if (g_ui->is_key_pressed && g_ui->key_code == KEY_CODE_UP) {
if (i > 0) {
_tab_sounds_draw_i = i - 1;
sys_notify_on_next_frame(&tab_sounds_draw_select_sound, NULL);
}
}
if (g_ui->is_key_pressed && g_ui->key_code == KEY_CODE_DOWN) {
if (i < g_project->_->sounds->length - 1) {
_tab_sounds_draw_i = i + 1;
sys_notify_on_next_frame(&tab_sounds_draw_select_sound, NULL);
}
}
}
}
}
void tab_sounds_accept_sound_drop(slot_sound_t *sound) {
if (tab_sounds_drag_pos == -1) {
return;
}
i32 sound_pos = array_index_of(g_project->_->sounds, sound);
if (sound_pos != -1 && math_abs(sound_pos - tab_sounds_drag_pos) > 0) {
array_remove(g_project->_->sounds, sound);
i32 new_pos = tab_sounds_drag_pos - sound_pos > 0 ? tab_sounds_drag_pos - 1 : tab_sounds_drag_pos;
array_insert(g_project->_->sounds, new_pos, sound);
}
}
+4 -1
View File
@@ -344,23 +344,26 @@ tab_draw_array_t_array_t *ui_base_init_hwnd_tabs() {
_draw_callback_create(tab_browser_draw),
_draw_callback_create(tab_textures_draw),
_draw_callback_create(tab_fonts_draw),
_draw_callback_create(tab_sounds_draw),
_draw_callback_create(tab_swatches_draw),
_draw_callback_create(tab_timeline_draw),
_draw_callback_create(tab_console_draw),
_draw_callback_create(ui_statusbar_draw_version_tab),
},
7);
8);
#ifdef IRON_IOS
if (config_is_iphone()) {
array_splice(a2, 5, 1); // Timeline
array_splice(a2, 4, 1); // Swatches
array_splice(a2, 3, 1); // Sounds
}
#endif
#ifdef IRON_ANDROID
if (iron_window_width() <= 1080) {
array_splice(a2, 5, 1); // Timeline
array_splice(a2, 3, 1); // Sounds
}
#endif
+3 -1
View File
@@ -206,7 +206,7 @@ buffer_t *util_encode_project(project_t *raw) {
buffer_t *encoded = buffer_create(size);
armpack_encode_start(encoded->buffer);
armpack_encode_map(35);
armpack_encode_map(36);
armpack_encode_string("version");
armpack_encode_string(raw->version);
@@ -359,6 +359,8 @@ buffer_t *util_encode_project(project_t *raw) {
armpack_encode_string("font_assets");
armpack_encode_array_string(raw->font_assets);
armpack_encode_string("sound_assets");
armpack_encode_array_string(raw->sound_assets);
armpack_encode_string("layer_datas");
if (raw->layer_datas != NULL) {