From 75a3248d6a6ec01c45cb706dfbcec9f2e0e58f33 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 8 Oct 2015 01:11:42 +0200 Subject: [PATCH] Hook over OverlayEffect, and make add_effect() take a variable number of parameters. --- theme.cpp | 39 +++++++++++++++++++++++++++++---------- theme.lua | 9 +++++---- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/theme.cpp b/theme.cpp index 8828906..410ac74 100644 --- a/theme.cpp +++ b/theme.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "theme.h" @@ -48,7 +49,8 @@ Effect *get_effect(lua_State *L, int idx) if (luaL_testudata(L, idx, "WhiteBalanceEffect") || luaL_testudata(L, idx, "ResampleEffect") || luaL_testudata(L, idx, "PaddingEffect") || - luaL_testudata(L, idx, "IntegralPaddingEffect")) { + luaL_testudata(L, idx, "IntegralPaddingEffect") || + luaL_testudata(L, idx, "OverlayEffect")) { return (Effect *)lua_touserdata(L, idx); } fprintf(stderr, "Error: Index #%d was not an Effect type\n", idx); @@ -80,20 +82,23 @@ int EffectChain_add_live_input(lua_State* L) int EffectChain_add_effect(lua_State* L) { - assert(lua_gettop(L) == 3); + assert(lua_gettop(L) >= 2); EffectChain *chain = (EffectChain *)luaL_checkudata(L, 1, "EffectChain"); // TODO: Better error reporting. - Effect *effect1 = get_effect(L, 2); - if (luaL_testudata(L, 3, "LiveInputWrapper")) { - LiveInputWrapper *effect2 = (LiveInputWrapper *)lua_touserdata(L, 3); - chain->add_effect(effect1, effect2->get_input()); - } else { - Effect *effect2 = get_effect(L, 3); - chain->add_effect(effect1, effect2); + Effect *effect = get_effect(L, 2); + vector inputs; + for (int idx = 3; idx <= lua_gettop(L); ++idx) { + if (luaL_testudata(L, idx, "LiveInputWrapper")) { + LiveInputWrapper *input = (LiveInputWrapper *)lua_touserdata(L, idx); + inputs.push_back(input->get_input()); + } else { + inputs.push_back(get_effect(L, idx)); + } } + chain->add_effect(effect, inputs); - lua_settop(L, 2); + lua_settop(L, 2); // Return the effect itself. return 1; } @@ -157,6 +162,12 @@ int IntegralPaddingEffect_new(lua_State* L) return wrap_lua_object(L, "IntegralPaddingEffect"); } +int OverlayEffect_new(lua_State* L) +{ + assert(lua_gettop(L) == 0); + return wrap_lua_object(L, "OverlayEffect"); +} + int Effect_set_float(lua_State *L) { assert(lua_gettop(L) == 3); @@ -222,6 +233,13 @@ const luaL_Reg IntegralPaddingEffect_funcs[] = { { NULL, NULL } }; +const luaL_Reg OverlayEffect_funcs[] = { + { "new", OverlayEffect_new }, + { "set_float", Effect_set_float }, + { "set_int", Effect_set_int }, + { NULL, NULL } +}; + } // namespace LiveInputWrapper::LiveInputWrapper(Theme *theme, EffectChain *chain) @@ -264,6 +282,7 @@ Theme::Theme(const char *filename, ResourcePool *resource_pool) register_class("ResampleEffect", ResampleEffect_funcs); register_class("PaddingEffect", PaddingEffect_funcs); register_class("IntegralPaddingEffect", IntegralPaddingEffect_funcs); + register_class("OverlayEffect", OverlayEffect_funcs); // Run script. lua_settop(L, 0); diff --git a/theme.lua b/theme.lua index 020fc8c..a0e3862 100644 --- a/theme.lua +++ b/theme.lua @@ -23,11 +23,11 @@ padding_effect:set_int("width", 1280); padding_effect:set_int("height", 720); padding_effect:set_int("left", 30); padding_effect:set_int("top", 60); -local wb_effect = main_chain:add_effect(WhiteBalanceEffect.new(), padding_effect); +local input1 = main_chain:add_live_input(); +input1:connect_signal(1); +local wb_effect = main_chain:add_effect(WhiteBalanceEffect.new(), input1); +local overlay_effect = main_chain:add_effect(OverlayEffect.new(), wb_effect, padding_effect); main_chain:finalize(true); --- local input1 = main_chain.add_input(Inputs.create(1)); --- local resample_effect = main_chain.add_effect(ResampleEffect.new(), input0); --- local padding_effect = main_chain.add_effect(IntegralPaddingEffect.new()); -- A chain to show a single input on screen. local simple_chain = EffectChain.new(16, 9); @@ -80,6 +80,7 @@ function get_chain(num, t, width, height) if num == 0 then -- Live. prepare = function() input0:connect_signal(live_signal_num); + input1:connect_signal(1); wb_effect:set_float("output_color_temperature", 3500.0 + t * 100.0); end return main_chain, prepare; -- 2.39.2