diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index e770f6673..6c92a6845 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -854,35 +854,13 @@ static void scene_load_item(struct obs_scene *scene, obs_data_t *item_data) obs_data_t *show_data = obs_data_get_obj(item_data, "show_transition"); if (show_data) { - const char *id = obs_data_get_string(show_data, "id"); - if (id && strlen(id)) { - const char *tn = obs_data_get_string(show_data, "name"); - obs_data_t *s = - obs_data_get_obj(show_data, "transition"); - obs_source_t *t = obs_source_create_private(id, tn, s); - obs_sceneitem_set_show_transition(item, t); - obs_source_release(t); - obs_data_release(s); - } - item->show_transition_duration = - (uint32_t)obs_data_get_int(show_data, "duration"); + obs_sceneitem_transition_load(item, show_data, true); obs_data_release(show_data); } obs_data_t *hide_data = obs_data_get_obj(item_data, "hide_transition"); if (hide_data) { - const char *id = obs_data_get_string(hide_data, "id"); - if (id && strlen(id)) { - const char *tn = obs_data_get_string(hide_data, "name"); - obs_data_t *s = - obs_data_get_obj(hide_data, "transition"); - obs_source_t *t = obs_source_create_private(id, tn, s); - obs_sceneitem_set_hide_transition(item, t); - obs_source_release(t); - obs_data_release(s); - } - item->hide_transition_duration = - (uint32_t)obs_data_get_int(hide_data, "duration"); + obs_sceneitem_transition_load(item, hide_data, false); obs_data_release(hide_data); } @@ -1001,37 +979,11 @@ static void scene_save_item(obs_data_array_t *array, obs_data_set_string(item_data, "scale_filter", scale_filter); - obs_data_t *show_data = obs_data_create(); - if (item->show_transition) { - obs_data_set_string( - show_data, "id", - obs_source_get_unversioned_id(item->show_transition)); - obs_data_set_string(show_data, "versioned_id", - obs_source_get_id(item->show_transition)); - obs_data_set_string(show_data, "name", - obs_source_get_name(item->show_transition)); - obs_data_t *s = obs_source_get_settings(item->show_transition); - obs_data_set_obj(show_data, "transition", s); - obs_data_release(s); - } - obs_data_set_int(show_data, "duration", item->show_transition_duration); + obs_data_t *show_data = obs_sceneitem_transition_save(item, true); obs_data_set_obj(item_data, "show_transition", show_data); obs_data_release(show_data); - obs_data_t *hide_data = obs_data_create(); - if (item->hide_transition) { - obs_data_set_string( - hide_data, "id", - obs_source_get_unversioned_id(item->hide_transition)); - obs_data_set_string(hide_data, "versioned_id", - obs_source_get_id(item->hide_transition)); - obs_data_set_string(hide_data, "name", - obs_source_get_name(item->hide_transition)); - obs_data_t *s = obs_source_get_settings(item->hide_transition); - obs_data_set_obj(hide_data, "transition", s); - obs_data_release(s); - } - obs_data_set_int(hide_data, "duration", item->hide_transition_duration); + obs_data_t *hide_data = obs_sceneitem_transition_save(item, false); obs_data_set_obj(item_data, "hide_transition", hide_data); obs_data_release(hide_data); @@ -3579,3 +3531,51 @@ void obs_sceneitem_do_transition(obs_sceneitem_t *item, bool visible) duration, item->source); } } + +void obs_sceneitem_transition_load(struct obs_scene_item *item, + obs_data_t *data, bool show) +{ + if (!item || !data) + return; + const char *id = obs_data_get_string(data, "id"); + if (id && strlen(id)) { + const char *tn = obs_data_get_string(data, "name"); + obs_data_t *s = obs_data_get_obj(data, "transition"); + obs_source_t *t = obs_source_create_private(id, tn, s); + if (show) + obs_sceneitem_set_show_transition(item, t); + else + obs_sceneitem_set_hide_transition(item, t); + obs_source_release(t); + obs_data_release(s); + } + if (show) + item->show_transition_duration = + (uint32_t)obs_data_get_int(data, "duration"); + else + item->hide_transition_duration = + (uint32_t)obs_data_get_int(data, "duration"); +} + +obs_data_t *obs_sceneitem_transition_save(struct obs_scene_item *item, + bool show) +{ + obs_data_t *data = obs_data_create(); + struct obs_source *transition = show ? item->show_transition + : item->hide_transition; + if (transition) { + obs_data_set_string(data, "id", + obs_source_get_unversioned_id(transition)); + obs_data_set_string(data, "versioned_id", + obs_source_get_id(transition)); + obs_data_set_string(data, "name", + obs_source_get_name(transition)); + obs_data_t *s = obs_source_get_settings(transition); + obs_data_set_obj(data, "transition", s); + obs_data_release(s); + } + obs_data_set_int(data, "duration", + show ? item->show_transition_duration + : item->hide_transition_duration); + return data; +} diff --git a/libobs/obs.h b/libobs/obs.h index bfbd18b7c..694a2cc4a 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -1780,6 +1780,10 @@ EXPORT obs_source_t *obs_sceneitem_get_hide_transition(obs_sceneitem_t *item); EXPORT uint32_t obs_sceneitem_get_hide_transition_duration(obs_sceneitem_t *item); EXPORT void obs_sceneitem_do_transition(obs_sceneitem_t *item, bool visible); +EXPORT void obs_sceneitem_transition_load(struct obs_scene_item *item, + obs_data_t *data, bool show); +EXPORT obs_data_t *obs_sceneitem_transition_save(struct obs_scene_item *item, + bool show); /* ------------------------------------------------------------------------- */ /* Outputs */