应用转场
文件包含
window-basic-main-transitions.cpp
window-basic-main.hpp
类
OBSBasic
主要代码
void OBSBasic::TransitionToScene(OBSSource source, bool force,
bool quickTransition, int quickDuration,
bool black, bool manual)
void OBSBasic::TransitionToScene(OBSSource source, bool force,
bool quickTransition, int quickDuration,
bool black, bool manual)
{
obs_scene_t *scene = obs_scene_from_source(source);
bool usingPreviewProgram = IsPreviewProgramMode();
if (!scene)
return;
OBSWeakSource lastProgramScene;
if (usingPreviewProgram) {
if (!tBarActive)
lastProgramScene = programScene;
programScene = OBSGetWeakRef(source);
if (!force && !black) {
OBSSource lastScene = OBSGetStrongRef(lastProgramScene);
if (!sceneDuplicationMode && lastScene == source)
return;
if (swapScenesMode && lastScene &&
lastScene != GetCurrentSceneSource())
swapScene = lastProgramScene;
}
}
if (usingPreviewProgram && sceneDuplicationMode) {
scene = obs_scene_duplicate(
scene, obs_source_get_name(obs_scene_get_source(scene)),
editPropertiesMode ? OBS_SCENE_DUP_PRIVATE_COPY
: OBS_SCENE_DUP_PRIVATE_REFS);
source = obs_scene_get_source(scene);
}
OBSSourceAutoRelease transition = obs_get_output_source(0);
if (!transition) {
if (usingPreviewProgram && sceneDuplicationMode)
obs_scene_release(scene);
return;
}
float t = obs_transition_get_time(transition);
bool stillTransitioning = t < 1.0f && t > 0.0f;
// If actively transitioning, block new transitions from starting
if (usingPreviewProgram && stillTransitioning)
goto cleanup;
if (force) {
obs_transition_set(transition, source);
if (api)
api->on_event(OBS_FRONTEND_EVENT_SCENE_CHANGED);
} else {
int duration = ui->transitionDuration->value();
/* check for scene override */
OBSSource trOverride = GetOverrideTransition(source);
if (trOverride && !overridingTransition && !quickTransition) {
transition = std::move(trOverride);
duration = GetOverrideTransitionDuration(source);
OverrideTransition(transition.Get());
overridingTransition = true;
}
if (black && !prevFTBSource) {
prevFTBSource = source;
source = nullptr;
} else if (black && prevFTBSource) {
source = prevFTBSource;
prevFTBSource = nullptr;
} else if (!black) {
prevFTBSource = nullptr;
}
if (quickTransition)
duration = quickDuration;
enum obs_transition_mode mode =
manual ? OBS_TRANSITION_MODE_MANUAL
: OBS_TRANSITION_MODE_AUTO;
EnableTransitionWidgets(false);
bool success = obs_transition_start(transition, mode, duration,
source);
if (!success)
TransitionFullyStopped();
}
cleanup:
if (usingPreviewProgram && sceneDuplicationMode)
obs_scene_release(scene);
}
转场初始化
void InitDefaultTransitions();
转场开始
void TransitionClicked();
转场结束
void TransitionStopped();