Add saturation effect

pull/261/head
James H Ball 2024-09-29 19:46:35 +01:00
rodzic 0eafc29ed8
commit d1be10bd5a
6 zmienionych plików z 29 dodań i 1 usunięć

Wyświetl plik

@ -105,6 +105,7 @@
mainGain : 0.0, mainGain : 0.0,
brightness : 0.0, brightness : 0.0,
intensity: 0.02, intensity: 0.02,
saturation: 1.0,
hue : 125, hue : 125,
invertXY : false, invertXY : false,
grid : true, grid : true,
@ -438,9 +439,17 @@
uniform sampler2D uTexture2; //big glow uniform sampler2D uTexture2; //big glow
uniform sampler2D uTexture3; //screen uniform sampler2D uTexture3; //screen
uniform float uExposure; uniform float uExposure;
uniform float uSaturation;
uniform vec3 uColour; uniform vec3 uColour;
varying vec2 vTexCoord; varying vec2 vTexCoord;
varying vec2 vTexCoordCanvas; varying vec2 vTexCoordCanvas;
vec3 desaturate(vec3 color, float factor) {
vec3 lum = vec3(0.299, 0.587, 0.114);
vec3 gray = vec3(dot(lum, color));
return vec3(mix(color, gray, factor));
}
void main (void) void main (void)
{ {
vec4 line = texture2D(uTexture0, vTexCoordCanvas); vec4 line = texture2D(uTexture0, vTexCoordCanvas);
@ -453,7 +462,8 @@
float tlight = 1.0-pow(2.0, -uExposure*light); float tlight = 1.0-pow(2.0, -uExposure*light);
float tlight2 = tlight*tlight*tlight; float tlight2 = tlight*tlight*tlight;
gl_FragColor.rgb = mix(uColour, vec3(1.0), 0.3+tlight2*tlight2*0.5)*tlight; gl_FragColor.rgb = mix(uColour, vec3(1.0), 0.3+tlight2*tlight2*0.5)*tlight;
gl_FragColor.a= 1.0; gl_FragColor.rgb = desaturate(gl_FragColor.rgb, 1.0 - uSaturation);
gl_FragColor.a = 1.0;
} }
</script> </script>

Wyświetl plik

