sparksjs
Version:
Sparks library for three.js with theen.js
135 lines (107 loc) • 3.46 kB
JavaScript
(function(){
/************************
* Canvas shader programs
*************************/
var PI2 = Math.PI * 2;
var particleShaders = [];
var circles = function ( context ) {
context.beginPath();
context.arc( 0, 0, 1, 0, PI2, true );
context.closePath();
context.fill();
};
// circle circum
var circleLines = function ( context ) {
context.lineWidth = 0.1; //0.05
context.beginPath();
context.arc( 0, 0, 1, 0, PI2, true );
context.closePath();
context.stroke();
}
var squares = function ( context ) {
context.beginPath();
context.rect( 0, 0, 1, 1 );
context.closePath();
context.fill();
}
var hearts = function ( context ) {
context.globalAlpha = 0.5;
var x = 0, y = 0;
context.scale(0.1, -0.1);
context.beginPath();
context.bezierCurveTo( x + 2.5, y + 2.5, x + 2.0, y, x, y );
context.bezierCurveTo( x - 3.0, y, x - 3.0, y + 3.5,x - 3.0,y + 3.5 );
context.bezierCurveTo( x - 3.0, y + 5.5, x - 1.0, y + 7.7, x + 2.5, y + 9.5 );
context.bezierCurveTo( x + 6.0, y + 7.7, x + 8.0, y + 5.5, x + 8.0, y + 3.5 );
context.bezierCurveTo( x + 8.0, y + 3.5, x + 8.0, y, x + 5.0, y );
context.bezierCurveTo( x + 3.5, y, x + 2.5, y + 2.5, x + 2.5, y + 2.5 );
context.closePath();
context.fill();
context.lineWidth = 0.05; //0.05
context.stroke();
}
var hexagons = function ( ctx ) {
var x = y = 0;
var width = 1, height = 1;
var dist = 1;
var cx = x * (width + dist) - y * (width + dist) / 2,
cy = y * (3/4 * height + dist);
ctx.beginPath();
ctx.moveTo(cx, cy - height/2);
ctx.lineTo(cx + width/2, cy - height/4);
ctx.lineTo(cx + width/2, cy + height/4);
ctx.lineTo(cx, cy + height/2);
ctx.lineTo(cx - width/2, cy + height/4);
ctx.lineTo(cx - width/2, cy - height/4);
ctx.lineTo(cx, cy - height/2);
ctx.fill();
//context.fill();
//context.lineWidth = 0.4; //0.05
//context.stroke();
}
var polygons = function(context, sides, radius, fill, stroke) {
// drived from http://www.kozlenko.info/blog/2010/11/19/how-to-calulate-polygon-points-for-html5-canvas/
var delta_theta = 2.0 * Math.PI / sides;
var theta = 0;
context.beginPath();
for (var i = 0, x, y; i < sides; i++ ) {
x = (radius * Math.cos(theta));
y = (radius * Math.sin(theta));
context.lineTo(x, y);
theta += delta_theta;
}
context.closePath();
if (fill) context.fill();
if (stroke) {
context.lineWidth = 0.5;
if (fill) context.stroke();
}
}
//var star TODO
var octagons = function(context) {
return polygons(context, 5, 3, true, true);
}
var septagon = function(context) {
return polygons(context, 8, 3, true, true);
}
var random = function(context) {
var i = Math.floor(Math.random()*particleShaders.length);
return particleShaders[i];
}
particleShaders.push(circles);
particleShaders.push(circleLines);
particleShaders.push(squares);
particleShaders.push(hearts);
particleShaders.push(hexagons);
particleShaders.push(octagons);
particleShaders.push(septagon);
SPARKS.CanvasShadersUtils = {};
SPARKS.CanvasShadersUtils.circles = circles;
SPARKS.CanvasShadersUtils.circleLines = circleLines;
SPARKS.CanvasShadersUtils.squares = squares;
SPARKS.CanvasShadersUtils.hearts = hearts;
SPARKS.CanvasShadersUtils.hexagons = hexagons;
SPARKS.CanvasShadersUtils.octagons = octagons;
SPARKS.CanvasShadersUtils.septagon = septagon;
SPARKS.CanvasShadersUtils.random = random;
})(SPARKS);