1#include "KrotosBinaryData.h"
14 "Graphics" + File::getSeparatorString() +
"backdrop.png");
16 if (customBackdrop.existsAsFile())
22 m_backdropImage = ImageFileFormat::loadFrom(KrotosBinaryData::GrainBackdrop_png,
23 KrotosBinaryData::GrainBackdrop_pngSize);
27 "Graphics" + File::getSeparatorString() +
"Grains");
29 if (customGrains.containsSubDirectories())
31 Array<File> directoryList = customGrains.findChildFiles(File::TypesOfFileToFind::findDirectories,
false);
33 for (
const auto& directoryPath : directoryList)
35 File directory(directoryPath);
36 String directoryName = directoryPath.getFullPathName();
38 Array<File> filePaths = directory.findChildFiles(File::TypesOfFileToFind::findFiles,
false,
"*.png");
40 Array<String> spriteNames;
42 for (
const auto& spritePath : filePaths)
44 spriteNames.add(spritePath.getFileNameWithoutExtension());
47 std::vector<String> spriteNamesVector(spriteNames.begin(), spriteNames.end());
48 std::sort(spriteNamesVector.begin(), spriteNamesVector.end());
50 for (
const auto& spriteName : spriteNamesVector)
52 File spriteFile(directoryName + File::getSeparatorString() + spriteName +
".png");
53 m_grainImages.push_back(ImageFileFormat::loadFrom(spriteFile));
76 float diameter,
float sprite,
float envelope)
78 bool bulgeEnabled =
true;
84 float bulge = 1.f + envelope * 0.75f;
85 float diam = jmap<float>(diameter, 0.f, 1.f, 0.01f, 0.1f);
87 Rectangle<float> ellipseBounds{0.f, 0.f, diam *
ASPECT_RATIO, diam};
88 ellipseBounds.setCentre(x, 1.f - y);
100 graphicContext.setOpacity(1.f);
101 overlayContext.setOpacity(1.f);
104 int spriteIndex =
static_cast<int>((1.f - sprite) * numSprites);
105 int maxSpriteIndex =
static_cast<int>(numSprites) - 1;
107 spriteIndex = std::max<int>(spriteIndex, 0);
108 spriteIndex = std::min<int>(spriteIndex, maxSpriteIndex);
131 float z,
float ,
const AffineTransform& transform,
float envelope)
134 Point<float> slice{x - 0.5f, z - 0.5f + zDisplacement};
135 slice.applyTransform(transform);
137 drawGrain(graphicContext, overlayContext, (slice.x * perspectiveScaling) + 0.5f,
138 ((y - 0.5f) * perspectiveScaling) + 0.5f, 1.f - slice.y, y, envelope);
150 jassert(parallax >= 0 && parallax <= 1.f);
152 int baseFrame =
static_cast<int>(fractionalFrame);
154 interFrame = fractionalFrame -
static_cast<float>(baseFrame);
155 jassert(interFrame >= 0.f && interFrame < 1.f);
173 g.setColour(Colours::white);
175 g.setOpacity(interFrame);
182 auto backColour = getLookAndFeel().findColour(ResizableWindow::backgroundColourId);
183 juce::ColourGradient cg = juce::ColourGradient::vertical(
184 backColour.darker(0.5f), 0.0f, backColour.brighter(0.2f),
static_cast<float>(getHeight()));
185 g.setGradientFill(cg);
190 void GrainVisualiser::drawProgressTracker(juce::Graphics& g,
ProgressTracker& progessTracker)
198 Rectangle<float>{0.25f, 0.25f, .5f, 0.5f});
203 g.setColour(getLookAndFeel().findColour(ResizableWindow::backgroundColourId).withAlpha(alpha));
208 pie.addPieSegment(pieBounds, progessTracker.
getIndicator() * 6.28319f,
213 g.setColour(Colour::fromHSV(
m_indicatorHue, 0.5f, 0.6f, 1.f).withAlpha(alpha));
219 g.setColour(getLookAndFeel().findColour(ResizableWindow::backgroundColourId).brighter(0.5f).withAlpha(alpha));
220 g.strokePath(pie, PathStrokeType(2.f));
223 g.setColour(Colours::white.withAlpha(alpha));
224 Rectangle<float> textBounds;
225 textBounds.setSize(0.5f, 0.05f);
226 textBounds.setPosition(0.2f, 0.8f);
238 graphicContext.setColour(Colours::white.withAlpha(0.2f));
239 Rectangle<float> textBounds;
240 textBounds.setSize(0.5f, 0.05f);
241 textBounds.setPosition(0.25f, 0.95f);
243 "Grains: " + String(grainDescriptionByZ.size()) +
251 for (
auto& grainDescription : grainDescriptionByZ)
254 grainDescription.principalY, grainDescription.principalZ, grainDescription.principalQ,
301 bool shouldRegenerateDisplayCache =
false;
306 if (engine.getGrainDescriptionByZ().size() > 0)
309 if (engine.shouldRegenerateDisplayCache())
313 shouldRegenerateDisplayCache =
true;
365 if (grainArray[i].isPlaying)
374 return AffineTransform().rotated((parallax -= 0.5f) * -
ROTATION_RANGE);
379 jassert((sampleEngine !=
nullptr) && (isEnabled() ==
true));
411 graphicContext.setColour(Colours::white.withAlpha(
m_grainAlpha));
424 grain.principalZ, grain.principalQ, transform, grain.envelope);
438 auto progessTracker = sampleEngine->getProgressTracker();
442 drawProgressTracker(graphicContext, progessTracker);
462 graphicContext.setColour(Colours::white.withAlpha(
m_grainAlpha));
468 overlayContext.setOpacity(0.f);
479 Graphics gContext(backGround.image);
481 backGround.dirty =
true;
487 std::vector<const char*> imageArray;
488 std::vector<size_t> imageSizeArray;
493 imageArray = {KrotosBinaryData::Compound_0_png, KrotosBinaryData::Compound_01_png,
494 KrotosBinaryData::Compound_02_png, KrotosBinaryData::Compound_03_png,
495 KrotosBinaryData::Compound_04_png};
497 imageSizeArray = {KrotosBinaryData::Compound_0_pngSize, KrotosBinaryData::Compound_01_pngSize,
498 KrotosBinaryData::Compound_02_pngSize, KrotosBinaryData::Compound_03_pngSize,
499 KrotosBinaryData::Compound_04_pngSize};
503 imageArray = {KrotosBinaryData::DotsWithLines_01_png, KrotosBinaryData::DotsWithLines_02_png,
504 KrotosBinaryData::DotsWithLines_03_png};
506 imageSizeArray = {KrotosBinaryData::DotsWithLines_01_pngSize, KrotosBinaryData::DotsWithLines_02_pngSize,
507 KrotosBinaryData::DotsWithLines_03_pngSize};
511 for (
size_t i = 0; i < imageArray.size(); ++i)
513 m_grainImages.push_back(ImageFileFormat::loadFrom(imageArray[i], imageSizeArray[i]));
static File getPluginDirectory()
Definition AssetManager.cpp:392
Definition OscillatorUtils.h:39
std::vector< KrotosImage > m_backgroundCache
Definition GrainVisualiser.h:312
std::vector< KrotosImage > m_grainImages
Definition GrainVisualiser.h:332
Image m_displayBuffer
Definition GrainVisualiser.h:330
const float BACKGROUND_INTERPOLATION_SPAN
Definition GrainVisualiser.h:310
void drawInterpolatedBackground(juce::Graphics &g, float parallax)
Draw the background from the backgound frames store The final image will be interpolated from the two...
Definition GrainVisualiser.cpp:165
const int NUM_BACKGROUND_FRAMES
Definition GrainVisualiser.h:308
const float Z_SEPARATION_SCALING
Definition GrainVisualiser.h:299
float m_overlayAlpha
Definition GrainVisualiser.h:319
const int DISPLAY_HEIGHT
Definition GrainVisualiser.h:315
std::vector< SampleEngineShallow > m_shallowEngineArray
Definition GrainVisualiser.h:336
void drawBackdropGradient(juce::Graphics &g)
Draw a gradient for the display background.
Definition GrainVisualiser.cpp:180
const float ROTATION_RANGE
Definition GrainVisualiser.h:289
bool m_performMode
Definition GrainVisualiser.h:279
void drawGrainPerspective(Graphics &graphicContext, Graphics &overlayContext, float x, float y, float z, float q, const AffineTransform &transform, float envelope=-1.f)
Draw a grain blob into the grain display 3D.
Definition GrainVisualiser.cpp:130
float m_grainDiameter
Definition GrainVisualiser.h:317
bool m_advancedGraphics
Definition GrainVisualiser.h:322
const float NUM_GLOBAL_FADE_UP_FRAMES
Definition GrainVisualiser.h:275
const GrainRenderStyle DEFAULT_GRAIN_RENDER_STYLE
Definition GrainVisualiser.h:277
float m_parallaxFromPuck
Definition GrainVisualiser.h:281
void markBackgroundFramesDirty()
Sets the dirty flag true for every background frame.
Definition GrainVisualiser.cpp:473
const float TWO_PI
Definition GrainVisualiser.h:297
GrainRenderStyle
Enumerate the sets of PNGs used to render grains.
Definition GrainVisualiser.h:259
@ Compound
Definition GrainVisualiser.h:260
@ DotsWithLines
Definition GrainVisualiser.h:261
float m_overlayHue
Definition GrainVisualiser.h:318
int m_redrawFrameIndex
Definition GrainVisualiser.h:334
float m_grainZ
Definition GrainVisualiser.h:321
float m_grainAlpha
Definition GrainVisualiser.h:320
void drawDisplayBuffer(juce::Graphics &g)
Draw the display buffer into a graphics context.
Definition GrainVisualiser.cpp:141
void paintPlayingGrains(SampleEngineShallow *sampleEngine)
Paint the grain display into the display buffer.
Definition GrainVisualiser.cpp:377
float m_indicatorHue
Definition GrainVisualiser.h:287
volatile std::atomic< float > m_puckPositionX
Definition GrainVisualiser.h:282
Image m_backdropImage
Definition GrainVisualiser.h:324
const int DISPLAY_WIDTH
Definition GrainVisualiser.h:314
void drawBackgroundFrame(Graphics &graphicContext, Graphics &overlayContext, SampleEngineShallow *sampleEngine, float parallax)
Draws all the grain display components - background.
Definition GrainVisualiser.cpp:231
const AffineTransform makeParallaxRotationTransform(float parallax)
Make an affine transform to rotate X & Z around the Y axis.
Definition GrainVisualiser.cpp:372
const float PERSPECTIVE_SCALING_MAX
Definition GrainVisualiser.h:293
float m_globalDisplayOpacity
Definition GrainVisualiser.h:273
int calcBaseFrame(const float parallax, float &interFrame)
Calculates which frame index into the background cache for a given parallax value.
Definition GrainVisualiser.cpp:148
~GrainVisualiser() override
Definition GrainVisualiser.cpp:73
void drawGrain(Graphics &graphicContext, Graphics &overlayContext, float x, float y, float diameter, float sprite, float envelope=0.f)
Draw a grain blob into the grain display 2D.
Definition GrainVisualiser.cpp:75
const float LEGACY_MODE_ALPHA_VALUE
Definition GrainVisualiser.h:301
bool m_requestBackgroundCacheRegeneration
Definition GrainVisualiser.h:311
void updateBackgroundCacheFrame(SampleEngineShallow *sampleEngine, int index)
Regenerate a frame in the background cache.
Definition GrainVisualiser.cpp:451
const float PERSPECTIVE_SCALING_MIN
Definition GrainVisualiser.h:292
const float ASPECT_RATIO
Definition GrainVisualiser.h:295
void loadBinaryAssetGrainGraphics(GrainRenderStyle style)
Loads the PNGs for display of grains from binary assets.
Definition GrainVisualiser.cpp:485
void drawBackdrop(juce::Graphics &g)
The backdrop is graphic which is drawn into the background of the display This method draws it into t...
Definition GrainVisualiser.cpp:146
GrainVisualiser()
Definition GrainVisualiser.cpp:6
void paint(Graphics &g) override
Paints in the grains display This method is called when the component is asked to re-paint itself Thi...
Definition GrainVisualiser.cpp:259
ProgressTracker & getProgressTracker()
Get a reference to this buffer's ProgressTracker.
Definition KrotosAudioBufferDSP.cpp:24
bool analysisResultsAreValid()
Definition KrotosAudioBufferDSP.h:422
AnalysisCoefficients & getAnalysisCoefficients()
Definition KrotosAudioBufferDSP.cpp:979
bool shouldRegenerateDisplayCache()
Definition KrotosAudioBufferDSP.cpp:28
std::vector< AudioDescriptor > & getGrainDescriptionByZ()
Definition KrotosAudioBufferDSP.h:454
ProgressTracker - a class to help with display of a progresas bar during audio analysis.
Definition KrotosAudioBufferDSP.h:64
float getIndicator()
Definition KrotosAudioBufferDSP.h:71
bool isLoading()
Definition KrotosAudioBufferDSP.h:98
float getFilledIndicator()
Definition KrotosAudioBufferDSP.h:69
String & getMessage()
Definition KrotosAudioBufferDSP.h:67
Definition SampleEngine.h:84
static const int MAX_NUM_GRAINS
Definition SampleEngine.h:88
Grain * getGrainArray()
Definition SampleEngine.cpp:73
A structure to hold a "shallow" copy of a SampleEngine structure It contains only the data from a Sam...
Definition GrainVisualiser.h:24
std::vector< Grain > m_grains
Definition GrainVisualiser.h:50
std::vector< Grain > & getGrainArray()
Definition GrainVisualiser.h:46
std::vector< AudioDescriptor > & getGrainDescriptionByZ()
Definition GrainVisualiser.h:40
void shallowCopy(SampleEngine *sampleEngine)
Make a shallow copy of a sample engine This might have been this class's constructor,...
Definition GrainVisualiser.cpp:351
AnalysisCoefficients & getAnalysisCoefficients()
Definition GrainVisualiser.h:48
bool m_shouldRegenerateDisplayCache
Definition GrainVisualiser.h:54
std::vector< AudioDescriptor > m_grainDescriptionByZ
Definition GrainVisualiser.h:53
AnalysisCoefficients m_analysisCoefficients
Definition GrainVisualiser.h:55
bool analysisResultsAreValid()
Definition GrainVisualiser.h:44
bool m_analysisResultsAreValid
Definition GrainVisualiser.h:56
void SetTransformToFit(int width, int height)
Definition ZoomableComponent.cpp:123
void drawNormalisedZoomedImage(Graphics &g, Image &image, const Rectangle< float > &bounds, bool fillAlphaChannelWithCurrentBrush=false)
Definition ZoomableComponent.cpp:73
void drawNormalisedZoomedText(Graphics &g, String text, Rectangle< float > bounds) const
Definition ZoomableComponent.cpp:41
void fillNormalisedZoomedEllipse(Graphics &g, const Rectangle< float > &bounds)
Definition ZoomableComponent.cpp:80
void drawNormalisedZoomedEllipse(Graphics &g, const Rectangle< float > &bounds)
Definition ZoomableComponent.cpp:85
Definition AirAbsorptionFilter.cpp:2
float coeff6
Definition KrotosAudioBufferDSP.h:49
float dispAH
Definition KrotosAudioBufferDSP.h:56
float dispAAlpha
Definition KrotosAudioBufferDSP.h:55
float dispAA
Definition KrotosAudioBufferDSP.h:57