X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fscene.cpp;h=ccb3b1bf241c74c7c72ca1a1bcaac4c0f0c927ce;hb=5a8cccb37e6832197fac3afa0fa39cf83283d5af;hp=38927384a1fafc4fb8fa8cb1477334f1e4b4cad7;hpb=2839159e454d18d2536facaf47ad57eff529f303;p=nageru diff --git a/nageru/scene.cpp b/nageru/scene.cpp index 3892738..ccb3b1b 100644 --- a/nageru/scene.cpp +++ b/nageru/scene.cpp @@ -67,10 +67,10 @@ size_t Scene::compute_chain_number_for_block(size_t block_idx) const int Scene::add_input(lua_State* L) { assert(lua_gettop(L) == 1 || lua_gettop(L) == 2); - Scene *chain = (Scene *)luaL_checkudata(L, 1, "Scene"); + Scene *scene = (Scene *)luaL_checkudata(L, 1, "Scene"); Block *block = new Block; - block->idx = chain->blocks.size(); + block->idx = scene->blocks.size(); if (lua_gettop(L) == 1) { // No parameter given, so a flexible input. block->alternatives.emplace_back(new EffectBlueprint(LIVE_INPUT_YCBCR)); @@ -104,7 +104,7 @@ int Scene::add_input(lua_State* L) assert(ok); } block->is_input = true; - chain->blocks.push_back(block); + scene->blocks.push_back(block); return wrap_lua_existing_object_nonowned(L, "Block", block); } @@ -112,10 +112,10 @@ int Scene::add_input(lua_State* L) int Scene::add_effect(lua_State* L) { assert(lua_gettop(L) >= 2); - Scene *chain = (Scene *)luaL_checkudata(L, 1, "Scene"); + Scene *scene = (Scene *)luaL_checkudata(L, 1, "Scene"); Block *block = new Block; - block->idx = chain->blocks.size(); + block->idx = scene->blocks.size(); if (lua_istable(L, 2)) { size_t len = lua_objlen(L, 2); @@ -132,8 +132,8 @@ int Scene::add_effect(lua_State* L) // Find the inputs. if (lua_gettop(L) == 2) { - assert(!chain->blocks.empty()); - block->inputs.push_back(chain->blocks.size() - 1); + assert(!scene->blocks.empty()); + block->inputs.push_back(scene->blocks.size() - 1); } else { for (int idx = 3; idx <= lua_gettop(L); ++idx) { Block *input_block = nullptr; @@ -143,21 +143,21 @@ int Scene::add_effect(lua_State* L) EffectBlueprint *blueprint = *(EffectBlueprint **)luaL_checkudata(L, idx, "EffectBlueprint"); // Search through all the blocks to figure out which one contains this effect. - for (Block *block : chain->blocks) { + for (Block *block : scene->blocks) { if (find(block->alternatives.begin(), block->alternatives.end(), blueprint) != block->alternatives.end()) { input_block = block; break; } } if (input_block == nullptr) { - luaL_error(L, "Input effect in parameter #%d has not been added to this chain", idx - 1); + luaL_error(L, "Input effect in parameter #%d has not been added to this scene", idx - 1); } } block->inputs.push_back(input_block->idx); } } - chain->blocks.push_back(block); + scene->blocks.push_back(block); return wrap_lua_existing_object_nonowned(L, "Block", block); } @@ -165,11 +165,11 @@ int Scene::add_effect(lua_State* L) int Scene::add_optional_effect(lua_State* L) { assert(lua_gettop(L) >= 2); - Scene *chain = (Scene *)luaL_checkudata(L, 1, "Scene"); + Scene *scene = (Scene *)luaL_checkudata(L, 1, "Scene"); // NOTE: We only support effects with a single parent, since that's what IdentityEffect does. Block *block = new Block; - block->idx = chain->blocks.size(); + block->idx = scene->blocks.size(); EffectBlueprint *blueprint = *(EffectBlueprint **)luaL_checkudata(L, 2, "EffectBlueprint"); block->alternatives.push_back(blueprint); @@ -177,8 +177,8 @@ int Scene::add_optional_effect(lua_State* L) // An IdentityEffect will be the alternative for when the effect is disabled. block->alternatives.push_back(new EffectBlueprint(IDENTITY_EFFECT)); - block->inputs.push_back(chain->blocks.size() - 1); - chain->blocks.push_back(block); + block->inputs.push_back(scene->blocks.size() - 1); + scene->blocks.push_back(block); return wrap_lua_existing_object_nonowned(L, "Block", block); } @@ -191,8 +191,7 @@ Effect *Scene::instantiate_effects(const Block *block, size_t chain_idx, Scene:: } // Find the chosen alternative for this block in this instance. - size_t chosen_alternative = (chain_idx / block->cardinality_base) % block->alternatives.size(); - EffectType chosen_type = block->alternatives[chosen_alternative]->effect_type; + EffectType chosen_type = block->alternatives[block->chosen_alternative(chain_idx)]->effect_type; Effect *effect; switch (chosen_type) { @@ -225,7 +224,7 @@ Effect *Scene::instantiate_effects(const Block *block, size_t chain_idx, Scene:: break; } default: - effect = instantiate_effect(instantiation->chain.get(), block->alternatives[chosen_alternative]->effect_type); + effect = instantiate_effect(instantiation->chain.get(), chosen_type); instantiation->chain->add_effect(effect, inputs); break; } @@ -243,11 +242,11 @@ int Scene::finalize(lua_State* L) } else { assert(lua_gettop(L) == 1); } - Scene *chain = (Scene *)luaL_checkudata(L, 1, "Scene"); + Scene *scene = (Scene *)luaL_checkudata(L, 1, "Scene"); Theme *theme = get_theme_updata(L); size_t base = 1; - for (Block *block : chain->blocks) { + for (Block *block : scene->blocks) { block->cardinality_base = base; base *= block->alternatives.size(); } @@ -259,20 +258,20 @@ int Scene::finalize(lua_State* L) total_cardinality); } - Block *output_block = chain->blocks.back(); + Block *output_block = scene->blocks.back(); for (bool is_main_chain : { false, true }) { for (size_t chain_idx = 0; chain_idx < cardinality; ++chain_idx) { if (only_one_mode && is_main_chain != chosen_mode) { - chain->chains.emplace_back(); + scene->chains.emplace_back(); continue; } Scene::Instantiation instantiation; - instantiation.chain.reset(new EffectChain(chain->aspect_nom, chain->aspect_denom, theme->get_resource_pool())); - chain->instantiate_effects(output_block, chain_idx, &instantiation); + instantiation.chain.reset(new EffectChain(scene->aspect_nom, scene->aspect_denom, theme->get_resource_pool())); + scene->instantiate_effects(output_block, chain_idx, &instantiation); add_outputs_and_finalize(instantiation.chain.get(), is_main_chain); - chain->chains.emplace_back(move(instantiation)); + scene->chains.emplace_back(move(instantiation)); } } return 0; @@ -328,7 +327,7 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp } else if (block->signal_type_to_connect == Block::CONNECT_VIDEO) { signals_to_connect.emplace(input, block->video_to_connect->get_card_index()); } else if (block->signal_type_to_connect == Block::CONNECT_NONE) { - luaL_error(L, "An input in a chain was not connected to anything (forgot to call display())"); + luaL_error(L, "An input in a scene was not connected to anything (forgot to call display())"); } else { assert(false); } @@ -366,16 +365,16 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp if (!block->alternatives.empty()) { EffectBlueprint *blueprint = block->alternatives[block->currently_chosen_alternative]; for (const auto &key_and_tuple : blueprint->int_parameters) { - int_to_set.emplace(make_pair(effect, key_and_tuple.first), key_and_tuple.second); + int_to_set[make_pair(effect, key_and_tuple.first)] = key_and_tuple.second; } for (const auto &key_and_tuple : blueprint->float_parameters) { - float_to_set.emplace(make_pair(effect, key_and_tuple.first), key_and_tuple.second); + float_to_set[make_pair(effect, key_and_tuple.first)] = key_and_tuple.second; } for (const auto &key_and_tuple : blueprint->vec3_parameters) { - vec3_to_set.emplace(make_pair(effect, key_and_tuple.first), key_and_tuple.second); + vec3_to_set[make_pair(effect, key_and_tuple.first)] = key_and_tuple.second; } for (const auto &key_and_tuple : blueprint->vec4_parameters) { - vec4_to_set.emplace(make_pair(effect, key_and_tuple.first), key_and_tuple.second); + vec4_to_set[make_pair(effect, key_and_tuple.first)] = key_and_tuple.second; } } } @@ -516,7 +515,7 @@ int Block_choose(lua_State* L) assert(size_t(alternative_idx) < block->alternatives.size()); block->currently_chosen_alternative = alternative_idx; - return 0; + return wrap_lua_existing_object_nonowned(L, "EffectBlueprint", block->alternatives[alternative_idx]); } int Block_enable(lua_State *L) @@ -532,6 +531,20 @@ int Block_enable(lua_State *L) return 0; } +int Block_enable_if(lua_State *L) +{ + assert(lua_gettop(L) == 2); + Block *block = *(Block **)luaL_checkudata(L, 1, "Block"); + + if (block->alternatives.size() != 2 || + block->alternatives[1]->effect_type != IDENTITY_EFFECT) { + luaL_error(L, "enable_if() called on something that wasn't added with add_optional_effect()"); + } + bool enabled = checkbool(L, 2); + block->currently_chosen_alternative = enabled ? 0 : 1; + return 0; +} + int Block_disable(lua_State *L) { assert(lua_gettop(L) == 1);