X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Ftheme.lua;h=349d33b865fa7ebbfae90179ab8d05235cd363e9;hb=HEAD;hp=de8d25222e9492e1118d94897bc7c0fc9743750f;hpb=2ba69dc78d091ad92427389147365f39760e0b1f;p=nageru diff --git a/nageru/theme.lua b/nageru/theme.lua index de8d252..1fc7d11 100644 --- a/nageru/theme.lua +++ b/nageru/theme.lua @@ -16,11 +16,6 @@ local state = { transition_src_signal = 0, transition_dst_signal = 0, - neutral_colors = { - {0.5, 0.5, 0.5}, -- Input 0. - {0.5, 0.5, 0.5} -- Input 1. - }, - live_signal_num = 0, preview_signal_num = 1 } @@ -36,16 +31,11 @@ local NO_TRANSITION = 0 local ZOOM_TRANSITION = 1 -- Also for slides. local FADE_TRANSITION = 2 --- Last width/height/frame rate for each channel, if we have it. --- Note that unlike the values we get from Nageru, the resolution is per --- frame and not per field, since we deinterlace. -local last_resolution = {} - function make_sbs_input(scene) return { - input = scene:add_input(), + input = scene:add_input(0), -- Live inputs only. resample_effect = scene:add_effect({ResampleEffect.new(), ResizeEffect.new()}), - wb_effect = scene:add_effect(WhiteBalanceEffect.new()), + wb_effect = scene:add_white_balance(), padding_effect = scene:add_effect(IntegralPaddingEffect.new()) } end @@ -77,7 +67,7 @@ function make_fade_input(scene) return { input = scene:add_input(), resample_effect = scene:add_optional_effect(ResampleEffect.new()), -- Activated if scaling. - wb_effect = scene:add_optional_effect(WhiteBalanceEffect.new()) -- Activated for video inputs. + wb_effect = scene:add_white_balance() -- Activated for video inputs. } end @@ -105,7 +95,7 @@ local simple_scene = { scene = scene, input = scene:add_input(), resample_effect = scene:add_effect({ResampleEffect.new(), ResizeEffect.new(), IdentityEffect.new()}), - wb_effect = scene:add_effect(WhiteBalanceEffect.new()) + wb_effect = scene:add_white_balance() } scene:finalize() @@ -115,54 +105,24 @@ local static_scene = Scene.new(16, 9) static_scene:add_input(static_image) -- Note: Locks this input to images only. static_scene:finalize() --- API ENTRY POINT --- Returns the number of outputs in addition to the live (0) and preview (1). --- Called only once, at the start of the program. -function num_channels() - return 4 -end +-- Set some global state. Unless marked otherwise, these can only be set once, +-- at the start of the program. +Nageru.set_num_channels(4) -function is_plain_signal(num) - return num == INPUT0_SIGNAL_NUM or num == INPUT1_SIGNAL_NUM -end +-- Sets, for each channel, which signal it corresponds to (starting from 0). +-- The information is used for whether right-click on the channel should bring up +-- an input selector or not. Only call this for channels that actually correspond +-- directly to a signal (ie., live inputs, not live (0) or preview (1)). +Nageru.set_channel_signal(2, 0) +Nageru.set_channel_signal(3, 1) --- API ENTRY POINT --- Returns the name for each additional channel (starting from 2). --- Called at the start of the program, and then each frame for live --- channels in case they change resolution. -function channel_name(channel) - local signal_num = channel - 2 - if is_plain_signal(signal_num) then - if last_resolution[signal_num] then - return "Input " .. (signal_num + 1) .. " (" .. last_resolution[signal_num].human_readable_resolution .. ")" - else - return "Input " .. (signal_num + 1) - end - elseif signal_num == SBS_SIGNAL_NUM then - return "Side-by-side" - elseif signal_num == STATIC_SIGNAL_NUM then - return "Static picture" - end -end +-- Set whether a given channel supports setting white balance. (Default is false.) +Nageru.set_supports_wb(2, true) +Nageru.set_supports_wb(3, true) --- API ENTRY POINT --- Returns, given a channel number, which signal it corresponds to (starting from 0). --- Should return -1 if the channel does not correspond to a simple signal --- (one connected to a capture card, or a video input). The information is used for --- whether right-click on the channel should bring up a context menu or not, --- typically containing an input selector, resolution menu etc. --- --- Called once for each channel, at the start of the program. --- Will never be called for live (0) or preview (1). -function channel_signal(channel) - if channel == 2 then - return 0 - elseif channel == 3 then - return 1 - else - return -1 - end -end +-- These can be set at any time. +Nageru.set_channel_name(SBS_SIGNAL_NUM + 2, "Side-by-side") +Nageru.set_channel_name(STATIC_SIGNAL_NUM + 2, "Static picture") -- API ENTRY POINT -- Called every frame. Returns the color (if any) to paint around the given @@ -186,6 +146,10 @@ function channel_color(channel) return "transparent" end +function is_plain_signal(num) + return num == INPUT0_SIGNAL_NUM or num == INPUT1_SIGNAL_NUM +end + function channel_involved_in(channel, signal_num) if is_plain_signal(signal_num) then return channel == (signal_num + 2) @@ -199,22 +163,6 @@ function channel_involved_in(channel, signal_num) return false end --- API ENTRY POINT --- Returns if a given channel supports setting white balance (starting from 2). --- Called only once for each channel, at the start of the program. -function supports_set_wb(channel) - return is_plain_signal(channel - 2) -end - --- API ENTRY POINT --- Gets called with a new gray point when the white balance is changing. --- The color is in linear light (not sRGB gamma). -function set_wb(channel, red, green, blue) - if is_plain_signal(channel - 2) then - state.neutral_colors[channel - 2 + 1] = { red, green, blue } - end -end - function finish_transitions(t) if state.transition_type ~= NO_TRANSITION and t >= state.transition_end then state.live_signal_num = state.transition_dst_signal @@ -334,7 +282,6 @@ function setup_fade_input(state, input, signals, signal_num, width, height) else input.input:display(signal_num) input.wb_effect:enable() - set_neutral_color(input.wb_effect, state.neutral_colors[signal_num - INPUT0_SIGNAL_NUM + 1]) if (signals:get_width(signal_num) ~= width or signals:get_height(signal_num) ~= height) then input.resample_effect:enable() @@ -368,7 +315,6 @@ function setup_simple_input(state, signals, signal_num, width, height, hq) else simple_scene.resample_effect:disable() -- No scaling. end - set_neutral_color_from_signal(state, simple_scene.wb_effect, signal_num) end -- API ENTRY POINT @@ -379,10 +325,13 @@ end -- the output, although you can ignore them if you don't need them -- (they're useful if you want to e.g. know what to resample by). -- --- is basically an exposed InputState, which you can use to --- query for information about the signals at the point of the current --- frame. In particular, you can call get_width() and get_height() --- for any signal number, and use that to e.g. assist in scene selection. +-- is an object which you can query for information +-- about the signals at the point of the current frame. In particular, +-- you can call get_frame_width() and get_frame_height() for any +-- signal number, and use that to e.g. see if you wish to enable +-- a scaler or not. (You can also use get_width() and get_height(), +-- which return the _field_ size. This has half the height for +-- interlaced signals.) -- -- You should return scene to use, after having set any parameters you -- want to set (through set_int() etc.). The parameters will be snapshot @@ -391,30 +340,14 @@ function get_scene(num, t, width, height, signals) local input_resolution = {} for signal_num=0,1 do local res = { - width = signals:get_width(signal_num), - height = signals:get_height(signal_num), - interlaced = signals:get_interlaced(signal_num), - is_connected = signals:get_is_connected(signal_num), - has_signal = signals:get_has_signal(signal_num), - frame_rate_nom = signals:get_frame_rate_nom(signal_num), - frame_rate_den = signals:get_frame_rate_den(signal_num), - human_readable_resolution = signals:get_human_readable_resolution(signal_num) + width = signals:get_frame_width(signal_num), + height = signals:get_frame_height(signal_num), } - - if res.interlaced then - -- Convert height from frame height to field height. - -- (Needed for e.g. place_rectangle.) - res.height = res.height * 2 - - -- Show field rate instead of frame rate; really for cosmetics only - -- (and actually contrary to EBU recommendations, although in line - -- with typical user expectations). - res.frame_rate_nom = res.frame_rate_nom * 2 - end - input_resolution[signal_num] = res + + local text_res = signals:get_human_readable_resolution(signal_num) + Nageru.set_channel_name(signal_num + 2, "Input " .. (signal_num + 1) .. " (" .. text_res .. ")") end - last_resolution = input_resolution if num == 0 then -- Live. finish_transitions(t) @@ -587,9 +520,6 @@ function pos_from_top_left(x, y, width, height, screen_width, screen_height) end function prepare_sbs_scene(state, t, transition_type, src_signal, dst_signal, screen_width, screen_height, input_resolution, hq) - set_neutral_color(sbs_scene.input0.wb_effect, state.neutral_colors[1]) - set_neutral_color(sbs_scene.input1.wb_effect, state.neutral_colors[2]) - -- First input is positioned (16,48) from top-left. -- Second input is positioned (16,48) from the bottom-right. local pos0 = pos_from_top_left(16, 48, 848, 477, screen_width, screen_height) @@ -646,16 +576,6 @@ function place_rectangle_with_affine(input, pos, aff, screen_width, screen_heigh place_rectangle(input, x0, y0, x1, y1, screen_width, screen_height, input_width, input_height, hq) end -function set_neutral_color(effect, color) - effect:set_vec3("neutral_color", color[1], color[2], color[3]) -end - -function set_neutral_color_from_signal(state, effect, signal) - if is_plain_signal(signal) then - set_neutral_color(effect, state.neutral_colors[signal - INPUT0_SIGNAL_NUM + 1]) - end -end - function calc_zoom_progress(state, t) if t < state.transition_start then return 0.0