34 g.setColour(m_speakerDrawablesCurrentColour);
35 for (
auto const& speakerDrawableKV : m_speakerDrawables)
38 speakerDrawableKV.second->drawWithin(g, m_speakerDrawableAreas[speakerDrawableKV.first], juce::RectanglePlacement::centred, 1.0f);
46 PrerenderSpeakersInBounds();
51 UmsciPaintNControlComponentBase::lookAndFeelChanged();
53 for (
auto const& speakerDrawableKV : m_speakerDrawables)
54 if (speakerDrawableKV.second)
55 speakerDrawableKV.second->replaceColour(m_speakerDrawablesCurrentColour, getLookAndFeel().findColour(juce::TextButton::textColourOnId));
57 m_speakerDrawablesCurrentColour = getLookAndFeel().findColour(juce::TextButton::textColourOnId);
60void UmsciLoudspeakersPaintComponent::PrerenderSpeakerDrawable(std::int16_t speakerId,
const std::array<std::float_t, 6>& rotNPos)
62 auto& hor = rotNPos.at(0);
63 auto& ver = rotNPos.at(1);
64 auto& rot = rotNPos.at(2);
65 auto& x = rotNPos.at(3);
66 auto& y = rotNPos.at(4);
67 auto& z = rotNPos.at(5);
69 if (hor != 0.0f || ver != 0.0f || rot != 0.0f || x != 0.0f || y != 0.0f || z != 0.0f)
71 if (juce::isWithin<int>((
int(std::abs(ver)) % 180), 90, 15))
72 m_speakerDrawables[speakerId] = Drawable::createFromSVG(*XmlDocument::parse(BinaryData::loudspeaker_vert24px_svg));
74 m_speakerDrawables[speakerId] = Drawable::createFromSVG(*XmlDocument::parse(BinaryData::loudspeaker_hor24px_svg));
75 auto& drawable = m_speakerDrawables.at(speakerId);
76 drawable->replaceColour(Colours::black, m_speakerDrawablesCurrentColour);
77 auto drawableBounds = drawable->getBounds().toFloat();
82 auto verRad = juce::degreesToRadians(ver);
83 auto angle2D = -hor * std::cos(verRad) + rot * std::sin(verRad) + 90.0f;
84 drawable->setTransform(juce::AffineTransform::rotation(juce::degreesToRadians(angle2D), drawableBounds.getCentreX(), drawableBounds.getCentreY()));
90 if (speakerPositions.empty())
92 m_speakerPositions.clear();
93 m_speakerDrawableAreas.clear();
94 m_speakerDrawables.clear();
98 m_speakerPositions = speakerPositions;
100 for (
auto const speakerPositionKV : speakerPositions)
101 PrerenderSpeakerDrawable(speakerPositionKV.first, speakerPositionKV.second);
103 PrerenderSpeakersInBounds();
111 m_speakerPositions[speakerId] = position;
112 PrerenderSpeakerDrawable(speakerId, position);
121 PrerenderSpeakersInBounds();
124void UmsciLoudspeakersPaintComponent::onZoomChanged()
126 PrerenderSpeakersInBounds();
130void UmsciLoudspeakersPaintComponent::PrerenderSpeakersInBounds()
133 for (
auto const speakerPositionKV : m_speakerPositions)
135 auto& speakerId = speakerPositionKV.first;
136 auto& speakerRotNPos = speakerPositionKV.second;
137 auto& hor = speakerRotNPos.at(0);
138 auto& ver = speakerRotNPos.at(1);
139 auto& rot = speakerRotNPos.at(2);
140 auto& x = speakerRotNPos.at(3);
141 auto& y = speakerRotNPos.at(4);
142 auto& z = speakerRotNPos.at(5);
144 if (hor != 0.0f || ver != 0.0f || rot != 0.0f || x != 0.0f || y != 0.0f || z != 0.0f)
147 m_speakerDrawableAreas[speakerId] = speakerArea;
void setControlsSize(ControlsSize size) override
Re-prerender all speaker drawables at the new icon size.
void paint(Graphics &) override
~UmsciLoudspeakersPaintComponent() override
void lookAndFeelChanged() override
Re-prerender all speaker drawables in the new look-and-feel colour.
void setSpeakerPosition(std::int16_t speakerId, const std::array< std::float_t, 6 > &position)
Updates a single speaker position and re-prerenders its drawable.
UmsciLoudspeakersPaintComponent()
void setSpeakerPositions(const std::map< std::int16_t, std::array< std::float_t, 6 > > &speakerPositions)
Replaces all speaker positions at once (e.g. on reconnect).
Abstract base class for all three overlaid visualisation layers in UmsciControlComponent.
ControlsSize
Visual size of source/speaker icons. Multiplier accessible via getControlsSizeMultiplier().
juce::Point< float > GetPointForRealCoordinate(const std::array< float, 3 > &realCoordinate)
Converts a 3D real-world coordinate to a 2D screen pixel point.
virtual void setControlsSize(ControlsSize size)
Updates the icon size; derived classes may override to re-prerender.
float getControlsSizeMultiplier() const
Returns a multiplier (e.g. 0.5 / 1.0 / 1.5) for S/M/L icon sizes.