computerscare-vcv-modules

computerscare modules for VCV Rack
Log | Files | Refs

commit b6f549faf35c99b44c3be94c16b716d52cd5b57d
parent e21586d462dd0a4d6bd81ce5dcf4716a610c7a62
Author: Adam M <aemalone@gmail.com>
Date:   Fri, 10 Apr 2020 21:01:20 -0500

drolypaw lives

Diffstat:
Mplugin.json | 5+++++
Ares/computerscare-iso-button-small-down-grey.svg | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ares/computerscare-iso-button-small-up-grey.svg | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/Computerscare.cpp | 3+++
Msrc/Computerscare.hpp | 32++++++++++++++++++++++++++++++--
Msrc/ComputerscareBolyPuttons.cpp | 13++++++++++++-
Asrc/ComputerscareDrolyPaw.cpp | 360+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/ComputerscareHorseADoodleDoo.cpp | 2+-
Msrc/drawFunctions.hpp | 6+-----
Asrc/pointFunctions.hpp | 38++++++++++++++++++++++++++++++++++++++
10 files changed, 626 insertions(+), 9 deletions(-)

diff --git a/plugin.json b/plugin.json @@ -95,6 +95,11 @@ "name":"Horse A Doodle Doo", "description":"Rhythm generator", "tags":["Sequencer","Clock Modulator","Polyphonic"] + }, + {"slug":"computerscare-droly-paw", + "name":"Droly Paw", + "description":"Draws weird things", + "tags":["Visualization","Polyphonic","Utility"] } ] } \ No newline at end of file diff --git a/res/computerscare-iso-button-small-down-grey.svg b/res/computerscare-iso-button-small-down-grey.svg @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="8mm" + height="8mm" + viewBox="0 0 8 8" + version="1.1" + id="svg837" + inkscape:version="0.92.2 5c3e80d, 2017-08-06" + sodipodi:docname="computerscare-iso-button-small-down-grey.svg"> + <defs + id="defs831"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="-15.502741 : -0.68761461 : 1" + inkscape:vp_y="0 : 1935.9757 : 0" + inkscape:vp_z="25.090656 : 9.2983744 : 1" + inkscape:persp3d-origin="19.059341 : -5.6235546 : 1" + id="perspective1382" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="15.839192" + inkscape:cx="1.5446239" + inkscape:cy="12.208888" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1440" + inkscape:window-height="855" + inkscape:window-x="0" + inkscape:window-y="1" + inkscape:window-maximized="1" + inkscape:snap-object-midpoints="false" + inkscape:snap-others="false" + inkscape:object-nodes="false" + inkscape:snap-nodes="false" /> + <metadata + id="metadata834"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-289)"> + <path + style="fill:#42595b;fill-opacity:1;stroke:#000000;stroke-width:0.17936714px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 7.6997832,291.09096 c -5.6745886,-0.0497 -5.7223016,0.0508 -5.7223016,0.0508 l 0.016704,5.62316 5.7676146,0.0158 z" + id="path1551" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.19468118px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 1.9906471,296.77083 Z" + id="path2175" + inkscape:connector-curvature="0" /> + <path + style="fill:#1d3335;fill-opacity:1;stroke:#000000;stroke-width:0.19468118px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 2.7583609,296.71643 -0.047277,-4.96564 v 0 l -0.7168975,-0.72599 -0.1988388,3e-4 0.1988391,5.74019 v 0 z" + id="path2177" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccccccc" /> + <path + style="fill:#899e99;fill-opacity:1;stroke:#000000;stroke-width:0.19468118px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 1.9941859,291.0248 c 1.9018658,0.0221 3.8037316,0.044 5.7055973,0.0662 l 0.00699,0.62149 -4.9956948,0.0383 z" + id="path2181" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + </g> +</svg> diff --git a/res/computerscare-iso-button-small-up-grey.svg b/res/computerscare-iso-button-small-up-grey.svg @@ -0,0 +1,84 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="8mm" + height="8mm" + viewBox="0 0 8 8" + version="1.1" + id="svg837" + inkscape:version="0.92.2 5c3e80d, 2017-08-06" + sodipodi:docname="computerscare-iso-button-small-up-grey.svg"> + <defs + id="defs831"> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="-15.502741 : -0.68761461 : 1" + inkscape:vp_y="0 : 1935.9757 : 0" + inkscape:vp_z="25.090656 : 9.2983744 : 1" + inkscape:persp3d-origin="19.059341 : -5.6235546 : 1" + id="perspective1382" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="15.839192" + inkscape:cx="13.469425" + inkscape:cy="11.6384" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1440" + inkscape:window-height="855" + inkscape:window-x="0" + inkscape:window-y="1" + inkscape:window-maximized="1" + inkscape:snap-nodes="false" /> + <metadata + id="metadata834"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-289)"> + <path + style="fill:#3c4f4c;fill-opacity:1;stroke:#000000;stroke-width:0.18299402;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 0.13498472,296.1192 2.17320148,0.63818 5.5061789,0.0256 -0.1796201,-5.60982 c -0.4937595,-0.16251 -1.0888666,-0.94602 -1.760248,-0.93658" + id="path1553" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccc" /> + <path + style="fill:#009b00;fill-opacity:1;stroke:#000000;stroke-width:0.18299402;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 5.9251288,296.04418 c 0.368731,0.18222 0.4538673,0.15991 0.6544761,0.35027 l 1.2013884,0.36992" + id="path1555" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccc" /> + <path + style="fill:#92a19e;fill-opacity:1;stroke:#000000;stroke-width:0.18299402;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 5.9048249,290.2249 c -5.71885349,-0.0513 -5.75010404,-0.0682 -5.75010404,-0.0682 v 0 5.92022 l 5.81260524,0.0171 z" + id="path1551" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cscccc" /> + </g> +</svg> diff --git a/src/Computerscare.cpp b/src/Computerscare.cpp @@ -21,9 +21,12 @@ void init(Plugin *p) { p->addModel(modelComputerscareFolyPace); p->addModel(modelComputerscareBlank); p->addModel(modelComputerscareStolyFickPigure); + p->addModel(modelComputerscareDrolyPaw); p->addModel(modelComputerscareGolyPenerator); p->addModel(modelComputerscareMolyPatrix); p->addModel(modelComputerscareHorseADoodleDoo); + + } diff --git a/src/Computerscare.hpp b/src/Computerscare.hpp @@ -43,6 +43,7 @@ extern Model *modelComputerscareGolyPenerator; extern Model *modelComputerscareMolyPatrix; extern Model *modelComputerscareHorseADoodleDoo; +extern Model *modelComputerscareDrolyPaw; static const NVGcolor COLOR_COMPUTERSCARE_LIGHT_GREEN = nvgRGB(0xC0, 0xE7, 0xDE); static const NVGcolor COLOR_COMPUTERSCARE_GREEN = nvgRGB(0x24, 0xc9, 0xa6); @@ -126,11 +127,37 @@ struct IsoButton : SvgSwitch { } }; struct SmallIsoButton : app::SvgSwitch { + bool disabled=true; + bool lastDisabled=false; + std::vector<std::shared_ptr<Svg>> enabledFrames; + std::vector<std::shared_ptr<Svg>> disabledFrames; + SmallIsoButton() { - addFrame(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-iso-button-small-up.svg"))); - addFrame(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-iso-button-small-down.svg"))); + enabledFrames.push_back(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-iso-button-small-up.svg"))); + enabledFrames.push_back(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-iso-button-small-down.svg"))); + + disabledFrames.push_back(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-iso-button-small-up-grey.svg"))); + disabledFrames.push_back(APP->window->loadSvg(asset::plugin(pluginInstance, "res/computerscare-iso-button-small-down-grey.svg"))); + + + //addFrame(enabledFrames[0]); + //addFrame(enabledFrames[1]); shadow->opacity = 0.f; } + + void draw(const DrawArgs& args) override { + if (disabled != lastDisabled) { + DEBUG("AH HA!!!"); + frames.empty(); + addFrame(disabled ? disabledFrames[0] : enabledFrames[0]); + addFrame(disabled ? disabledFrames[1] : enabledFrames[1]); + + //setSvg(candidate ? disabledSvg : enabledSvg); + dirtyValue = -20.f; + lastDisabled = disabled; + } + SvgSwitch::draw(args); + } }; struct ComputerscareIsoThree : app::SvgSwitch { ComputerscareIsoThree() { @@ -477,5 +504,6 @@ struct SmallLetterDisplay : Widget { } }; +#include "pointFunctions.hpp" #include "drawFunctions.hpp" #include "ComputerscarePolyModule.hpp" diff --git a/src/ComputerscareBolyPuttons.cpp b/src/ComputerscareBolyPuttons.cpp @@ -97,7 +97,7 @@ struct ComputerscareBolyPuttons : ComputerscarePolyModule { json_object_set_new(rootJ, "radioMode", json_boolean(radioMode)); json_object_set_new(rootJ, "momentaryMode", json_boolean(momentary)); return rootJ; - } + } void onRandomize() override { if (radioMode) { @@ -175,6 +175,17 @@ struct ComputerscareBolyPuttons : ComputerscarePolyModule { }; +struct DisableableParamWidget : ParamWidget { + ComputerscarePolyModule *module; + bool disabled; + int channel; + void step() override { + if (module) { + disabled = channel > module->polyChannels - 1; + } + ParamWidget::step(); + } +}; struct ComputerscareBolyPuttonsWidget : ModuleWidget { ComputerscareBolyPuttonsWidget(ComputerscareBolyPuttons *module) { diff --git a/src/ComputerscareDrolyPaw.cpp b/src/ComputerscareDrolyPaw.cpp @@ -0,0 +1,360 @@ +#include <string.h> +#include "plugin.hpp" +#include "Computerscare.hpp" +#include "dtpulse.hpp" + + +static const int BUFFER_SIZE = 512; + + +struct DrolyPaw : Module { + enum ParamIds { + TIME_PARAM, + TRIM, + OFFSET, + SCRAMBLE, + DRAW_MODE, + NUM_PARAMS + }; + enum InputIds { + X_INPUT, + SCRAMBLE_INPUT, + NUM_INPUTS + }; + enum OutputIds { + NUM_OUTPUTS + }; + enum LightIds { + NUM_LIGHTS + }; + + float bufferX[16][BUFFER_SIZE] = {}; + int cmap[16]; + int channelsX = 0; + int bufferIndex = 0; + int frameIndex = 0; + int cnt = 0; + float lastScramble = 0; + + int A = 31; + int B = 32; + int C = 29; + int D = 2; + + + DrolyPaw() { + config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); + const float timeBase = (float) BUFFER_SIZE / 6; + + for(int i = 0; i < 16; i++) { + cmap[i]=i; + } + + configParam(TIME_PARAM, 6.f, 16.f, 14.f, "Time", " ms/div", 1 / 2.f, 1000 * timeBase); + + configParam(TRIM, -2.f, 2.f, 0.2f, "Input Trim"); + configParam(OFFSET, -5.f, 5.f, 0.f, "Input Offset", " Volts"); + + configParam(SCRAMBLE, -10.f, 10.f, 0.f, "Scrambling"); + configParam(DRAW_MODE,0.f,64.f,0.f,"Draw Mode"); + + } + + void onReset() override { + //std::memset(bufferX, 0, sizeof(bufferX)); + } + void updateScramble(float v) { + for(int i = 0; i < 16; i++) { + cmap[i] = (i*A+B+(int)std::floor(v*1010.1))%16; + } + } + void checkScramble() { + float xx = params[SCRAMBLE].getValue(); + if(lastScramble != xx) { + lastScramble= xx; + updateScramble(xx); + } + } + void process(const ProcessArgs &args) override { + // Modes + // Compute time + float deltaTime = std::pow(2.f, -params[TIME_PARAM].getValue()); + + int frameCount = (int) std::ceil(deltaTime * args.sampleRate); + + // Set channels + int channelsX = inputs[X_INPUT].getChannels(); + if (channelsX != this->channelsX) { + std::memset(bufferX, 0, sizeof(bufferX)); + this->channelsX = channelsX; + } + + if(cnt > 4101) { + + checkScramble(); + cnt = 0; + } + cnt++; + // Add frame to buffer + if (bufferIndex < BUFFER_SIZE) { + if (++frameIndex > frameCount) { + frameIndex = 0; + float trimVal = params[TRIM].getValue(); + float offsetVal = params[OFFSET].getValue(); + + if (inputs[X_INPUT].isConnected()) { + for (int c = 0; c < 16; c++) { + //bufferX[c][bufferIndex] = inputs[X_INPUT].getVoltage(std::min(cmap[c], this->channelsX)) * trimVal + offsetVal + 99 + (1071 * cmap[c]) % 19; + //bufferX[c][bufferIndex]=inputs[X_INPUT].getVoltage(cmap[c]); + //bufferX[c][bufferIndex]=inputs[X_INPUT].getVoltage(c); + bufferX[c][bufferIndex]=inputs[X_INPUT].getVoltage(c)*trimVal+offsetVal; + } + } + else { + for (int c = 0; c < 16; c++) { + bufferX[c][bufferIndex] = offsetVal + 99 + (1071 * cmap[c]) % 19; + } + } + + bufferIndex++; + } + } + + // Don't wait for trigger if still filling buffer + if (bufferIndex < BUFFER_SIZE) { + return; + } + + // Trigger immediately if external but nothing plugged in, or in Lissajous mode + if (true) { + trigger(); + return; + } + + frameIndex++; + + + } + + void trigger() { + bufferIndex = 0; + frameIndex = 0; + } +}; + + + +struct DrolyPawDisplay : TransparentWidget { + DrolyPaw *module; + + + DrolyPawDisplay() { + } +void drawThingie(const DrawArgs &args, float buffer[16][BUFFER_SIZE]) { + DrawHelper draw = DrawHelper(args.vg); + Points pts = Points(); + if(module->params[DrolyPaw::DRAW_MODE].getValue()==0) { + pts.triangle(Vec(60,60),Vec(buffer[0][0],buffer[1][0])); + + pts.offset(Vec(67.5,190)); + for(int i = 0; i < 4; i++) { + pts.offset(Vec(buffer[2][0],buffer[3][0])); + draw.drawShape(pts.get()); + } + + } +} +void drawThingie(const DrawArgs &args) { + +} + void drawStickFigure(const DrawArgs &args, float A, float B, float C, float D, float E, float F, float G, float H, float I, float J, float K, float L, float M, float N, float O, float P) { + + nvgStrokeColor(args.vg, COLOR_COMPUTERSCARE_GREEN); + + nvgLineJoin(args.vg, NVG_ROUND); + + float h = 0.5 + 0.25 * sin(C / 2) + 0.25 * sin(K / 3); //face hue + float s = 0.5 + 0.32 * sin(B / 3 - 33.21 - D / 2); //face saturation + float l = 0.5 + 0.35 * sin(E / 2); //face lightness + + NVGcolor faceColor = nvgHSLA(h, s, l, 0xff); + + nvgFillColor(args.vg, faceColor); + nvgStrokeWidth(args.vg, 3.2); + + float size = 1+sin(O-29)/4; + + //crotch + float cx = 62*(1+(sin(E+F)-sin(P+O/2+50))/40000); + float cy = 210*(1+(sin(A+G-12)-sin(P+H/2))/11000); + + //thigh spread, length, direction + float thighSpread = (2+sin(J+I+K)-sin(A-N/2))/4; + float thighLength = 50*(1+(sin(C-100+F+K*2)+sin(C+L-10))/6); + float thighDirection = (sin(J+O-211)-sin(P*2+I)-sin(B+K))/2; + + + //ankle spread,length,direction + float ankleSpread = (2+sin(O-B)/2+sin(F+2)/2+sin(P-E-D+19.2))/13; + float ankleLength = thighLength*(1+(sin(F+A+J-K/2+9))/9); + float ankleDirection = 3*M_PI/2+(3+sin(J+M-L-101)-sin(P-B+22)-sin(H))/8; + + float leftKneeArg = 3*M_PI/2 +thighDirection + thighSpread; + float rightKneeArg = 3*M_PI/2 +thighDirection - thighSpread; + + + float leftAnkleArg = ankleDirection+ankleSpread; + float rightAnkleArg = ankleDirection-ankleSpread; + + + float leftKneeX=cx+thighLength*cos(leftKneeArg); + float leftKneeY=cy-thighLength*sin(leftKneeArg); + + float leftAnkleX = leftKneeX+ankleLength*cos(leftAnkleArg); + float leftAnkleY = leftKneeY-ankleLength*sin(leftAnkleArg); + + float rightKneeX=cx+thighLength*cos(rightKneeArg); + float rightKneeY=cy-thighLength*sin(rightKneeArg); + + float rightAnkleX = rightKneeX+ankleLength*cos(rightAnkleArg); + float rightAnkleY = rightKneeY-ankleLength*sin(rightAnkleArg); + + + nvgBeginPath(args.vg); + + + nvgMoveTo(args.vg, leftAnkleX,leftAnkleY); + nvgLineTo(args.vg, leftKneeX,leftKneeY); + nvgLineTo(args.vg, cx,cy); + nvgLineTo(args.vg, rightKneeX,rightKneeY); + nvgLineTo(args.vg, rightAnkleX,rightAnkleY); + + //nvgClosePath(args.vg); + nvgStroke(args.vg); + + + //torso length,direction + float torsoLength=thighLength*(1.4+(sin(A-12))/4); + float torsoDirection=M_PI/2+sin(D)/2; + + float neckX = cx+torsoLength*cos(torsoDirection); + float neckY = cy-torsoLength*sin(torsoDirection); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg,cx,cy); + nvgLineTo(args.vg,neckX,neckY); + nvgStroke(args.vg); + + float armLength=torsoLength*(2+(sin(N+14)-sin(P-L-3))/2)/4; + float forearmLength=armLength*(1+(2+(sin(F+B+2)-sin(E)))/300); + float armDirection=3*M_PI/2+0.2*(sin(C-M)); + float armSpread=sin(B+P-A)+sin(N-J); + + float leftElbowArg=armDirection+armSpread; + float rightElbowArg=armDirection-armSpread; + + float leftHandArg=sin(E+22+A-4); + float rightHandArg=sin(F+22-B); + + float leftElbowX = neckX+armLength*cos(leftElbowArg); + float leftElbowY = neckY-armLength*sin(leftElbowArg); + + float leftHandX=leftElbowX+forearmLength*cos(leftHandArg); + float leftHandY=leftElbowY-forearmLength*sin(leftHandArg); + + float rightElbowX = neckX+armLength*cos(rightElbowArg); + float rightElbowY = neckY-armLength*sin(rightElbowArg); + + float rightHandX=rightElbowX+forearmLength*cos(rightHandArg); + float rightHandY=rightElbowY-forearmLength*sin(rightHandArg); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg,neckX,neckY); + nvgLineTo(args.vg,leftElbowX,leftElbowY); + nvgLineTo(args.vg,leftHandX,leftHandY); + nvgStroke(args.vg); + + nvgBeginPath(args.vg); + nvgMoveTo(args.vg,neckX,neckY); + nvgLineTo(args.vg,rightElbowX,rightElbowY); + nvgLineTo(args.vg,rightHandX,rightHandY); + nvgStroke(args.vg); + + float headHeight = torsoLength*(0.5+sin(H-E-I-D)/9-sin(F+B-C+E)/7); + float headWidth = headHeight*(0.6+sin(I+D-M/2)/7+sin(G/2+J-10)/6); + float headAngle = M_PI/2 + (sin(C+A)/6+sin(D+G)/9); + + float headRotation=sin(C+A)/2+sin(M/2)/3; + + nvgBeginPath(args.vg); + + nvgTranslate(args.vg, neckX, neckY); + nvgRotate(args.vg,headRotation); + nvgEllipse(args.vg, 0,-headHeight,headWidth,headHeight); + + nvgFill(args.vg); + nvgStroke(args.vg); + + + nvgResetScissor(args.vg); + //nvgRestore(args.vg); + } + + void draw(const DrawArgs &args) override { + if (!module) { + drawThingie(args); + } + else { + drawThingie(args, module->bufferX); + } + } +}; + + + + +struct DrolyPawWidget : ModuleWidget { + DrolyPawWidget(DrolyPaw *module) { + setModule(module); + + box.size = Vec(9 * 15, 380); + { + ComputerscareSVGPanel *panel = new ComputerscareSVGPanel(); + panel->box.size = box.size; + panel->setBackground(APP->window->loadSvg(asset::plugin(pluginInstance, "res/ComputerscareFolyPacePanel.svg"))); + addChild(panel); + + } + + { + DrolyPawDisplay *display = new DrolyPawDisplay(); + display->module = module; + display->box.pos = Vec(0, 0); + display->box.size = Vec(box.size.x, box.size.y); + addChild(display); + } + + addInput(createInput<PointingUpPentagonPort>(Vec(1, 353), module, DrolyPaw::X_INPUT)); + addParam(createParam<SmallKnob>(Vec(31, 357), module, DrolyPaw::TRIM)); + addParam(createParam<SmoothKnob>(Vec(51, 353), module, DrolyPaw::OFFSET)); + + addParam(createParam<ScrambleKnob>(Vec(81, 357), module, DrolyPaw::SCRAMBLE)); + + + } + void drawShadow(const DrawArgs& args) { + DEBUG("my draw shadow has been called"); + nvgBeginPath(args.vg); + float r = 20; // Blur radius + float c = 20; // Corner radius + math::Vec b = math::Vec(-10, 30); // Offset from each corner + nvgRect(args.vg, b.x - r, b.y - r, box.size.x - 2 * b.x + 2 * r, box.size.y - 2 * b.y + 2 * r); + NVGcolor shadowColor = nvgRGBAf(120, 0, 0, 0.7); + NVGcolor transparentColor = nvgRGBAf(120, 0, 0, 0); + nvgFillPaint(args.vg, nvgBoxGradient(args.vg, b.x, b.y, box.size.x - 2 * b.x, box.size.y - 2 * b.y, c, r, shadowColor, transparentColor)); + nvgFill(args.vg); + } +}; + + +Model *modelComputerscareDrolyPaw = createModel<DrolyPaw, DrolyPawWidget>("computerscare-droly-paw"); diff --git a/src/ComputerscareHorseADoodleDoo.cpp b/src/ComputerscareHorseADoodleDoo.cpp @@ -70,7 +70,7 @@ struct HorseSequencer { newSeq.push_back(val < (density - 0.5) * 4 * 2 ? 1 : 0); newCV.push_back(cvRoot + (cvVal + 4) / .8); } - printVector(newSeq); + //printVector(newSeq); absoluteSequence = newSeq; cvSequence = newCV; } diff --git a/src/drawFunctions.hpp b/src/drawFunctions.hpp @@ -8,16 +8,12 @@ struct DrawHelper { DrawHelper(NVGcontext* ctx) { vg = ctx; } - void drawShape(std::vector<Vec> points, NVGcolor fillColor) { + void drawShape(std::vector<Vec> points, NVGcolor fillColor=COLOR_COMPUTERSCARE_PINK) { drawShape(points, fillColor, COLOR_COMPUTERSCARE_TRANSPARENT, 0.f); - } void drawShape(std::vector<Vec> points, NVGcolor fillColor, NVGcolor strokeColor) { drawShape(points, fillColor, strokeColor, 1.f); - } - - void drawShape(std::vector<Vec> points, NVGcolor strokeColor, float thickness) { drawShape(points, COLOR_COMPUTERSCARE_TRANSPARENT, strokeColor, thickness); } diff --git a/src/pointFunctions.hpp b/src/pointFunctions.hpp @@ -0,0 +1,37 @@ +#pragma once + +namespace rack { +namespace app { +struct Points { + + std::vector<Vec> points; + Points() { + + } + + void grid(int numx,int numy, Vec size) { + int N = numx*numy; + points.resize(N); + for(int i = 0; i < N; i++) { + points[i] = Vec((i%numx)*size.x,(i-i%numx)/numx*size.y); + } + } + void triangle(Vec lengths, Vec angles) { + points.resize(3); + points[0] = Vec(0,0); + Vec b = Vec(lengths.x*cos(angles.x),lengths.x*sin(angles.x)); + Vec cMinusB = Vec(lengths.y*cos(angles.y),lengths.y*sin(angles.y)); + points[1] = b; + points[2] = b.plus(cMinusB); + } + void offset(Vec dz) { + for(unsigned int i = 0; i < points.size(); i++) { + points[i] = points[i].plus(dz); + } + } + std::vector<Vec> get() { + return points; + } +}; +} +} +\ No newline at end of file