From 26195abde389c0113ce82c2216cc9ec0e4d56377 Mon Sep 17 00:00:00 2001 From: anuraghazra Date: Fri, 5 Jul 2019 14:23:53 +0530 Subject: [PATCH] fixed multi instance variable collision bug / improved internal renderer / v1.1.4 --- CHANGELOG.md | 14 +++++++ dist/verly.bundle.js | 2 +- dist/verly.bundle.js.map | 2 +- examples/behavior.html | 26 +++++------- examples/behavior2.html | 2 +- examples/dynamicCustomMesh.html | 3 +- examples/rotatingEntity.html | 4 +- examples/shadedCloth.html | 8 ++-- examples/ship/index.js | 2 +- examples/text/index.html | 1 - examples/typography/Text.js | 7 ++-- examples/typography/index.js | 4 +- experiments/api_flexibility/index.js | 8 ---- experiments/multiple_instance/index.js | 18 ++++---- experiments/web_components/Component.js | 2 +- index.js | 2 +- src/Entity.js | 56 +++++++++++++++---------- src/Objects.js | 4 +- src/Point.js | 29 +++++++++---- src/TypoGraphy.js | 4 +- src/Verly.js | 35 +++++++++++----- 21 files changed, 134 insertions(+), 99 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..524b9e3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.1.4] - 05-07-2019 +### Fixed +- independent internal rendering engine +- multiple instance of verly.js was causing global var collisions (WIDTH, HEIGHT, CTX) +### Changed +- Entity.js Class now expects two arguments (iteration, verlyInstance) because previously we used global variables to keep track of WIDTH, HEIGHT and ctx which was casing some problems +- When extending Entity class we have to do super(iteration, verlyInstance) +- Point.js Class's render, constrain, update methods now expects verlyInstance and ctx variables to be passed. \ No newline at end of file diff --git a/dist/verly.bundle.js b/dist/verly.bundle.js index 492ede8..1f8b762 100644 --- a/dist/verly.bundle.js +++ b/dist/verly.bundle.js @@ -1,2 +1,2 @@ -!function(t){var i={};function s(n){if(i[n])return i[n].exports;var e=i[n]={i:n,l:!1,exports:{}};return t[n].call(e.exports,e,e.exports,s),e.l=!0,e.exports}s.m=t,s.c=i,s.d=function(t,i,n){s.o(t,i)||Object.defineProperty(t,i,{enumerable:!0,get:n})},s.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},s.t=function(t,i){if(1&i&&(t=s(t)),8&i)return t;if(4&i&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(s.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&i&&"string"!=typeof t)for(var e in t)s.d(n,e,function(i){return t[i]}.bind(null,e));return n},s.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return s.d(i,"a",i),i},s.o=function(t,i){return Object.prototype.hasOwnProperty.call(t,i)},s.p="",s(s.s=1)}([function(t,i){window.normalizedRandom=function(){return 2*Math.random()-1},window.degreesToRad=function(t){return t*(Math.PI/180)},window.clamp=function(t,i,s){return Math.min(Math.max(t,Math.min(i,s)),Math.max(i,s))},window.random=function(t,i,s){return 1===arguments.length?Math.random()*arguments[0]:(2==arguments.length&&(s=i,i=t,t=Math.random),i||s?s?t()*(s-i)+i:(s=i,t()*s):Math.random())},window.lerp=function(t,i,s){return(i-t)*s+t}},function(t,i,s){"use strict";s.r(i);class n{constructor(t,i,s){this.entities=t,this.draggedPoint=null,this.down=!1,this.coord=new Vector,this.offset=new Vector,this.offsetCoord=new Vector,this.canvas=i,this.ctx=s,this.canvas.addEventListener("mousedown",t=>{this.down=!0,this.draggedPoint&&(this.offset.setXY(t.offsetX-this.draggedPoint.pos.x,t.offsetY-this.draggedPoint.pos.y),this.offsetCoord=Vector.sub(this.coord,this.offset))}),this.canvas.addEventListener("mouseup",t=>{this.draggedPoint&&this.draggedPoint.resetVelocity(),this.down=!1,this.draggedPoint=null}),this.canvas.addEventListener("mousemove",t=>{this.coord.setXY(t.offsetX,t.offsetY),this.offsetCoord=Vector.sub(this.coord,this.offset)}),this.canvas.addEventListener("touchstart",t=>{let i=t.touches[0];this.down=!0,this.draggedPoint&&(this.offset.setXY(i.clientX-this.draggedPoint.pos.x,i.clientY-this.draggedPoint.pos.y),this.offsetCoord=Vector.sub(this.coord,this.offset))}),this.canvas.addEventListener("touchend",t=>{this.draggedPoint&&this.draggedPoint.resetVelocity(),this.down=!1,this.draggedPoint=null}),this.canvas.addEventListener("touchmove",t=>{let i=t.touches[0];this.coord.setXY(i.pageX,i.pageY),this.offsetCoord=Vector.sub(this.coord,this.offset)})}dragPoint(){this.down&&this.draggedPoint.pos.setXY(this.offsetCoord.x,this.offsetCoord.y)}drag(){this.down||(this.draggedPoint=this.getNearestPoint()),this.draggedPoint&&(this.renderDraggedPoint(this.draggedPoint),this.dragPoint())}renderDraggedPoint(t){this.ctx.beginPath(),this.ctx.strokeStyle="black",this.ctx.arc(t.pos.x,t.pos.y,1.5*t.radius,0,2*Math.PI),this.ctx.stroke(),this.ctx.closePath()}getNearestPoint(){let t=null;for(let i=0;i0&&d.addStick(r*e+h,r*e+h-1),r>0&&d.addStick(r*e+h,(r-1)*e+h)}for(d.tear=function(t){for(let i=0;i(t||20)&&d.removeSticks(d.sticks[i].startPoint)},h=0;h0&&this.div(t),this},normalizeTo:function(t){var i=this.mag();return i>0&&(i=t/i,this.mult(i)),this},limit:function(t){return this.mag()>t&&(this.normalize(),this.mult(t)),this},heading:function(){return-Math.atan2(-this.y,this.x)},dist:function(t){let i=this.x-t.x,s=this.y-t.y;return Math.sqrt(i*i+s*s)},distSq:function(t){let i=this.x-t.x,s=this.y-t.y;return i*i+s*s},copy:function(){return new o(this.x,this.y)},negative:function(){return this.x=-this.x,this.y=-this.y,this},array:function(){return[this.x,this.y]},toString:function(){return"["+this.x+", "+this.y+", "+this.z+"]"},project:function(t){var i=(this.x*t.x+this.y*t.y)/(t.x*t.x+t.y*t.y);return this.x=i*t.x,this.y=i*t.y,this},rotate:function(t){var i=this.heading()+t,s=this.mag();this.x=Math.cos(i)*s,this.y=Math.sin(i)*s}};window.Verly=e,window.Vector=o,window.Point=class{constructor(t,i,s,n,e){this.pos=new Vector(t,i),this.oldpos=new Vector(t+(s||0),i+(n||0)),this.bounce=.99,this.friction=.97,this.groundFriction=.7,this.gravity=new Vector(0,1),this.pinned=!1,this.radius=e||5,this.color="#e62a4f",this.mass=1,this.sticks=[],this.forceAcc=1}setGravity(t){this.gravity=t}setForceAcc(t){this.forceAcc=t}setMass(t){this.mass=t}setRadius(t){this.radius=t}resetVelocity(){this.oldpos.setXY(this.pos.x,this.pos.y)}pin(){this.pinned=!0}unpin(){this.pinned=!1}rotate(t,i){let s=i.x+(this.pos.x-i.x)*Math.cos(t)-(this.pos.y-i.y)*Math.sin(t),n=i.y+(this.pos.x-i.x)*Math.sin(t)+(this.pos.y-i.y)*Math.cos(t);this.pos.setXY(s,n)}resolveBehaviors(t,i,s){var n=Vector.sub(this.pos,t.pos),e=n.magSq();let o=i?i*i:this.radius*this.radius;if(eWIDTH-this.radius&&(this.pos.x=WIDTH-this.radius),this.pos.xHEIGHT-this.radius&&(this.pos.y=HEIGHT-this.radius),this.pos.y=HEIGHT-this.radius&&t.magSq()>1e-6){var i=t.mag();t.x/=i,t.y/=i,t.mult(i*this.groundFriction)}this.oldpos.setXY(this.pos.x,this.pos.y),this.pos.add(t),this.pos.add(this.gravity)}render(t){t.beginPath(),t.fillStyle=this.color,t.arc(this.pos.x,this.pos.y,this.radius,0,2*Math.PI),t.fill(),t.closePath()}},window.Stick=class{constructor(t,i,s,n){this.startPoint=t,this.endPoint=i,this.stiffness=n||2,this.color="#f5476a",this.length=s||this.startPoint.pos.dist(this.endPoint.pos),this.startPoint.sticks.push(this),this.endPoint.sticks.push(this)}update(t){let i=this.endPoint.pos.x-this.startPoint.pos.x,s=this.endPoint.pos.y-this.startPoint.pos.y,n=Math.sqrt(i*i+s*s),e=(this.length-n)/n*this.stiffness,o=i*e*.5,h=s*e*.5,r=this.startPoint.mass+this.endPoint.mass,d=this.startPoint.mass/r;r=this.endPoint.mass/r,this.startPoint.pinned||(this.startPoint.pos.x-=o*r,this.startPoint.pos.y-=h*r),this.endPoint.pinned||(this.endPoint.pos.x+=o*d,this.endPoint.pos.y+=h*d)}render(t){t.beginPath(),t.strokeStyle=this.color,t.moveTo(this.startPoint.pos.x,this.startPoint.pos.y),t.lineTo(this.endPoint.pos.x,this.endPoint.pos.y),t.stroke(),t.closePath()}},window.Entity=class{constructor(t){this.points=[],this.sticks=[],this.iterations=t||16}setGravity(t){for(let i=0;i{s.oldpos.x+=t,s.oldpos.y+=i})}addPoint(t,i,s,n,e){let o;return o=t instanceof Point?t:new Point(t,i,s,n,e),this.points.push(o),o}addStick(t,i,s){t instanceof Stick?this.sticks.push(t):this.sticks.push(new Stick(this.points[t],this.points[i],s))}updatePoints(){for(let t=0;t0&&s{this.down=!0,this.draggedPoint&&(this.offset.setXY(t.offsetX-this.draggedPoint.pos.x,t.offsetY-this.draggedPoint.pos.y),this.offsetCoord=Vector.sub(this.coord,this.offset))}),this.canvas.addEventListener("mouseup",t=>{this.draggedPoint&&this.draggedPoint.resetVelocity(),this.down=!1,this.draggedPoint=null}),this.canvas.addEventListener("mousemove",t=>{this.coord.setXY(t.offsetX,t.offsetY),this.offsetCoord=Vector.sub(this.coord,this.offset)}),this.canvas.addEventListener("touchstart",t=>{let i=t.touches[0];this.down=!0,this.draggedPoint&&(this.offset.setXY(i.clientX-this.draggedPoint.pos.x,i.clientY-this.draggedPoint.pos.y),this.offsetCoord=Vector.sub(this.coord,this.offset))}),this.canvas.addEventListener("touchend",t=>{this.draggedPoint&&this.draggedPoint.resetVelocity(),this.down=!1,this.draggedPoint=null}),this.canvas.addEventListener("touchmove",t=>{let i=t.touches[0];this.coord.setXY(i.pageX,i.pageY),this.offsetCoord=Vector.sub(this.coord,this.offset)})}dragPoint(){this.down&&this.draggedPoint.pos.setXY(this.offsetCoord.x,this.offsetCoord.y)}drag(){this.down||(this.draggedPoint=this.getNearestPoint()),this.draggedPoint&&(this.renderDraggedPoint(this.draggedPoint),this.dragPoint())}renderDraggedPoint(t){this.ctx.beginPath(),this.ctx.strokeStyle="black",this.ctx.arc(t.pos.x,t.pos.y,1.5*t.radius,0,2*Math.PI),this.ctx.stroke(),this.ctx.closePath()}getNearestPoint(){let t=null;for(let i=0;i0&&d.addStick(r*e+h,r*e+h-1),r>0&&d.addStick(r*e+h,(r-1)*e+h)}for(d.tear=function(t){for(let i=0;i(t||20)&&d.removeSticks(d.sticks[i].startPoint)},h=0;h0&&this.div(t),this},normalizeTo:function(t){var i=this.mag();return i>0&&(i=t/i,this.mult(i)),this},limit:function(t){return this.mag()>t&&(this.normalize(),this.mult(t)),this},heading:function(){return-Math.atan2(-this.y,this.x)},dist:function(t){let i=this.x-t.x,s=this.y-t.y;return Math.sqrt(i*i+s*s)},distSq:function(t){let i=this.x-t.x,s=this.y-t.y;return i*i+s*s},copy:function(){return new o(this.x,this.y)},negative:function(){return this.x=-this.x,this.y=-this.y,this},array:function(){return[this.x,this.y]},toString:function(){return"["+this.x+", "+this.y+", "+this.z+"]"},project:function(t){var i=(this.x*t.x+this.y*t.y)/(t.x*t.x+t.y*t.y);return this.x=i*t.x,this.y=i*t.y,this},rotate:function(t){var i=this.heading()+t,s=this.mag();this.x=Math.cos(i)*s,this.y=Math.sin(i)*s}};window.Verly=e,window.Vector=o,window.Point=class{constructor(t,i,s,n,e){this.pos=new Vector(t,i),this.oldpos=new Vector(t+(s||0),i+(n||0)),this.bounce=.99,this.friction=.97,this.groundFriction=.7,this.gravity=new Vector(0,1),this.pinned=!1,this.radius=e||5,this.color="#e62a4f",this.mass=1,this.sticks=[],this.forceAcc=1}setGravity(t){this.gravity=t}setFriction(t){this.friction=t}setForceAcc(t){this.forceAcc=t}setMass(t){this.mass=t}setRadius(t){this.radius=t}resetVelocity(){this.oldpos.setXY(this.pos.x,this.pos.y)}pin(){this.pinned=!0}unpin(){this.pinned=!1}rotate(t,i){let s=i.x+(this.pos.x-i.x)*Math.cos(t)-(this.pos.y-i.y)*Math.sin(t),n=i.y+(this.pos.x-i.x)*Math.sin(t)+(this.pos.y-i.y)*Math.cos(t);this.pos.setXY(s,n)}resolveBehaviors(t,i,s){var n=Vector.sub(this.pos,t.pos),e=n.magSq();let o=i?i*i:this.radius*this.radius;if(et.WIDTH-this.radius&&(this.pos.x=t.WIDTH-this.radius),this.pos.xt.HEIGHT-this.radius&&(this.pos.y=t.HEIGHT-this.radius),this.pos.y=t.HEIGHT-this.radius&&i.magSq()>1e-6){var s=i.mag();i.x/=s,i.y/=s,i.mult(s*this.groundFriction)}this.oldpos.setXY(this.pos.x,this.pos.y),this.pos.add(i),this.pos.add(this.gravity)}render(t){t.beginPath(),t.fillStyle=this.color,t.arc(this.pos.x,this.pos.y,this.radius,0,2*Math.PI),t.fill(),t.closePath()}},window.Stick=class{constructor(t,i,s,n){this.startPoint=t,this.endPoint=i,this.stiffness=n||2,this.color="#f5476a",this.length=s||this.startPoint.pos.dist(this.endPoint.pos),this.startPoint.sticks.push(this),this.endPoint.sticks.push(this)}update(t){let i=this.endPoint.pos.x-this.startPoint.pos.x,s=this.endPoint.pos.y-this.startPoint.pos.y,n=Math.sqrt(i*i+s*s),e=(this.length-n)/n*this.stiffness,o=i*e*.5,h=s*e*.5,r=this.startPoint.mass+this.endPoint.mass,d=this.startPoint.mass/r;r=this.endPoint.mass/r,this.startPoint.pinned||(this.startPoint.pos.x-=o*r,this.startPoint.pos.y-=h*r),this.endPoint.pinned||(this.endPoint.pos.x+=o*d,this.endPoint.pos.y+=h*d)}render(t){t.beginPath(),t.strokeStyle=this.color,t.moveTo(this.startPoint.pos.x,this.startPoint.pos.y),t.lineTo(this.endPoint.pos.x,this.endPoint.pos.y),t.stroke(),t.closePath()}},window.Entity=class{constructor(t,i){this.points=[],this.sticks=[],this.verlyInstance=i,this.iterations=t||16}setGravity(t){for(let i=0;i{s.oldpos.x+=t,s.oldpos.y+=i})}addPoint(t,i,s,n,e){let o;return o=t instanceof Point?t:new Point(t,i,s,n,e),this.points.push(o),o}addStick(t,i,s){t instanceof Stick?this.sticks.push(t):this.sticks.push(new Stick(this.points[t],this.points[i],s))}updatePoints(){for(let t=0;t0&&s {\r\n this.down = true;\r\n if (this.draggedPoint) {\r\n this.offset.setXY(e.offsetX - this.draggedPoint.pos.x, e.offsetY - this.draggedPoint.pos.y);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n }\r\n })\r\n this.canvas.addEventListener('mouseup', (e) => {\r\n if (this.draggedPoint) {\r\n this.draggedPoint.resetVelocity();\r\n };\r\n this.down = false;\r\n this.draggedPoint = null;\r\n })\r\n\r\n this.canvas.addEventListener('mousemove', (e) => {\r\n this.coord.setXY(e.offsetX, e.offsetY);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n })\r\n\r\n // TOUCH\r\n this.canvas.addEventListener('touchstart', (e) => {\r\n let offset = e.touches[0];\r\n this.down = true;\r\n if (this.draggedPoint) {\r\n this.offset.setXY(offset.clientX - this.draggedPoint.pos.x, offset.clientY - this.draggedPoint.pos.y);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n }\r\n })\r\n this.canvas.addEventListener('touchend', (e) => {\r\n if (this.draggedPoint) {\r\n this.draggedPoint.resetVelocity();\r\n };\r\n this.down = false;\r\n this.draggedPoint = null;\r\n })\r\n this.canvas.addEventListener('touchmove', (e) => {\r\n let offset = e.touches[0];\r\n this.coord.setXY(offset.pageX, offset.pageY);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n })\r\n }\r\n\r\n dragPoint() {\r\n if (!this.down) return;\r\n this.draggedPoint.pos.setXY(this.offsetCoord.x, this.offsetCoord.y);\r\n }\r\n\r\n drag() {\r\n if (!this.down) {\r\n this.draggedPoint = this.getNearestPoint();\r\n }\r\n if (this.draggedPoint) {\r\n this.renderDraggedPoint(this.draggedPoint);\r\n this.dragPoint();\r\n }\r\n }\r\n \r\n renderDraggedPoint(point) {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = 'black';\r\n this.ctx.arc(point.pos.x, point.pos.y, point.radius * 1.5, 0, Math.PI * 2);\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n }\r\n\r\n\r\n getNearestPoint() {\r\n // if (!this.down) return false;\r\n let d = 20;\r\n let p = null;\r\n for (let k = 0; k < this.entities.length; k++) {\r\n for (let i = 0; i < this.entities[k].points.length; i++) {\r\n let dist = this.entities[k].points[i].pos.dist(this.coord);\r\n if (dist < d) {\r\n p = this.entities[k].points[i];\r\n }\r\n }\r\n }\r\n return p;\r\n }\r\n}\r\n","import Mouse from './Mouse';\r\n\r\n/**\r\n * @class Verly\r\n * @version 1.1.3\r\n * @author \r\n */\r\nclass Verly {\r\n constructor(iterations, canvas, ctx) {\r\n this.entities = [];\r\n this.iterations = iterations;\r\n this.currentFrame = 0;\r\n this.canvas = canvas;\r\n window.WIDTH = canvas.width;\r\n window.HEIGHT = canvas.height;\r\n this.ctx = ctx;\r\n this.mouse = new Mouse(this.entities, this.canvas, this.ctx);\r\n }\r\n\r\n /**\r\n * Joins two Entity Class Together\r\n * @param {...Entity} args \r\n */\r\n joinEntities(...args) {\r\n let mixEntity = new Entity(this.iterations);\r\n\r\n let points = [];\r\n let sticks = [];\r\n\r\n // loop through the args and push points and sticks to the array\r\n for (let i = 0; i < args.length; i++) {\r\n points.push(args[i].points);\r\n sticks.push(args[i].sticks);\r\n\r\n // get the index which item we should splice in [this.entities]\r\n let index = this.entities.indexOf(args[i]);\r\n this.entities.splice(index, 1);\r\n }\r\n\r\n // join multiple arrays\r\n points = [].concat.apply([], points);\r\n sticks = [].concat.apply([], sticks);\r\n\r\n // add the arrays to the mix::Entity\r\n mixEntity.points = points;\r\n mixEntity.sticks = sticks;\r\n\r\n // add the mix::Entity to [this.entities]\r\n this.addEntity(mixEntity);\r\n return mixEntity; // return for chaining\r\n }\r\n\r\n addEntity(e) {\r\n this.entities.push(e);\r\n }\r\n\r\n /**\r\n * @method interact\r\n * drags points\r\n */\r\n interact() {\r\n this.mouse.drag();\r\n }\r\n\r\n /**\r\n * @method update\r\n * updates all the physics stuff\r\n */\r\n update() {\r\n for (let i = 0; i < this.entities.length; i++) {\r\n this.entities[i].update();\r\n }\r\n\r\n this.currentFrame++;\r\n }\r\n \r\n renderPointIndex() {\r\n for (let i = 0; i < this.entities.length; i++) {\r\n this.entities[i].renderPointIndex(this.ctx);\r\n }\r\n }\r\n \r\n /**\r\n * @method render\r\n * renders all the entity\r\n */\r\n render() {\r\n for (let i = 0; i < this.entities.length; i++) {\r\n this.entities[i].render(this.ctx);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * @method createBox\r\n * @param {number} x \r\n * @param {number} y \r\n * @param {number} w \r\n * @param {number} h \r\n */\r\n createBox(x, y, w, h) {\r\n const box = new Entity(this.iterations);\r\n box.addPoint(x, y, 0, 0);\r\n box.addPoint(x + w, y, 0, 0);\r\n box.addPoint(x + w, y + h, 0, 0);\r\n box.addPoint(x, y + h, 0, 0);\r\n box.addStick(0, 1);\r\n box.addStick(1, 2);\r\n box.addStick(2, 3);\r\n box.addStick(3, 0);\r\n box.addStick(3, 1);\r\n\r\n this.addEntity(box);\r\n return box;\r\n }\r\n\r\n\r\n /**\r\n * @method createHexagon\r\n * @param {number} x \r\n * @param {number} y \r\n * @param {number} segments \r\n * @param {number} radius=50\r\n * @param {number} stride1=1\r\n * @param {number} stride2=5\r\n */\r\n createHexagon(x, y, segments, radius = 50, stride1 = 1, stride2 = 5) {\r\n const hexagon = new Entity(this.iterations);\r\n\r\n let stride = (2 * Math.PI) / segments;\r\n\r\n // points\r\n for (let i = 0; i < segments; ++i) {\r\n let theta = i * stride;\r\n hexagon.addPoint(\r\n x + Math.cos(theta) * radius,\r\n y + Math.sin(theta) * radius,\r\n 0, 0\r\n );\r\n }\r\n\r\n let center = hexagon.addPoint(x, y, 0, 0);\r\n\r\n // sticks\r\n for (let i = 0; i < segments; ++i) {\r\n hexagon.addStick(i, (i + stride1) % segments);\r\n hexagon.addStick(new Stick(hexagon.points[i], center));\r\n hexagon.addStick(i, (i + stride2) % segments);\r\n }\r\n\r\n\r\n this.addEntity(hexagon);\r\n return hexagon;\r\n }\r\n\r\n /**\r\n * @method createCloth\r\n * @param {number} posx \r\n * @param {number} posy \r\n * @param {number} w \r\n * @param {number} h \r\n * @param {number} segments \r\n * @param {number} pinOffset \r\n */\r\n createCloth(posx, posy, w, h, segments, pinOffset) {\r\n let cloth = new Entity(this.iterations);\r\n\r\n let xStride = w / segments;\r\n let yStride = h / segments;\r\n\r\n let x, y;\r\n for (y = 0; y < segments; ++y) {\r\n for (x = 0; x < segments; ++x) {\r\n let px = posx + x * xStride - w / 2 + xStride / 2;\r\n let py = posy + y * yStride - h / 2 + yStride / 2;\r\n cloth.addPoint(px, py);\r\n\r\n if (x > 0) {\r\n cloth.addStick(y * segments + x, y * segments + x - 1);\r\n }\r\n\r\n if (y > 0) {\r\n cloth.addStick(y * segments + x, (y - 1) * segments + x);\r\n }\r\n }\r\n }\r\n\r\n // as the name suggest\r\n function tear(threshold) {\r\n for (let i = 0; i < cloth.sticks.length; i++) {\r\n // find the distance between two points\r\n let dist = cloth.sticks[i].startPoint.pos.dist(cloth.sticks[i].endPoint.pos)\r\n if (dist > (threshold || 20)) { // remove if the dist is > than threshold \r\n cloth.removeSticks(cloth.sticks[i].startPoint);\r\n }\r\n }\r\n }\r\n\r\n cloth.tear = tear;\r\n\r\n for (x = 0; x < segments; ++x) {\r\n if (x % pinOffset == 0) { // magic\r\n cloth.pin(x);\r\n }\r\n }\r\n\r\n !this.dontPush && this.addEntity(cloth);\r\n return cloth;\r\n }\r\n\r\n\r\n /**\r\n * @method createRope\r\n * @param {number} x \r\n * @param {number} y \r\n * @param {number} segments=10\r\n * @param {number} gap=15\r\n * @param {number} pin=0\r\n */\r\n createRope(x, y, segments = 10, gap = 15, pin) {\r\n let rope = new Entity(this.iterations);\r\n\r\n for (let i = 0; i < segments; i++) {\r\n rope.addPoint(x + i * gap, y, 0, 0)\r\n }\r\n\r\n for (let i = 0; i < segments - 1; i++) {\r\n rope.addStick(i, (i + 1) % segments);\r\n }\r\n\r\n if (pin !== undefined) {\r\n rope.pin(pin);\r\n }\r\n this.addEntity(rope);\r\n return rope;\r\n }\r\n\r\n\r\n createRagdoll(x0, y0) {\r\n let ragdoll = new Entity(this.iterations);\r\n\r\n // Head\r\n // x, y, extremity, gravity, radius\r\n // let h = ;\r\n // h.head = true;\r\n // h.oldx = x0 + (Math.random() - 0.5) * 25;\r\n\r\n let head = new Point(x0, y0, 0, 0, 15);\r\n head.setMass(5);\r\n ragdoll.addPoint(head);\r\n\r\n // Groin\r\n ragdoll.addPoint(x0, y0 + 100);\r\n\r\n // Hips\r\n ragdoll.addPoint(x0 + 30, y0 + 90);\r\n ragdoll.addPoint(x0 - 30, y0 + 90);\r\n\r\n // Knees\r\n ragdoll.addPoint(x0 + 20, y0 + 150);\r\n ragdoll.addPoint(x0 - 20, y0 + 150);\r\n\r\n // Feet\r\n let f1 = new Point(x0 + 30, y0 + 190, 0, 0, 10);\r\n let f2 = new Point(x0 - 30, y0 + 190, 0, 0, 10);\r\n f1.setMass(20);\r\n f2.setMass(20);\r\n ragdoll.addPoint(f1);\r\n ragdoll.addPoint(f2);\r\n\r\n // Neck\r\n ragdoll.addPoint(x0, y0 + 25);\r\n\r\n // Shoulders\r\n ragdoll.addPoint(x0 + 25, y0 + 30);\r\n ragdoll.addPoint(x0 - 25, y0 + 30);\r\n\r\n // Hands\r\n let h1 = new Point(x0 + 15, y0 + 105, 0, 0, 10);\r\n let h2 = new Point(x0 - 15, y0 + 105, 0, 0, 10);\r\n h1.setMass(5);\r\n h2.setMass(5);\r\n ragdoll.addPoint(h1);\r\n ragdoll.addPoint(h2);\r\n\r\n\r\n\r\n // \"Muscles\"\r\n // Head - shoulders\r\n ragdoll.addStick(0, 9);\r\n ragdoll.addStick(0, 10);\r\n // Shoulder - shoulder\r\n ragdoll.addStick(9, 10);\r\n\r\n // Shoulders - hips\r\n ragdoll.addStick(9, 2);\r\n ragdoll.addStick(10, 3);\r\n // Shoulders - hips opposite side\r\n ragdoll.addStick(9, 3);\r\n ragdoll.addStick(10, 2);\r\n\r\n // Hips - feet\r\n ragdoll.addStick(2, 6);\r\n ragdoll.addStick(3, 7);\r\n\r\n // Hips - feet, opposite\r\n ragdoll.addStick(2, 7);\r\n ragdoll.addStick(3, 6);\r\n\r\n // Head - groin\r\n ragdoll.addStick(0, 1);\r\n\r\n // Hip - hip\r\n ragdoll.addStick(2, 3);\r\n // Shoulder - hip\r\n ragdoll.addStick(9, 2);\r\n ragdoll.addStick(10, 3);\r\n\r\n // Head - knee\r\n ragdoll.addStick(0, 4);\r\n // Head - knee\r\n ragdoll.addStick(0, 5);\r\n\r\n // Head feet\r\n ragdoll.addStick(0, 6);\r\n ragdoll.addStick(0, 7);\r\n\r\n // Body parts\r\n // Hips\r\n ragdoll.addStick(1, 2);\r\n ragdoll.addStick(1, 3);\r\n // Legs\r\n ragdoll.addStick(2, 4);\r\n ragdoll.addStick(3, 5);\r\n ragdoll.addStick(4, 6);\r\n ragdoll.addStick(5, 7);\r\n\r\n ragdoll.addStick(0, 8);\r\n ragdoll.addStick(8, 1);\r\n\r\n // Left arm\r\n ragdoll.addStick(8, 9);\r\n ragdoll.addStick(9, 11);\r\n\r\n // Right arm\r\n ragdoll.addStick(8, 10);\r\n ragdoll.addStick(10, 12);\r\n\r\n this.addEntity(ragdoll);\r\n return ragdoll;\r\n }\r\n}\r\n\r\nexport default Verly;","/**\r\n * Vector.js v1.0.0\r\n * @author Anurag Hazra\r\n * @borrows p5.Vector\r\n * @param {number} x \r\n * @param {number} y \r\n */\r\n\r\nexport default function Vector(x, y) {\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n}\r\n\r\n// Static Functions\r\nVector.dist = function (v1, v2) {\r\n return v1.dist(v2);\r\n}\r\nVector.distSq = function (v1, v2) {\r\n return v1.distSq(v2);\r\n}\r\nVector.sub = function (v1, v2) {\r\n return new Vector(v1.x - v2.x, v1.y - v2.y);\r\n};\r\nVector.add = function (v1, v2) {\r\n return new Vector(v1.x + v2.x, v1.y + v2.y);\r\n};\r\nVector.fromAngle = function (angle) {\r\n let v = new Vector(0, 0);\r\n v.x = Math.cos(angle);\r\n v.y = Math.sin(angle);\r\n return v;\r\n}\r\nVector.random2D = function (v) {\r\n return Vector.fromAngle(Math.random() * Math.PI * 180);\r\n}\r\n\r\n\r\nVector.prototype = {\r\n jitter: function (a, b) {\r\n var v = new Vector(a, b);\r\n this.x += normalizedRandom() * v.x;\r\n this.y += normalizedRandom() * v.y;\r\n return this;\r\n },\r\n add: function (x, y) {\r\n if (arguments.length === 1) {\r\n this.x += x.x;\r\n this.y += x.y;\r\n } else if (arguments.length === 2) {\r\n this.x += x;\r\n this.y += y;\r\n }\r\n return this;\r\n },\r\n sub: function (x, y) {\r\n if (arguments.length === 1) {\r\n this.x -= x.x;\r\n this.y -= x.y;\r\n } else if (arguments.length === 2) {\r\n this.x -= x;\r\n this.y -= y;\r\n }\r\n return this;\r\n },\r\n mult: function (v) {\r\n if (typeof v === 'number') {\r\n this.x *= v;\r\n this.y *= v;\r\n } else {\r\n this.x *= v.x;\r\n this.y *= v.y;\r\n }\r\n return this;\r\n },\r\n div: function (v) {\r\n if (typeof v === 'number') {\r\n this.x /= v;\r\n this.y /= v;\r\n } else {\r\n this.x /= v.x;\r\n this.y /= v.y;\r\n }\r\n return this;\r\n },\r\n setAngle: function (angle) {\r\n var len = this.mag();\r\n this.x = Math.cos(angle) * len;\r\n this.y = Math.sin(angle) * len;\r\n },\r\n mag: function () {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n },\r\n magSq: function () {\r\n return (this.x * this.x + this.y * this.y);\r\n },\r\n setXY: function (x, y) {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n },\r\n setMag: function (value) {\r\n this.normalize();\r\n this.mult(value);\r\n return this;\r\n },\r\n normalize: function () {\r\n let m = this.mag();\r\n if (m > 0) {\r\n this.div(m);\r\n }\r\n return this;\r\n },\r\n normalizeTo: function (length) {\r\n var mag = this.mag();\r\n if (mag > 0) {\r\n mag = length / mag;\r\n this.mult(mag);\r\n }\r\n return this;\r\n },\r\n limit: function (max) {\r\n if (this.mag() > max) {\r\n this.normalize();\r\n this.mult(max);\r\n }\r\n return this;\r\n },\r\n heading: function () {\r\n return (-Math.atan2(-this.y, this.x));\r\n },\r\n dist: function (v) {\r\n let dx = this.x - v.x;\r\n let dy = this.y - v.y;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n },\r\n distSq: function (v) {\r\n let dx = this.x - v.x;\r\n let dy = this.y - v.y;\r\n return (dx * dx + dy * dy);\r\n },\r\n copy: function () {\r\n return new Vector(this.x, this.y);\r\n },\r\n negative: function () {\r\n this.x = -this.x;\r\n this.y = -this.y;\r\n return this;\r\n },\r\n array: function () {\r\n return [this.x, this.y];\r\n },\r\n toString: function () {\r\n return \"[\" + this.x + \", \" + this.y + \", \" + this.z + \"]\";\r\n },\r\n project: function (v) {\r\n var coeff = ((this.x * v.x) + (this.y * v.y)) / ((v.x * v.x) + (v.y * v.y));\r\n this.x = coeff * v.x;\r\n this.y = coeff * v.y;\r\n return this;\r\n },\r\n rotate: function (a) {\r\n var b = this.heading() + a;\r\n var c = this.mag();\r\n this.x = Math.cos(b) * c;\r\n this.y = Math.sin(b) * c;\r\n }\r\n}","import Verly from './Verly';\r\nimport Utils from './Utils';\r\nimport Vector from './Vector';\r\nimport Point from './Point';\r\nimport Stick from './Stick';\r\nimport Entity from './Entity';\r\nimport TypoGraphy from './TypoGraphy';\r\n\r\nwindow.Verly = Verly;\r\nwindow.Vector = Vector;\r\nwindow.Point = Point;\r\nwindow.Stick = Stick;\r\nwindow.Entity = Entity;\r\nwindow.TypoGraphy = TypoGraphy;\r\n\r\nexport default Verly;","export default class Point {\r\n constructor(x, y, vx, vy, radius) {\r\n this.pos = new Vector(x, y);\r\n this.oldpos = new Vector(x + (vx || 0), y + (vy || 0));\r\n this.bounce = 0.99;\r\n this.friction = 0.97;\r\n this.groundFriction = 0.7;\r\n this.gravity = new Vector(0, 1);\r\n this.pinned = false;\r\n this.radius = radius || 5;\r\n this.color = '#e62a4f';\r\n this.mass = 1;\r\n this.sticks = [];\r\n // this.behaviors = [];\r\n this.forceAcc = 1;\r\n }\r\n\r\n setGravity(g) {\r\n this.gravity = g;\r\n }\r\n setForceAcc(f) {\r\n this.forceAcc = f;\r\n }\r\n setMass(m) {\r\n this.mass = m;\r\n }\r\n setRadius(radius) {\r\n this.radius = radius;\r\n }\r\n\r\n resetVelocity() {\r\n this.oldpos.setXY(this.pos.x, this.pos.y);\r\n }\r\n pin() {\r\n this.pinned = true;\r\n }\r\n unpin() {\r\n this.pinned = false;\r\n }\r\n\r\n rotate(angle, offset) {\r\n let x = offset.x + (this.pos.x - offset.x) * Math.cos(angle) - (this.pos.y - offset.y) * Math.sin(angle);\r\n let y = offset.y + (this.pos.x - offset.x) * Math.sin(angle) + (this.pos.y - offset.y) * Math.cos(angle);\r\n this.pos.setXY(x, y);\r\n }\r\n\r\n resolveBehaviors(p, radius, strength) {\r\n var delta = Vector.sub(this.pos, p.pos);\r\n var dist = delta.magSq();\r\n\r\n let magR = (!radius) ? (this.radius * this.radius) : (radius * radius);\r\n if (dist < magR) {\r\n var f = delta.normalizeTo(1 - (dist / magR)).mult(strength || this.forceAcc);\r\n this.applyForce(f);\r\n }\r\n }\r\n\r\n applyForce(f) {\r\n this.pos.add(f);\r\n }\r\n\r\n addMotor(x, y, time, radius, speed) {\r\n this.pos.x = x + radius * Math.cos(time * speed);\r\n this.pos.y = y + radius * Math.sin(time * speed);\r\n }\r\n\r\n constrain() {\r\n // if (this.pos.y > HEIGHT - 1) {\r\n // this.pos.y = HEIGHT - 1;\r\n // }\r\n // if (this.pos.x < 0) {\r\n // this.pos.x = 0;\r\n // }\r\n // if (this.pos.x > WIDTH - 1) {\r\n // this.pos.x = WIDTH - 1;\r\n // }\r\n // let vel = Vector.sub(this.pos, this.oldpos);\r\n if (this.pos.x > WIDTH - this.radius) {\r\n this.pos.x = WIDTH - this.radius;\r\n // this.oldpos.x = (this.pos.x + vel.x) * this.bounce;\r\n }\r\n if (this.pos.x < this.radius) {\r\n this.pos.x = this.radius;\r\n // this.oldpos.x = (this.pos.x + vel.x) * this.bounce;\r\n }\r\n if (this.pos.y > HEIGHT - this.radius) {\r\n this.pos.y = HEIGHT - this.radius;\r\n // this.oldpos.y = (this.pos.y + vel.y) * this.bounce;\r\n }\r\n if (this.pos.y < this.radius) {\r\n this.pos.y = this.radius;\r\n // this.oldpos.y = (this.pos.y + vel.y) * this.bounce;\r\n }\r\n };\r\n\r\n\r\n update() {\r\n if (this.pinned) return;\r\n let vel = Vector.sub(this.pos, this.oldpos);\r\n vel.mult(this.friction);\r\n // if the point touches the ground set groundFriction\r\n if (this.pos.y >= HEIGHT - this.radius && vel.magSq() > 0.000001) {\r\n var m = vel.mag();\r\n vel.x /= m;\r\n vel.y /= m;\r\n vel.mult(m * this.groundFriction);\r\n }\r\n this.oldpos.setXY(this.pos.x, this.pos.y);\r\n this.pos.add(vel);\r\n this.pos.add(this.gravity);\r\n }\r\n\r\n render(ctx) {\r\n ctx.beginPath();\r\n ctx.fillStyle = this.color;\r\n ctx.arc(this.pos.x, this.pos.y, this.radius, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.closePath();\r\n }\r\n}\r\n","export default class Stick {\r\n constructor(p1, p2, length, stiffness) {\r\n this.startPoint = p1;\r\n this.endPoint = p2;\r\n this.stiffness = stiffness || 2;\r\n this.color = '#f5476a';\r\n if (!length) {\r\n this.length = this.startPoint.pos.dist(this.endPoint.pos);\r\n } else {\r\n this.length = length;\r\n }\r\n this.startPoint.sticks.push(this);\r\n this.endPoint.sticks.push(this);\r\n }\r\n\r\n update(stepCoef) {\r\n // not gonna use vectors for performance optimization\r\n // let dx = this.endPoint.pos.x - this.startPoint.pos.x;\r\n // let dy = this.endPoint.pos.y - this.startPoint.pos.y;\r\n // let dist = Math.sqrt(dx * dx + dy * dy);\r\n // let diff = this.length - dist;\r\n // let percent = diff / dist / 2;\r\n // let offsetx = (dx * percent);\r\n // let offsety = (dy * percent);\r\n // if (!this.startPoint.pinned) {\r\n // this.startPoint.pos.x -= offsetx;\r\n // this.startPoint.pos.y -= offsety;\r\n // }\r\n // if (!this.endPoint.pinned) {\r\n // this.endPoint.pos.x += offsetx;\r\n // this.endPoint.pos.y += offsety;\r\n // }\r\n // ----- algo two\r\n\r\n // algo three\r\n let dx = this.endPoint.pos.x - this.startPoint.pos.x;\r\n let dy = this.endPoint.pos.y - this.startPoint.pos.y;\r\n let dist = Math.sqrt(dx * dx + dy * dy);\r\n let diff = (this.length - dist) / dist * this.stiffness;\r\n\r\n let offsetx = dx * diff * 0.5;\r\n let offsety = dy * diff * 0.5;\r\n\r\n // calculate mass\r\n let m1 = this.startPoint.mass + this.endPoint.mass;\r\n let m2 = this.startPoint.mass / m1;\r\n m1 = this.endPoint.mass / m1;\r\n\r\n if (!this.startPoint.pinned) {\r\n this.startPoint.pos.x -= offsetx * m1;\r\n this.startPoint.pos.y -= offsety * m1;\r\n }\r\n if (!this.endPoint.pinned) {\r\n this.endPoint.pos.x += offsetx * m2;\r\n this.endPoint.pos.y += offsety * m2;\r\n }\r\n\r\n \r\n // calculate mass\r\n // var m1 = this.startPoint.mass + this.endPoint.mass;\r\n // var m2 = this.startPoint.mass / m1;\r\n // m1 = this.endPoint.mass / m1;\r\n \r\n // var normal = Vector.sub(this.startPoint.pos, this.endPoint.pos);\r\n // var m = normal.magSq();\r\n // let diff = ((this.length * this.length) - m);\r\n // normal.mult((diff / m) * this.stiffness * stepCoef);\r\n \r\n // if (!this.startPoint.pinned) {\r\n // this.startPoint.pos.add(normal);\r\n // }\r\n // if (!this.endPoint.pinned) {\r\n // this.endPoint.pos.sub(normal);\r\n // }\r\n }\r\n\r\n render(ctx) {\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.color;\r\n ctx.moveTo(this.startPoint.pos.x, this.startPoint.pos.y);\r\n ctx.lineTo(this.endPoint.pos.x, this.endPoint.pos.y);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n}\r\n","/**\r\n * @class Entity\r\n */\r\nexport default class Entity {\r\n /**\r\n * \r\n * @param {Number} iterations \r\n */\r\n constructor(iterations) {\r\n this.points = [];\r\n this.sticks = [];\r\n this.iterations = iterations || 16;\r\n }\r\n\r\n\r\n // join(...args) {\r\n // let points = [];\r\n // let sticks = [];\r\n\r\n // // loop through the args and push points and sticks to the array\r\n // for (let i = 0; i < args.length; i++) {\r\n // points.push(args[i].points);\r\n // sticks.push(args[i].sticks);\r\n // }\r\n\r\n // // join multiple arrays\r\n // points = [].concat.apply([], points);\r\n // sticks = [].concat.apply([], sticks);\r\n\r\n // // add the arrays to the mix::Entity\r\n // this.points = points;\r\n // this.sticks = sticks;\r\n\r\n // return this; // return for chaining\r\n // }\r\n\r\n /**\r\n * @method setGravity\r\n * @param {Vector} g \r\n */\r\n setGravity(g) {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].setGravity(g);\r\n }\r\n }\r\n\r\n /**\r\n * @method pin\r\n * @param {Number} index \r\n */\r\n pin(index) {\r\n this.points[index].pin();\r\n }\r\n\r\n /**\r\n * @method removeSticks\r\n * @param {Point} p\r\n */\r\n removeSticks(p) {\r\n this.sticks.splice(this.sticks.indexOf(p.sticks[0]), 1);\r\n p.sticks.splice(0, 1);\r\n }\r\n \r\n /**\r\n * @method setVelocity\r\n * @param {Number} x \r\n * @param {Number} y \r\n */\r\n setVelocity(x, y) {\r\n this.points.map(e => {\r\n e.oldpos.x += x;\r\n e.oldpos.y += y;\r\n })\r\n }\r\n\r\n /**\r\n * @ethod addPoint\r\n * @param {Number|Point} x \r\n * @param {Number?} y \r\n * @param {Number?} vx \r\n * @param {Number?} vy \r\n * @param {Number?} radius \r\n * @description adds a Point in points array with {x,y,vx,vy,radius}\r\n */\r\n addPoint(x, y, vx, vy, radius) {\r\n let p\r\n if (x instanceof Point) {\r\n p = x;\r\n } else {\r\n p = new Point(x, y, vx, vy, radius);\r\n }\r\n this.points.push(p);\r\n return p;\r\n }\r\n\r\n /**\r\n * \r\n * @param {Number|Stick} p1 \r\n * @param {Number} p2 \r\n * @param {Number} length \r\n */\r\n addStick(p1, p2, length) {\r\n // let s;\r\n // return s;\r\n if (p1 instanceof Stick) {\r\n this.sticks.push(p1);\r\n } else {\r\n this.sticks.push(new Stick(this.points[p1], this.points[p2], length));\r\n }\r\n }\r\n\r\n /**\r\n * @method updatePoints\r\n */\r\n updatePoints() {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].update();\r\n }\r\n }\r\n\r\n /**\r\n * @methdo updateSticks\r\n * @param {Number} stepCoef \r\n */\r\n updateSticks(stepCoef) {\r\n for (let i = 0; i < this.sticks.length; i++) {\r\n this.sticks[i].update(stepCoef);\r\n }\r\n }\r\n \r\n /**\r\n * @method updateContrains\r\n */\r\n updateContrains() {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].constrain();\r\n }\r\n }\r\n \r\n /**\r\n * @method update\r\n */\r\n update() {\r\n // var stepCoef = 1 / this.iterations;\r\n this.updatePoints();\r\n for (let j = 0; j < this.iterations; ++j) {\r\n this.updateSticks();\r\n this.updateContrains();\r\n }\r\n }\r\n\r\n /**\r\n * @method renderPoints\r\n */\r\n renderPoints(ctx) {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].render(ctx);\r\n }\r\n }\r\n\r\n /**\r\n * @method renderSticks\r\n */\r\n renderSticks(ctx) {\r\n for (let i = 0; i < this.sticks.length; i++) {\r\n this.sticks[i].render(ctx);\r\n }\r\n }\r\n\r\n /**\r\n * @method renderPointIndex\r\n */\r\n renderPointIndex(ctx) {\r\n for (let i = 0; i < this.points.length; i++) {\r\n ctx.beginPath();\r\n ctx.fillStyle = 'black';\r\n ctx.fillText(i, this.points[i].pos.x + 5, this.points[i].pos.y - 6);\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * @method render\r\n */\r\n render(ctx) {\r\n this.renderPoints(ctx);\r\n this.renderSticks(ctx);\r\n }\r\n}","export default class TypoGraphy {\r\n constructor(x, y, size, letter) {\r\n this.x = x;\r\n this.y = y;\r\n this.size = size;\r\n this.stickDistance = this.size;\r\n this.iterations = 50;\r\n // A\r\n this.A = [\r\n [0, 0, 1, 0, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 0, 1, 0],\r\n [1, 1, 1, 1, 1],\r\n [1, 0, 0, 0, 1]\r\n ]\r\n // B\r\n this.B = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0]\r\n ]\r\n\r\n // C\r\n this.C = [\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0]\r\n ]\r\n\r\n // D\r\n this.D = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0]\r\n ];\r\n\r\n // E\r\n this.E = [\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 0, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 0, 0],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // S\r\n this.S = [\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0]\r\n ]\r\n\r\n // I \r\n this.I = [\r\n [0, 0, 1, 0, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n\r\n // K\r\n this.K = [\r\n [1, 0, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 0, 1, 1, 0]\r\n ]\r\n\r\n // U\r\n this.U = [\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // N\r\n this.N = [\r\n [0, 0, 0, 0, 0, 0],\r\n [1, 1, 0, 0, 1, 1],\r\n [1, 1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1, 1],\r\n [1, 1, 0, 1, 1, 1],\r\n [1, 1, 0, 0, 1, 1]\r\n ]\r\n\r\n // R\r\n this.R = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0]\r\n ]\r\n\r\n // G\r\n this.G = [\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // L\r\n this.L = [\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1]\r\n ]\r\n\r\n // Y\r\n this.Y = [\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // V\r\n this.V = [\r\n [1, 0, 0, 0, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n //X\r\n this.X = [\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1]\r\n ]\r\n\r\n //P\r\n this.P = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 0, 0]\r\n ]\r\n\r\n //H\r\n this.H = [\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1]\r\n ]\r\n\r\n //O\r\n this.O = [\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n this.letters = {\r\n A: this.A,\r\n B: this.B,\r\n C: this.C,\r\n D: this.D,\r\n E: this.E,\r\n K: this.K,\r\n I: this.I,\r\n S: this.S,\r\n U: this.U,\r\n N: this.N,\r\n R: this.R,\r\n G: this.G,\r\n L: this.L,\r\n Y: this.Y,\r\n V: this.V,\r\n X: this.X,\r\n P: this.P,\r\n H: this.H,\r\n O: this.O,\r\n }\r\n\r\n\r\n let gridArray = this.letters[letter];\r\n\r\n this.text = new Entity(this.iterations);\r\n // this.text.renderPoints = function() {};\r\n\r\n for (let x = 0; x < gridArray.length; x++) {\r\n for (let y = 0; y < gridArray[x].length; y++) {\r\n if (gridArray[y][x] == 1) {\r\n let p = new Point(this.x + x * this.size, this.y + y * this.size);\r\n p.setRadius(2);\r\n this.text.addPoint(p);\r\n }\r\n }\r\n }\r\n\r\n // join\r\n for (let i = 0; i < this.text.points.length; i++) {\r\n for (let j = 0; j < this.text.points.length; j++) {\r\n if (this.text.points[i] == this.text.points[j]) break;\r\n let d = this.text.points[i].pos.dist(this.text.points[j].pos);\r\n\r\n if (d > 0 && d < this.size + this.stickDistance) {\r\n this.text.addStick(i, j);\r\n }\r\n }\r\n }\r\n }\r\n}"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/Utils.js","webpack:///./src/Mouse.js","webpack:///./src/Verly.js","webpack:///./src/Vector.js","webpack:///./src/app.js","webpack:///./src/Point.js","webpack:///./src/Stick.js","webpack:///./src/Entity.js","webpack:///./src/TypoGraphy.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","normalizedRandom","Math","random","degreesToRad","degrees","PI","clamp","e","min","max","rand","arguments","length","lerp","a","b","Mouse","[object Object]","entities","canvas","ctx","this","draggedPoint","down","coord","Vector","offset","offsetCoord","addEventListener","setXY","offsetX","pos","x","offsetY","y","sub","resetVelocity","touches","clientX","clientY","pageX","pageY","getNearestPoint","renderDraggedPoint","dragPoint","point","beginPath","strokeStyle","arc","radius","stroke","closePath","k","points","dist","src_Verly","iterations","currentFrame","WIDTH","width","HEIGHT","height","mouse","args","mixEntity","Entity","sticks","push","index","indexOf","splice","concat","apply","addEntity","drag","update","renderPointIndex","render","w","h","box","addPoint","addStick","segments","stride1","stride2","hexagon","stride","theta","cos","sin","center","Stick","posx","posy","pinOffset","cloth","xStride","yStride","px","py","tear","threshold","startPoint","endPoint","removeSticks","pin","dontPush","gap","rope","undefined","x0","y0","ragdoll","head","Point","setMass","f1","f2","h1","h2","Vector_Vector","v1","v2","distSq","add","fromAngle","angle","v","random2D","jitter","mult","div","setAngle","len","mag","sqrt","magSq","setMag","normalize","normalizeTo","limit","heading","atan2","dx","dy","copy","negative","array","toString","z","project","coeff","rotate","Verly","vx","vy","oldpos","bounce","friction","groundFriction","gravity","pinned","color","mass","forceAcc","g","f","strength","delta","magR","applyForce","time","speed","verlyInstance","vel","fillStyle","fill","p1","p2","stiffness","stepCoef","diff","offsetx","offsety","m1","m2","moveTo","lineTo","setGravity","setFriction","map","constrain","updatePoints","j","updateSticks","updateConstraints","fillText","renderPoints","renderSticks","TypoGraphy","size","letter","stickDistance","A","B","C","D","E","S","I","K","U","N","R","G","L","Y","V","X","P","H","O","letters","gridArray","text","setRadius","__webpack_exports__"],"mappings":"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C,SACAI,KAAAiL,eACAjL,KAAAkL,iBH1LAxM,OAAAyM,WIbe,MACfvL,YAAAe,EAAAE,EAAAuK,EAAAC,EAAA5B,GACAzJ,KAAAW,IACAX,KAAAa,IACAb,KAAAoL,OACApL,KAAAsL,cAAAtL,KAAAoL,KACApL,KAAAmC,WAAA,GAEAnC,KAAAuL,EAAA,CACA,YACA,YACA,YACA,YACA,aAGAvL,KAAAwL,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAxL,KAAAyL,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAzL,KAAA0L,EAAA,CACA,YACA,YACA,YACA,YACA,aAIA1L,KAAA2L,EAAA,CACA,YACA,YACA,YACA,YACA,aAIA3L,KAAA4L,EAAA,CACA,YACA,YACA,YACA,YACA,aAIA5L,KAAA6L,EAAA,CACA,YACA,YACA,YACA,YACA,aAKA7L,KAAA8L,EAAA,CACA,YACA,YACA,YACA,YACA,aAIA9L,KAAA+L,EAAA,CACA,YACA,YACA,YACA,YACA,aAIA/L,KAAAgM,EAAA,CACA,cACA,cACA,cACA,cACA,cACA,eAIAhM,KAAAiM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAjM,KAAAkM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAlM,KAAAmM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAnM,KAAAoM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIApM,KAAAqM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIArM,KAAAsM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAtM,KAAAuM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAvM,KAAAwM,EAAA,CACA,YACA,YACA,YACA,YACA,aAIAxM,KAAAyM,EAAA,CACA,YACA,YACA,YACA,YACA,aAGAzM,KAAA0M,QAAA,CACAnB,EAAAvL,KAAAuL,EACAC,EAAAxL,KAAAwL,EACAC,EAAAzL,KAAAyL,EACAC,EAAA1L,KAAA0L,EACAC,EAAA3L,KAAA2L,EACAG,EAAA9L,KAAA8L,EACAD,EAAA7L,KAAA6L,EACAD,EAAA5L,KAAA4L,EACAG,EAAA/L,KAAA+L,EACAC,EAAAhM,KAAAgM,EACAC,EAAAjM,KAAAiM,EACAC,EAAAlM,KAAAkM,EACAC,EAAAnM,KAAAmM,EACAC,EAAApM,KAAAoM,EACAC,EAAArM,KAAAqM,EACAC,EAAAtM,KAAAsM,EACAC,EAAAvM,KAAAuM,EACAC,EAAAxM,KAAAwM,EACAC,EAAAzM,KAAAyM,GAIA,IAAAE,EAAA3M,KAAA0M,QAAArB,GAEArL,KAAA4M,KAAA,IAAAhK,OAAA5C,KAAAmC,WAAAsH,GAGA,QAAA9I,EAAA,EAAmBA,EAAAgM,EAAApN,OAAsBoB,IACzC,QAAAE,EAAA,EAAqBA,EAAA8L,EAAAhM,GAAApB,OAAyBsB,IAC9C,MAAA8L,EAAA9L,GAAAF,GAAA,CACA,IAAAnC,EAAA,IAAAsH,MAAA9F,KAAAW,IAAAX,KAAAoL,KAAApL,KAAAa,IAAAb,KAAAoL,MACA5M,EAAAqO,UAAA,GACA7M,KAAA4M,KAAAhJ,SAAApF,GAMA,QAAA9B,EAAA,EAAmBA,EAAAsD,KAAA4M,KAAA5K,OAAAzC,OAA6B7C,IAChD,QAAAmO,EAAA,EAAqBA,EAAA7K,KAAA4M,KAAA5K,OAAAzC,QACrBS,KAAA4M,KAAA5K,OAAAtF,IAAAsD,KAAA4M,KAAA5K,OAAA6I,GADkDA,IAAA,CAElD,IAAA7N,EAAAgD,KAAA4M,KAAA5K,OAAAtF,GAAAgE,IAAAuB,KAAAjC,KAAA4M,KAAA5K,OAAA6I,GAAAnK,KAEA1D,EAAA,GAAAA,EAAAgD,KAAAoL,KAAApL,KAAAsL,eACAtL,KAAA4M,KAAA/I,SAAAnH,EAAAmO,MJjNeiC,EAAA","file":"verly.bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","window.normalizedRandom = function () {\r\n return Math.random() * 2 - 1;\r\n};\r\nwindow.degreesToRad = function (degrees) {\r\n var pi = Math.PI;\r\n return degrees * (pi / 180);\r\n}\r\nwindow.clamp = function (t, e, i) {\r\n return Math.min(Math.max(t, Math.min(e, i)), Math.max(e, i))\r\n}\r\nwindow.random = function (rand, min, max) {\r\n //one param\r\n if (arguments.length === 1) {\r\n return Math.random() * arguments[0];\r\n } else if (arguments.length == 2) {\r\n //min and max\r\n max = min;\r\n min = rand;\r\n rand = Math.random;\r\n }\r\n if (!min && !max) {\r\n return Math.random();\r\n } else if (!max) {\r\n //if only one is provided, then thats actually the max\r\n max = min;\r\n return rand() * max;\r\n }\r\n return rand() * (max - min) + min;\r\n};\r\n\r\nwindow.lerp = function(a, b, p) {\r\n return (b - a) * p + a;\r\n}\r\n","export default class Mouse {\r\n constructor(entities, canvas, ctx) {\r\n this.entities = entities;\r\n // Drag Interaction\r\n this.draggedPoint = null;\r\n this.down = false;\r\n this.coord = new Vector();\r\n this.offset = new Vector();\r\n this.offsetCoord = new Vector();\r\n this.canvas = canvas;\r\n this.ctx = ctx;\r\n\r\n this.canvas.addEventListener('mousedown', (e) => {\r\n this.down = true;\r\n if (this.draggedPoint) {\r\n this.offset.setXY(e.offsetX - this.draggedPoint.pos.x, e.offsetY - this.draggedPoint.pos.y);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n }\r\n })\r\n this.canvas.addEventListener('mouseup', (e) => {\r\n if (this.draggedPoint) {\r\n this.draggedPoint.resetVelocity();\r\n };\r\n this.down = false;\r\n this.draggedPoint = null;\r\n })\r\n\r\n this.canvas.addEventListener('mousemove', (e) => {\r\n this.coord.setXY(e.offsetX, e.offsetY);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n })\r\n\r\n // TOUCH\r\n this.canvas.addEventListener('touchstart', (e) => {\r\n let offset = e.touches[0];\r\n this.down = true;\r\n if (this.draggedPoint) {\r\n this.offset.setXY(offset.clientX - this.draggedPoint.pos.x, offset.clientY - this.draggedPoint.pos.y);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n }\r\n })\r\n this.canvas.addEventListener('touchend', (e) => {\r\n if (this.draggedPoint) {\r\n this.draggedPoint.resetVelocity();\r\n };\r\n this.down = false;\r\n this.draggedPoint = null;\r\n })\r\n this.canvas.addEventListener('touchmove', (e) => {\r\n let offset = e.touches[0];\r\n this.coord.setXY(offset.pageX, offset.pageY);\r\n this.offsetCoord = Vector.sub(this.coord, this.offset);\r\n })\r\n }\r\n\r\n dragPoint() {\r\n if (!this.down) return;\r\n this.draggedPoint.pos.setXY(this.offsetCoord.x, this.offsetCoord.y);\r\n }\r\n\r\n drag() {\r\n if (!this.down) {\r\n this.draggedPoint = this.getNearestPoint();\r\n }\r\n if (this.draggedPoint) {\r\n this.renderDraggedPoint(this.draggedPoint);\r\n this.dragPoint();\r\n }\r\n }\r\n \r\n renderDraggedPoint(point) {\r\n this.ctx.beginPath();\r\n this.ctx.strokeStyle = 'black';\r\n this.ctx.arc(point.pos.x, point.pos.y, point.radius * 1.5, 0, Math.PI * 2);\r\n this.ctx.stroke();\r\n this.ctx.closePath();\r\n }\r\n\r\n\r\n getNearestPoint() {\r\n // if (!this.down) return false;\r\n let d = 20;\r\n let p = null;\r\n for (let k = 0; k < this.entities.length; k++) {\r\n for (let i = 0; i < this.entities[k].points.length; i++) {\r\n let dist = this.entities[k].points[i].pos.dist(this.coord);\r\n if (dist < d) {\r\n p = this.entities[k].points[i];\r\n }\r\n }\r\n }\r\n return p;\r\n }\r\n}\r\n","import Mouse from './Mouse';\r\n\r\n/**\r\n * @class Verly\r\n * @version 1.1.4\r\n * @author \r\n */\r\nclass Verly {\r\n /**\r\n * \r\n * @param {Number} iterations \r\n * @param {HTMLCanvasElement} canvas \r\n * @param {CanvasRenderingContext2D} ctx \r\n */\r\n constructor(iterations, canvas, ctx) {\r\n this.entities = [];\r\n this.iterations = iterations;\r\n this.currentFrame = 0;\r\n this.canvas = canvas;\r\n this.WIDTH = canvas.width;\r\n this.HEIGHT = canvas.height;\r\n this.ctx = ctx;\r\n this.mouse = new Mouse(this.entities, this.canvas, this.ctx);\r\n }\r\n\r\n /**\r\n * Joins two Entity Class Together\r\n * @param {...Entity} args \r\n */\r\n joinEntities(...args) {\r\n let mixEntity = new Entity(this.iterations, this);\r\n\r\n let points = [];\r\n let sticks = [];\r\n\r\n // loop through the args and push points and sticks to the array\r\n for (let i = 0; i < args.length; i++) {\r\n points.push(args[i].points);\r\n sticks.push(args[i].sticks);\r\n\r\n // get the index which item we should splice in [this.entities]\r\n let index = this.entities.indexOf(args[i]);\r\n this.entities.splice(index, 1);\r\n }\r\n\r\n // join multiple arrays\r\n points = [].concat.apply([], points);\r\n sticks = [].concat.apply([], sticks);\r\n\r\n // add the arrays to the mix::Entity\r\n mixEntity.points = points;\r\n mixEntity.sticks = sticks;\r\n\r\n // add the mix::Entity to [this.entities]\r\n this.addEntity(mixEntity);\r\n return mixEntity; // return for chaining\r\n }\r\n\r\n /**\r\n * @method addEntity\r\n * @param {Entity} e \r\n */\r\n addEntity(e) {\r\n this.entities.push(e);\r\n }\r\n\r\n /**\r\n * @method interact\r\n * drags points\r\n */\r\n interact() {\r\n this.mouse.drag();\r\n }\r\n\r\n /**\r\n * @method update\r\n * updates all the physics stuff\r\n */\r\n update() {\r\n for (let i = 0; i < this.entities.length; i++) {\r\n this.entities[i].update();\r\n }\r\n\r\n this.currentFrame++;\r\n }\r\n\r\n /**\r\n * @method renderPointIndex\r\n */\r\n renderPointIndex() {\r\n for (let i = 0; i < this.entities.length; i++) {\r\n this.entities[i].renderPointIndex(this.ctx);\r\n }\r\n }\r\n\r\n /**\r\n * @method render\r\n * renders all the entity\r\n */\r\n render() {\r\n for (let i = 0; i < this.entities.length; i++) {\r\n this.entities[i].render(this.ctx);\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * @method createBox\r\n * @param {number} x \r\n * @param {number} y \r\n * @param {number} w \r\n * @param {number} h \r\n */\r\n createBox(x, y, w, h) {\r\n const box = new Entity(this.iterations, this);\r\n box.addPoint(x, y, 0, 0);\r\n box.addPoint(x + w, y, 0, 0);\r\n box.addPoint(x + w, y + h, 0, 0);\r\n box.addPoint(x, y + h, 0, 0);\r\n box.addStick(0, 1);\r\n box.addStick(1, 2);\r\n box.addStick(2, 3);\r\n box.addStick(3, 0);\r\n box.addStick(3, 1);\r\n\r\n this.addEntity(box);\r\n return box;\r\n }\r\n\r\n\r\n /**\r\n * @method createHexagon\r\n * @param {number} x \r\n * @param {number} y \r\n * @param {number} segments \r\n * @param {number} radius=50\r\n * @param {number} stride1=1\r\n * @param {number} stride2=5\r\n */\r\n createHexagon(x, y, segments, radius = 50, stride1 = 1, stride2 = 5) {\r\n const hexagon = new Entity(this.iterations, this);\r\n\r\n let stride = (2 * Math.PI) / segments;\r\n\r\n // points\r\n for (let i = 0; i < segments; ++i) {\r\n let theta = i * stride;\r\n hexagon.addPoint(\r\n x + Math.cos(theta) * radius,\r\n y + Math.sin(theta) * radius,\r\n 0, 0\r\n );\r\n }\r\n\r\n let center = hexagon.addPoint(x, y, 0, 0);\r\n\r\n // sticks\r\n for (let i = 0; i < segments; ++i) {\r\n hexagon.addStick(i, (i + stride1) % segments);\r\n hexagon.addStick(new Stick(hexagon.points[i], center));\r\n hexagon.addStick(i, (i + stride2) % segments);\r\n }\r\n\r\n\r\n this.addEntity(hexagon);\r\n return hexagon;\r\n }\r\n\r\n /**\r\n * @method createCloth\r\n * @param {number} posx \r\n * @param {number} posy \r\n * @param {number} w \r\n * @param {number} h \r\n * @param {number} segments \r\n * @param {number} pinOffset \r\n */\r\n createCloth(posx, posy, w, h, segments, pinOffset) {\r\n let cloth = new Entity(this.iterations, this);\r\n\r\n let xStride = w / segments;\r\n let yStride = h / segments;\r\n\r\n let x, y;\r\n for (y = 0; y < segments; ++y) {\r\n for (x = 0; x < segments; ++x) {\r\n let px = posx + x * xStride - w / 2 + xStride / 2;\r\n let py = posy + y * yStride - h / 2 + yStride / 2;\r\n cloth.addPoint(px, py);\r\n\r\n if (x > 0) {\r\n cloth.addStick(y * segments + x, y * segments + x - 1);\r\n }\r\n\r\n if (y > 0) {\r\n cloth.addStick(y * segments + x, (y - 1) * segments + x);\r\n }\r\n }\r\n }\r\n\r\n // as the name suggest\r\n function tear(threshold) {\r\n for (let i = 0; i < cloth.sticks.length; i++) {\r\n // find the distance between two points\r\n let dist = cloth.sticks[i].startPoint.pos.dist(cloth.sticks[i].endPoint.pos)\r\n if (dist > (threshold || 20)) { // remove if the dist is > than threshold \r\n cloth.removeSticks(cloth.sticks[i].startPoint);\r\n }\r\n }\r\n }\r\n\r\n cloth.tear = tear;\r\n\r\n for (x = 0; x < segments; ++x) {\r\n if (x % pinOffset == 0) { // magic\r\n cloth.pin(x);\r\n }\r\n }\r\n\r\n !this.dontPush && this.addEntity(cloth);\r\n return cloth;\r\n }\r\n\r\n\r\n /**\r\n * @method createRope\r\n * @param {number} x \r\n * @param {number} y \r\n * @param {number} segments=10\r\n * @param {number} gap=15\r\n * @param {number} pin=0\r\n */\r\n createRope(x, y, segments = 10, gap = 15, pin) {\r\n let rope = new Entity(this.iterations, this);\r\n\r\n for (let i = 0; i < segments; i++) {\r\n rope.addPoint(x + i * gap, y, 0, 0)\r\n }\r\n\r\n for (let i = 0; i < segments - 1; i++) {\r\n rope.addStick(i, (i + 1) % segments);\r\n }\r\n\r\n if (pin !== undefined) {\r\n rope.pin(pin);\r\n }\r\n this.addEntity(rope);\r\n return rope;\r\n }\r\n\r\n\r\n createRagdoll(x0, y0) {\r\n let ragdoll = new Entity(this.iterations, this);\r\n\r\n // Head\r\n // x, y, extremity, gravity, radius\r\n // let h = ;\r\n // h.head = true;\r\n // h.oldx = x0 + (Math.random() - 0.5) * 25;\r\n\r\n let head = new Point(x0, y0, 0, 0, 15);\r\n head.setMass(5);\r\n ragdoll.addPoint(head);\r\n\r\n // Groin\r\n ragdoll.addPoint(x0, y0 + 100);\r\n\r\n // Hips\r\n ragdoll.addPoint(x0 + 30, y0 + 90);\r\n ragdoll.addPoint(x0 - 30, y0 + 90);\r\n\r\n // Knees\r\n ragdoll.addPoint(x0 + 20, y0 + 150);\r\n ragdoll.addPoint(x0 - 20, y0 + 150);\r\n\r\n // Feet\r\n let f1 = new Point(x0 + 30, y0 + 190, 0, 0, 10);\r\n let f2 = new Point(x0 - 30, y0 + 190, 0, 0, 10);\r\n f1.setMass(20);\r\n f2.setMass(20);\r\n ragdoll.addPoint(f1);\r\n ragdoll.addPoint(f2);\r\n\r\n // Neck\r\n ragdoll.addPoint(x0, y0 + 25);\r\n\r\n // Shoulders\r\n ragdoll.addPoint(x0 + 25, y0 + 30);\r\n ragdoll.addPoint(x0 - 25, y0 + 30);\r\n\r\n // Hands\r\n let h1 = new Point(x0 + 15, y0 + 105, 0, 0, 10);\r\n let h2 = new Point(x0 - 15, y0 + 105, 0, 0, 10);\r\n h1.setMass(5);\r\n h2.setMass(5);\r\n ragdoll.addPoint(h1);\r\n ragdoll.addPoint(h2);\r\n\r\n\r\n\r\n // \"Muscles\"\r\n // Head - shoulders\r\n ragdoll.addStick(0, 9);\r\n ragdoll.addStick(0, 10);\r\n // Shoulder - shoulder\r\n ragdoll.addStick(9, 10);\r\n\r\n // Shoulders - hips\r\n ragdoll.addStick(9, 2);\r\n ragdoll.addStick(10, 3);\r\n // Shoulders - hips opposite side\r\n ragdoll.addStick(9, 3);\r\n ragdoll.addStick(10, 2);\r\n\r\n // Hips - feet\r\n ragdoll.addStick(2, 6);\r\n ragdoll.addStick(3, 7);\r\n\r\n // Hips - feet, opposite\r\n ragdoll.addStick(2, 7);\r\n ragdoll.addStick(3, 6);\r\n\r\n // Head - groin\r\n ragdoll.addStick(0, 1);\r\n\r\n // Hip - hip\r\n ragdoll.addStick(2, 3);\r\n // Shoulder - hip\r\n ragdoll.addStick(9, 2);\r\n ragdoll.addStick(10, 3);\r\n\r\n // Head - knee\r\n ragdoll.addStick(0, 4);\r\n // Head - knee\r\n ragdoll.addStick(0, 5);\r\n\r\n // Head feet\r\n ragdoll.addStick(0, 6);\r\n ragdoll.addStick(0, 7);\r\n\r\n // Body parts\r\n // Hips\r\n ragdoll.addStick(1, 2);\r\n ragdoll.addStick(1, 3);\r\n // Legs\r\n ragdoll.addStick(2, 4);\r\n ragdoll.addStick(3, 5);\r\n ragdoll.addStick(4, 6);\r\n ragdoll.addStick(5, 7);\r\n\r\n ragdoll.addStick(0, 8);\r\n ragdoll.addStick(8, 1);\r\n\r\n // Left arm\r\n ragdoll.addStick(8, 9);\r\n ragdoll.addStick(9, 11);\r\n\r\n // Right arm\r\n ragdoll.addStick(8, 10);\r\n ragdoll.addStick(10, 12);\r\n\r\n this.addEntity(ragdoll);\r\n return ragdoll;\r\n }\r\n}\r\n\r\nexport default Verly;","/**\r\n * Vector.js v1.0.0\r\n * @author Anurag Hazra\r\n * @borrows p5.Vector\r\n * @param {number} x \r\n * @param {number} y \r\n */\r\n\r\nexport default function Vector(x, y) {\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n}\r\n\r\n// Static Functions\r\nVector.dist = function (v1, v2) {\r\n return v1.dist(v2);\r\n}\r\nVector.distSq = function (v1, v2) {\r\n return v1.distSq(v2);\r\n}\r\nVector.sub = function (v1, v2) {\r\n return new Vector(v1.x - v2.x, v1.y - v2.y);\r\n};\r\nVector.add = function (v1, v2) {\r\n return new Vector(v1.x + v2.x, v1.y + v2.y);\r\n};\r\nVector.fromAngle = function (angle) {\r\n let v = new Vector(0, 0);\r\n v.x = Math.cos(angle);\r\n v.y = Math.sin(angle);\r\n return v;\r\n}\r\nVector.random2D = function (v) {\r\n return Vector.fromAngle(Math.random() * Math.PI * 180);\r\n}\r\n\r\n\r\nVector.prototype = {\r\n jitter: function (a, b) {\r\n var v = new Vector(a, b);\r\n this.x += normalizedRandom() * v.x;\r\n this.y += normalizedRandom() * v.y;\r\n return this;\r\n },\r\n add: function (x, y) {\r\n if (arguments.length === 1) {\r\n this.x += x.x;\r\n this.y += x.y;\r\n } else if (arguments.length === 2) {\r\n this.x += x;\r\n this.y += y;\r\n }\r\n return this;\r\n },\r\n sub: function (x, y) {\r\n if (arguments.length === 1) {\r\n this.x -= x.x;\r\n this.y -= x.y;\r\n } else if (arguments.length === 2) {\r\n this.x -= x;\r\n this.y -= y;\r\n }\r\n return this;\r\n },\r\n mult: function (v) {\r\n if (typeof v === 'number') {\r\n this.x *= v;\r\n this.y *= v;\r\n } else {\r\n this.x *= v.x;\r\n this.y *= v.y;\r\n }\r\n return this;\r\n },\r\n div: function (v) {\r\n if (typeof v === 'number') {\r\n this.x /= v;\r\n this.y /= v;\r\n } else {\r\n this.x /= v.x;\r\n this.y /= v.y;\r\n }\r\n return this;\r\n },\r\n setAngle: function (angle) {\r\n var len = this.mag();\r\n this.x = Math.cos(angle) * len;\r\n this.y = Math.sin(angle) * len;\r\n },\r\n mag: function () {\r\n return Math.sqrt(this.x * this.x + this.y * this.y);\r\n },\r\n magSq: function () {\r\n return (this.x * this.x + this.y * this.y);\r\n },\r\n setXY: function (x, y) {\r\n this.x = x;\r\n this.y = y;\r\n return this;\r\n },\r\n setMag: function (value) {\r\n this.normalize();\r\n this.mult(value);\r\n return this;\r\n },\r\n normalize: function () {\r\n let m = this.mag();\r\n if (m > 0) {\r\n this.div(m);\r\n }\r\n return this;\r\n },\r\n normalizeTo: function (length) {\r\n var mag = this.mag();\r\n if (mag > 0) {\r\n mag = length / mag;\r\n this.mult(mag);\r\n }\r\n return this;\r\n },\r\n limit: function (max) {\r\n if (this.mag() > max) {\r\n this.normalize();\r\n this.mult(max);\r\n }\r\n return this;\r\n },\r\n heading: function () {\r\n return (-Math.atan2(-this.y, this.x));\r\n },\r\n dist: function (v) {\r\n let dx = this.x - v.x;\r\n let dy = this.y - v.y;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n },\r\n distSq: function (v) {\r\n let dx = this.x - v.x;\r\n let dy = this.y - v.y;\r\n return (dx * dx + dy * dy);\r\n },\r\n copy: function () {\r\n return new Vector(this.x, this.y);\r\n },\r\n negative: function () {\r\n this.x = -this.x;\r\n this.y = -this.y;\r\n return this;\r\n },\r\n array: function () {\r\n return [this.x, this.y];\r\n },\r\n toString: function () {\r\n return \"[\" + this.x + \", \" + this.y + \", \" + this.z + \"]\";\r\n },\r\n project: function (v) {\r\n var coeff = ((this.x * v.x) + (this.y * v.y)) / ((v.x * v.x) + (v.y * v.y));\r\n this.x = coeff * v.x;\r\n this.y = coeff * v.y;\r\n return this;\r\n },\r\n rotate: function (a) {\r\n var b = this.heading() + a;\r\n var c = this.mag();\r\n this.x = Math.cos(b) * c;\r\n this.y = Math.sin(b) * c;\r\n }\r\n}","import Verly from './Verly';\r\nimport Utils from './Utils';\r\nimport Vector from './Vector';\r\nimport Point from './Point';\r\nimport Stick from './Stick';\r\nimport Entity from './Entity';\r\nimport TypoGraphy from './TypoGraphy';\r\n\r\nwindow.Verly = Verly;\r\nwindow.Vector = Vector;\r\nwindow.Point = Point;\r\nwindow.Stick = Stick;\r\nwindow.Entity = Entity;\r\nwindow.TypoGraphy = TypoGraphy;\r\n\r\nexport default Verly;","export default class Point {\r\n constructor(x, y, vx, vy, radius) {\r\n this.pos = new Vector(x, y);\r\n this.oldpos = new Vector(x + (vx || 0), y + (vy || 0));\r\n this.bounce = 0.99;\r\n this.friction = 0.97;\r\n this.groundFriction = 0.7;\r\n this.gravity = new Vector(0, 1);\r\n this.pinned = false;\r\n this.radius = radius || 5;\r\n this.color = '#e62a4f';\r\n this.mass = 1;\r\n this.sticks = [];\r\n // this.behaviors = [];\r\n this.forceAcc = 1;\r\n }\r\n\r\n setGravity(g) {\r\n this.gravity = g;\r\n }\r\n setFriction(f) {\r\n this.friction = f;\r\n }\r\n setForceAcc(f) {\r\n this.forceAcc = f;\r\n }\r\n setMass(m) {\r\n this.mass = m;\r\n }\r\n setRadius(radius) {\r\n this.radius = radius;\r\n }\r\n\r\n resetVelocity() {\r\n this.oldpos.setXY(this.pos.x, this.pos.y);\r\n }\r\n pin() {\r\n this.pinned = true;\r\n }\r\n unpin() {\r\n this.pinned = false;\r\n }\r\n\r\n rotate(angle, offset) {\r\n let x = offset.x + (this.pos.x - offset.x) * Math.cos(angle) - (this.pos.y - offset.y) * Math.sin(angle);\r\n let y = offset.y + (this.pos.x - offset.x) * Math.sin(angle) + (this.pos.y - offset.y) * Math.cos(angle);\r\n this.pos.setXY(x, y);\r\n }\r\n\r\n resolveBehaviors(p, radius, strength) {\r\n var delta = Vector.sub(this.pos, p.pos);\r\n var dist = delta.magSq();\r\n\r\n let magR = (!radius) ? (this.radius * this.radius) : (radius * radius);\r\n if (dist < magR) {\r\n var f = delta.normalizeTo(1 - (dist / magR)).mult(strength || this.forceAcc);\r\n this.applyForce(f);\r\n }\r\n }\r\n\r\n applyForce(f) {\r\n this.pos.add(f);\r\n }\r\n\r\n addMotor(x, y, time, radius, speed) {\r\n this.pos.x = x + radius * Math.cos(time * speed);\r\n this.pos.y = y + radius * Math.sin(time * speed);\r\n }\r\n\r\n /**\r\n * @method constrain\r\n * @param {Verly} verlyInstance \r\n */\r\n constrain(verlyInstance) {\r\n // if (this.pos.y > HEIGHT - 1) {\r\n // this.pos.y = HEIGHT - 1;\r\n // }\r\n // if (this.pos.x < 0) {\r\n // this.pos.x = 0;\r\n // }\r\n // if (this.pos.x > WIDTH - 1) {\r\n // this.pos.x = WIDTH - 1;\r\n // }\r\n // let vel = Vector.sub(this.pos, this.oldpos);\r\n if (this.pos.x > verlyInstance.WIDTH - this.radius) {\r\n this.pos.x = verlyInstance.WIDTH - this.radius;\r\n // this.oldpos.x = (this.pos.x + vel.x) * this.bounce;\r\n }\r\n if (this.pos.x < this.radius) {\r\n this.pos.x = this.radius;\r\n // this.oldpos.x = (this.pos.x + vel.x) * this.bounce;\r\n }\r\n if (this.pos.y > verlyInstance.HEIGHT - this.radius) {\r\n this.pos.y = verlyInstance.HEIGHT - this.radius;\r\n // this.oldpos.y = (this.pos.y + vel.y) * this.bounce;\r\n }\r\n if (this.pos.y < this.radius) {\r\n this.pos.y = this.radius;\r\n // this.oldpos.y = (this.pos.y + vel.y) * this.bounce;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * @method update\r\n * @param {Verly} verlyInstance \r\n */\r\n update(verlyInstance) {\r\n if (this.pinned) return;\r\n let vel = Vector.sub(this.pos, this.oldpos);\r\n vel.mult(this.friction);\r\n // if the point touches the ground set groundFriction\r\n if (this.pos.y >= verlyInstance.HEIGHT - this.radius && vel.magSq() > 0.000001) {\r\n var m = vel.mag();\r\n vel.x /= m;\r\n vel.y /= m;\r\n vel.mult(m * this.groundFriction);\r\n }\r\n this.oldpos.setXY(this.pos.x, this.pos.y);\r\n this.pos.add(vel);\r\n this.pos.add(this.gravity);\r\n }\r\n\r\n /**\r\n * @method render\r\n * @param {CanvasRenderingContext2D} ctx \r\n */\r\n render(ctx) {\r\n ctx.beginPath();\r\n ctx.fillStyle = this.color;\r\n ctx.arc(this.pos.x, this.pos.y, this.radius, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.closePath();\r\n }\r\n}\r\n","export default class Stick {\r\n constructor(p1, p2, length, stiffness) {\r\n this.startPoint = p1;\r\n this.endPoint = p2;\r\n this.stiffness = stiffness || 2;\r\n this.color = '#f5476a';\r\n if (!length) {\r\n this.length = this.startPoint.pos.dist(this.endPoint.pos);\r\n } else {\r\n this.length = length;\r\n }\r\n this.startPoint.sticks.push(this);\r\n this.endPoint.sticks.push(this);\r\n }\r\n\r\n update(stepCoef) {\r\n // not gonna use vectors for performance optimization\r\n // let dx = this.endPoint.pos.x - this.startPoint.pos.x;\r\n // let dy = this.endPoint.pos.y - this.startPoint.pos.y;\r\n // let dist = Math.sqrt(dx * dx + dy * dy);\r\n // let diff = this.length - dist;\r\n // let percent = diff / dist / 2;\r\n // let offsetx = (dx * percent);\r\n // let offsety = (dy * percent);\r\n // if (!this.startPoint.pinned) {\r\n // this.startPoint.pos.x -= offsetx;\r\n // this.startPoint.pos.y -= offsety;\r\n // }\r\n // if (!this.endPoint.pinned) {\r\n // this.endPoint.pos.x += offsetx;\r\n // this.endPoint.pos.y += offsety;\r\n // }\r\n // ----- algo two\r\n\r\n // algo three\r\n let dx = this.endPoint.pos.x - this.startPoint.pos.x;\r\n let dy = this.endPoint.pos.y - this.startPoint.pos.y;\r\n let dist = Math.sqrt(dx * dx + dy * dy);\r\n let diff = (this.length - dist) / dist * this.stiffness;\r\n\r\n let offsetx = dx * diff * 0.5;\r\n let offsety = dy * diff * 0.5;\r\n\r\n // calculate mass\r\n let m1 = this.startPoint.mass + this.endPoint.mass;\r\n let m2 = this.startPoint.mass / m1;\r\n m1 = this.endPoint.mass / m1;\r\n\r\n if (!this.startPoint.pinned) {\r\n this.startPoint.pos.x -= offsetx * m1;\r\n this.startPoint.pos.y -= offsety * m1;\r\n }\r\n if (!this.endPoint.pinned) {\r\n this.endPoint.pos.x += offsetx * m2;\r\n this.endPoint.pos.y += offsety * m2;\r\n }\r\n\r\n \r\n // calculate mass\r\n // var m1 = this.startPoint.mass + this.endPoint.mass;\r\n // var m2 = this.startPoint.mass / m1;\r\n // m1 = this.endPoint.mass / m1;\r\n \r\n // var normal = Vector.sub(this.startPoint.pos, this.endPoint.pos);\r\n // var m = normal.magSq();\r\n // let diff = ((this.length * this.length) - m);\r\n // normal.mult((diff / m) * this.stiffness * stepCoef);\r\n \r\n // if (!this.startPoint.pinned) {\r\n // this.startPoint.pos.add(normal);\r\n // }\r\n // if (!this.endPoint.pinned) {\r\n // this.endPoint.pos.sub(normal);\r\n // }\r\n }\r\n\r\n render(ctx) {\r\n ctx.beginPath();\r\n ctx.strokeStyle = this.color;\r\n ctx.moveTo(this.startPoint.pos.x, this.startPoint.pos.y);\r\n ctx.lineTo(this.endPoint.pos.x, this.endPoint.pos.y);\r\n ctx.stroke();\r\n ctx.closePath();\r\n }\r\n}\r\n","/**\r\n * @class Entity\r\n */\r\nexport default class Entity {\r\n /**\r\n * \r\n * @param {Number} iterations \r\n * @param {Verly} verlyInstance \r\n */\r\n constructor(iterations, verlyInstance) {\r\n this.points = [];\r\n this.sticks = [];\r\n this.verlyInstance = verlyInstance;\r\n this.iterations = iterations || 16;\r\n }\r\n\r\n\r\n // join(...args) {\r\n // let points = [];\r\n // let sticks = [];\r\n\r\n // // loop through the args and push points and sticks to the array\r\n // for (let i = 0; i < args.length; i++) {\r\n // points.push(args[i].points);\r\n // sticks.push(args[i].sticks);\r\n // }\r\n\r\n // // join multiple arrays\r\n // points = [].concat.apply([], points);\r\n // sticks = [].concat.apply([], sticks);\r\n\r\n // // add the arrays to the mix::Entity\r\n // this.points = points;\r\n // this.sticks = sticks;\r\n\r\n // return this; // return for chaining\r\n // }\r\n\r\n /**\r\n * @method setGravity\r\n * @param {Vector} g \r\n */\r\n setGravity(g) {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].setGravity(g);\r\n }\r\n }\r\n\r\n /**\r\n * @method setFriction\r\n * @param {Number} f \r\n */\r\n setFriction(f) {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].setFriction(f);\r\n }\r\n }\r\n\r\n /**\r\n * @method pin\r\n * @param {Number} index \r\n */\r\n pin(index) {\r\n this.points[index].pin();\r\n }\r\n\r\n /**\r\n * @method removeSticks\r\n * @param {Point} p\r\n */\r\n removeSticks(p) {\r\n this.sticks.splice(this.sticks.indexOf(p.sticks[0]), 1);\r\n p.sticks.splice(0, 1);\r\n }\r\n\r\n /**\r\n * @method setVelocity\r\n * @param {Number} x \r\n * @param {Number} y \r\n */\r\n setVelocity(x, y) {\r\n this.points.map(e => {\r\n e.oldpos.x += x;\r\n e.oldpos.y += y;\r\n })\r\n }\r\n\r\n /**\r\n * @ethod addPoint\r\n * @param {Number|Point} x \r\n * @param {Number?} y \r\n * @param {Number?} vx \r\n * @param {Number?} vy \r\n * @param {Number?} radius \r\n * @description adds a Point in points array with {x,y,vx,vy,radius}\r\n */\r\n addPoint(x, y, vx, vy, radius) {\r\n let p\r\n if (x instanceof Point) {\r\n p = x;\r\n } else {\r\n p = new Point(x, y, vx, vy, radius);\r\n }\r\n this.points.push(p);\r\n return p;\r\n }\r\n\r\n /**\r\n * \r\n * @param {Number|Stick} p1 \r\n * @param {Number} p2 \r\n * @param {Number} length \r\n */\r\n addStick(p1, p2, length) {\r\n // let s;\r\n // return s;\r\n if (p1 instanceof Stick) {\r\n this.sticks.push(p1);\r\n } else {\r\n this.sticks.push(new Stick(this.points[p1], this.points[p2], length));\r\n }\r\n }\r\n\r\n /**\r\n * @method updatePoints\r\n */\r\n updatePoints() {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].update(this.verlyInstance);\r\n }\r\n }\r\n\r\n /**\r\n * @methdo updateSticks\r\n * @param {Number?} stepCoef \r\n */\r\n updateSticks(stepCoef) {\r\n for (let i = 0; i < this.sticks.length; i++) {\r\n this.sticks[i].update(stepCoef);\r\n }\r\n }\r\n\r\n /**\r\n * @method updateConstraints\r\n */\r\n updateConstraints() {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].constrain(this.verlyInstance);\r\n }\r\n }\r\n\r\n /**\r\n * @method update\r\n */\r\n update() {\r\n // var stepCoef = 1 / this.iterations;\r\n this.updatePoints();\r\n for (let j = 0; j < this.iterations; ++j) {\r\n this.updateSticks();\r\n this.updateConstraints();\r\n }\r\n }\r\n\r\n /**\r\n * @method renderPoints\r\n */\r\n renderPoints() {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.points[i].render(this.verlyInstance.ctx);\r\n }\r\n }\r\n\r\n /**\r\n * @method renderSticks\r\n */\r\n renderSticks() {\r\n for (let i = 0; i < this.sticks.length; i++) {\r\n this.sticks[i].render(this.verlyInstance.ctx);\r\n }\r\n }\r\n\r\n /**\r\n * @method renderPointIndex\r\n */\r\n renderPointIndex() {\r\n for (let i = 0; i < this.points.length; i++) {\r\n this.verlyInstance.ctx.beginPath();\r\n this.verlyInstance.ctx.fillStyle = 'black';\r\n this.verlyInstance.ctx.fillText(i, this.points[i].pos.x + 5, this.points[i].pos.y - 6);\r\n this.verlyInstance.ctx.closePath();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * @method render\r\n */\r\n render() {\r\n this.renderPoints();\r\n this.renderSticks();\r\n }\r\n}","export default class TypoGraphy {\r\n constructor(x, y, size, letter, verlyInstance) {\r\n this.x = x;\r\n this.y = y;\r\n this.size = size;\r\n this.stickDistance = this.size;\r\n this.iterations = 50;\r\n // A\r\n this.A = [\r\n [0, 0, 1, 0, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 0, 1, 0],\r\n [1, 1, 1, 1, 1],\r\n [1, 0, 0, 0, 1]\r\n ]\r\n // B\r\n this.B = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0]\r\n ]\r\n\r\n // C\r\n this.C = [\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0]\r\n ]\r\n\r\n // D\r\n this.D = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0]\r\n ];\r\n\r\n // E\r\n this.E = [\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 0, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 0, 0],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // S\r\n this.S = [\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0]\r\n ]\r\n\r\n // I \r\n this.I = [\r\n [0, 0, 1, 0, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n\r\n // K\r\n this.K = [\r\n [1, 0, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 0, 1, 1, 0]\r\n ]\r\n\r\n // U\r\n this.U = [\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // N\r\n this.N = [\r\n [0, 0, 0, 0, 0, 0],\r\n [1, 1, 0, 0, 1, 1],\r\n [1, 1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1, 1],\r\n [1, 1, 0, 1, 1, 1],\r\n [1, 1, 0, 0, 1, 1]\r\n ]\r\n\r\n // R\r\n this.R = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0]\r\n ]\r\n\r\n // G\r\n this.G = [\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // L\r\n this.L = [\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 0, 0, 0],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1]\r\n ]\r\n\r\n // Y\r\n this.Y = [\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n // V\r\n this.V = [\r\n [1, 0, 0, 0, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n //X\r\n this.X = [\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 1, 1, 1]\r\n ]\r\n\r\n //P\r\n this.P = [\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 1, 0],\r\n [1, 1, 1, 0, 0],\r\n [1, 1, 1, 0, 0]\r\n ]\r\n\r\n //H\r\n this.H = [\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 1, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1]\r\n ]\r\n\r\n //O\r\n this.O = [\r\n [0, 1, 1, 1, 0],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [1, 1, 0, 1, 1],\r\n [0, 1, 1, 1, 0]\r\n ]\r\n\r\n this.letters = {\r\n A: this.A,\r\n B: this.B,\r\n C: this.C,\r\n D: this.D,\r\n E: this.E,\r\n K: this.K,\r\n I: this.I,\r\n S: this.S,\r\n U: this.U,\r\n N: this.N,\r\n R: this.R,\r\n G: this.G,\r\n L: this.L,\r\n Y: this.Y,\r\n V: this.V,\r\n X: this.X,\r\n P: this.P,\r\n H: this.H,\r\n O: this.O,\r\n }\r\n\r\n\r\n let gridArray = this.letters[letter];\r\n\r\n this.text = new Entity(this.iterations, verlyInstance);\r\n // this.text.renderPoints = function() {};\r\n\r\n for (let x = 0; x < gridArray.length; x++) {\r\n for (let y = 0; y < gridArray[x].length; y++) {\r\n if (gridArray[y][x] == 1) {\r\n let p = new Point(this.x + x * this.size, this.y + y * this.size);\r\n p.setRadius(2);\r\n this.text.addPoint(p);\r\n }\r\n }\r\n }\r\n\r\n // join\r\n for (let i = 0; i < this.text.points.length; i++) {\r\n for (let j = 0; j < this.text.points.length; j++) {\r\n if (this.text.points[i] == this.text.points[j]) break;\r\n let d = this.text.points[i].pos.dist(this.text.points[j].pos);\r\n\r\n if (d > 0 && d < this.size + this.stickDistance) {\r\n this.text.addStick(i, j);\r\n }\r\n }\r\n }\r\n }\r\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/examples/behavior.html b/examples/behavior.html index ec8ea15..dc7f85a 100644 --- a/examples/behavior.html +++ b/examples/behavior.html @@ -45,32 +45,26 @@ mouse.setForceAcc(-30); mouse.setRadius(100); - + let mBehavior = 2; window.addEventListener('mousemove', (e) => { - if (e.altKey) { - addParticles(e.offsetX, e.offsetY); - } - mouse.pos.x = e.offsetX; - mouse.pos.y = e.offsetY; + if (e.altKey) addParticles(e.offsetX, e.offsetY); + mouse.pos.setXY(e.offsetX, e.offsetY) }) + window.addEventListener('mousedown', () => mBehavior = -5) + window.addEventListener('mouseup', () => mBehavior = 5) - window.addEventListener('mousedown', () => { - mBehavior = -5; - }) - window.addEventListener('mouseup', () => { - mBehavior = 5; - }) - let particles = new Entity(); + let particles = new Entity(16, verly); function addParticles(x, y) { let p = new Point(x, y); p.setRadius(3); p.setGravity(new Vector(0, 0)); particles.addPoint(p); } - for (let i = 0; i < 1000; i++) { + + for (let i = 0; i < 700; i++) { addParticles(random(width), random(height)); } @@ -83,7 +77,7 @@ for (let i = 0; i < particles.points.length; i++) { for (let j = 0; j < particles.points.length; j++) { if (particles.points[i] !== particles.points[j]) { - particles.points[j].resolveBehaviors(particles.points[i], 20, 2) + particles.points[j].resolveBehaviors(particles.points[i], 20, 3) } } particles.points[i].resolveBehaviors(mouse, mouse.radius, mBehavior) @@ -91,7 +85,7 @@ verly.update(); verly.render(); - verly.interact(); + // verly.interact(); // verly.renderPointIndex(); diff --git a/examples/behavior2.html b/examples/behavior2.html index 11aed4f..6f9fcb7 100644 --- a/examples/behavior2.html +++ b/examples/behavior2.html @@ -44,7 +44,7 @@ let verly = new Verly(16, canvas, ctx); - let particle = new Entity(); + let particle = new Entity(16, verly); let p1 = new Point(0, 0); let p2 = new Point(0, 0); p1.setRadius(20); diff --git a/examples/dynamicCustomMesh.html b/examples/dynamicCustomMesh.html index 41154ca..0b9046e 100644 --- a/examples/dynamicCustomMesh.html +++ b/examples/dynamicCustomMesh.html @@ -42,7 +42,7 @@ let verly = new Verly(16, canvas, ctx); - let custom = new Entity(16); + let custom = new Entity(16, verly); window.addEventListener('contextmenu', (e) => { e.preventDefault(); @@ -62,6 +62,7 @@ verly.createRagdoll(100, 100, 100, 100); verly.addEntity(custom); + function animate() { ctx.clearRect(0, 0, width, height); diff --git a/examples/rotatingEntity.html b/examples/rotatingEntity.html index c91b761..a9630ca 100644 --- a/examples/rotatingEntity.html +++ b/examples/rotatingEntity.html @@ -43,7 +43,7 @@ let verly = new Verly(16, canvas, ctx); - let b1 = new Box(200, 110, 20, 100); + let b1 = new Box(200, 110, 20, 100, 16, verly); b1.setGravity(new Vector()) verly.addEntity(b1); @@ -55,7 +55,7 @@ p.resetVelocity(); } - let b2 = new Box(150, 125, 20, 100); + let b2 = new Box(150, 125, 20, 100, 16, verly); b2.setGravity(new Vector()) verly.addEntity(b2); diff --git a/examples/shadedCloth.html b/examples/shadedCloth.html index 837386b..97677fa 100644 --- a/examples/shadedCloth.html +++ b/examples/shadedCloth.html @@ -28,7 +28,7 @@ - +