diff --git a/base/sources/libs/minic_api.c b/base/sources/libs/minic_api.c index aeccaa80..93182c3c 100644 --- a/base/sources/libs/minic_api.c +++ b/base/sources/libs/minic_api.c @@ -14,7 +14,6 @@ #include "iron_shape.h" #include "iron_string.h" #include "iron_sys.h" -#include "iron_tilesheet.h" #include "iron_ui.h" #include "minic.h" #include @@ -366,6 +365,9 @@ project_t *script_get_project() { return g_project; } +void script_set_stage(char *name); +void script_set_tilesheet_anim(object_t *o, char *anim); + object_t *script_get_object(char *s) { for (int i = 0; i < g_project->_->paint_objects->length; ++i) { if (string_equals(g_project->_->paint_objects->buffer[i]->base->name, s)) { @@ -791,6 +793,8 @@ void minic_register_builtins() { MINIC_STRUCT(transform_t); MINIC_E(loc, vec4_t); + MINIC_E(rot, quat_t); + MINIC_E(scale, vec4_t); MINIC_F(scale_world); MINIC_I(dirty); MINIC_O(object, object_t); @@ -1339,6 +1343,8 @@ void minic_register_builtins() { R(script_get_config, "p()"); R(script_get_project, "p()"); R(script_get_object, "p(p)"); + R(script_set_stage, "v(p)"); + R(script_set_tilesheet_anim, "v(p,p)"); R(context_set_viewport_shader, "v(p)"); R(context_set_viewport_mode, "v(i)"); R(context_set_camera_controls, "v(i)"); diff --git a/paint/sources/functions.h b/paint/sources/functions.h index b60ff368..9fabade3 100644 --- a/paint/sources/functions.h +++ b/paint/sources/functions.h @@ -411,6 +411,7 @@ stage_t *tab_stages_get_stage(); void tab_stages_apply(stage_t *stage); void tab_stages_rename_object(char *old_name, char *new_name); void tab_stages_rename_layer(char *old_name, char *new_name); +void script_set_stage(char *name); void tab_stages_prune(); void project_open(); void project_save(bool save_and_quit); diff --git a/paint/sources/main.c b/paint/sources/main.c index fb7abaac..58b494e5 100644 --- a/paint/sources/main.c +++ b/paint/sources/main.c @@ -192,6 +192,7 @@ #include "util/util_raycast.c" #include "util/util_render.c" #include "util/util_resize.c" +#include "util/util_script.c" #include "util/util_select.c" #include "util/util_shortcut.c" #include "util/util_stage.c" diff --git a/paint/sources/util/util_script.c b/paint/sources/util/util_script.c new file mode 100644 index 00000000..68898bb2 --- /dev/null +++ b/paint/sources/util/util_script.c @@ -0,0 +1,62 @@ + +#include "../global.h" + +void script_set_stage(char *name) { + if (g_project->stages == NULL) { + return; + } + for (i32 i = 0; i < g_project->stages->length; ++i) { + stage_t *s = g_project->stages->buffer[i]; + if (string_equals(s->name, name)) { + tab_stages_selected = i; + tab_stages_apply(s); + return; + } + } +} + +void script_set_tilesheet_anim(object_t *o, char *anim) { + mesh_object_t *mo = (mesh_object_t *)o->ext; + + // Locate the material slot + i32 slot_index = tab_meshes_get_override(mo); + if (slot_index < 0) { + for (i32 i = 0; i < g_project->_->materials->length; ++i) { + if (g_project->_->materials->buffer[i]->data == mo->material) { + slot_index = i; + break; + } + } + } + + slot_material_t *slot = g_project->_->materials->buffer[slot_index]; + + // Locate the tilesheet animation node + for (i32 i = 0; i < slot->canvas->nodes->length; ++i) { + ui_node_t *node = slot->canvas->nodes->buffer[i]; + if (!string_equals(node->type, "TILESHEET_ANIM")) { + continue; + } + + ui_node_button_t *enum_but = node->buttons->buffer[4]; + string_array_t *names = string_split(u8_array_to_string(enum_but->data), "\n"); + for (i32 j = 0; j < (i32)names->length; ++j) { + if (!string_equals(names->buffer[j], anim)) { + continue; + } + + enum_but->default_value->buffer[0] = (f32)j; + make_material_parse_paint_material(true); + + // Material override + for (i32 k = 0; k < g_project->_->paint_objects->length; ++k) { + mesh_object_t *po = g_project->_->paint_objects->buffer[k]; + if (tab_meshes_get_override(po) == slot_index) { + tab_meshes_set_override(po, slot_index); + g_context->ddirty = 2; + } + } + return; + } + } +}