diff --git a/UI/window-basic-main-transitions.cpp b/UI/window-basic-main-transitions.cpp index 793a54e08..e841df4c5 100644 --- a/UI/window-basic-main-transitions.cpp +++ b/UI/window-basic-main-transitions.cpp @@ -1095,7 +1095,7 @@ QMenu *OBSBasic::CreatePerSceneTransitionMenu() void OBSBasic::on_actionShowTransitionProperties_triggered() { OBSSceneItem item = GetCurrentSceneItem(); - OBSSource source = obs_sceneitem_get_show_transition(item); + OBSSource source = obs_sceneitem_get_transition(item, true); if (source) CreatePropertiesWindow(source); @@ -1104,7 +1104,7 @@ void OBSBasic::on_actionShowTransitionProperties_triggered() void OBSBasic::on_actionHideTransitionProperties_triggered() { OBSSceneItem item = GetCurrentSceneItem(); - OBSSource source = obs_sceneitem_get_hide_transition(item); + OBSSource source = obs_sceneitem_get_transition(item, false); if (source) CreatePropertiesWindow(source); @@ -1118,14 +1118,11 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible) new QMenu(QTStr(visible ? "ShowTransition" : "HideTransition")); QAction *action; - OBSSource curTransition = - visible ? obs_sceneitem_get_show_transition(si) - : obs_sceneitem_get_hide_transition(si); + OBSSource curTransition = obs_sceneitem_get_transition(si, visible); const char *curId = curTransition ? obs_source_get_id(curTransition) : nullptr; int curDuration = - (int)(visible ? obs_sceneitem_get_show_transition_duration(si) - : obs_sceneitem_get_hide_transition_duration(si)); + (int)obs_sceneitem_get_transition_duration(si, visible); if (curDuration <= 0) curDuration = obs_frontend_get_transition_duration(); @@ -1164,18 +1161,11 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible) OBSDataAutoRelease oldTransitionData = obs_sceneitem_transition_save(sceneItem, visible); if (id.isNull() || id.isEmpty()) { - if (visible) - obs_sceneitem_set_show_transition(sceneItem, - nullptr); - else - obs_sceneitem_set_hide_transition(sceneItem, - nullptr); + obs_sceneitem_set_transition(sceneItem, visible, + nullptr); } else { - OBSSource tr = - visible ? obs_sceneitem_get_show_transition( - sceneItem) - : obs_sceneitem_get_hide_transition( - sceneItem); + OBSSource tr = obs_sceneitem_get_transition(sceneItem, + visible); if (!tr || strcmp(QT_TO_UTF8(id), obs_source_get_id(tr)) != 0) { @@ -1187,28 +1177,18 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible) tr = obs_source_create_private(QT_TO_UTF8(id), QT_TO_UTF8(name), nullptr); - if (visible) - obs_sceneitem_set_show_transition( - sceneItem, tr); - else - obs_sceneitem_set_hide_transition( - sceneItem, tr); + obs_sceneitem_set_transition(sceneItem, visible, + tr); obs_source_release(tr); - int duration = - (int)(visible ? obs_sceneitem_get_show_transition_duration( - sceneItem) - : obs_sceneitem_get_hide_transition_duration( - sceneItem)); + int duration = (int) + obs_sceneitem_get_transition_duration( + sceneItem, visible); if (duration <= 0) { duration = obs_frontend_get_transition_duration(); - if (visible) - obs_sceneitem_set_show_transition_duration( - sceneItem, duration); - else - obs_sceneitem_set_hide_transition_duration( - sceneItem, duration); + obs_sceneitem_set_transition_duration( + sceneItem, visible, duration); } } if (obs_source_configurable(tr)) @@ -1227,31 +1207,15 @@ QMenu *OBSBasic::CreateVisibilityTransitionMenu(bool visible) sceneItem))), undo_redo, undo_redo, undo_data, redo_data); }; - if (visible) { - auto setDuration = [](int duration) { - OBSBasic *main = reinterpret_cast( - App()->GetMainWindow()); + auto setDuration = [visible](int duration) { + OBSBasic *main = + reinterpret_cast(App()->GetMainWindow()); - OBSSceneItem item = main->GetCurrentSceneItem(); - obs_sceneitem_set_show_transition_duration(item, - duration); - }; - connect(duration, - (void (QSpinBox::*)(int)) & QSpinBox::valueChanged, - setDuration); - } else { - auto setDuration = [](int duration) { - OBSBasic *main = reinterpret_cast( - App()->GetMainWindow()); - - OBSSceneItem item = main->GetCurrentSceneItem(); - obs_sceneitem_set_hide_transition_duration(item, - duration); - }; - connect(duration, - (void (QSpinBox::*)(int)) & QSpinBox::valueChanged, - setDuration); - } + OBSSceneItem item = main->GetCurrentSceneItem(); + obs_sceneitem_set_transition_duration(item, visible, duration); + }; + connect(duration, (void (QSpinBox::*)(int)) & QSpinBox::valueChanged, + setDuration); action = menu->addAction(QT_UTF8(Str("None"))); action->setProperty("transition_id", QT_UTF8("")); diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 98418aebd..4ed2f119a 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -912,8 +912,8 @@ static bool LogSceneItem(obs_scene_t *, obs_sceneitem_t *item, void *v_val) obs_source_enum_filters(source, LogFilter, (void *)(intptr_t)child_indent); - obs_source_t *show_tn = obs_sceneitem_get_show_transition(item); - obs_source_t *hide_tn = obs_sceneitem_get_hide_transition(item); + obs_source_t *show_tn = obs_sceneitem_get_transition(item, true); + obs_source_t *hide_tn = obs_sceneitem_get_transition(item, false); if (show_tn) blog(LOG_INFO, " %s- show: '%s' (%s)", indent.c_str(), obs_source_get_name(show_tn), obs_source_get_id(show_tn)); diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 2ce9f6444..c12b336e4 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -1523,14 +1523,14 @@ static inline void duplicate_item_data(struct obs_scene_item *dst, obs_source_t *transition = obs_source_duplicate( src->show_transition, obs_source_get_name(src->show_transition), true); - obs_sceneitem_set_show_transition(dst, transition); + obs_sceneitem_set_transition(dst, true, transition); obs_source_release(transition); } if (src->hide_transition) { obs_source_t *transition = obs_source_duplicate( src->hide_transition, obs_source_get_name(src->hide_transition), true); - obs_sceneitem_set_hide_transition(dst, transition); + obs_sceneitem_set_transition(dst, false, transition); obs_source_release(transition); } dst->show_transition_duration = src->show_transition_duration; @@ -2129,8 +2129,8 @@ void obs_sceneitem_remove(obs_sceneitem_t *item) full_unlock(scene); - obs_sceneitem_set_show_transition(item, NULL); - obs_sceneitem_set_hide_transition(item, NULL); + obs_sceneitem_set_transition(item, true, NULL); + obs_sceneitem_set_transition(item, false, NULL); obs_sceneitem_release(item); } @@ -3655,6 +3655,46 @@ uint32_t obs_sceneitem_get_hide_transition_duration(obs_sceneitem_t *item) return item->hide_transition_duration; } +void obs_sceneitem_set_transition(obs_sceneitem_t *item, bool show, + obs_source_t *transition) +{ + if (!item) + return; + + obs_source_t **target = show ? &item->show_transition + : &item->hide_transition; + if (*target) + obs_source_release(*target); + *target = obs_source_get_ref(transition); +} + +obs_source_t *obs_sceneitem_get_transition(obs_sceneitem_t *item, bool show) +{ + if (!item) + return NULL; + + return show ? item->show_transition : item->hide_transition; +} + +void obs_sceneitem_set_transition_duration(obs_sceneitem_t *item, bool show, + uint32_t duration_ms) +{ + if (!item) + return; + if (show) + item->show_transition_duration = duration_ms; + else + item->hide_transition_duration = duration_ms; +} + +uint32_t obs_sceneitem_get_transition_duration(obs_sceneitem_t *item, bool show) +{ + if (!item) + return 0; + return show ? item->show_transition_duration + : item->hide_transition_duration; +} + void obs_sceneitem_transition_stop(void *data, calldata_t *calldata) { obs_source_t *parent = data; @@ -3679,16 +3719,12 @@ void obs_sceneitem_do_transition(obs_sceneitem_t *item, bool visible) if (transition_active(item->hide_transition)) obs_transition_force_stop(item->hide_transition); - obs_source_t *transition = - visible ? obs_sceneitem_get_show_transition(item) - : obs_sceneitem_get_hide_transition(item); + obs_source_t *transition = obs_sceneitem_get_transition(item, visible); if (!transition) return; int duration = - (int)(visible ? obs_sceneitem_get_show_transition_duration(item) - : obs_sceneitem_get_hide_transition_duration( - item)); + (int)obs_sceneitem_get_transition_duration(item, visible); const int cx = obs_source_get_width(item->source); const int cy = obs_source_get_height(item->source); @@ -3729,10 +3765,7 @@ void obs_sceneitem_transition_load(struct obs_scene_item *item, 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_sceneitem_set_transition(item, show, t); obs_source_release(t); obs_data_release(s); } diff --git a/libobs/obs.h b/libobs/obs.h index 5d5d66177..6e0c93885 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -1859,16 +1859,30 @@ EXPORT void obs_sceneitem_set_show_transition(obs_sceneitem_t *item, obs_source_t *transition); EXPORT void obs_sceneitem_set_show_transition_duration(obs_sceneitem_t *item, uint32_t duration_ms); -EXPORT obs_source_t *obs_sceneitem_get_show_transition(obs_sceneitem_t *item); -EXPORT uint32_t +OBS_DEPRECATED EXPORT obs_source_t * +obs_sceneitem_get_show_transition(obs_sceneitem_t *item); +OBS_DEPRECATED EXPORT uint32_t obs_sceneitem_get_show_transition_duration(obs_sceneitem_t *item); -EXPORT void obs_sceneitem_set_hide_transition(obs_sceneitem_t *item, - obs_source_t *transition); -EXPORT void obs_sceneitem_set_hide_transition_duration(obs_sceneitem_t *item, - uint32_t duration_ms); -EXPORT obs_source_t *obs_sceneitem_get_hide_transition(obs_sceneitem_t *item); -EXPORT uint32_t +OBS_DEPRECATED EXPORT void +obs_sceneitem_set_hide_transition(obs_sceneitem_t *item, + obs_source_t *transition); +OBS_DEPRECATED EXPORT void +obs_sceneitem_set_hide_transition_duration(obs_sceneitem_t *item, + uint32_t duration_ms); +OBS_DEPRECATED EXPORT obs_source_t * +obs_sceneitem_get_hide_transition(obs_sceneitem_t *item); +OBS_DEPRECATED EXPORT uint32_t obs_sceneitem_get_hide_transition_duration(obs_sceneitem_t *item); + +EXPORT void obs_sceneitem_set_transition(obs_sceneitem_t *item, bool show, + obs_source_t *transition); +EXPORT obs_source_t *obs_sceneitem_get_transition(obs_sceneitem_t *item, + bool show); +EXPORT void obs_sceneitem_set_transition_duration(obs_sceneitem_t *item, + bool show, + uint32_t duration_ms); +EXPORT uint32_t obs_sceneitem_get_transition_duration(obs_sceneitem_t *item, + bool show); 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);