toolkit/jb/toolkit.js (486 lines of code) (raw):
/* Rpd.channeltype('jb/config', {
show: function(cfg) { return cfg ? '[Config]' : '[No Config]'; }
}); */
Rpd.channeltype('jb/darkmatter', { show: function(v) { return (v == 'dark') ? 'Dark Matter' : 'Light Matter' } });
Rpd.channeltype('jb/image', {
show: function(img) { return img ? '[Image]' : '[No Image]'; }
});
Rpd.channeltype('jb/integer', {
allow: [ 'util/number' ],
default: 0,
readonly: true,
accept: function(val) {
if (val === Infinity) return true;
var parsed = parseFloat(val);
return !isNaN(parsed) && isFinite(parsed);
},
adapt: function(val) { return Math.floor(parseFloat(val)); }
});
Rpd.channeltype('jb/noise-step', {
allow: ['util/wholenumber'],
adapt : function(val) { return val < 1 ? 1 : val; }
});
Rpd.channeltype('jb/brightness', {
allow: ['util/wholenumber'],
adapt : function(val) { return val > 255 ? 255 : val; }
});
Rpd.channeltype('jb/palette', { show: howMuch('color', 'colors') });
Rpd.channeltype('jb/logo', { show: function(logo) { return logo.product + ', ' + logo.x + ', '+ logo.y; } });
Rpd.channeltype('jb/product', { });
Rpd.channeltype('jb/drawable', {
allow: [ 'jb/darkmatter' ],
show: function(v) { return (v && v !== 'dark') ? '<Drawable>' : '<Empty>'; }
});
Rpd.channeltype('jb/voronoi', { show: function(v) { return v ? '<Voronoi>' : '<Empty>'; } });
Rpd.channeltype('jb/point-data', { show: howMuch('point', 'points') });
Rpd.channeltype('jb/layers', {
show: function(v) {
return howMuch('layer', 'layers')(v.values);
}
});
Rpd.channeltype('jb/angle', {
allow: [ 'util/number' ],
show: function(v) { return Math.floor(v * (180 / Math.PI)) + '°'; }
});
var PIXELS_COUNT_FACTOR = 4; // one pixel is four elements in the array
Rpd.channeltype('jb/pixels', {
show: function(pixels) {
if (!pixels) return '<None>';
return pixels.values && pixels.values.length
? (Math.floor(pixels.values.length / PIXELS_COUNT_FACTOR / 100) / 10) + 'kpx'
: '0px';
/* return pixels.width + 'x' + pixels.height + ', ' +
((pixels.values && pixels.values.length)
? (Math.floor(pixels.values.length / PIXELS_COUNT_FACTOR / 100) / 10) + 'kpx'
: '0px'); */
}
});
function adaptToOne(val) {
if ( val < 0 ) {
return 0;
} else if (val > 1) {
return 1;
} else {
return val;
}
}
/* Rpd.nodetype('jb/config', {
inlets: {
'width': { type: 'jb/integer', 'default': window.innerWidth },
'height': { type: 'jb/integer', 'default': window.innerHeight },
'srcPixels': { type: 'jb/pixels', 'default': null },
'bgcolor': { type: 'util/color', 'default': _rgb(24, 24, 24) },
'palette': { type: 'jb/palette' },
'logo': { type: 'jb/logo' },
'maxSquareSize': { type: 'jb/integer', 'default': 15, name: 'squareSize' },
'chaos': { type: 'util/number', 'default': 0.5 },
'tmp' : {type: 'util/number'},
'step': { type: 'jb/integer', 'default': 16 }
},
outlets: {
'config': { type: 'jb/config' }
},
process: function(inlets) {
return {
config: inlets
};
}
}); */
Rpd.nodetype('jb/clear', {
// title: 'Dark Matter',
title: 'Clear',
inlets: {
trigger: { type: 'jb/darkmatter', default: 'dark', hidden: true }
},
outlets: {
clear: { type: 'jb/darkmatter' }
},
process: function() {
return { 'clear': 'dark' };
}
});
Rpd.nodetype('jb/preview', {
title: 'Preview',
inlets: {
layers: { type: 'jb/layers', 'default': [] }
},
outlets: {
image: { type: 'jb/image', 'default': null }
},
process: function(inlets) {
var config = {};
config.layers = inlets.layers;
window.updateSketchConfig(config);
return { image: {} };
}
});
Rpd.nodetype('jb/rorschach', function() {
var refreshSketch = initHRorschachSketch();
return {
title: 'H-Rorschach',
inlets: {
'pixels': { type: 'jb/pixels' }
},
outlets: {
'pixels': { type: 'jb/pixels' }
},
process: function(inlets) {
if (!inlets.pixels) return;
return { 'pixels': refreshSketch(inlets) };
}
};
});
// FIXME: make an option for rorshach node
Rpd.nodetype('jb/rorschach-vertical', function() {
var refreshSketch = initVRorschachSketch();
return {
title: 'V-Rorschach',
inlets: {
'pixels': { type: 'jb/pixels' }
},
outlets: {
'pixels': { type: 'jb/pixels' }
},
process: function(inlets) {
if (!inlets.pixels) return;
return { 'pixels': refreshSketch(inlets) };
}
};
});
Rpd.nodetype('jb/image', function() {
var refreshSketch = initCustomBackgroundSketch();
return {
inlets: {
file: { type: 'core/any', hidden: true },
},
outlets: {
pixels: { type: 'jb/pixels' }
},
process: function(inlets) {
return { 'pixels': refreshSketch(inlets) };
}
};
});
Rpd.nodetype('jb/save', {
title: 'Save Image',
inlets: { 'image': { type: 'jb/image' } },
process: function() {}
});
Rpd.nodetype('jb/palette', {
title: 'Product Palette',
inlets: {
'palette': { type: 'jb/palette', default: PRODUCTS[0].palette, label: 'selection', hidden: true },
'product': { type: 'jb/product', default: PRODUCTS[0].id, label: 'product', hidden: true },
},
outlets: {
'palette': { type: 'jb/palette' },
'product': { type: 'jb/product' }
},
process: function(inlets) {
return {
palette: inlets.palette,
product: inlets.product
};
}
});
Rpd.nodetype('jb/noise', function() {
var refreshSketch = initNoiseSketch();
return {
title: 'Noise',
inlets: {
'bang': { type: 'util/bang' },
'grain': { type: 'jb/noise-step', 'default': 10 },
'octave': { type: 'util/wholenumber', 'default': 4 },
'falloff': { type: 'util/number', 'default': 0.9 },
'palette': { type: 'jb/palette', default: [ '#ffffff', '#000000', '#000000']},
'border': { type: 'util/number', 'default': 0 },
'radius': { type: 'util/number', 'default': 0, 'adapt': adaptToOne }
},
outlets: { 'pixels': { type: 'jb/pixels' } },
process: function(inlets) {
return {
pixels: refreshSketch(inlets)
}
}
};
});
var MAX_LAYERS = 9;
var LAYERS_INLETS = {};
LAYERS_INLETS['background'] = { type: 'util/color', default: { r: 66, g: 66, b: 66 } };
for (var i = 0; i < MAX_LAYERS; i++) {
LAYERS_INLETS['layer-' + (i + 1)] = { type: 'jb/drawable' }
};
LAYERS_INLETS['renderOptions'] = { type: 'core/any', hidden: true };
var DEFAULT_LAYER_OPTIONS = {
blendMode: '',
opacity: 1
};
var lastLayersConfig;
Rpd.nodetype('jb/layers', {
title: 'Layers',
inlets: LAYERS_INLETS,
outlets: {
'layers': { type: 'jb/layers' }
},
process: function(inlets) {
//if (!inlets.renderOptions) return;
var renderOptions = inlets.renderOptions;
var layers = [];
var layer;
for (var i = 0; i < MAX_LAYERS; i++) {
layer = inlets['layer-' + (i + 1)];
if (layer && layer != 'dark') {
layers.push([ inlets['layer-' + (i + 1)],
renderOptions ? renderOptions[i] : DEFAULT_LAYER_OPTIONS ]);
}
}
if (!layers.length) return;
return {
'layers': { background: inlets.background,
values: layers }
}
}
});
Rpd.nodetype('jb/draw-pixels', {
title: 'Draw Pixels',
inlets: {
'pixels': { type: 'jb/pixels'},
'blur': { type: 'util/number'},
'contrast': { type: 'util/number'}
},
outlets: {
'drawable': { type: 'jb/drawable' }
},
process: function(inlets) {
return {
'drawable': {
'conf': inlets,
'func': drawPixels
}
}
}
});
Rpd.nodetype('jb/collect-point-data', {
title: 'Collect Points',
inlets: {
'chaos': { type: 'util/wholenumber', default: 50 },
'step': { type: 'util/wholenumber', default: 16 },
'low': { type: 'jb/brightness', default: 40 },
'high': { type: 'jb/brightness', default: 30 },
'pixels': { type: 'jb/pixels' }
},
outlets: {
'points': { type: 'jb/point-data' }
},
process: function(inlets) {
if (!inlets.pixels) return;
return {
'points': collectPointData(inlets.pixels, inlets)
}
}
});
Rpd.nodetype('jb/apply-gradient', {
title: 'Make Gradient',
inlets: {
'width': { type: 'util/number', default: window.innerWidth, hidden: true },
'height': { type: 'util/number', default: window.innerHeight, hidden: true },
'palette': { type: 'jb/palette' }
},
outlets: {
'drawable': { type: 'jb/drawable' }
},
process: function(inlets) {
return {
'drawable': {
'conf': inlets,
'func': applyGradient
}
}
}
});
Rpd.nodetype('jb/vignette', {
title: 'Vignette',
inlets: {
'width': { type: 'util/number', 'default': window.innerWidth, hidden: true },
'height': { type: 'util/number', 'default': window.innerHeight, hidden: true },
'iris': { type: 'util/number', 'default': 100 },
'pupilOpacity': { type: 'util/number', 'default': 0 },
'pupilColor': { type: 'util/color', 'default': _rgb(255, 255, 255) }
},
outlets: {
'drawable': { type: 'jb/drawable' }
},
process: function(inlets) {
return {
'drawable': {
'conf': inlets,
'func': drawDarkGradients
}
}
}
});
Rpd.nodetype('jb/voronoi', {
title: 'Voronoi',
inlets: {
'width': { type: 'util/number', default: window.innerWidth, hidden: true },
'height': { type: 'util/number', default: window.innerHeight, hidden: true },
'points': { type: 'jb/point-data' }
},
outlets: {
'voronoi': { type: 'jb/voronoi' }
},
process: function(inlets) {
if (!inlets.points || !inlets.width || !inlets.height) return;
return {
'voronoi': d3.voronoi().size([inlets.width, inlets.height])(inlets.points)
}
}
});
Rpd.nodetype('jb/curved-edges', {
title: 'Curves',
inlets: {
'voronoi': { type: 'jb/voronoi' },
'density': { type: 'util/number', default: 0.3 },
'near': { type: 'util/number', default: 0.5 },
'far': { type: 'util/number', default: 0.4 },
'curve': { type: 'util/number', default: 0.5 },
'palette': { type: 'jb/palette', default: [ '#ffffff', '#ffffff', '#ffffff']}
},
outlets: {
'drawable': { type: 'jb/drawable' }
},
process: function(inlets) {
if (!inlets.voronoi) return;
return {
'drawable': {
'conf': inlets,
'func': drawCurvedEdges
}
}
}
});
Rpd.nodetype('jb/shapes', {
title: 'Shapes',
inlets: {
'voronoi': { type: 'jb/voronoi' },
'qty': { type: 'util/number', default: 0.12 },
'palette': { type: 'jb/palette', default: [ '#ffffff', '#ffffff', '#ffffff']}
},
outlets: {
'drawable': { type: 'jb/drawable' }
},
process: function(inlets) {
if (!inlets.voronoi) return;
return {
'drawable': {
'conf': inlets,
'func': drawShapes
}
}
}
});
Rpd.nodetype('jb/edges-joints', {
title: 'Edges & Joints',
inlets: {
'voronoi': { type: 'jb/voronoi' },
'pixels': { type: 'jb/pixels' },
'palette': { type: 'jb/palette', 'default': [ '#ffffff', '#ffffff', '#ffffff']},
'jointSize': { type: 'util/number', 'default': 10 },
'jointBorder': { type: 'util/number', 'default': 0 },
'jointRadius' : {type: 'util/number', 'default': 0, 'adapt': adaptToOne }
},
outlets: {
'drawable': { type: 'jb/drawable' }
},
process: function(inlets) {
if (!inlets.pixels || !inlets.voronoi || !inlets.palette) return;
return {
'drawable': {
'conf': inlets,
'func': drawEdgesJoints
}
}
}
});
Rpd.nodetype('jb/back-edges-squares', {
title: 'Back Edges & Squares',
inlets: {
'points': { type: 'jb/point-data' },
'range': { type: 'util/number', 'default': 50 },
'palette': { type: 'jb/palette', default: [ '#ffffff', '#ffffff', '#ffffff']}
},
outlets: {
'drawable': { type: 'jb/drawable' }
},
process: function(inlets) {
if (!inlets.points) return;
return {
'drawable': {
'conf': inlets,
'func': drawBackEdgesSquares
}
}
}
});
Rpd.nodetype('jb/draw-logo', {
title: 'Draw Logo',
inlets: {
product: { type: 'jb/product' },
x: { type: 'util/number', 'default': 0.5 },
y: { type: 'util/number', 'default': 0.5 }
},
outlets: {
drawable: { type: 'jb/drawable' }
},
process: function(inlets) {
return {
'drawable': {
'conf': inlets,
'func': drawLogo
}
}
}
});
Rpd.nodetype('jb/background', function() {
var refreshSketch = initBackgroundSketch();
return {
title: 'Background',
inlets: {
bang: { type: 'util/bang' },
product: { type: 'jb/product' },
width: { type: 'util/number', default: window.innerWidth, hidden: true },
height: { type: 'util/number', default: window.innerHeight, hidden: true },
angle: { type: 'jb/angle', default: 0 },
scale: { type: 'util/number', default: 1 },
x: { type: 'util/number', default: 0 },
y: { type: 'util/number', default: 0 }
},
outlets: {
pixels: { type: 'jb/pixels' }
},
process: function(inlets) {
if (!inlets.bang || !inlets.product) return;
return {
pixels: refreshSketch(inlets)
}
}
}
});
Rpd.nodetype('jb/switch', {
inlets: {
value: { type: 'util/wholenumber', hidden: true }
},
outlets: {
'way-one': { type: 'util/bang' },
'way-two': { type: 'util/bang' }
},
process: function(inlets) {
if (inlets.value == 1) return { 'way-one': {} };
if (inlets.value == 2) return { 'way-two': {} };
}
});
Rpd.nodetype('jb/three-colors', {
inlets: {
'color-1': { type: 'util/color' },
'color-2': { type: 'util/color' },
'color-3': { type: 'util/color' }
},
outlets: {
'palette': { type: 'jb/palette' }
},
process: function(inlets) {
return {
'palette': [ inlets['color-1'] ? toHexColor(inlets['color-1']) : 'transparent',
inlets['color-2'] ? toHexColor(inlets['color-2']) : 'transparent',
inlets['color-3'] ? toHexColor(inlets['color-3']) : 'transparent' ]
}
}
});