#include "app.hpp" namespace rack { SVGKnob::SVGKnob() { shadow = new CircularShadow(); addChild(shadow); shadow->box.size = Vec(); tw = new TransformWidget(); addChild(tw); sw = new SVGWidget(); tw->addChild(sw); } void SVGKnob::setSVG(std::shared_ptr svg) { sw->setSVG(svg); tw->box.size = sw->box.size; box.size = sw->box.size; shadow->box.size = sw->box.size; shadow->box.pos = Vec(0, sw->box.size.y * 0.1); // shadow->box = shadow->box.grow(Vec(2, 2)); } void SVGKnob::step() { // Re-transform TransformWidget if dirty if (dirty) { float angle; if (isfinite(minValue) && isfinite(maxValue)) { angle = rescale(value, minValue, maxValue, minAngle, maxAngle); } else { angle = rescale(value, -1.0, 1.0, minAngle, maxAngle); angle = fmodf(angle, 2*M_PI); } tw->identity(); // Rotate SVG Vec center = sw->box.getCenter(); tw->translate(center); tw->rotate(angle); tw->translate(center.neg()); } FramebufferWidget::step(); } void SVGKnob::onChange(EventChange &e) { dirty = true; Knob::onChange(e); } } // namespace rack