]> git.sesse.net Git - nageru/commitdiff
Allow giving class names to Block.choose_alternative.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 15 Jun 2019 22:01:05 +0000 (00:01 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 15 Jun 2019 22:01:05 +0000 (00:01 +0200)
nageru/scene.cpp
nageru/theme.cpp
nageru/theme.h
nageru/theme.lua

index 6eb86ac91e6f85e1cf45120cc82910aceb3a0374..a3d3c6a20f172496f58b1509b82c59eccb0050e8 100644 (file)
@@ -495,7 +495,22 @@ int Block_choose_alternative(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_alternative(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_alternative() 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());
index fb1fa2fd7380c5422fc00dba6eb221dccc350f8c..bf7cdee1e3ceb64f7705f619f1f992c464357b5d 100644 (file)
@@ -1237,16 +1237,16 @@ Theme::Theme(const string &filename, const vector<string> &search_dirs, Resource
        register_class("ImageInput", ImageInput_funcs);
        register_class("VideoInput", VideoInput_funcs);
        register_class("HTMLInput", HTMLInput_funcs);
-       register_class("IdentityEffect", IdentityEffect_funcs);
-       register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs);
-       register_class("ResampleEffect", ResampleEffect_funcs);
-       register_class("PaddingEffect", PaddingEffect_funcs);
-       register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs);
-       register_class("OverlayEffect", OverlayEffect_funcs);
-       register_class("ResizeEffect", ResizeEffect_funcs);
-       register_class("MultiplyEffect", MultiplyEffect_funcs);
-       register_class("MixEffect", MixEffect_funcs);
-       register_class("LiftGammaGainEffect", LiftGammaGainEffect_funcs);
+       register_class("IdentityEffect", IdentityEffect_funcs, IDENTITY_EFFECT);
+       register_class("WhiteBalanceEffect", WhiteBalanceEffect_funcs, WHITE_BALANCE_EFFECT);
+       register_class("ResampleEffect", ResampleEffect_funcs, RESAMPLE_EFFECT);
+       register_class("PaddingEffect", PaddingEffect_funcs, PADDING_EFFECT);
+       register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs, INTEGRAL_PADDING_EFFECT);
+       register_class("OverlayEffect", OverlayEffect_funcs, OVERLAY_EFFECT);
+       register_class("ResizeEffect", ResizeEffect_funcs, RESIZE_EFFECT);
+       register_class("MultiplyEffect", MultiplyEffect_funcs, MULTIPLY_EFFECT);
+       register_class("MixEffect", MixEffect_funcs, MIX_EFFECT);
+       register_class("LiftGammaGainEffect", LiftGammaGainEffect_funcs, LIFT_GAMMA_GAIN_EFFECT);
        register_class("InputStateInfo", InputStateInfo_funcs);
        register_class("ThemeMenu", ThemeMenu_funcs);
 
@@ -1296,7 +1296,7 @@ void Theme::register_constants()
        assert(lua_gettop(L) == 0);
 }
 
-void Theme::register_class(const char *class_name, const luaL_Reg *funcs)
+void Theme::register_class(const char *class_name, const luaL_Reg *funcs, EffectType effect_type)
 {
        assert(lua_gettop(L) == 0);
        luaL_newmetatable(L, class_name);  // mt = {}
@@ -1304,6 +1304,10 @@ void Theme::register_class(const char *class_name, const luaL_Reg *funcs)
        luaL_setfuncs(L, funcs, 1);        // for (name,f in funcs) { mt[name] = f, with upvalue {theme} }
        lua_pushvalue(L, -1);
        lua_setfield(L, -2, "__index");    // mt.__index = mt
+       if (effect_type != NO_EFFECT_TYPE) {
+               lua_pushnumber(L, effect_type);
+               lua_setfield(L, -2, "__effect_type_id");  // mt.__effect_type_id = effect_type
+       }
        lua_setglobal(L, class_name);      // ClassName = mt
        assert(lua_gettop(L) == 0);
 }
index 7c6b3243c85e5d61a1bd7ef42c77d64e7444c0a0..1bed9929681fd11a3649b83d14b4de2d78125836 100644 (file)
@@ -46,7 +46,9 @@ enum EffectType {
        RESIZE_EFFECT,
        MULTIPLY_EFFECT,
        MIX_EFFECT,
-       LIFT_GAMMA_GAIN_EFFECT
+       LIFT_GAMMA_GAIN_EFFECT,
+
+       NO_EFFECT_TYPE
 };
 
 // An EffectBlueprint refers to an Effect before it's being added to the graph.
@@ -162,7 +164,7 @@ public:
 
 private:
        void register_constants();
-       void register_class(const char *class_name, const luaL_Reg *funcs);
+       void register_class(const char *class_name, const luaL_Reg *funcs, EffectType effect_type = NO_EFFECT_TYPE);
        int set_theme_menu(lua_State *L);
        Chain get_chain_from_effect_chain(movit::EffectChain *effect_chain, unsigned num, const InputState &input_state);
 
index 0bbb7194a6eb8c2ff9151739c47fb5e55d9c12aa..e117e62949f4472e736fe03574fbfaf5fc50e8ea 100644 (file)
@@ -401,9 +401,9 @@ function setup_simple_input(state, signals, signal_num, width, height, hq)
        simple_scene.input:display(signal_num)
        if needs_scale(signals, signal_num, width, height) then
                if hq then
-                       simple_scene.resample_effect:choose_alternative(0)  -- High-quality resampling (ResampleEffect)
+                       simple_scene.resample_effect:choose_alternative(ResampleEffect)  -- High-quality resampling.
                else
-                       simple_scene.resample_effect:choose_alternative(1)  -- Low-quality resampling (ResizeEffect)
+                       simple_scene.resample_effect:choose_alternative(ResizeEffect)  -- Low-quality resampling.
                end
                simple_scene.resample_effect:set_int("width", width)
                simple_scene.resample_effect:set_int("height", height)
@@ -509,7 +509,7 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp
 
        -- Cull.
        if x0 > screen_width or x1 < 0.0 or y0 > screen_height or y1 < 0.0 then
-               input.resample_switcher:choose_alternative(1)  -- Low-quality resizing.
+               input.resample_switcher:choose_alternative(ResizeEffect)  -- Low-quality resizing.
                input.resize_effect:set_int("width", 1)
                input.resize_effect:set_int("height", 1)
                input.padding_effect:set_int("left", screen_width + 100)
@@ -542,7 +542,7 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp
 
        if hq then
                -- High-quality resampling.
-               input.resample_switcher:choose_alternative(0)
+               input.resample_switcher:choose_alternative(ResampleEffect)
 
                local x_subpixel_offset = x0 - math.floor(x0)
                local y_subpixel_offset = y0 - math.floor(y0)
@@ -578,7 +578,7 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp
                input.padding_effect:set_float("border_offset_bottom", y1 - (math.floor(y0) + height))
        else
                -- Lower-quality simple resizing.
-               input.resample_switcher:choose_alternative(1)
+               input.resample_switcher:choose_alternative(ResizeEffect)
 
                local width = round(x1 - x0)
                local height = round(y1 - y0)