File: EnergyDistributionVisualizer.h

package info (click to toggle)
iem-plugin-suite 1.15.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,080 kB
  • sloc: cpp: 58,973; python: 269; sh: 79; makefile: 41
file content (123 lines) | stat: -rw-r--r-- 4,582 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 ==============================================================================
 This file is part of the IEM plug-in suite.
 Author: Daniel Rudrich
 Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM)
 https://iem.at

 The IEM plug-in suite is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 The IEM plug-in suite is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this software.  If not, see <https://www.gnu.org/licenses/>.
 ==============================================================================
 */

#include "../../resources/customComponents/HammerAitovGrid.h"
#include "../JuceLibraryCode/JuceHeader.h"
#pragma once

class EnergyDistributionVisualizer : public juce::Component
{
public:
    EnergyDistributionVisualizer (std::vector<R3>& pts,
                                  juce::BigInteger& imagFlags,
                                  juce::Image& energyImageFromProcessor,
                                  juce::Image& rEImageFromProcessor) :
        juce::Component(),
        extPoints (pts),
        imaginaryFlags (imagFlags),
        energyImage (energyImageFromProcessor),
        rEImage (rEImageFromProcessor)
    {
        setBufferedToImage (true);

        showrEVector = false;
        addAndMakeVisible (imgComp);
        imgComp.setImage (energyImage);
        imgComp.setImagePlacement (juce::RectanglePlacement::stretchToFit);

        addAndMakeVisible (background);
        background.addMouseListener (this, false); // could this be risky?
    };
    ~EnergyDistributionVisualizer() {};

    void resized() override
    {
        imgComp.setBounds (getLocalBounds().reduced (10, 20));
        background.setBounds (getLocalBounds());
    }

    void paintOverChildren (juce::Graphics& g) override
    {
        const juce::Rectangle<float> bounds = getLocalBounds().toFloat().reduced (10.0f, 20.0f);
        const float centreX = bounds.getCentreX();
        const float centreY = bounds.getCentreY();
        const float wh = bounds.getWidth() * 0.5f;
        const float hh = bounds.getHeight() * 0.5f;

        for (int i = 0; i < extPoints.size(); ++i)
        {
            R3 point = extPoints[i];
            g.setColour (activePoint == point.lspNum ? juce::Colours::lawngreen
                         : point.isImaginary         ? juce::Colours::orange
                                                     : juce::Colours::cornflowerblue);
            float x, y;
            float azimuth = juce::degreesToRadians (point.azimuth);
            float elevation = juce::degreesToRadians (point.elevation);
            HammerAitov::sphericalToXY (azimuth, elevation, x, y);

            juce::Rectangle<float> rect (centreX + x * wh - 5.0f,
                                         centreY - y * hh - 5.0f,
                                         10.0f,
                                         10.0f);
            g.fillRoundedRectangle (rect, 5.0f);
        }

        g.setColour (juce::Colours::white);
        auto currentFont =
            juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f)))
                .withHeight (12.0f);
        g.setFont (currentFont);

        juce::String displayText = showrEVector ? "acos-rE source width (double-click to change)"
                                                : "energy fluctuations (double-click to change)";
        g.drawText (displayText,
                    getLocalBounds().removeFromBottom (12),
                    juce::Justification::centred);
    };

    void mouseDoubleClick (const juce::MouseEvent& event) override
    {
        showrEVector = ! showrEVector;
        if (showrEVector)
            imgComp.setImage (rEImage);
        else
            imgComp.setImage (energyImage);
        imgComp.repaint();
        repaint();
    }

    void setActiveSpeakerIndex (int newIdx)
    {
        activePoint = newIdx;
        repaint();
    }

private:
    std::vector<R3>& extPoints;
    juce::BigInteger& imaginaryFlags;
    int activePoint = -1;
    juce::ImageComponent imgComp;
    juce::Image &energyImage, rEImage;
    bool showrEVector;

    HammerAitovGrid background;
};