X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fultimate.lua;h=586b36d7223cb0b29fc6de1d24dd85aa4d45fa55;hb=3c3a5c028bed3922840a2b5ad7ab861fca092582;hp=90369e70e74f9eb40954451904499a0dd86f2c7a;hpb=a863d093841773e0e17cc4965c073b443e195071;p=ultimatescore diff --git a/nageru/ultimate.lua b/nageru/ultimate.lua index 90369e7..586b36d 100644 --- a/nageru/ultimate.lua +++ b/nageru/ultimate.lua @@ -1,4 +1,4 @@ --- Nageru theme for TFK mini-tournament 2017, based on the default theme. +-- Nageru theme for ultimate productions, based on the default theme. local transition_start = -2.0 local transition_end = -1.0 @@ -51,6 +51,8 @@ local cef_path = Nageru.THEME_PATH:match("(.*)/nageru/") local cef_input = HTMLInput.new("file://" .. cef_path .. "/score.html") cef_input:execute_javascript_async("play()") +local bg_video = VideoInput.new(cef_path .. "/flow-720.mp4", Nageru.VIDEO_FORMAT_YCBCR) + function reload_cef() cef_input:reload() cef_input:execute_javascript_async("play()") @@ -101,7 +103,7 @@ function make_fade_input(chain, signal, live, deint, scale) input:connect_signal(signal) last = input else - input = chain:add_effect(ImageInput.new("tfk_pause.png")) + input = chain:add_effect(ImageInput.new(cef_path .. "/nageru/dsn-bg.png")) last = input end @@ -217,13 +219,16 @@ end function make_sbs_chain(input0_type, input0_overlay, input1_type, hq) local chain = EffectChain.new(16, 9) + local bg = chain:add_video_input(bg_video, false) + local input0 = make_sbs_input(chain, INPUT0_SIGNAL_NUM, input0_type == "livedeint", input0_overlay, hq) local input1 = make_sbs_input(chain, INPUT4_SIGNAL_NUM, input1_type == "livedeint", false, hq) - input0.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 1.0) + input0.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 0.0) input1.padding_effect:set_vec4("border_color", 0.0, 0.0, 0.0, 0.0) - chain:add_effect(OverlayEffect.new(), input0.padding_effect, input1.padding_effect) + local i0 = chain:add_effect(OverlayEffect.new(), bg, input0.padding_effect) + chain:add_effect(OverlayEffect.new(), i0, input1.padding_effect) chain:finalize(hq) return { @@ -292,7 +297,7 @@ local static_chains = make_cartesian_product({ {true, false} -- hq }, function(hq) local chain = EffectChain.new(16, 9) - local chain_input = chain:add_effect(ImageInput.new("tfk_pause.png")) + local chain_input = chain:add_effect(ImageInput.new(cef_path .. "/nageru/dsn-bg.png")) chain:finalize(hq) return { @@ -688,6 +693,8 @@ function get_sbs_chain(signals, t, width, height, input_resolution) return sbs_chains[input0_type][overlay_enabled][input1_type][true] end +local last_rate = 0.0 + -- API ENTRY POINT -- Called every frame. Get the chain for displaying at input , -- where 0 is live, 1 is preview, 2 is the first channel to display @@ -740,6 +747,21 @@ function get_chain(num, t, width, height, signals) end last_resolution = input_resolution + -- Save some CPU time if we're not having SBS on live. + local new_rate + if live_signal_num == SBS_SIGNAL_NUM or + preview_signal_num == SBS_SIGNAL_NUM or + transition_type == ZOOM_TRANSITION then + new_rate = 1.0 + else + new_rate = 0.0001 + end + if new_rate ~= last_rate then + -- Avoid waking up the video thread (which may be sleeping) if the rate is the same. + bg_video:change_rate(new_rate) + last_rate = new_rate + end + if num == 0 then -- Live. -- See if we're in a transition. finish_transitions(t) @@ -874,10 +896,9 @@ function prepare_sbs_chain(chain, t, transition_type, src_signal, dst_signal, sc set_neutral_color(chain.input0.wb_effect, neutral_colors[1]) set_neutral_color(chain.input1.wb_effect, neutral_colors[5]) - -- 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) - local pos1 = pos_from_top_left(1280 - 384 - 16, 720 - 216 - 48, 384, 216, screen_width, screen_height) + -- Both inputs are the same size (true side-by-side). + local pos0 = pos_from_top_left(1280 - 616 - 16, 186, 616, 347, screen_width, screen_height) + local pos1 = pos_from_top_left(16, 186, 616, 347, screen_width, screen_height) local pos_fs = { x0 = 0, y0 = 0, x1 = screen_width, y1 = screen_height } local affine_param