-- The theme is what decides what's actually shown on screen, what kind of
-- transitions are available (if any), and what kind of inputs there are,
-- if any. In general, it drives the entire display logic by creating Movit
--- chains, setting their parameters and then deciding which to show when.
+-- chains (called “scenes”), setting their parameters and then deciding which
+-- to show when.
--
-- Themes are written in Lua, which reflects a simplified form of the Movit API
--- where all the low-level details (such as texture formats) are handled by the
--- C++ side and you generally just build chains.
+-- where all the low-level details (such as texture formats) and alternatives
+-- (e.g. turning scaling on or off) are handled by the C++ side and you
+-- generally just build scenes.
--
-- This is a much simpler theme than the default theme; it only allows you to
-- switch between inputs and set white balance, no transitions or the likes.
local live_signal_num = 0
local preview_signal_num = 1
--- A chain to show a single input, with white balance. In a real example,
--- we'd probably want to support deinterlacing and high-quality scaling
--- (if the input isn't exactly what we want). However, we don't want these
--- things always on, so we'd need to generate more chains for the various
--- cases. In such a simple example, just having two is fine.
-function make_simple_chain(hq)
- local chain = EffectChain.new(16, 9)
-
- local input = chain:add_live_input(false, false) -- No deinterlacing, no bounce override.
- input:connect_signal(0) -- First input card. Can be changed whenever you want.
- local wb_effect = chain:add_effect(WhiteBalanceEffect.new())
- chain:finalize(hq)
-
- return {
- chain = chain,
- input = input,
- wb_effect = wb_effect,
- }
-end
+local img = ImageInput.new("bg.jpeg")
--- We only make two chains; one for the live view and one for the previews.
--- (Since they have different outputs, you cannot mix and match them.)
-local simple_hq_chain = make_simple_chain(true)
-local simple_lq_chain = make_simple_chain(false)
+local scene = Scene.new(16, 9)
+local input = scene:add_input()
+local wb_effect = scene:add_effect(WhiteBalanceEffect.new())
+scene:finalize()
-- API ENTRY POINT
-- Returns the number of outputs in addition to the live (0) and preview (1).
end
-- API ENTRY POINT
--- Called every frame. Get the chain for displaying at input <num>,
+-- Called every frame. Get the scene for displaying at input <num>,
-- where 0 is live, 1 is preview, 2 is the first channel to display
-- in the bottom bar, and so on up to num_channels()+1. t is the
-- current time in seconds. width and height are the dimensions of
-- <signals> 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 chain selection.
---
--- You should return two objects; the chain itself, and then a
--- function (taking no parameters) that is run just before rendering.
--- The function needs to call connect_signal on any inputs, so that
--- it gets updated video data for the given frame. (You are allowed
--- to switch which input your input is getting from between frames,
--- but not calling connect_signal results in undefined behavior.)
--- If you want to change any parameters in the chain, this is also
--- the right place.
+-- for any signal number, and use that to e.g. assist in scene selection.
--
--- NOTE: The chain returned must be finalized with the Y'CbCr flag
--- if and only if num==0.
-function get_chain(num, t, width, height, signals)
- local chain, signal_num
+-- You should return the scene to use, after having set any parameters you
+-- want to set (through set_int() etc.). The parameters will be snapshot
+-- at return time and used during rendering.
+function get_scene(num, t, width, height, signals)
+ local signal_num
if num == 0 then -- Live (right pane).
- chain = simple_hq_chain
signal_num = live_signal_num
elseif num == 1 then -- Preview (left pane).
- chain = simple_lq_chain
signal_num = preview_signal_num
else -- One of the two previews (bottom panes).
- chain = simple_lq_chain
signal_num = num - 2
end
- -- Make a copy of the current neutral color before returning, so that the
- -- returned prepare function is unaffected by state changes made by the UI
- -- before it is rendered.
+ if num == 3 then
+ input:display(img)
+ else
+ input:display(signal_num)
+ end
+
local color = input_neutral_color[signal_num + 1]
+ wb_effect:set_vec3("neutral_color", color[1], color[2], color[3])
- local prepare = function()
- chain.input:connect_signal(signal_num)
- chain.wb_effect:set_vec3("neutral_color", color[1], color[2], color[3])
- end
- return chain.chain, prepare
+ return scene
end