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 {
std::vector<EffectBlueprint *> alternatives; // Must all have the same amount of inputs. Pointers to make things easier for Lua.
std::vector<Index> 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 <condition>, 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<Disabler> 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,
std::map<std::string, float> float_parameters;
std::map<std::string, std::array<float, 3>> vec3_parameters;
std::map<std::string, std::array<float, 4>> vec4_parameters;
+
+ std::string declaration_point; // For error messages.
};
int Block_display(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);
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