From f3aa15a52accbc8184fdd617a3e14126cb6a3a20 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 16 Jun 2019 01:14:55 +0200 Subject: [PATCH] Make Block.choose() return the effect that was chosen. --- nageru/scene.cpp | 2 +- nageru/theme.lua | 39 ++++++++++++++++++--------------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/nageru/scene.cpp b/nageru/scene.cpp index 0eacc75..090f95b 100644 --- a/nageru/scene.cpp +++ b/nageru/scene.cpp @@ -516,7 +516,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) diff --git a/nageru/theme.lua b/nageru/theme.lua index 172b91d..973e389 100644 --- a/nageru/theme.lua +++ b/nageru/theme.lua @@ -42,13 +42,9 @@ local FADE_TRANSITION = 2 local last_resolution = {} function make_sbs_input(scene) - local resample_effect = ResampleEffect.new() - local resize_effect = ResizeEffect.new() return { input = scene:add_input(), - resample_effect = resample_effect, - resize_effect = resize_effect, - resample_switcher = scene:add_effect({resample_effect, resize_effect}), + resample_effect = scene:add_effect({ResampleEffect.new(), ResizeEffect.new()}), wb_effect = scene:add_effect(WhiteBalanceEffect.new()), padding_effect = scene:add_effect(IntegralPaddingEffect.new()) } @@ -509,9 +505,9 @@ 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(ResizeEffect) -- Low-quality resizing. - input.resize_effect:set_int("width", 1) - input.resize_effect:set_int("height", 1) + input.resample_effect:choose(ResizeEffect) -- Low-quality resizing. + input.resample_effect:set_int("width", 1) + input.resample_effect:set_int("height", 1) input.padding_effect:set_int("left", screen_width + 100) input.padding_effect:set_int("top", screen_height + 100) return @@ -541,8 +537,9 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp end if hq then - -- High-quality resampling. - input.resample_switcher:choose(ResampleEffect) + -- High-quality resampling. Go for the actual effect (returned by choose()) + -- since we want to set zoom_*, which will give an error if set on ResizeEffect. + local resample_effect = input.resample_effect:choose(ResampleEffect) local x_subpixel_offset = x0 - math.floor(x0) local y_subpixel_offset = y0 - math.floor(y0) @@ -551,25 +548,25 @@ function place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, inp -- and then add an extra pixel so we have some leeway for the border. local width = math.ceil(x1 - x0) + 1 local height = math.ceil(y1 - y0) + 1 - input.resample_effect:set_int("width", width) - input.resample_effect:set_int("height", height) + resample_effect:set_int("width", width) + resample_effect:set_int("height", height) -- Correct the discrepancy with zoom. (This will leave a small -- excess edge of pixels and subpixels, which we'll correct for soon.) local zoom_x = (x1 - x0) / (width * (srcx1 - srcx0)) local zoom_y = (y1 - y0) / (height * (srcy1 - srcy0)) - input.resample_effect:set_float("zoom_x", zoom_x) - input.resample_effect:set_float("zoom_y", zoom_y) - input.resample_effect:set_float("zoom_center_x", 0.0) - input.resample_effect:set_float("zoom_center_y", 0.0) + resample_effect:set_float("zoom_x", zoom_x) + resample_effect:set_float("zoom_y", zoom_y) + resample_effect:set_float("zoom_center_x", 0.0) + resample_effect:set_float("zoom_center_y", 0.0) -- Padding must also be to a whole-pixel offset. input.padding_effect:set_int("left", math.floor(x0)) input.padding_effect:set_int("top", math.floor(y0)) -- Correct _that_ discrepancy by subpixel offset in the resampling. - input.resample_effect:set_float("left", srcx0 * input_width - x_subpixel_offset / zoom_x) - input.resample_effect:set_float("top", srcy0 * input_height - y_subpixel_offset / zoom_y) + resample_effect:set_float("left", srcx0 * input_width - x_subpixel_offset / zoom_x) + resample_effect:set_float("top", srcy0 * input_height - y_subpixel_offset / zoom_y) -- Finally, adjust the border so it is exactly where we want it. input.padding_effect:set_float("border_offset_left", x_subpixel_offset) @@ -578,12 +575,12 @@ 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(ResizeEffect) + input.resample_effect:choose(ResizeEffect) local width = round(x1 - x0) local height = round(y1 - y0) - input.resize_effect:set_int("width", width) - input.resize_effect:set_int("height", height) + input.resample_effect:set_int("width", width) + input.resample_effect:set_int("height", height) -- Padding must also be to a whole-pixel offset. input.padding_effect:set_int("left", math.floor(x0)) -- 2.39.2