| 127 | } |
| 128 | |
| 129 | void FilterControl::updateFilterPath() { |
| 130 | auto drawRect = mVizRect.reduced(Utils::PADDING * 2, Utils::PADDING * 2); |
| 131 | |
| 132 | // Draw selected filter path |
| 133 | mFilterPath.clear(); |
| 134 | int resPadding = drawRect.getHeight() * 0.3f; // both width and height max size of resonance peak |
| 135 | float cutoffWidth = drawRect.getWidth() * |
| 136 | ParamRanges::FILT_CUTOFF.convertTo0to1(mSliderCutoff.getValue()); |
| 137 | float resHeight = |
| 138 | drawRect.getHeight() * 0.3f * ParamRanges::FILT_RESONANCE.convertTo0to1(mSliderResonance.getValue()); |
| 139 | |
| 140 | juce::Point<float> startPt = drawRect.getBottomLeft(); |
| 141 | juce::Point<float> midPt1, midPt2, midPt3, midPt4; |
| 142 | juce::Point<float> endPt = drawRect.getBottomRight(); |
| 143 | |
| 144 | switch (mFilterType.getSelectedId() - 1) { |
| 145 | case (Utils::FilterType::LOWPASS): |
| 146 | midPt1 = juce::Point<float>(drawRect.getX(), drawRect.getY() + resPadding); |
| 147 | midPt2 = juce::Point<float>(drawRect.getX() + cutoffWidth - resPadding / 2, drawRect.getY() + resPadding); |
| 148 | midPt3 = juce::Point<float>(drawRect.getX() + cutoffWidth, drawRect.getY() + (resPadding - resHeight)); |
| 149 | midPt4 = juce::Point<float>(drawRect.getX() + cutoffWidth + resPadding / 2, drawRect.getBottom()); |
| 150 | break; |
| 151 | case (Utils::FilterType::HIGHPASS): |
| 152 | cutoffWidth = drawRect.getWidth() - cutoffWidth; // Reverse for HP |
| 153 | midPt1 = juce::Point<float>(drawRect.getRight() - cutoffWidth - resPadding / 2, drawRect.getBottom()); |
| 154 | midPt2 = juce::Point<float>(drawRect.getRight() - cutoffWidth, drawRect.getY() + (resPadding - resHeight)); |
| 155 | midPt3 = juce::Point<float>(drawRect.getRight() - cutoffWidth + resPadding / 2, drawRect.getY() + resPadding); |
| 156 | midPt4 = juce::Point<float>(drawRect.getRight(), drawRect.getY() + resPadding); |
| 157 | break; |
| 158 | case (Utils::FilterType::BANDPASS): |
| 159 | midPt1 = juce::Point<float>(drawRect.getCentreX() - cutoffWidth / 2 - resPadding / 2, |
| 160 | drawRect.getBottom()); |
| 161 | midPt2 = juce::Point<float>(drawRect.getCentreX() - cutoffWidth / 2, drawRect.getY() + (resPadding - resHeight)); |
| 162 | midPt3 = juce::Point<float>(drawRect.getCentreX() + cutoffWidth / 2, drawRect.getY() + (resPadding - resHeight)); |
| 163 | midPt4 = juce::Point<float>(drawRect.getCentreX() + cutoffWidth / 2 + resPadding / 2, |
| 164 | drawRect.getBottom()); |
| 165 | break; |
| 166 | case (Utils::FilterType::NO_FILTER): |
| 167 | midPt1 = juce::Point<float>(drawRect.getTopLeft().translated(0, resPadding)); |
| 168 | midPt2 = juce::Point<float>(drawRect.getTopLeft().translated(10, resPadding)); |
| 169 | midPt3 = juce::Point<float>(drawRect.getTopRight().translated(-10, resPadding)); |
| 170 | midPt4 = juce::Point<float>(drawRect.getTopRight().translated(0, resPadding)); |
| 171 | break; |
| 172 | } |
| 173 | |
| 174 | // I'm not happy with this either, clean it up if possible |
| 175 | midPt1.setXY(juce::jlimit(drawRect.getX(), drawRect.getRight(), midPt1.x), juce::jlimit(drawRect.getY(), drawRect.getBottom(), midPt1.y)); |
| 176 | midPt2.setXY(juce::jlimit(drawRect.getX(), drawRect.getRight(), midPt2.x), juce::jlimit(drawRect.getY(), drawRect.getBottom(), midPt2.y)); |
| 177 | midPt3.setXY(juce::jlimit(drawRect.getX(), drawRect.getRight(), midPt3.x), juce::jlimit(drawRect.getY(), drawRect.getBottom(), midPt3.y)); |
| 178 | midPt4.setXY(juce::jlimit(drawRect.getX(), drawRect.getRight(), midPt4.x), juce::jlimit(drawRect.getY(), drawRect.getBottom(), midPt4.y)); |
| 179 | |
| 180 | // Make path from points |
| 181 | if (startPt.x < midPt1.x) startPt.x = midPt1.x + 5; |
| 182 | if (endPt.x > midPt4.x) endPt.x = midPt4.x - 5; |
| 183 | mFilterPath.startNewSubPath(startPt); |
| 184 | mFilterPath.lineTo(midPt1); |
| 185 | mFilterPath.lineTo(midPt2); |
| 186 | mFilterPath.lineTo(midPt3); |