From a30c2972b928d9f13ebee54466f2e6af12219c31 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 18 Mar 2020 19:38:25 +0100 Subject: [PATCH] When deciding which signal to connect, delay the mapping to cards. This fixes an issue where scenes that get display() once at start and then never afterwards wouldn't get updated properly when mappings changed in the UI. --- nageru/scene.cpp | 22 +++++++++++----------- nageru/scene.h | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/nageru/scene.cpp b/nageru/scene.cpp index 53a64a0..7a8e882 100644 --- a/nageru/scene.cpp +++ b/nageru/scene.cpp @@ -18,7 +18,7 @@ extern "C" { using namespace movit; using namespace std; -bool display(Block *block, lua_State *L, int idx); +static bool display(Block *block, lua_State *L, int idx); EffectType current_type(const Block *block) { @@ -495,10 +495,10 @@ int Scene::finalize(lua_State* L) return 0; } -int find_card_to_connect(lua_State *L, const Block *block) +int find_card_to_connect(Theme *theme, lua_State *L, const Block *block) { - if (block->signal_type_to_connect == Block::CONNECT_CARD) { - return block->card_to_connect; + if (block->signal_type_to_connect == Block::CONNECT_SIGNAL) { + return theme->map_signal_to_card(block->signal_to_connect); #ifdef HAVE_CEF } else if (block->signal_type_to_connect == Block::CONNECT_CEF) { return block->cef_to_connect->get_card_index(); @@ -520,10 +520,11 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp // based on the current state of the signals. InputStateInfo info(input_state); for (Block *block : blocks) { - if (block->is_input && block->signal_type_to_connect == Block::CONNECT_CARD) { + if (block->is_input && block->signal_type_to_connect == Block::CONNECT_SIGNAL) { EffectType chosen_type = current_type(block); assert(chosen_type == LIVE_INPUT_YCBCR || chosen_type == LIVE_INPUT_YCBCR_WITH_DEINTERLACE); - if (info.last_interlaced[block->card_to_connect]) { + int card_index = theme->map_signal_to_card(block->signal_to_connect); + if (info.last_interlaced[card_index]) { block->currently_chosen_alternative = find_index_of(block, LIVE_INPUT_YCBCR_WITH_DEINTERLACE); } else { block->currently_chosen_alternative = find_index_of(block, LIVE_INPUT_YCBCR); @@ -552,7 +553,7 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp chosen_type == LIVE_INPUT_YCBCR_WITH_DEINTERLACE || chosen_type == LIVE_INPUT_YCBCR_PLANAR || chosen_type == LIVE_INPUT_BGRA); - int card_idx = find_card_to_connect(L, input); + int card_idx = find_card_to_connect(theme, L, input); RGBTriplet wb = theme->get_white_balance_for_card(card_idx); if (fabs(wb.r - 1.0) < 1e-3 && fabs(wb.g - 1.0) < 1e-3 && fabs(wb.b - 1.0) < 1e-3) { // Neutral white balance. @@ -603,7 +604,7 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp chosen_type == LIVE_INPUT_YCBCR_PLANAR || chosen_type == LIVE_INPUT_BGRA) { LiveInputWrapper *input = index_and_input.second; - cards_to_connect.emplace(input, find_card_to_connect(L, block)); + cards_to_connect.emplace(input, find_card_to_connect(theme, L, block)); } } for (const auto &index_and_input : instantiation.image_inputs) { @@ -734,10 +735,9 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp bool display(Block *block, lua_State *L, int idx) { if (lua_isnumber(L, idx)) { - Theme *theme = get_theme_updata(L); int signal_idx = luaL_checknumber(L, idx); - block->signal_type_to_connect = Block::CONNECT_CARD; - block->card_to_connect = theme->map_signal_to_card(signal_idx); + block->signal_type_to_connect = Block::CONNECT_SIGNAL; + block->signal_to_connect = signal_idx; block->currently_chosen_alternative = find_index_of(block, LIVE_INPUT_YCBCR); // Will be changed to deinterlaced at get_chain() time if needed. return true; #ifdef HAVE_CEF diff --git a/nageru/scene.h b/nageru/scene.h index e126ca3..4e1181b 100644 --- a/nageru/scene.h +++ b/nageru/scene.h @@ -113,8 +113,8 @@ struct Block { // For LIVE_INPUT* only. We can't just always populate signal_to_connect, // since when we set this, CEF and video signals may not have numbers yet. // FIXME: Perhaps it would be simpler if they just did? - enum { CONNECT_NONE, CONNECT_CARD, CONNECT_CEF, CONNECT_VIDEO } signal_type_to_connect = CONNECT_NONE; - int card_to_connect = 0; // For CONNECT_CARD. + enum { CONNECT_NONE, CONNECT_SIGNAL, CONNECT_CEF, CONNECT_VIDEO } signal_type_to_connect = CONNECT_NONE; + int signal_to_connect = 0; // For CONNECT_SIGNAL. #ifdef HAVE_CEF CEFCapture *cef_to_connect = nullptr; // For CONNECT_CEF. #endif -- 2.39.2