]> git.sesse.net Git - nageru/blobdiff - nageru/scene.cpp
Make Block.choose() return the effect that was chosen.
[nageru] / nageru / scene.cpp
index 0d10be5b8cba5876363367b7007c43cb2f0ac2ba..090f95be917884a1044239bb4046fc4d6726d613 100644 (file)
@@ -366,16 +366,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;
                        }
                }
        }
@@ -385,9 +385,6 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp
        auto setup_chain = [L, theme, signals_to_connect, images_to_select, int_to_set, float_to_set, vec3_to_set, vec4_to_set, input_state]{
                lock_guard<mutex> lock(theme->m);
 
-               assert(theme->input_state == nullptr);
-               theme->input_state = &input_state;
-
                // Set up state, including connecting signals.
                for (const auto &input_and_signal : signals_to_connect) {
                        LiveInputWrapper *input = input_and_signal.first;
@@ -430,8 +427,6 @@ Scene::get_chain(Theme *theme, lua_State *L, unsigned num, const InputState &inp
                                                value[0], value[1], value[2], value[3]);
                        }
                }
-
-               theme->input_state = nullptr;
        };
        return make_pair(effect_chain, move(setup_chain));
 }
@@ -496,17 +491,32 @@ int Block_display(lua_State* L)
        return 0;
 }
 
-int Block_choose_alternative(lua_State* L)
+int Block_choose(lua_State* L)
 {
        assert(lua_gettop(L) == 2);
        Block *block = *(Block **)luaL_checkudata(L, 1, "Block");
-       int alternative_idx = luaL_checknumber(L, 2);
+       int alternative_idx = -1;
+       if (lua_isnumber(L, 2)) {
+               alternative_idx = luaL_checknumber(L, 2);
+       } else if (lua_istable(L, 2)) {
+               // See if it's an Effect metatable (e.g. foo:choose(ResampleEffect))
+               lua_getfield(L, 2, "__effect_type_id");
+               if (lua_isnumber(L, -1)) {
+                       EffectType effect_type = EffectType(luaL_checknumber(L, -1));
+                       alternative_idx = find_index_of(block, effect_type);
+               }
+               lua_pop(L, 1);
+       }
+
+       if (alternative_idx == -1) {
+               luaL_error(L, "choose() called with something that was not an index or an effect type (e.g. ResampleEffect) that was part of the alternatives");
+       }
 
        assert(alternative_idx >= 0);
        assert(size_t(alternative_idx) < block->alternatives.size());
        block->currently_chosen_alternative = alternative_idx;
 
-       return 0;
+       return wrap_lua_existing_object_nonowned<EffectBlueprint>(L, "EffectBlueprint", block->alternatives[alternative_idx]);
 }
 
 int Block_enable(lua_State *L)
@@ -527,11 +537,10 @@ int Block_disable(lua_State *L)
        assert(lua_gettop(L) == 1);
        Block *block = *(Block **)luaL_checkudata(L, 1, "Block");
 
-       if (block->alternatives.size() != 2 ||
-           block->alternatives[1]->effect_type != IDENTITY_EFFECT) {
-               luaL_error(L, "disable() called on something that wasn't added with add_optional_effect()");
-       }
        block->currently_chosen_alternative = find_index_of(block, IDENTITY_EFFECT);
+       if (block->currently_chosen_alternative == -1) {
+               luaL_error(L, "disable() called on something that didn't have an IdentityEffect fallback (try add_optional_effect())");
+       }
        assert(block->currently_chosen_alternative != -1);
        return 0;
 }