From adf5624e4e1ed56593a2aa8ce79e43dd4037fbd4 Mon Sep 17 00:00:00 2001 From: James Ball Date: Fri, 1 Sep 2023 19:52:36 +0100 Subject: [PATCH] Start trying to support mac --- Source/ObjComponent.h | 4 +- Source/PluginProcessor.cpp | 34 ++++++------ Source/PluginProcessor.h | 30 ++++++----- Source/audio/BitCrushEffect.cpp | 2 - Source/audio/BitCrushEffect.h | 3 +- Source/audio/BooleanParameter.h | 4 +- Source/audio/Effect.cpp | 78 +++++++++++++-------------- Source/audio/EffectParameter.h | 18 +++---- Source/audio/PerspectiveEffect.cpp | 6 ++- Source/audio/PerspectiveEffect.h | 12 +++-- Source/components/EffectComponent.cpp | 20 +++---- Source/obj/Camera.cpp | 4 +- Source/obj/WorldObject.cpp | 6 +-- Source/obj/WorldObject.h | 2 +- Source/shape/CircleArc.cpp | 2 - osci-render.jucer | 2 +- 16 files changed, 115 insertions(+), 112 deletions(-) diff --git a/Source/ObjComponent.h b/Source/ObjComponent.h index a178381..3fedcb2 100644 --- a/Source/ObjComponent.h +++ b/Source/ObjComponent.h @@ -6,7 +6,7 @@ #include "components/SvgButton.h" class OscirenderAudioProcessorEditor; -class ObjComponent : public juce::GroupComponent, public juce::MouseListener { +class ObjComponent : public juce::GroupComponent { public: ObjComponent(OscirenderAudioProcessor&, OscirenderAudioProcessorEditor&); ~ObjComponent(); @@ -32,4 +32,4 @@ private: std::shared_ptr fixedRotateZ = std::make_shared("fixedRotateZ", juce::String(BinaryData::fixed_rotate_svg), "white", "red", audioProcessor.fixedRotateZ); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ObjComponent) -}; \ No newline at end of file +}; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index 8861b8f..63a314b 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -38,56 +38,56 @@ OscirenderAudioProcessor::OscirenderAudioProcessor() toggleableEffects.push_back(std::make_shared( std::make_shared(), - new EffectParameter("Bit Crush", "bitCrush", 0.0, 0.0, 1.0) + new EffectParameter("Bit Crush", "bitCrush", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( std::make_shared(), - new EffectParameter("Bulge", "bulge", 0.0, 0.0, 1.0) + new EffectParameter("Bulge", "bulge", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( std::make_shared(), - new EffectParameter("2D Rotate", "2DRotateSpeed", 0.0, 0.0, 1.0) + new EffectParameter("2D Rotate", "2DRotateSpeed", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( std::make_shared(), - new EffectParameter("Vector Cancelling", "vectorCancelling", 0.0, 0.0, 1.0) + new EffectParameter("Vector Cancelling", "vectorCancelling", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( std::make_shared(false), - new EffectParameter("Distort X", "distortX", 0.0, 0.0, 1.0) + new EffectParameter("Distort X", "distortX", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( std::make_shared(true), - new EffectParameter("Distort Y", "distortY", 0.0, 0.0, 1.0) + new EffectParameter("Distort Y", "distortY", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { input.x += values[0]; input.y += values[1]; return input; - }, std::vector{new EffectParameter("Translate X", "translateX", 0.0, -1.0, 1.0), new EffectParameter("Translate Y", "translateY", 0.0, -1.0, 1.0)} + }, std::vector{new EffectParameter("Translate X", "translateX", VERSION_HINT, 0.0, -1.0, 1.0), new EffectParameter("Translate Y", "translateY", VERSION_HINT, 0.0, -1.0, 1.0)} )); toggleableEffects.push_back(std::make_shared( std::make_shared(), - new EffectParameter("Smoothing", "smoothing", 0.0, 0.0, 1.0) + new EffectParameter("Smoothing", "smoothing", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( wobbleEffect, - new EffectParameter("Wobble", "wobble", 0.0, 0.0, 1.0) + new EffectParameter("Wobble", "wobble", VERSION_HINT, 0.0, 0.0, 1.0) )); toggleableEffects.push_back(std::make_shared( delayEffect, - std::vector{new EffectParameter("Delay Decay", "delayDecay", 0.0, 0.0, 1.0), new EffectParameter("Delay Length", "delayLength", 0.5, 0.0, 1.0)} + std::vector{new EffectParameter("Delay Decay", "delayDecay", VERSION_HINT, 0.0, 0.0, 1.0), new EffectParameter("Delay Length", "delayLength", VERSION_HINT, 0.5, 0.0, 1.0)} )); toggleableEffects.push_back(std::make_shared( perspectiveEffect, std::vector{ - new EffectParameter("3D Perspective", "perspectiveStrength", 0.0, 0.0, 1.0), - new EffectParameter("Depth (z)", "perspectiveZPos", 0.1, 0.0, 1.0), - new EffectParameter("Rotate Speed", "perspectiveRotateSpeed", 0.0, -1.0, 1.0), - new EffectParameter("Rotate X", "perspectiveRotateX", 1.0, -1.0, 1.0), - new EffectParameter("Rotate Y", "perspectiveRotateY", 1.0, -1.0, 1.0), - new EffectParameter("Rotate Z", "perspectiveRotateZ", 0.0, -1.0, 1.0), + new EffectParameter("3D Perspective", "perspectiveStrength", VERSION_HINT, 0.0, 0.0, 1.0), + new EffectParameter("Depth (z)", "perspectiveZPos", VERSION_HINT, 0.1, 0.0, 1.0), + new EffectParameter("Rotate Speed", "perspectiveRotateSpeed", VERSION_HINT, 0.0, -1.0, 1.0), + new EffectParameter("Rotate X", "perspectiveRotateX", VERSION_HINT, 1.0, -1.0, 1.0), + new EffectParameter("Rotate Y", "perspectiveRotateY", VERSION_HINT, 1.0, -1.0, 1.0), + new EffectParameter("Rotate Z", "perspectiveRotateZ", VERSION_HINT, 0.0, -1.0, 1.0), } )); toggleableEffects.push_back(traceMax); @@ -240,7 +240,7 @@ void OscirenderAudioProcessor::addLuaSlider() { luaEffects.push_back(std::make_shared( std::make_shared(sliderName, *this), - new EffectParameter("Lua " + sliderName, "lua" + sliderName, 0.0, 0.0, 1.0, 0.001, false) + new EffectParameter("Lua " + sliderName, "lua" + sliderName, VERSION_HINT, 0.0, 0.0, 1.0, 0.001, false) )); auto& effect = luaEffects.back(); diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index c511b99..b29ae5f 100644 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -60,6 +60,8 @@ public: void changeProgramName(int index, const juce::String& newName) override; void getStateInformation(juce::MemoryBlock& destData) override; void setStateInformation(const void* data, int sizeInBytes) override; + + int VERSION_HINT = 1; std::atomic currentSampleRate = 0.0; @@ -71,21 +73,21 @@ public: [this](int index, Vector2 input, const std::vector& values, double sampleRate) { frequency = values[0]; return input; - }, new EffectParameter("Frequency", "frequency", 440.0, 0.0, 12000.0, 0.1) + }, new EffectParameter("Frequency", "frequency", VERSION_HINT, 440.0, 0.0, 12000.0, 0.1) ); std::shared_ptr volumeEffect = std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { volume = values[0]; return input; - }, new EffectParameter("Volume", "volume", 1.0, 0.0, 3.0) + }, new EffectParameter("Volume", "volume", VERSION_HINT, 1.0, 0.0, 3.0) ); std::shared_ptr thresholdEffect = std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { threshold = values[0]; return input; - }, new EffectParameter("Threshold", "threshold", 1.0, 0.0, 1.0) + }, new EffectParameter("Threshold", "threshold", VERSION_HINT, 1.0, 0.0, 1.0) ); std::shared_ptr focalLength = std::make_shared( @@ -96,12 +98,12 @@ public: camera->setFocalLength(values[0]); } return input; - }, new EffectParameter("Focal length", "objFocalLength", 1.0, 0.0, 2.0) + }, new EffectParameter("Focal length", "objFocalLength", VERSION_HINT, 1.0, 0.0, 2.0) ); - BooleanParameter* fixedRotateX = new BooleanParameter("Object Fixed Rotate X", "objFixedRotateX", false); - BooleanParameter* fixedRotateY = new BooleanParameter("Object Fixed Rotate Y", "objFixedRotateY", false); - BooleanParameter* fixedRotateZ = new BooleanParameter("Object Fixed Rotate Z", "objFixedRotateZ", false); + BooleanParameter* fixedRotateX = new BooleanParameter("Object Fixed Rotate X", "objFixedRotateX", VERSION_HINT, false); + BooleanParameter* fixedRotateY = new BooleanParameter("Object Fixed Rotate Y", "objFixedRotateY", VERSION_HINT, false); + BooleanParameter* fixedRotateZ = new BooleanParameter("Object Fixed Rotate Z", "objFixedRotateZ", VERSION_HINT, false); std::shared_ptr rotateX = std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { if (getCurrentFileIndex() != -1) { @@ -115,7 +117,7 @@ public: } } return input; - }, new EffectParameter("Rotate X", "objRotateX", 1.0, -1.0, 1.0) + }, new EffectParameter("Rotate X", "objRotateX", VERSION_HINT, 1.0, -1.0, 1.0) ); std::shared_ptr rotateY = std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { @@ -130,7 +132,7 @@ public: } } return input; - }, new EffectParameter("Rotate Y", "objRotateY", 1.0, -1.0, 1.0) + }, new EffectParameter("Rotate Y", "objRotateY", VERSION_HINT, 1.0, -1.0, 1.0) ); std::shared_ptr rotateZ = std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { @@ -145,7 +147,7 @@ public: } } return input; - }, new EffectParameter("Rotate Z", "objRotateZ", 0.0, -1.0, 1.0) + }, new EffectParameter("Rotate Z", "objRotateZ", VERSION_HINT, 0.0, -1.0, 1.0) ); std::shared_ptr rotateSpeed = std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { @@ -155,11 +157,11 @@ public: obj->setRotationSpeed(values[0]); } return input; - }, new EffectParameter("Rotate Speed", "objRotateSpeed", 0.0, -1.0, 1.0) + }, new EffectParameter("Rotate Speed", "objRotateSpeed", VERSION_HINT, 0.0, -1.0, 1.0) ); std::shared_ptr delayEffect = std::make_shared(); - std::shared_ptr perspectiveEffect = std::make_shared(); + std::shared_ptr perspectiveEffect = std::make_shared(VERSION_HINT); juce::SpinLock parsersLock; std::vector> parsers; @@ -226,14 +228,14 @@ private: traceMaxValue = values[0]; traceMaxEnabled = true; return input; - }, new EffectParameter("Trace max", "traceMax", 1.0, 0.0, 1.0) + }, new EffectParameter("Trace max", "traceMax", VERSION_HINT, 1.0, 0.0, 1.0) ); std::shared_ptr traceMin = std::make_shared( [this](int index, Vector2 input, const std::vector& values, double sampleRate) { traceMinValue = values[0]; traceMinEnabled = true; return input; - }, new EffectParameter("Trace min", "traceMin", 0.0, 0.0, 1.0) + }, new EffectParameter("Trace min", "traceMin", VERSION_HINT, 0.0, 0.0, 1.0) ); const double MIN_TRACE = 0.005; double traceMaxValue = traceMax->getValue(); diff --git a/Source/audio/BitCrushEffect.cpp b/Source/audio/BitCrushEffect.cpp index 9efdb15..3f08ab1 100644 --- a/Source/audio/BitCrushEffect.cpp +++ b/Source/audio/BitCrushEffect.cpp @@ -2,8 +2,6 @@ BitCrushEffect::BitCrushEffect() {} -BitCrushEffect::~BitCrushEffect() {} - // algorithm from https://www.kvraudio.com/forum/viewtopic.php?t=163880 Vector2 BitCrushEffect::apply(int index, Vector2 input, const std::vector& values, double sampleRate) { double value = values[0]; diff --git a/Source/audio/BitCrushEffect.h b/Source/audio/BitCrushEffect.h index 9b93e54..edc537d 100644 --- a/Source/audio/BitCrushEffect.h +++ b/Source/audio/BitCrushEffect.h @@ -5,7 +5,6 @@ class BitCrushEffect : public EffectApplication { public: BitCrushEffect(); - ~BitCrushEffect(); Vector2 apply(int index, Vector2 input, const std::vector& values, double sampleRate) override; -}; \ No newline at end of file +}; diff --git a/Source/audio/BooleanParameter.h b/Source/audio/BooleanParameter.h index 2323438..b2cd44e 100644 --- a/Source/audio/BooleanParameter.h +++ b/Source/audio/BooleanParameter.h @@ -4,7 +4,7 @@ class BooleanParameter : public juce::AudioProcessorParameterWithID { public: - BooleanParameter(juce::String name, juce::String id, bool value) : AudioProcessorParameterWithID(id, name), value(value) {} + BooleanParameter(juce::String name, juce::String id, int versionHint, bool value) : AudioProcessorParameterWithID(juce::ParameterID(id, versionHint), name), value(value) {} juce::String getName(int maximumStringLength) const override { return name.substring(0, maximumStringLength); @@ -86,4 +86,4 @@ public: private: std::atomic value = false; -}; \ No newline at end of file +}; diff --git a/Source/audio/Effect.cpp b/Source/audio/Effect.cpp index a87ee7a..1bca139 100644 --- a/Source/audio/Effect.cpp +++ b/Source/audio/Effect.cpp @@ -33,47 +33,47 @@ void Effect::animateValues() { float percentage = phase / (2 * std::numbers::pi); LfoType type = lfoEnabled ? (LfoType)(int)parameter->lfo->getValueUnnormalised() : LfoType::Static; - switch (type) { - case LfoType::Sine: - actualValues[i] = std::sin(phase) * 0.5 + 0.5; - actualValues[i] = actualValues[i] * (maxValue - minValue) + minValue; - break; - case LfoType::Square: - actualValues[i] = (percentage < 0.5) ? maxValue : minValue; - break; - case LfoType::Seesaw: - // modified sigmoid function - actualValues[i] = (percentage < 0.5) ? percentage * 2 : (1 - percentage) * 2; - actualValues[i] = 1 / (1 + std::exp(-16 * (actualValues[i] - 0.5))); - actualValues[i] = actualValues[i] * (maxValue - minValue) + minValue; - break; - case LfoType::Triangle: - actualValues[i] = (percentage < 0.5) ? percentage * 2 : (1 - percentage) * 2; - actualValues[i] = actualValues[i] * (maxValue - minValue) + minValue; - break; - case LfoType::Sawtooth: - actualValues[i] = percentage * (maxValue - minValue) + minValue; - break; - case LfoType::ReverseSawtooth: - actualValues[i] = (1 - percentage) * (maxValue - minValue) + minValue; - break; - case LfoType::Noise: - actualValues[i] = ((float)rand() / RAND_MAX) * (maxValue - minValue) + minValue; - break; + switch (type) { + case LfoType::Sine: + actualValues[i] = std::sin(phase) * 0.5 + 0.5; + actualValues[i] = actualValues[i] * (maxValue - minValue) + minValue; + break; + case LfoType::Square: + actualValues[i] = (percentage < 0.5) ? maxValue : minValue; + break; + case LfoType::Seesaw: + // modified sigmoid function + actualValues[i] = (percentage < 0.5) ? percentage * 2 : (1 - percentage) * 2; + actualValues[i] = 1 / (1 + std::exp(-16 * (actualValues[i] - 0.5))); + actualValues[i] = actualValues[i] * (maxValue - minValue) + minValue; + break; + case LfoType::Triangle: + actualValues[i] = (percentage < 0.5) ? percentage * 2 : (1 - percentage) * 2; + actualValues[i] = actualValues[i] * (maxValue - minValue) + minValue; + break; + case LfoType::Sawtooth: + actualValues[i] = percentage * (maxValue - minValue) + minValue; + break; + case LfoType::ReverseSawtooth: + actualValues[i] = (1 - percentage) * (maxValue - minValue) + minValue; + break; + case LfoType::Noise: + actualValues[i] = ((float)rand() / RAND_MAX) * (maxValue - minValue) + minValue; + break; default: double weight = parameter->smoothValueChange ? 0.0005 : 1.0; actualValues[i] = (1.0 - weight) * actualValues[i] + weight * parameter->getValueUnnormalised(); - break; + break; } } } // should only be the audio thread calling this, but either way it's not a big deal float Effect::nextPhase(EffectParameter* parameter) { - parameter->phase += parameter->lfoRate->getValueUnnormalised() / sampleRate; + parameter->phase = parameter->phase + parameter->lfoRate->getValueUnnormalised() / sampleRate; if (parameter->phase > 1) { - parameter->phase -= 1; + parameter->phase = parameter->phase - 1; } return parameter->phase * 2 * std::numbers::pi; @@ -137,7 +137,7 @@ void Effect::markEnableable(bool enable) { if (enabled != nullptr) { enabled->setValue(enable); } else { - enabled = new BooleanParameter(getName() + " Enabled", getId() + "Enabled", enable); + enabled = new BooleanParameter(getName() + " Enabled", getId() + "Enabled", parameters[0]->getVersionHint(), enable); } } @@ -150,14 +150,14 @@ juce::String Effect::getName() { } void Effect::save(juce::XmlElement* xml) { - if (enabled != nullptr) { - auto enabledXml = xml->createNewChildElement("enabled"); - enabled->save(enabledXml); - } - xml->setAttribute("id", getId()); - xml->setAttribute("precedence", precedence); - for (auto parameter : parameters) { - parameter->save(xml->createNewChildElement("parameter")); + if (enabled != nullptr) { + auto enabledXml = xml->createNewChildElement("enabled"); + enabled->save(enabledXml); + } + xml->setAttribute("id", getId()); + xml->setAttribute("precedence", precedence); + for (auto parameter : parameters) { + parameter->save(xml->createNewChildElement("parameter")); } } diff --git a/Source/audio/EffectParameter.h b/Source/audio/EffectParameter.h index 1712d9a..0a91320 100644 --- a/Source/audio/EffectParameter.h +++ b/Source/audio/EffectParameter.h @@ -5,10 +5,10 @@ class FloatParameter : public juce::AudioProcessorParameterWithID { public: std::atomic min = 0.0; - std::atomic max = 1.0; - std::atomic step = 0.001; + std::atomic max = 0.0; + std::atomic step = 0.0; - FloatParameter(juce::String name, juce::String id, float value, float min, float max, float step = 0.001, juce::String label = "") : juce::AudioProcessorParameterWithID(id, name), value(value), min(min), max(max), step(step), label(label) {} + FloatParameter(juce::String name, juce::String id, int versionHint, float value, float min, float max, float step = 0.69, juce::String label = "") : juce::AudioProcessorParameterWithID(juce::ParameterID(id, versionHint), name), min(min), max(max), step(step), value(value), label(label) {} juce::String getName(int maximumStringLength) const override { return name.substring(0, maximumStringLength); @@ -131,7 +131,7 @@ public: std::atomic min = 0; std::atomic max = 10; - IntParameter(juce::String name, juce::String id, int value, int min, int max) : AudioProcessorParameterWithID(id, name), value(value), min(min), max(max) {} + IntParameter(juce::String name, juce::String id, int versionHint, int value, int min, int max) : AudioProcessorParameterWithID(juce::ParameterID(id, versionHint), name), min(min), max(max), value(value) {} juce::String getName(int maximumStringLength) const override { return name.substring(0, maximumStringLength); @@ -237,7 +237,7 @@ enum class LfoType : int { class LfoTypeParameter : public IntParameter { public: - LfoTypeParameter(juce::String name, juce::String id, int value) : IntParameter(name, id, value, 1, 8) {} + LfoTypeParameter(juce::String name, juce::String id, int versionHint, int value) : IntParameter(name, id, versionHint, value, 1, 8) {} juce::String getText(float value, int maximumStringLength) const override { switch ((LfoType)(int)getUnnormalisedValue(value)) { @@ -298,8 +298,8 @@ public: class EffectParameter : public FloatParameter { public: std::atomic smoothValueChange = true; - LfoTypeParameter* lfo = new LfoTypeParameter(name + " LFO", paramID + "Lfo", 1); - FloatParameter* lfoRate = new FloatParameter(name + " LFO Rate", paramID + "LfoRate", 1.0f, 0.0f, 100.0f, 0.1f, "Hz"); + LfoTypeParameter* lfo = new LfoTypeParameter(name + " LFO", paramID + "Lfo", getVersionHint(), 1); + FloatParameter* lfoRate = new FloatParameter(name + " LFO Rate", paramID + "LfoRate", getVersionHint(), 1.0f, 0.0f, 100.0f, 0.1f, "Hz"); std::atomic phase = 0.0f; std::vector getParameters() { @@ -341,5 +341,5 @@ public: } } - EffectParameter(juce::String name, juce::String id, float value, float min, float max, float step = 0.001, bool smoothValueChange = true) : FloatParameter(name, id, value, min, max, step), smoothValueChange(smoothValueChange) {} -}; \ No newline at end of file + EffectParameter(juce::String name, juce::String id, int versionHint, float value, float min, float max, float step = 0.01, bool smoothValueChange = true) : FloatParameter(name, id, versionHint, value, min, max, step), smoothValueChange(smoothValueChange) {} +}; diff --git a/Source/audio/PerspectiveEffect.cpp b/Source/audio/PerspectiveEffect.cpp index d5f50d2..518d7a3 100644 --- a/Source/audio/PerspectiveEffect.cpp +++ b/Source/audio/PerspectiveEffect.cpp @@ -1,7 +1,11 @@ #include "PerspectiveEffect.h" #include -PerspectiveEffect::PerspectiveEffect() {} +PerspectiveEffect::PerspectiveEffect(int versionHint) : versionHint(versionHint) { + fixedRotateX = new BooleanParameter("Perspective Fixed Rotate X", "perspectiveFixedRotateX", versionHint, false); + fixedRotateY = new BooleanParameter("Perspective Fixed Rotate Y", "perspectiveFixedRotateY", versionHint, false); + fixedRotateZ = new BooleanParameter("Perspective Fixed Rotate Z", "perspectiveFixedRotateZ", versionHint, false); +} Vector2 PerspectiveEffect::apply(int index, Vector2 input, const std::vector& values, double sampleRate) { auto effectScale = values[0]; diff --git a/Source/audio/PerspectiveEffect.h b/Source/audio/PerspectiveEffect.h index 6f8db4b..a86d92a 100644 --- a/Source/audio/PerspectiveEffect.h +++ b/Source/audio/PerspectiveEffect.h @@ -6,15 +6,15 @@ class PerspectiveEffect : public EffectApplication { public: - PerspectiveEffect(); + PerspectiveEffect(int versionHint); Vector2 apply(int index, Vector2 input, const std::vector& values, double sampleRate) override; void updateCode(const juce::String& newCode); juce::String getCode(); - BooleanParameter* fixedRotateX = new BooleanParameter("Perspective Fixed Rotate X", "perspectiveFixedRotateX", false); - BooleanParameter* fixedRotateY = new BooleanParameter("Perspective Fixed Rotate Y", "perspectiveFixedRotateY", false); - BooleanParameter* fixedRotateZ = new BooleanParameter("Perspective Fixed Rotate Z", "perspectiveFixedRotateZ", false); + BooleanParameter* fixedRotateX; + BooleanParameter* fixedRotateY; + BooleanParameter* fixedRotateZ; private: const juce::String DEFAULT_SCRIPT = "return { x, y, z }"; juce::String code = DEFAULT_SCRIPT; @@ -25,8 +25,10 @@ private: float currentRotateX = 0; float currentRotateY = 0; float currentRotateZ = 0; + + int versionHint; float linearSpeedToActualSpeed(float rotateSpeed) { return (std::exp(3 * juce::jmin(10.0f, std::abs(rotateSpeed))) - 1) / 50000.0; } -}; \ No newline at end of file +}; diff --git a/Source/components/EffectComponent.cpp b/Source/components/EffectComponent.cpp index 86b26d5..318ba2c 100644 --- a/Source/components/EffectComponent.cpp +++ b/Source/components/EffectComponent.cpp @@ -116,16 +116,16 @@ EffectComponent::~EffectComponent() { effect.removeListener(index, this); } -void EffectComponent::resized() { - auto bounds = getLocalBounds(); - auto componentBounds = bounds.removeFromRight(25); - if (component != nullptr) { - component->setBounds(componentBounds); - } - - if (lfoEnabled) { - lfo.setBounds(bounds.removeFromRight(100).reduced(5)); - } +void EffectComponent::resized() { + auto bounds = getLocalBounds(); + auto componentBounds = bounds.removeFromRight(25); + if (component != nullptr) { + component->setBounds(componentBounds); + } + + if (lfoEnabled) { + lfo.setBounds(bounds.removeFromRight(100).reduced(5)); + } auto checkboxLabel = bounds.removeFromLeft(120); diff --git a/Source/obj/Camera.cpp b/Source/obj/Camera.cpp index cb40857..2153938 100644 --- a/Source/obj/Camera.cpp +++ b/Source/obj/Camera.cpp @@ -47,8 +47,8 @@ std::vector Camera::sampleVerticesInRender(WorldObject& object) { double z = object.vs[j * 3 + 2]; vertices.push_back(project(object.rotateX, object.rotateY, object.rotateZ, x, y, z)); } - object.rotateY += rotation; - object.rotateZ += rotation; + object.rotateY = object.rotateY + rotation; + object.rotateZ = object.rotateY + rotation; } return vertices; diff --git a/Source/obj/WorldObject.cpp b/Source/obj/WorldObject.cpp index 3981a18..b94df1b 100644 --- a/Source/obj/WorldObject.cpp +++ b/Source/obj/WorldObject.cpp @@ -238,9 +238,9 @@ void WorldObject::setRotationSpeed(double rotateSpeed) { // called whenever a new frame is drawn, so that the object can update its // rotation void WorldObject::nextFrame() { - currentRotateX += baseRotateX * rotateSpeed; - currentRotateY += baseRotateY * rotateSpeed; - currentRotateZ += baseRotateZ * rotateSpeed; + currentRotateX = currentRotateX + baseRotateX * rotateSpeed; + currentRotateY = currentRotateY + baseRotateY * rotateSpeed; + currentRotateZ = currentRotateZ + baseRotateZ * rotateSpeed; rotateX = baseRotateX + currentRotateX; rotateY = baseRotateY + currentRotateY; rotateZ = baseRotateZ + currentRotateZ; diff --git a/Source/obj/WorldObject.h b/Source/obj/WorldObject.h index e41a9c0..058f6e3 100644 --- a/Source/obj/WorldObject.h +++ b/Source/obj/WorldObject.h @@ -26,4 +26,4 @@ private: std::atomic baseRotateX = 0.0, baseRotateY = 0.0, baseRotateZ = 0.0; std::atomic currentRotateX = 0.0, currentRotateY = 0.0, currentRotateZ = 0.0; std::atomic rotateSpeed; -}; \ No newline at end of file +}; diff --git a/Source/shape/CircleArc.cpp b/Source/shape/CircleArc.cpp index 9303a66..d872247 100644 --- a/Source/shape/CircleArc.cpp +++ b/Source/shape/CircleArc.cpp @@ -56,8 +56,6 @@ void CircleArc::translate(double x, double y) { double CircleArc::length() { if (len < 0) { len = 0; - double angle = startAngle; - double step = (endAngle - startAngle) / 500; for (int i = 0; i < 500; i++) { Vector2 v1 = nextVector(i / 500.0); Vector2 v2 = nextVector((i + 1) / 500.0); diff --git a/osci-render.jucer b/osci-render.jucer index 653d8a3..7a47e9f 100644 --- a/osci-render.jucer +++ b/osci-render.jucer @@ -1,7 +1,7 @@