UNPKG

p5.plotsvg

Version:

A Plotter-Oriented SVG Exporter for p5.js

196 lines (175 loc) 6.72 kB
//========================================================= // USER INTERFACE let spineModeRadio, spineModeRadioLabel; let envModeRadio, envModeRadioLabel; let maxThicknessSlider, maxThicknessSliderLabel; let fitCurveSlider, fitCurveSliderLabel; let betaSlider, betaSliderLabel; let envEmphasisSlider, envEmphasisSliderLabel; let envContrastSlider, envContrastSliderLabel; let envScaleSlider, envScaleSliderLabel; let envOffsetSlider, envOffsetSliderLabel; let envStepSlider, envStepSliderLabel; let filterButton, clearButton, resetButton; function updateSliders(){ maxThicknessSliderLabel.html("Width Multiplier: " + nf(maxThicknessSlider.value(), 1, 3)); fitCurveSliderLabel.html("Spine Fit Error: " + nf(fitCurveSlider.value(), 1, 3)); betaSliderLabel.html("Envelope Smoothness: " + nf(betaSlider.value(), 1, 3)); envStepSliderLabel.html("Envelope Step: " + nf(envStepSlider.value(), 1, 3)); envEmphasisSliderLabel.html("Emphasis: " + nf(envEmphasisSlider.value(), 1, 3)); envContrastSliderLabel.html("Contrast: " + nf(envContrastSlider.value(), 1, 3)); envScaleSliderLabel.html("Scale: " + nf(envScaleSlider.value(), 1, 3)); envOffsetSliderLabel.html("Offset: " + nf(envOffsetSlider.value(), 1, 3)); } function createUserInterface(){ createSliders(); createSpineModeRadio(); createEnvelopeModeRadio(); createSpineModeRadio(); createButtons(); } //-------------------- function createSpineModeRadio(){ spineModeRadio = createRadio(); spineModeRadio.class('p5-radio'); spineModeRadio.position(7, 10); spineModeRadio.size(300); spineModeRadio.option(SPINE_MODE_LINEAR, 'Polyline'); spineModeRadio.option(SPINE_MODE_BEZIER, 'PolyBezier'); spineModeRadio.selected(String(SPINE_MODE_LINEAR)); spineModeRadio.elt.addEventListener('mousedown', (e) => e.stopPropagation()); spineModeRadio.changed(() => { SPINE_MODE = Number(spineModeRadio.value()); fitCurveSlider.elt.disabled = (SPINE_MODE != SPINE_MODE_BEZIER); }); fitCurveSlider.elt.disabled = (SPINE_MODE != SPINE_MODE_BEZIER); spineModeRadioLabel = createDiv('Spine Construction'); spineModeRadioLabel.position(220, 12); } //-------------------- function createEnvelopeModeRadio() { envModeRadio = createRadio(); envModeRadio.class('p5-radio'); envModeRadio.position(7, 30); envModeRadio.size(300); envModeRadio.option(ENV_INTERP_LINEAR, 'Linear'); envModeRadio.option(ENV_INTERP_BEZIER_JOHAN, 'CubicBezierJohan'); envModeRadio.selected(String(ENV_INTERP_LINEAR)); envModeRadio.elt.addEventListener('mousedown', (e) => e.stopPropagation()); envModeRadio.changed(() => { ENV_INTERP_MODE = Number(envModeRadio.value()); betaSlider.elt.disabled = (ENV_INTERP_MODE != ENV_INTERP_BEZIER_JOHAN); }); betaSlider.elt.disabled = (ENV_INTERP_MODE != ENV_INTERP_BEZIER_JOHAN); envModeRadioLabel = createDiv('Envelope Smoothing Type'); envModeRadioLabel.position(220, 32); } function setRadioOption(radio, valueToDisable, torf) { const inputs = radio.elt.querySelectorAll('input[type="radio"]'); for (let input of inputs) { if (input.value === String(valueToDisable)) { input.disabled = !torf; break; } } } //-------------------- function createSliders(){ let sy = 110; const dy = 20; envStepSlider = createSlider(0.25,20, 3, 0.25); envStepSlider.position(10, sy); envStepSlider.size(200); envStepSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); envStepSliderLabel = createDiv('Envelope Step'); envStepSliderLabel.position(220, sy); sy += dy; maxThicknessSlider = createSlider(1,100, 50, 1); maxThicknessSlider.position(10, sy); maxThicknessSlider.size(200); maxThicknessSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); maxThicknessSliderLabel = createDiv('Width Multiplier'); maxThicknessSliderLabel.position(220, sy); sy += dy; fitCurveSlider = createSlider(0.1,20, 4, 0.1); fitCurveSlider.position(10, sy); fitCurveSlider.size(200); fitCurveSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); fitCurveSliderLabel = createDiv('Spine Fit Error'); fitCurveSliderLabel.position(220, sy); sy += dy; betaSlider = createSlider(0,1, 0.25, 0.005); betaSlider.position(10, sy); betaSlider.size(200); betaSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); betaSliderLabel = createDiv('Envelope Smoothness'); betaSliderLabel.position(220, sy); sy += dy; envEmphasisSlider = createSlider(-1,1, 0.0, 0.005); envEmphasisSlider.position(10, sy); envEmphasisSlider.size(200); envEmphasisSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); envEmphasisSliderLabel = createDiv('Emphasis'); envEmphasisSliderLabel.position(220, sy); sy += dy; envContrastSlider = createSlider(-1,1, 0.0, 0.005); envContrastSlider.position(10, sy); envContrastSlider.size(200); envContrastSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); envContrastSliderLabel = createDiv('Contrast'); envContrastSliderLabel.position(220, sy); sy += dy; envScaleSlider = createSlider(0,2, 1, 0.005); envScaleSlider.position(10, sy); envScaleSlider.size(200); envScaleSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); envScaleSliderLabel = createDiv('Scale'); envScaleSliderLabel.position(220, sy); sy += dy; envOffsetSlider = createSlider(-1,1, 0, 0.005); envOffsetSlider.position(10, sy); envOffsetSlider.size(200); envOffsetSlider.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); envOffsetSliderLabel = createDiv('Offset'); envOffsetSliderLabel.position(220, sy); sy += dy; } //-------------------- function createButtons(){ let filterButton = createButton('Filter'); let clearButton = createButton('Clear'); let resetButton = createButton('Reset'); filterButton.position(10, 80); clearButton.position(60, 80); resetButton.position(110, 80); filterButton.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); clearButton.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); resetButton.elt.addEventListener( 'mousedown', (e) => e.stopPropagation()); filterButton.mousePressed(() => { filterCurrentPowerStroke(); }); clearButton.mousePressed(() => { clearCurrentPowerStroke(); }); resetButton.mousePressed(() => { envStepSlider.value(3); maxThicknessSlider.value(50); fitCurveSlider.value(4); betaSlider.value(0.25); envEmphasisSlider.value(0); envContrastSlider.value(0); envScaleSlider.value(1); envOffsetSlider.value(0); }); }