| @@ -145,7 +145,6 @@ struct SVGKnob : Knob, FramebufferWidget { | |||||
| /** Not owned */ | /** Not owned */ | ||||
| TransformWidget *tw; | TransformWidget *tw; | ||||
| SVGWidget *sw; | SVGWidget *sw; | ||||
| CircularShadow *shadow; | |||||
| SVGKnob(); | SVGKnob(); | ||||
| void setSVG(std::shared_ptr<SVG> svg); | void setSVG(std::shared_ptr<SVG> svg); | ||||
| @@ -5,21 +5,6 @@ | |||||
| namespace rack { | namespace rack { | ||||
| enum ColorNames { | |||||
| COLOR_BLACK, | |||||
| COLOR_WHITE, | |||||
| COLOR_RED, | |||||
| COLOR_ORANGE, | |||||
| COLOR_YELLOW, | |||||
| COLOR_GREEN, | |||||
| COLOR_CYAN, | |||||
| COLOR_BLUE, | |||||
| COLOR_PURPLE, | |||||
| NUM_COLORS | |||||
| }; | |||||
| extern const NVGcolor colors[NUM_COLORS]; | |||||
| //////////////////// | //////////////////// | ||||
| // Knobs | // Knobs | ||||
| //////////////////// | //////////////////// | ||||
| @@ -286,6 +271,24 @@ struct Davies1900hRedKnob : Davies1900hKnob { | |||||
| } | } | ||||
| }; | }; | ||||
| struct Davies1900hLargeWhiteKnob : Davies1900hKnob { | |||||
| Davies1900hLargeWhiteKnob() { | |||||
| setSVG(SVG::load("res/ComponentLibrary/Davies1900hLargeWhite.svg")); | |||||
| } | |||||
| }; | |||||
| struct Davies1900hLargeBlackKnob : Davies1900hKnob { | |||||
| Davies1900hLargeBlackKnob() { | |||||
| setSVG(SVG::load("res/ComponentLibrary/Davies1900hLargeBlack.svg")); | |||||
| } | |||||
| }; | |||||
| struct Davies1900hLargeRedKnob : Davies1900hKnob { | |||||
| Davies1900hLargeRedKnob() { | |||||
| setSVG(SVG::load("res/ComponentLibrary/Davies1900hLargeRed.svg")); | |||||
| } | |||||
| }; | |||||
| struct Trimpot : SVGKnob { | struct Trimpot : SVGKnob { | ||||
| Trimpot() { | Trimpot() { | ||||
| box.size = Vec(17, 17); | box.size = Vec(17, 17); | ||||
| @@ -366,30 +369,49 @@ struct ValueLight : Light { | |||||
| float *value; | float *value; | ||||
| }; | }; | ||||
| template <int COLOR> | |||||
| struct ColorValueLight : ValueLight { | struct ColorValueLight : ValueLight { | ||||
| NVGcolor baseColor; | |||||
| void step() { | void step() { | ||||
| float v = sqrtBipolar(getf(value)); | float v = sqrtBipolar(getf(value)); | ||||
| color = nvgLerpRGBA(colors[COLOR_BLACK], colors[COLOR], v); | |||||
| color = baseColor; | |||||
| color.a = clampf(v, 0.0, 1.0); | |||||
| } | |||||
| }; | |||||
| struct RedValueLight : ColorValueLight { | |||||
| RedValueLight() { | |||||
| baseColor = nvgRGB(0xed, 0x2c, 0x24); | |||||
| } | } | ||||
| }; | }; | ||||
| typedef ColorValueLight<COLOR_RED> RedValueLight; | |||||
| typedef ColorValueLight<COLOR_YELLOW> YellowValueLight; | |||||
| typedef ColorValueLight<COLOR_GREEN> GreenValueLight; | |||||
| struct YellowValueLight : ColorValueLight { | |||||
| YellowValueLight() { | |||||
| baseColor = nvgRGB(0xf9, 0xdf, 0x1c); | |||||
| } | |||||
| }; | |||||
| struct GreenValueLight : ColorValueLight { | |||||
| GreenValueLight() { | |||||
| baseColor = nvgRGB(0x90, 0xc7, 0x3e); | |||||
| } | |||||
| }; | |||||
| template <int COLOR_POS, int COLOR_NEG> | |||||
| struct PolarityLight : ValueLight { | struct PolarityLight : ValueLight { | ||||
| NVGcolor posColor; | |||||
| NVGcolor negColor; | |||||
| void step() { | void step() { | ||||
| float v = sqrtBipolar(getf(value)); | float v = sqrtBipolar(getf(value)); | ||||
| if (v >= 0.0) | |||||
| color = nvgLerpRGBA(colors[COLOR_BLACK], colors[COLOR_POS], v); | |||||
| else | |||||
| color = nvgLerpRGBA(colors[COLOR_BLACK], colors[COLOR_NEG], -v); | |||||
| color = (v >= 0.0) ? posColor : negColor; | |||||
| color.a = clampf(fabsf(v), 0.0, 1.0); | |||||
| } | } | ||||
| }; | }; | ||||
| typedef PolarityLight<COLOR_GREEN, COLOR_RED> GreenRedPolarityLight; | |||||
| struct GreenRedPolarityLight : PolarityLight { | |||||
| GreenRedPolarityLight() { | |||||
| posColor = nvgRGB(0x90, 0xc7, 0x3e); | |||||
| negColor = nvgRGB(0xed, 0x2c, 0x24); | |||||
| } | |||||
| }; | |||||
| template <typename BASE> | template <typename BASE> | ||||
| struct LargeLight : BASE { | struct LargeLight : BASE { | ||||
| @@ -418,9 +440,9 @@ struct SmallLight : BASE { | |||||
| struct NKK : SVGSwitch, ToggleSwitch { | struct NKK : SVGSwitch, ToggleSwitch { | ||||
| NKK() { | NKK() { | ||||
| addFrame(SVG::load("res/ComponentLibrary/NKK0.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/NKK1.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/NKK2.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/NKK_0.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/NKK_1.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/NKK_2.svg")); | |||||
| sw->wrap(); | sw->wrap(); | ||||
| box.size = sw->box.size; | box.size = sw->box.size; | ||||
| } | } | ||||
| @@ -428,8 +450,8 @@ struct NKK : SVGSwitch, ToggleSwitch { | |||||
| struct CKSS : SVGSwitch, ToggleSwitch { | struct CKSS : SVGSwitch, ToggleSwitch { | ||||
| CKSS() { | CKSS() { | ||||
| addFrame(SVG::load("res/ComponentLibrary/CKSS0.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/CKSS1.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/CKSS_0.svg")); | |||||
| addFrame(SVG::load("res/ComponentLibrary/CKSS_1.svg")); | |||||
| sw->wrap(); | sw->wrap(); | ||||
| box.size = sw->box.size; | box.size = sw->box.size; | ||||
| } | } | ||||
| @@ -5,32 +5,36 @@ namespace rack { | |||||
| void Light::draw(NVGcontext *vg) { | void Light::draw(NVGcontext *vg) { | ||||
| NVGcolor colorOutline = nvgLerpRGBA(color, nvgRGBf(0.0, 0.0, 0.0), 0.5); | |||||
| NVGcolor bgColor = nvgRGBf(0.0, 0.0, 0.0); | |||||
| float radius = box.size.x / 2.0; | float radius = box.size.x / 2.0; | ||||
| float oradius = radius + 30.0; | |||||
| // Solid | // Solid | ||||
| nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
| nvgCircle(vg, radius, radius, radius); | nvgCircle(vg, radius, radius, radius); | ||||
| nvgFillColor(vg, color); | |||||
| nvgFillColor(vg, bgColor); | |||||
| nvgFill(vg); | nvgFill(vg); | ||||
| // Border | // Border | ||||
| nvgStrokeWidth(vg, 1.0); | nvgStrokeWidth(vg, 1.0); | ||||
| nvgStrokeColor(vg, colorOutline); | |||||
| nvgStrokeColor(vg, nvgTransRGBAf(bgColor, 0.5)); | |||||
| nvgStroke(vg); | nvgStroke(vg); | ||||
| // Glow | |||||
| // Inner glow | |||||
| nvgGlobalCompositeOperation(vg, NVG_LIGHTER); | nvgGlobalCompositeOperation(vg, NVG_LIGHTER); | ||||
| nvgFillColor(vg, color); | |||||
| nvgFill(vg); | |||||
| // Outer glow | |||||
| nvgBeginPath(vg); | |||||
| nvgRect(vg, radius - oradius, radius - oradius, 2*oradius, 2*oradius); | |||||
| NVGpaint paint; | NVGpaint paint; | ||||
| NVGcolor icol = color; | NVGcolor icol = color; | ||||
| icol.a = 0.1; | |||||
| icol.a *= 0.1; | |||||
| NVGcolor ocol = color; | NVGcolor ocol = color; | ||||
| ocol.a = 0.0; | ocol.a = 0.0; | ||||
| float oradius = radius + 30.0; | |||||
| paint = nvgRadialGradient(vg, radius, radius, radius, oradius, icol, ocol); | paint = nvgRadialGradient(vg, radius, radius, radius, oradius, icol, ocol); | ||||
| nvgFillPaint(vg, paint); | nvgFillPaint(vg, paint); | ||||
| nvgBeginPath(vg); | |||||
| nvgRect(vg, radius - oradius, radius - oradius, 2*oradius, 2*oradius); | |||||
| nvgFill(vg); | nvgFill(vg); | ||||
| } | } | ||||
| @@ -7,12 +7,6 @@ namespace rack { | |||||
| SVGKnob::SVGKnob() { | SVGKnob::SVGKnob() { | ||||
| padding = Vec(1, 1); | padding = Vec(1, 1); | ||||
| shadow = new CircularShadow(); | |||||
| shadow->blur = 5.0; | |||||
| shadow->box.pos = Vec(0, 1); | |||||
| // TODO Remove shadow entirely | |||||
| // addChild(shadow); | |||||
| tw = new TransformWidget(); | tw = new TransformWidget(); | ||||
| addChild(tw); | addChild(tw); | ||||
| @@ -23,31 +17,27 @@ SVGKnob::SVGKnob() { | |||||
| void SVGKnob::setSVG(std::shared_ptr<SVG> svg) { | void SVGKnob::setSVG(std::shared_ptr<SVG> svg) { | ||||
| sw->svg = svg; | sw->svg = svg; | ||||
| sw->wrap(); | sw->wrap(); | ||||
| tw->box.size = sw->box.size; | |||||
| box.size = sw->box.size; | |||||
| } | } | ||||
| void SVGKnob::step() { | void SVGKnob::step() { | ||||
| // Re-transform TransformWidget if dirty | // Re-transform TransformWidget if dirty | ||||
| if (dirty) { | if (dirty) { | ||||
| float angle = mapf(value, minValue, maxValue, minAngle, maxAngle); | float angle = mapf(value, minValue, maxValue, minAngle, maxAngle); | ||||
| tw->box.size = box.size; | |||||
| tw->identity(); | tw->identity(); | ||||
| // Resize SVG | |||||
| Vec scale = Vec(box.size.x / sw->box.size.x, box.size.y / sw->box.size.y); | |||||
| tw->scale(scale); | |||||
| // Rotate SVG | // Rotate SVG | ||||
| Vec center = sw->box.getCenter(); | Vec center = sw->box.getCenter(); | ||||
| tw->translate(center); | tw->translate(center); | ||||
| tw->rotate(angle); | tw->rotate(angle); | ||||
| tw->translate(center.neg()); | tw->translate(center.neg()); | ||||
| // Resize shadow | |||||
| shadow->box.size = box.size; | |||||
| } | } | ||||
| FramebufferWidget::step(); | FramebufferWidget::step(); | ||||
| } | } | ||||
| void SVGKnob::onChange() { | void SVGKnob::onChange() { | ||||
| dirty = true; | dirty = true; | ||||
| ParamWidget::onChange(); | |||||
| Knob::onChange(); | |||||
| } | } | ||||
| @@ -28,6 +28,7 @@ void SVGSwitch::onChange() { | |||||
| if (0 <= index && index < (int)frames.size()) | if (0 <= index && index < (int)frames.size()) | ||||
| sw->svg = frames[index]; | sw->svg = frames[index]; | ||||
| dirty = true; | dirty = true; | ||||
| ParamWidget::onChange(); | |||||
| } | } | ||||
| @@ -1,19 +0,0 @@ | |||||
| #include "components.hpp" | |||||
| namespace rack { | |||||
| const NVGcolor colors[NUM_COLORS] = { | |||||
| nvgRGB(0x00, 0x00, 0x00), | |||||
| nvgRGB(0xff, 0xff, 0xff), | |||||
| nvgRGB(0xed, 0x2c, 0x24), | |||||
| nvgRGB(0xf2, 0xb1, 0x20), | |||||
| nvgRGB(0xf9, 0xdf, 0x1c), | |||||
| nvgRGB(0x90, 0xc7, 0x3e), | |||||
| nvgRGB(0x22, 0xe6, 0xef), | |||||
| nvgRGB(0x29, 0xb2, 0xef), | |||||
| nvgRGB(0xd5, 0x2b, 0xed), | |||||
| }; | |||||
| } // namespace rack | |||||
| @@ -112,7 +112,7 @@ static void drawSVG(NVGcontext *vg, NSVGimage *svg) { | |||||
| void SVGWidget::wrap() { | void SVGWidget::wrap() { | ||||
| if (svg) { | |||||
| if (svg && svg->handle) { | |||||
| box.size = Vec(svg->handle->width, svg->handle->height); | box.size = Vec(svg->handle->width, svg->handle->height); | ||||
| } | } | ||||
| else { | else { | ||||