X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fscene.h;h=73d24513d08238dccef5c1748d6caced3c06d8c0;hb=a0e57ec99e9dfdd7e79bcf21e8c996dc43b6cb49;hp=77155479adeb2f25280a0b822b67de0f2044541f;hpb=d8fadf26db4a259ce24b958e8c254d77dd7ea80a;p=nageru diff --git a/nageru/scene.h b/nageru/scene.h index 7715547..73d2451 100644 --- a/nageru/scene.h +++ b/nageru/scene.h @@ -13,11 +13,13 @@ // (directly to screen, RGBA) or live (Y'CbCr output). #include +#include #include #include #include #include #include +#include #include class CEFCapture; @@ -88,7 +90,21 @@ struct Block { std::vector alternatives; // Must all have the same amount of inputs. Pointers to make things easier for Lua. std::vector inputs; // One for each input of alternatives[0] (ie., typically 0 or 1, occasionally 2). - std::vector disablers; // If any of these are disabled (IdentityEffect chosen), so should this one. + + // If any of these effects are disabled (IdentityEffect chosen) + // or enabled (not chosen) as determined by , so should this one. + struct Disabler { + Index block_idx; + enum { + DISABLE_IF_OTHER_DISABLED, + + // This a promise from the user; ie., we don't disable automatically + // (see comments in find_disabled_blocks()). + DISABLE_IF_OTHER_ENABLED + } condition; + std::string declaration_point; // For error messages. + }; + std::vector disablers; int currently_chosen_alternative = 0; // What alternative to use if the block is disabled. // Points to an alternative with IDENTITY_EFFECT if it exists @@ -117,6 +133,10 @@ struct Block { std::map> vec4_parameters; std::string declaration_point; // For error messages. + + // Only for AUTO_WHITE_BALANCE_EFFECT. Points to the parent block with is_input = true, + // so that we know which signal to get the white balance from. + const Block *white_balance_controller_block = nullptr; }; int Block_display(lua_State* L); @@ -125,6 +145,7 @@ int Block_enable(lua_State *L); int Block_enable_if(lua_State *L); int Block_disable(lua_State *L); int Block_always_disable_if_disabled(lua_State *L); +int Block_promise_to_disable_if_enabled(lua_State *L); int Block_set_int(lua_State *L); int Block_set_float(lua_State *L); int Block_set_vec3(lua_State *L); @@ -147,7 +168,8 @@ private: movit::Effect *instantiate_effects(const Block *block, size_t chain_idx, Instantiation *instantiation); size_t compute_chain_number_for_block(size_t block_idx, const std::bitset<256> &disabled) const; - static void find_inputs_for_block(lua_State *L, Scene *scene, Block *block); + static void find_inputs_for_block(lua_State *L, Scene *scene, Block *block, int first_input_idx = 3); + static Block *find_block_from_arg(lua_State *L, Scene *scene, int idx); // Find out which blocks (indexed by position in the “blocks” array), // if any, are disabled in a given instantiation. A disabled block is @@ -167,6 +189,11 @@ private: // it returns true. bool is_noncanonical_chain(size_t chain_idx) const; + // For a given block, find any parents it may have that are inputs. + // If there is more than one, throws an error. If there are zero, + // returns nullptr (should probably also be an error). + const Block *find_root_input_block(lua_State *L, const Block *block); + public: Scene(Theme *theme, float aspect_nom, float aspect_denom); size_t compute_chain_number(bool is_main_chain) const; @@ -177,6 +204,7 @@ public: static int add_input(lua_State *L); static int add_effect(lua_State *L); static int add_optional_effect(lua_State *L); + static int add_white_balance(lua_State *L); static int finalize(lua_State *L); };