X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fscene.h;h=8db75540559cfa29bf45611319e19380bb56fc1c;hb=5e9f3fe04e04a7c53a8e64106797e14e44fe9024;hp=83346647236eb0ecda7aa512ec1fead4172940bf;hpb=e4ebe67b6523038484df30d1d5fafc6055398acc;p=nageru diff --git a/nageru/scene.h b/nageru/scene.h index 8334664..8db7554 100644 --- a/nageru/scene.h +++ b/nageru/scene.h @@ -78,7 +78,7 @@ struct Block { size_t cardinality_base = 0; // Find the chosen alternative for this block in a given instance. - size_t chosen_alternative(size_t chain_idx) const { + int chosen_alternative(size_t chain_idx) const { if (chain_idx == size_t(-1)) { return currently_chosen_alternative; } else { @@ -88,7 +88,26 @@ 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). + + // 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 + // (to disable as much as possible), otherwise 0. + int canonical_alternative = 0; bool is_input = false; // For LIVE_INPUT* only. We can't just always populate signal_to_connect, @@ -110,6 +129,8 @@ struct Block { std::map float_parameters; std::map> vec3_parameters; std::map> vec4_parameters; + + std::string declaration_point; // For error messages. }; int Block_display(lua_State* L); @@ -117,6 +138,8 @@ int Block_choose(lua_State* L); 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); @@ -152,7 +175,7 @@ private: std::bitset<256> find_disabled_blocks(size_t chain_idx) const; void find_disabled_blocks(size_t chain_idx, size_t block_idx, bool currently_disabled, std::bitset<256> *disabled) const; - // If a block is disabled, it should always have alternative 0 chosen, + // If a block is disabled, it should always have canonical_alternative chosen, // so that we don't instantiate a bunch of irrelevant duplicates that // differ only in disabled blocks. You can check this property with // is_noncanonical_chain() and then avoid instantiating the ones where