| @@ -40,7 +40,7 @@ struct Quantity { | |||
| return 0.f; | |||
| } | |||
| /** Returns the value, possibly transformed for displaying. | |||
| /** Returns the value, transformed for displaying. | |||
| Useful for logarithmic scaling, multiplying by 100 for percentages, etc. | |||
| */ | |||
| virtual float getDisplayValue(); | |||
| @@ -90,16 +90,21 @@ struct Quantity { | |||
| void setMax(); | |||
| /** Sets the value to max if the current value is min, otherwise sets the value to min. */ | |||
| void toggle(); | |||
| /** Sets value from the range 0 to 1. */ | |||
| void setScaledValue(float scaledValue); | |||
| /** Returns the value rescaled to the range 0 to 1. */ | |||
| float getScaledValue(); | |||
| /** Adds an amount to the value. */ | |||
| void moveValue(float deltaValue); | |||
| /** The difference between the max and min values. */ | |||
| float getRange(); | |||
| /** Checks whether the bounds are finite. */ | |||
| bool isBounded(); | |||
| /** Adds an amount to the value. */ | |||
| void moveValue(float deltaValue); | |||
| /** Transforms a value to the range 0 to 1. */ | |||
| float toScaled(float value); | |||
| /** Transforms a value from the range 0 to 1. */ | |||
| float fromScaled(float scaledValue); | |||
| /** Sets value from the range 0 to 1. */ | |||
| void setScaledValue(float scaledValue); | |||
| /** Returns the value scaled to the range 0 to 1. */ | |||
| float getScaledValue(); | |||
| /** Adds an amount to the value scaled to the range 0 to 1. */ | |||
| void moveScaledValue(float deltaScaledValue); | |||
| }; | |||
| @@ -64,11 +64,9 @@ struct ParamQuantity : Quantity { | |||
| bool snapEnabled = false; | |||
| Param* getParam(); | |||
| /** Request to the engine to smoothly set the value */ | |||
| /** If smoothEnabled is true, requests to the engine to smoothly set the value. */ | |||
| void setSmoothValue(float value); | |||
| float getSmoothValue(); | |||
| void setSmoothScaledValue(float scaledValue); | |||
| float getSmoothScaledValue(); | |||
| void setValue(float value) override; | |||
| float getValue() override; | |||
| @@ -87,32 +87,40 @@ void Quantity::toggle() { | |||
| setValue(isMin() ? getMaxValue() : getMinValue()); | |||
| } | |||
| void Quantity::setScaledValue(float scaledValue) { | |||
| if (!isBounded()) | |||
| setValue(scaledValue); | |||
| else | |||
| setValue(math::rescale(scaledValue, 0.f, 1.f, getMinValue(), getMaxValue())); | |||
| void Quantity::moveValue(float deltaValue) { | |||
| setValue(getValue() + deltaValue); | |||
| } | |||
| float Quantity::getScaledValue() { | |||
| float Quantity::getRange() { | |||
| return getMaxValue() - getMinValue(); | |||
| } | |||
| bool Quantity::isBounded() { | |||
| return std::isfinite(getMinValue()) && std::isfinite(getMaxValue()); | |||
| } | |||
| float Quantity::toScaled(float value) { | |||
| if (!isBounded()) | |||
| return getValue(); | |||
| return value; | |||
| else if (getMinValue() == getMaxValue()) | |||
| return 0.f; | |||
| else | |||
| return math::rescale(getValue(), getMinValue(), getMaxValue(), 0.f, 1.f); | |||
| return math::rescale(value, getMinValue(), getMaxValue(), 0.f, 1.f); | |||
| } | |||
| float Quantity::getRange() { | |||
| return getMaxValue() - getMinValue(); | |||
| float Quantity::fromScaled(float scaledValue) { | |||
| if (!isBounded()) | |||
| return scaledValue; | |||
| else | |||
| return math::rescale(scaledValue, 0.f, 1.f, getMinValue(), getMaxValue()); | |||
| } | |||
| bool Quantity::isBounded() { | |||
| return std::isfinite(getMinValue()) && std::isfinite(getMaxValue()); | |||
| void Quantity::setScaledValue(float scaledValue) { | |||
| setValue(fromScaled(scaledValue)); | |||
| } | |||
| void Quantity::moveValue(float deltaValue) { | |||
| setValue(getValue() + deltaValue); | |||
| float Quantity::getScaledValue() { | |||
| return toScaled(getValue()); | |||
| } | |||
| void Quantity::moveScaledValue(float deltaScaledValue) { | |||
| @@ -11,8 +11,10 @@ namespace engine { | |||
| engine::Param* ParamQuantity::getParam() { | |||
| assert(module); | |||
| assert(0 <= paramId && paramId < (int) module->params.size()); | |||
| if (!module) | |||
| return NULL; | |||
| if (!(0 <= paramId && paramId < (int) module->params.size())) | |||
| return NULL; | |||
| return &module->params[paramId]; | |||
| } | |||
| @@ -37,22 +39,6 @@ float ParamQuantity::getSmoothValue() { | |||
| return APP->engine->getParamValue(module, paramId); | |||
| } | |||
| void ParamQuantity::setSmoothScaledValue(float scaledValue) { | |||
| if (!isBounded()) | |||
| setSmoothValue(scaledValue); | |||
| else | |||
| setSmoothValue(math::rescale(scaledValue, 0.f, 1.f, getMinValue(), getMaxValue())); | |||
| } | |||
| float ParamQuantity::getSmoothScaledValue() { | |||
| if (!isBounded()) | |||
| return getSmoothValue(); | |||
| else if (getMinValue() == getMaxValue()) | |||
| return 0.f; | |||
| else | |||
| return math::rescale(getSmoothValue(), getMinValue(), getMaxValue(), 0.f, 1.f); | |||
| } | |||
| void ParamQuantity::setValue(float value) { | |||
| if (!module) | |||
| return; | |||
| @@ -81,8 +67,7 @@ float ParamQuantity::getDefaultValue() { | |||
| } | |||
| float ParamQuantity::getDisplayValue() { | |||
| if (!module) | |||
| return Quantity::getDisplayValue(); | |||
| // We don't want the text to be smoothed (animated), so get the smooth target value. | |||
| float v = getSmoothValue(); | |||
| if (displayBase == 0.f) { | |||
| // Linear | |||
| @@ -100,9 +85,6 @@ float ParamQuantity::getDisplayValue() { | |||
| } | |||
| void ParamQuantity::setDisplayValue(float displayValue) { | |||
| if (!module) | |||
| return; | |||
| // Handle displayOffset | |||
| float v = displayValue - displayOffset; | |||
| @@ -129,6 +111,7 @@ void ParamQuantity::setDisplayValue(float displayValue) { | |||
| if (std::isnan(v)) | |||
| return; | |||
| // Set the value directly without smoothing | |||
| setValue(v); | |||
| } | |||
| @@ -201,6 +184,7 @@ std::string SwitchQuantity::getDisplayValueString() { | |||
| } | |||
| void SwitchQuantity::setDisplayValueString(std::string s) { | |||
| // Find label that matches string, case insensitive. | |||
| auto it = std::find_if(labels.begin(), labels.end(), [&](const std::string& a) { | |||
| return string::lowercase(a) == string::lowercase(s); | |||
| }); | |||