@ -165,6 +165,7 @@ var Render =
this.outputShader.uTexture2 = gl.getUniformLocation(this.outputShader, "uTexture2"); this.outputShader.uTexture2 = gl.getUniformLocation(this.outputShader, "uTexture2");
this.outputShader.uTexture3 = gl.getUniformLocation(this.outputShader, "uTexture3"); this.outputShader.uTexture3 = gl.getUniformLocation(this.outputShader, "uTexture3");
this.outputShader.uExposure = gl.getUniformLocation(this.outputShader, "uExposure"); this.outputShader.uExposure = gl.getUniformLocation(this.outputShader, "uExposure");
this.outputShader.uSaturation = gl.getUniformLocation(this.outputShader, "uSaturation");
this.outputShader.uColour = gl.getUniformLocation(this.outputShader, "uColour"); this.outputShader.uColour = gl.getUniformLocation(this.outputShader, "uColour");
this.outputShader.uResizeForCanvas = gl.getUniformLocation(this.outputShader, "uResizeForCanvas"); this.outputShader.uResizeForCanvas = gl.getUniformLocation(this.outputShader, "uResizeForCanvas");
@ -302,6 +303,7 @@ var Render =
var brightness = Math.pow(2, controls.brightness-2.0); var brightness = Math.pow(2, controls.brightness-2.0);
//if (controls.disableFilter) brightness *= Filter.steps; //if (controls.disableFilter) brightness *= Filter.steps;
gl.uniform1f(this.outputShader.uExposure, brightness); gl.uniform1f(this.outputShader.uExposure, brightness);
gl.uniform1f(this.outputShader.uSaturation, controls.saturation);
gl.uniform1f(this.outputShader.uResizeForCanvas, this.lineTexture.width/1024); gl.uniform1f(this.outputShader.uResizeForCanvas, this.lineTexture.width/1024);
var colour = this.getColourFromHue(controls.hue); var colour = this.getColourFromHue(controls.hue);
gl.uniform3fv(this.outputShader.uColour, colour); gl.uniform3fv(this.outputShader.uColour, colour);
@ -677,6 +679,7 @@ function doScriptProcessor(bufferBase64) {
controls.brightness = settings.brightness; controls.brightness = settings.brightness;
controls.intensity = settings.intensity; controls.intensity = settings.intensity;
controls.persistence = settings.persistence; controls.persistence = settings.persistence;
controls.saturation = settings.saturation;
controls.hue = settings.hue; controls.hue = settings.hue;
controls.disableFilter = !settings.upsampling; controls.disableFilter = !settings.upsampling;
let numChannels = settings.numChannels; let numChannels = settings.numChannels;

Wyświetl plik

@ -153,6 +153,7 @@ OscirenderAudioProcessor::OscirenderAudioProcessor()
permanentEffects.push_back(visualiserParameters.intensityEffect); permanentEffects.push_back(visualiserParameters.intensityEffect);
permanentEffects.push_back(visualiserParameters.persistenceEffect); permanentEffects.push_back(visualiserParameters.persistenceEffect);
permanentEffects.push_back(visualiserParameters.hueEffect); permanentEffects.push_back(visualiserParameters.hueEffect);
permanentEffects.push_back(visualiserParameters.saturationEffect);
for (int i = 0; i < 26; i++) { for (int i = 0; i < 26; i++) {
addLuaSlider(); addLuaSlider();

Wyświetl plik

@ -24,6 +24,7 @@ SosciAudioProcessor::SosciAudioProcessor()
allEffects.push_back(parameters.intensityEffect); allEffects.push_back(parameters.intensityEffect);
allEffects.push_back(parameters.persistenceEffect); allEffects.push_back(parameters.persistenceEffect);
allEffects.push_back(parameters.hueEffect); allEffects.push_back(parameters.hueEffect);
allEffects.push_back(parameters.saturationEffect);
for (auto effect : allEffects) { for (auto effect : allEffects) {
for (auto effectParameter : effect->parameters) { for (auto effectParameter : effect->parameters) {

Wyświetl plik

@ -8,6 +8,7 @@ VisualiserSettings::VisualiserSettings(VisualiserParameters& parameters, int num
addAndMakeVisible(intensity); addAndMakeVisible(intensity);
addAndMakeVisible(persistence); addAndMakeVisible(persistence);
addAndMakeVisible(hue); addAndMakeVisible(hue);
addAndMakeVisible(saturation);
addAndMakeVisible(graticuleToggle); addAndMakeVisible(graticuleToggle);
addAndMakeVisible(smudgeToggle); addAndMakeVisible(smudgeToggle);
addAndMakeVisible(upsamplingToggle); addAndMakeVisible(upsamplingToggle);
@ -16,6 +17,7 @@ VisualiserSettings::VisualiserSettings(VisualiserParameters& parameters, int num
intensity.setSliderOnValueChange(); intensity.setSliderOnValueChange();
persistence.setSliderOnValueChange(); persistence.setSliderOnValueChange();
hue.setSliderOnValueChange(); hue.setSliderOnValueChange();
saturation.setSliderOnValueChange();
} }
VisualiserSettings::~VisualiserSettings() {} VisualiserSettings::~VisualiserSettings() {}
@ -27,6 +29,7 @@ void VisualiserSettings::resized() {
intensity.setBounds(area.removeFromTop(rowHeight)); intensity.setBounds(area.removeFromTop(rowHeight));
persistence.setBounds(area.removeFromTop(rowHeight)); persistence.setBounds(area.removeFromTop(rowHeight));
hue.setBounds(area.removeFromTop(rowHeight)); hue.setBounds(area.removeFromTop(rowHeight));
saturation.setBounds(area.removeFromTop(rowHeight));
graticuleToggle.setBounds(area.removeFromTop(rowHeight)); graticuleToggle.setBounds(area.removeFromTop(rowHeight));
smudgeToggle.setBounds(area.removeFromTop(rowHeight)); smudgeToggle.setBounds(area.removeFromTop(rowHeight));
upsamplingToggle.setBounds(area.removeFromTop(rowHeight)); upsamplingToggle.setBounds(area.removeFromTop(rowHeight));
@ -37,6 +40,7 @@ juce::var VisualiserSettings::getSettings() {
settings->setProperty("brightness", parameters.brightnessEffect->getActualValue() - 2); settings->setProperty("brightness", parameters.brightnessEffect->getActualValue() - 2);
settings->setProperty("intensity", parameters.intensityEffect->getActualValue() / 100); settings->setProperty("intensity", parameters.intensityEffect->getActualValue() / 100);
settings->setProperty("persistence", parameters.persistenceEffect->getActualValue() - 1.33); settings->setProperty("persistence", parameters.persistenceEffect->getActualValue() - 1.33);
settings->setProperty("saturation", parameters.saturationEffect->getActualValue());
settings->setProperty("hue", parameters.hueEffect->getActualValue()); settings->setProperty("hue", parameters.hueEffect->getActualValue());
settings->setProperty("graticule", parameters.graticuleEnabled->getBoolValue()); settings->setProperty("graticule", parameters.graticuleEnabled->getBoolValue());
settings->setProperty("smudges", parameters.smudgesEnabled->getBoolValue()); settings->setProperty("smudges", parameters.smudgesEnabled->getBoolValue());

Wyświetl plik

@ -51,6 +51,14 @@ public:
VERSION_HINT, 3.0, 0.0, 10.0 VERSION_HINT, 3.0, 0.0, 10.0
) )
); );
std::shared_ptr<Effect> saturationEffect = std::make_shared<Effect>(
new EffectParameter(
"Saturation",
"Controls how saturated the colours are on the oscilloscope.",
"saturation",
VERSION_HINT, 1.0, 0.0, 5.0
)
);
}; };
class VisualiserSettings : public juce::Component { class VisualiserSettings : public juce::Component {
@ -69,6 +77,7 @@ private:
EffectComponent intensity{*parameters.intensityEffect}; EffectComponent intensity{*parameters.intensityEffect};
EffectComponent persistence{*parameters.persistenceEffect}; EffectComponent persistence{*parameters.persistenceEffect};
EffectComponent hue{*parameters.hueEffect}; EffectComponent hue{*parameters.hueEffect};
EffectComponent saturation{*parameters.saturationEffect};
jux::SwitchButton graticuleToggle{parameters.graticuleEnabled}; jux::SwitchButton graticuleToggle{parameters.graticuleEnabled};
jux::SwitchButton smudgeToggle{parameters.smudgesEnabled}; jux::SwitchButton smudgeToggle{parameters.smudgesEnabled};