diff --git a/paint/sources/functions.h b/paint/sources/functions.h index 931323f3..abadd156 100644 --- a/paint/sources/functions.h +++ b/paint/sources/functions.h @@ -136,7 +136,7 @@ void tab_timeline_reset(); void tab_timeline_prepare_save(); void tab_timeline_finish_save(); void tab_timeline_play(); -void tab_timeline_player_update(); +void tab_timeline_update(); void tab_timeline_edit_script(i32 row, i32 frame); void tab_console_draw(ui_handle_t *htab); void tab_textures_draw(ui_handle_t *htab); @@ -453,6 +453,7 @@ config_t *script_get_config(); project_t *script_get_project(); object_t *script_get_object(char *s); object_t *script_shape_add(char *name); +object_t *script_object_duplicate(object_t *o); void script_physics_set_shape(object_t *o, i32 shape); void script_physics_set_mass(object_t *o, f32 mass); void script_physics_apply_impulse(object_t *o, f32 x, f32 y, f32 z); @@ -524,6 +525,7 @@ void sim_update(); void sim_play(); void sim_stop(); void sim_add_body(object_t *o, asim_shape_t shape, f32 mass); +mesh_object_t *sim_duplicate_object(mesh_object_t *so); void sim_duplicate(); void sim_delete(); ui_node_link_t *parser_material_get_input_link(ui_node_socket_t *inp); diff --git a/paint/sources/minic_api.c b/paint/sources/minic_api.c index b5eb7eef..3f5ff6fd 100644 --- a/paint/sources/minic_api.c +++ b/paint/sources/minic_api.c @@ -1232,6 +1232,7 @@ void minic_register_builtins() { R(script_get_project, "p()"); R(script_get_object, "p(p s)"); R(script_shape_add, "p(p name)"); + R(script_object_duplicate, "p(p o)"); R(script_physics_set_shape, "v(p o,i shape)"); R(script_physics_set_mass, "v(p o,f mass)"); R(script_physics_apply_impulse, "v(p o,f x,f y,f z)"); diff --git a/paint/sources/minic_impl.c b/paint/sources/minic_impl.c index 1b17e83c..02a0af90 100644 --- a/paint/sources/minic_impl.c +++ b/paint/sources/minic_impl.c @@ -619,6 +619,22 @@ object_t *script_shape_add(char *name) { return mo->base; } +object_t *script_object_duplicate(object_t *o) { + if (o == NULL || !string_equals(o->ext_type, "mesh_object_t")) { + return NULL; + } + + gpu_texture_t *current; + bool in_use; + script_gpu_begin(¤t, &in_use); + mesh_object_t *dup = sim_duplicate_object(o->ext); + script_gpu_end(current, in_use); + + g_context->ddirty = 2; + ui_base_hwnds->buffer[TAB_AREA_SIDEBAR0]->redraws = 2; + return dup->base; +} + static asim_body_t *script_physics_body(object_t *o) { return o != NULL && o->_ != NULL ? o->_->body : NULL; } diff --git a/paint/sources/sim.c b/paint/sources/sim.c index 78402b66..bbc4cb66 100644 --- a/paint/sources/sim.c +++ b/paint/sources/sim.c @@ -78,11 +78,10 @@ void sim_add_body(object_t *o, asim_shape_t shape, f32 mass) { asim_body_create(o, shape, mass); } -void sim_duplicate() { +mesh_object_t *sim_duplicate_object(mesh_object_t *so) { // Mesh - mesh_object_t *so = g_context->paint_object; if (so == NULL) { - return; + return NULL; } mesh_data_t *data = util_mesh_data_duplicate(so->data); @@ -112,6 +111,12 @@ void sim_duplicate() { if (pb != NULL) { asim_body_create(dup->base, pb->shape, pb->mass); } + + return dup; +} + +void sim_duplicate() { + sim_duplicate_object(g_context->paint_object); } void sim_delete() {