From 538662a971fb2a6a7ac1f540e25bca09c317dd7a Mon Sep 17 00:00:00 2001 From: James H Ball Date: Sat, 28 Dec 2024 15:37:19 +0000 Subject: [PATCH] Add vector display screen type --- Resources/oscilloscope/vector_display.jpg | Bin 0 -> 57724 bytes Source/visualiser/LineFragmentShader.glsl | 17 ++++++++-- Source/visualiser/OutputFragmentShader.glsl | 11 +++++- Source/visualiser/VisualiserComponent.cpp | 35 +++++++++++++++----- Source/visualiser/VisualiserComponent.h | 6 ++++ Source/visualiser/VisualiserSettings.h | 16 +++++++-- osci-render.jucer | 2 ++ sosci.jucer | 3 ++ 8 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 Resources/oscilloscope/vector_display.jpg diff --git a/Resources/oscilloscope/vector_display.jpg b/Resources/oscilloscope/vector_display.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12f1c6ad41048e08121ce12572ce5dce2a5cc24f GIT binary patch literal 57724 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

kR2QsRc{bmKK< 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 xPoints, const std: lineShader->setUniform("uFadeAmount", fadeAmount); lineShader->setUniform("uNEdges", (GLfloat) nEdges); - OsciPoint offset = settings.getScreenType() == ScreenType::Real ? REAL_SCREEN_OFFSET : OsciPoint(); - OsciPoint scale = settings.getScreenType() == ScreenType::Real ? REAL_SCREEN_SCALE : OsciPoint(1); - lineShader->setUniform("uOffset", (float) offset.x, (float) offset.y); - lineShader->setUniform("uScale", (float) scale.x, (float) scale.y); + lineShader->setUniform("uScreenType", (GLfloat) screenType); + lineShader->setUniform("uFishEye", screenType == ScreenType::VectorDisplay ? VECTOR_DISPLAY_FISH_EYE : 0.0f); + setOffsetAndScale(lineShader.get()); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertexIndexBuffer); int nEdgesThisTime = xPoints.size() - 1; @@ -860,17 +860,32 @@ void VisualiserComponent::drawCRT() { outputShader->setUniform("uTime", time); outputShader->setUniform("uGlow", (float) settings.getGlow()); outputShader->setUniform("uAmbient", (float) settings.getAmbient()); - OsciPoint offset = settings.getScreenType() == ScreenType::Real ? REAL_SCREEN_OFFSET : OsciPoint(); - OsciPoint scale = settings.getScreenType() == ScreenType::Real ? REAL_SCREEN_SCALE : OsciPoint(1); - outputShader->setUniform("uOffset", (float) offset.x, (float) offset.y); - outputShader->setUniform("uScale", (float) scale.x, (float) scale.y); - outputShader->setUniform("uRealScreen", settings.getScreenType() == ScreenType::Real ? 1.0f : 0.0f); + outputShader->setUniform("uFishEye", screenType == ScreenType::VectorDisplay ? VECTOR_DISPLAY_FISH_EYE : 0.0f); + setOffsetAndScale(outputShader.get()); + outputShader->setUniform("uRealScreen", settings.parameters.screenType->isRealisticDisplay() ? 1.0f : 0.0f); outputShader->setUniform("uResizeForCanvas", lineTexture.width / 1024.0f); juce::Colour colour = juce::Colour::fromHSV(settings.getHue() / 360.0f, 1.0, 1.0, 1.0); outputShader->setUniform("uColour", colour.getFloatRed(), colour.getFloatGreen(), colour.getFloatBlue()); drawTexture(lineTexture, blur1Texture, blur3Texture, screenTexture); } +void VisualiserComponent::setOffsetAndScale(juce::OpenGLShaderProgram* shader) { + OsciPoint offset; + OsciPoint scale; + if (settings.getScreenType() == ScreenType::Real) { + offset = REAL_SCREEN_OFFSET; + scale = REAL_SCREEN_SCALE; + } else if (settings.getScreenType() == ScreenType::VectorDisplay) { + offset = VECTOR_DISPLAY_OFFSET; + scale = VECTOR_DISPLAY_SCALE; + } else { + scale = { 1.0f }; + } + shader->setUniform("uOffset", (float) offset.x, (float) offset.y); + checkGLErrors("test 4"); + shader->setUniform("uScale", (float) scale.x, (float) scale.y); +} + Texture VisualiserComponent::createScreenTexture() { using namespace juce::gl; @@ -878,6 +893,8 @@ Texture VisualiserComponent::createScreenTexture() { screenOpenGLTexture.loadImage(screenTextureImage); } else if (screenType == ScreenType::Real) { screenOpenGLTexture.loadImage(oscilloscopeImage); + } else if (screenType == ScreenType::VectorDisplay) { + screenOpenGLTexture.loadImage(vectorDisplayImage); } else { screenOpenGLTexture.loadImage(emptyScreenImage); } diff --git a/Source/visualiser/VisualiserComponent.h b/Source/visualiser/VisualiserComponent.h index af27bb5..2e6f4d3 100644 --- a/Source/visualiser/VisualiserComponent.h +++ b/Source/visualiser/VisualiserComponent.h @@ -173,10 +173,15 @@ private: juce::Image screenTextureImage = juce::ImageFileFormat::loadFrom(BinaryData::noise_jpg, BinaryData::noise_jpgSize); juce::Image emptyScreenImage = juce::ImageFileFormat::loadFrom(BinaryData::empty_jpg, BinaryData::empty_jpgSize); juce::Image oscilloscopeImage = juce::ImageFileFormat::loadFrom(BinaryData::real_jpg, BinaryData::real_jpgSize); + juce::Image vectorDisplayImage = juce::ImageFileFormat::loadFrom(BinaryData::vector_display_jpg, BinaryData::vector_display_jpgSize); OsciPoint REAL_SCREEN_OFFSET = { 0.02, -0.15 }; OsciPoint REAL_SCREEN_SCALE = { 0.6 }; + OsciPoint VECTOR_DISPLAY_OFFSET = { 0.075, -0.045 }; + OsciPoint VECTOR_DISPLAY_SCALE = { 0.6 }; + float VECTOR_DISPLAY_FISH_EYE = 0.5; + Texture screenTexture; std::optional targetTexture = std::nullopt; @@ -198,6 +203,7 @@ private: chowdsp::ResamplingTypes::LanczosResampler<2048, 8> yResampler; chowdsp::ResamplingTypes::LanczosResampler<2048, 8> zResampler; + void setOffsetAndScale(juce::OpenGLShaderProgram* shader); void initialiseSharedTexture(); void closeSharedTexture(); Texture makeTexture(int width, int height); diff --git a/Source/visualiser/VisualiserSettings.h b/Source/visualiser/VisualiserSettings.h index b3b437a..2c8e610 100644 --- a/Source/visualiser/VisualiserSettings.h +++ b/Source/visualiser/VisualiserSettings.h @@ -14,12 +14,13 @@ enum class ScreenType : int { Graticule = 2, Smudged = 3, SmudgedGraticule = 4, - Real = 5 + Real = 5, + VectorDisplay = 6, }; class ScreenTypeParameter : public IntParameter { public: - ScreenTypeParameter(juce::String name, juce::String id, int versionHint, ScreenType value) : IntParameter(name, id, versionHint, (int) value, 1, 5) {} + ScreenTypeParameter(juce::String name, juce::String id, int versionHint, ScreenType value) : IntParameter(name, id, versionHint, (int) value, 1, 6) {} juce::String getText(float value, int maximumStringLength = 100) const override { switch ((ScreenType)(int)getUnnormalisedValue(value)) { @@ -33,6 +34,8 @@ public: return "Smudged Graticule"; case ScreenType::Real: return "Real Oscilloscope"; + case ScreenType::VectorDisplay: + return "Vector Display"; default: return "Unknown"; } @@ -50,6 +53,8 @@ public: unnormalisedValue = (int)ScreenType::SmudgedGraticule; } else if (text == "Real Oscilloscope") { unnormalisedValue = (int)ScreenType::Real; + } else if (text == "Vector Display") { + unnormalisedValue = (int)ScreenType::VectorDisplay; } else { unnormalisedValue = (int)ScreenType::Empty; } @@ -63,6 +68,11 @@ public: void load(juce::XmlElement* xml) { setValueNotifyingHost(getValueForText(xml->getStringAttribute("screenType"))); } + + bool isRealisticDisplay() { + ScreenType type = (ScreenType)(int)getValueUnnormalised(); + return type == ScreenType::Real || type == ScreenType::VectorDisplay; + } }; class VisualiserParameters { @@ -133,7 +143,7 @@ public: "Ambient Light", "Controls how much ambient light is added to the oscilloscope display.", "ambient", - VERSION_HINT, 0.8, 0.0, 5.0 + VERSION_HINT, 0.7, 0.0, 5.0 ) ); std::shared_ptr smoothEffect = std::make_shared( diff --git a/osci-render.jucer b/osci-render.jucer index 6bda7a9..1bebd9b 100644 --- a/osci-render.jucer +++ b/osci-render.jucer @@ -35,6 +35,8 @@ + diff --git a/sosci.jucer b/sosci.jucer index e0c3111..8819217 100644 --- a/sosci.jucer +++ b/sosci.jucer @@ -23,6 +23,9 @@ + +