OSC seperation
This commit is contained in:
@@ -825,201 +825,6 @@ void RuntimeHost::ClearReloadRequest()
|
||||
mReloadRequested = false;
|
||||
}
|
||||
|
||||
bool RuntimeHost::UpdateLayerParameterByControlKey(const std::string& layerKey, const std::string& parameterKey, const JsonValue& newValue, std::string& error)
|
||||
{
|
||||
return UpdateLayerParameterByControlKey(layerKey, parameterKey, newValue, true, error);
|
||||
}
|
||||
|
||||
bool RuntimeHost::UpdateLayerParameterByControlKey(const std::string& layerKey, const std::string& parameterKey, const JsonValue& newValue, bool persistState, std::string& error)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mMutex);
|
||||
|
||||
LayerPersistentState* matchedLayer = nullptr;
|
||||
const ShaderPackage* matchedPackage = nullptr;
|
||||
for (LayerPersistentState& layer : mPersistentState.layers)
|
||||
{
|
||||
auto shaderIt = mPackagesById.find(layer.shaderId);
|
||||
if (shaderIt == mPackagesById.end())
|
||||
continue;
|
||||
|
||||
if (MatchesControlKey(layer.id, layerKey) || MatchesControlKey(shaderIt->second.id, layerKey) ||
|
||||
MatchesControlKey(shaderIt->second.displayName, layerKey))
|
||||
{
|
||||
matchedLayer = &layer;
|
||||
matchedPackage = &shaderIt->second;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!matchedLayer || !matchedPackage)
|
||||
{
|
||||
error = "Unknown OSC layer key: " + layerKey;
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto parameterIt = std::find_if(matchedPackage->parameters.begin(), matchedPackage->parameters.end(),
|
||||
[¶meterKey](const ShaderParameterDefinition& definition)
|
||||
{
|
||||
return MatchesControlKey(definition.id, parameterKey) || MatchesControlKey(definition.label, parameterKey);
|
||||
});
|
||||
if (parameterIt == matchedPackage->parameters.end())
|
||||
{
|
||||
error = "Unknown OSC parameter key: " + parameterKey;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (parameterIt->type == ShaderParameterType::Trigger)
|
||||
{
|
||||
ShaderParameterValue& value = matchedLayer->parameterValues[parameterIt->id];
|
||||
const double previousCount = value.numberValues.empty() ? 0.0 : value.numberValues[0];
|
||||
const double triggerTime = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - mStartTime).count();
|
||||
value.numberValues = { previousCount + 1.0, triggerTime };
|
||||
MarkParameterStateDirtyLocked();
|
||||
return true;
|
||||
}
|
||||
|
||||
ShaderParameterValue normalized;
|
||||
if (!NormalizeAndValidateValue(*parameterIt, newValue, normalized, error))
|
||||
return false;
|
||||
|
||||
matchedLayer->parameterValues[parameterIt->id] = normalized;
|
||||
MarkParameterStateDirtyLocked();
|
||||
return !persistState || SavePersistentState(error);
|
||||
}
|
||||
|
||||
bool RuntimeHost::ApplyOscTargetByControlKey(const std::string& layerKey, const std::string& parameterKey, const JsonValue& targetValue, double smoothingAmount, bool& keepApplying, std::string& resolvedLayerId, std::string& resolvedParameterId, ShaderParameterValue& appliedValue, std::string& error)
|
||||
{
|
||||
keepApplying = false;
|
||||
resolvedLayerId.clear();
|
||||
resolvedParameterId.clear();
|
||||
appliedValue = ShaderParameterValue();
|
||||
|
||||
std::lock_guard<std::mutex> lock(mMutex);
|
||||
|
||||
LayerPersistentState* matchedLayer = nullptr;
|
||||
const ShaderPackage* matchedPackage = nullptr;
|
||||
for (LayerPersistentState& layer : mPersistentState.layers)
|
||||
{
|
||||
auto shaderIt = mPackagesById.find(layer.shaderId);
|
||||
if (shaderIt == mPackagesById.end())
|
||||
continue;
|
||||
|
||||
if (MatchesControlKey(layer.id, layerKey) || MatchesControlKey(shaderIt->second.id, layerKey) ||
|
||||
MatchesControlKey(shaderIt->second.displayName, layerKey))
|
||||
{
|
||||
matchedLayer = &layer;
|
||||
matchedPackage = &shaderIt->second;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!matchedLayer || !matchedPackage)
|
||||
{
|
||||
error = "Unknown OSC layer key: " + layerKey;
|
||||
return false;
|
||||
}
|
||||
|
||||
resolvedLayerId = matchedLayer->id;
|
||||
|
||||
const auto parameterIt = std::find_if(matchedPackage->parameters.begin(), matchedPackage->parameters.end(),
|
||||
[¶meterKey](const ShaderParameterDefinition& definition)
|
||||
{
|
||||
return MatchesControlKey(definition.id, parameterKey) || MatchesControlKey(definition.label, parameterKey);
|
||||
});
|
||||
if (parameterIt == matchedPackage->parameters.end())
|
||||
{
|
||||
error = "Unknown OSC parameter key: " + parameterKey;
|
||||
return false;
|
||||
}
|
||||
|
||||
resolvedParameterId = parameterIt->id;
|
||||
|
||||
if (parameterIt->type == ShaderParameterType::Trigger)
|
||||
{
|
||||
ShaderParameterValue& value = matchedLayer->parameterValues[parameterIt->id];
|
||||
const double previousCount = value.numberValues.empty() ? 0.0 : value.numberValues[0];
|
||||
const double triggerTime = std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::steady_clock::now() - mStartTime).count();
|
||||
value.numberValues = { previousCount + 1.0, triggerTime };
|
||||
MarkParameterStateDirtyLocked();
|
||||
appliedValue = value;
|
||||
return true;
|
||||
}
|
||||
|
||||
ShaderParameterValue normalizedTarget;
|
||||
if (!NormalizeAndValidateValue(*parameterIt, targetValue, normalizedTarget, error))
|
||||
return false;
|
||||
|
||||
const bool smoothableType =
|
||||
parameterIt->type == ShaderParameterType::Float ||
|
||||
parameterIt->type == ShaderParameterType::Vec2 ||
|
||||
parameterIt->type == ShaderParameterType::Color;
|
||||
const bool smoothableInput = targetValue.isNumber() || JsonValueContainsOnlyNumbers(targetValue);
|
||||
const double alpha = Clamp01(smoothingAmount);
|
||||
|
||||
if (!smoothableType || !smoothableInput || alpha <= 0.0)
|
||||
{
|
||||
matchedLayer->parameterValues[parameterIt->id] = normalizedTarget;
|
||||
MarkParameterStateDirtyLocked();
|
||||
appliedValue = normalizedTarget;
|
||||
return true;
|
||||
}
|
||||
|
||||
ShaderParameterValue currentValue = DefaultValueForDefinition(*parameterIt);
|
||||
auto currentIt = matchedLayer->parameterValues.find(parameterIt->id);
|
||||
if (currentIt != matchedLayer->parameterValues.end())
|
||||
currentValue = currentIt->second;
|
||||
|
||||
ShaderParameterValue nextValue = normalizedTarget;
|
||||
nextValue.numberValues = normalizedTarget.numberValues;
|
||||
|
||||
if (currentValue.numberValues.size() != normalizedTarget.numberValues.size())
|
||||
currentValue.numberValues = normalizedTarget.numberValues;
|
||||
|
||||
bool changed = false;
|
||||
bool converged = true;
|
||||
for (std::size_t index = 0; index < normalizedTarget.numberValues.size(); ++index)
|
||||
{
|
||||
const double currentNumber = currentValue.numberValues[index];
|
||||
const double targetNumber = normalizedTarget.numberValues[index];
|
||||
const double delta = targetNumber - currentNumber;
|
||||
double nextNumber = currentNumber + delta * alpha;
|
||||
|
||||
if (std::fabs(delta) <= 0.0005)
|
||||
{
|
||||
nextNumber = targetNumber;
|
||||
}
|
||||
else
|
||||
{
|
||||
converged = false;
|
||||
}
|
||||
|
||||
if (std::fabs(nextNumber - currentNumber) > 0.0000001)
|
||||
changed = true;
|
||||
|
||||
nextValue.numberValues[index] = nextNumber;
|
||||
}
|
||||
|
||||
if (!converged)
|
||||
{
|
||||
keepApplying = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
nextValue.numberValues = normalizedTarget.numberValues;
|
||||
}
|
||||
|
||||
if (!changed && !keepApplying)
|
||||
{
|
||||
appliedValue = matchedLayer->parameterValues[parameterIt->id];
|
||||
return true;
|
||||
}
|
||||
|
||||
matchedLayer->parameterValues[parameterIt->id] = nextValue;
|
||||
MarkParameterStateDirtyLocked();
|
||||
appliedValue = nextValue;
|
||||
return true;
|
||||
}
|
||||
|
||||
void RuntimeHost::SetCompileStatus(bool succeeded, const std::string& message)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mMutex);
|
||||
|
||||
Reference in New Issue
Block a user