|
@ -2,12 +2,12 @@ |
|
|
* Created by Alex on 2/23/2015. |
|
|
* Created by Alex on 2/23/2015. |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
import BarnesHutSolver from "./components/physics/BarnesHutSolver"; |
|
|
|
|
|
import Repulsion from "./components/physics/RepulsionSolver"; |
|
|
|
|
|
import HierarchicalRepulsion from "./components/physics/HierarchicalRepulsionSolver"; |
|
|
|
|
|
import SpringSolver from "./components/physics/SpringSolver"; |
|
|
|
|
|
import HierarchicalSpringSolver from "./components/physics/HierarchicalSpringSolver"; |
|
|
|
|
|
import CentralGravitySolver from "./components/physics/CentralGravitySolver"; |
|
|
|
|
|
|
|
|
import BarnesHutSolver from './components/physics/BarnesHutSolver'; |
|
|
|
|
|
import Repulsion from './components/physics/RepulsionSolver'; |
|
|
|
|
|
import HierarchicalRepulsion from './components/physics/HierarchicalRepulsionSolver'; |
|
|
|
|
|
import SpringSolver from './components/physics/SpringSolver'; |
|
|
|
|
|
import HierarchicalSpringSolver from './components/physics/HierarchicalSpringSolver'; |
|
|
|
|
|
import CentralGravitySolver from './components/physics/CentralGravitySolver'; |
|
|
|
|
|
|
|
|
var util = require('../../util'); |
|
|
var util = require('../../util'); |
|
|
|
|
|
|
|
@ -67,23 +67,23 @@ class PhysicsEngine { |
|
|
} |
|
|
} |
|
|
util.extend(this.options, this.defaultOptions); |
|
|
util.extend(this.options, this.defaultOptions); |
|
|
|
|
|
|
|
|
this.body.emitter.on("initPhysics", () => {this.initPhysics();}); |
|
|
|
|
|
this.body.emitter.on("resetPhysics", () => {this.stopSimulation(); this.ready = false;}); |
|
|
|
|
|
this.body.emitter.on("disablePhysics", () => {this.physicsEnabled = false; this.stopSimulation();}); |
|
|
|
|
|
this.body.emitter.on("restorePhysics", () => { |
|
|
|
|
|
|
|
|
this.body.emitter.on('initPhysics', () => {this.initPhysics();}); |
|
|
|
|
|
this.body.emitter.on('resetPhysics', () => {this.stopSimulation(); this.ready = false;}); |
|
|
|
|
|
this.body.emitter.on('disablePhysics', () => {this.physicsEnabled = false; this.stopSimulation();}); |
|
|
|
|
|
this.body.emitter.on('restorePhysics', () => { |
|
|
this.setOptions(this.options); |
|
|
this.setOptions(this.options); |
|
|
if (this.ready === true) { |
|
|
if (this.ready === true) { |
|
|
this.stabilized = false; |
|
|
this.stabilized = false; |
|
|
this.runSimulation(); |
|
|
this.runSimulation(); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
this.body.emitter.on("startSimulation", () => { |
|
|
|
|
|
|
|
|
this.body.emitter.on('startSimulation', () => { |
|
|
if (this.ready === true) { |
|
|
if (this.ready === true) { |
|
|
this.stabilized = false; |
|
|
this.stabilized = false; |
|
|
this.runSimulation(); |
|
|
this.runSimulation(); |
|
|
} |
|
|
} |
|
|
}) |
|
|
}) |
|
|
this.body.emitter.on("stopSimulation", () => {this.stopSimulation();}); |
|
|
|
|
|
|
|
|
this.body.emitter.on('stopSimulation', () => {this.stopSimulation();}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
setOptions(options) { |
|
|
setOptions(options) { |
|
@ -104,12 +104,12 @@ class PhysicsEngine { |
|
|
|
|
|
|
|
|
init() { |
|
|
init() { |
|
|
var options; |
|
|
var options; |
|
|
if (this.options.solver === "repulsion") { |
|
|
|
|
|
|
|
|
if (this.options.solver === 'repulsion') { |
|
|
options = this.options.repulsion; |
|
|
options = this.options.repulsion; |
|
|
this.nodesSolver = new Repulsion(this.body, this.physicsBody, options); |
|
|
this.nodesSolver = new Repulsion(this.body, this.physicsBody, options); |
|
|
this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options); |
|
|
this.edgesSolver = new SpringSolver(this.body, this.physicsBody, options); |
|
|
} |
|
|
} |
|
|
else if (this.options.solver === "hierarchicalRepulsion") { |
|
|
|
|
|
|
|
|
else if (this.options.solver === 'hierarchicalRepulsion') { |
|
|
options = this.options.hierarchicalRepulsion; |
|
|
options = this.options.hierarchicalRepulsion; |
|
|
this.nodesSolver = new HierarchicalRepulsion(this.body, this.physicsBody, options); |
|
|
this.nodesSolver = new HierarchicalRepulsion(this.body, this.physicsBody, options); |
|
|
this.edgesSolver = new HierarchicalSpringSolver(this.body, this.physicsBody, options); |
|
|
this.edgesSolver = new HierarchicalSpringSolver(this.body, this.physicsBody, options); |
|
@ -128,26 +128,27 @@ class PhysicsEngine { |
|
|
if (this.physicsEnabled === true) { |
|
|
if (this.physicsEnabled === true) { |
|
|
this.stabilized = false; |
|
|
this.stabilized = false; |
|
|
if (this.options.stabilization.enabled === true) { |
|
|
if (this.options.stabilization.enabled === true) { |
|
|
|
|
|
this.body.emitter.emit('_blockRedrawRequests'); |
|
|
this.stabilize(); |
|
|
this.stabilize(); |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
this.ready = true; |
|
|
this.ready = true; |
|
|
this.body.emitter.emit("zoomExtent", {duration: 0}, true) |
|
|
|
|
|
|
|
|
this.body.emitter.emit('zoomExtent', {duration: 0}, true) |
|
|
this.runSimulation(); |
|
|
this.runSimulation(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
this.ready = true; |
|
|
this.ready = true; |
|
|
this.body.emitter.emit("_redraw"); |
|
|
|
|
|
|
|
|
this.body.emitter.emit('_redraw'); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
stopSimulation() { |
|
|
stopSimulation() { |
|
|
this.stabilized = true; |
|
|
this.stabilized = true; |
|
|
if (this.viewFunction !== undefined) { |
|
|
if (this.viewFunction !== undefined) { |
|
|
this.body.emitter.off("initRedraw", this.viewFunction); |
|
|
|
|
|
|
|
|
this.body.emitter.off('initRedraw', this.viewFunction); |
|
|
this.viewFunction = undefined; |
|
|
this.viewFunction = undefined; |
|
|
this.body.emitter.emit("_stopRendering"); |
|
|
|
|
|
|
|
|
this.body.emitter.emit('_stopRendering'); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -155,12 +156,12 @@ class PhysicsEngine { |
|
|
if (this.physicsEnabled === true) { |
|
|
if (this.physicsEnabled === true) { |
|
|
if (this.viewFunction === undefined) { |
|
|
if (this.viewFunction === undefined) { |
|
|
this.viewFunction = this.simulationStep.bind(this); |
|
|
this.viewFunction = this.simulationStep.bind(this); |
|
|
this.body.emitter.on("initRedraw", this.viewFunction); |
|
|
|
|
|
this.body.emitter.emit("_startRendering"); |
|
|
|
|
|
|
|
|
this.body.emitter.on('initRedraw', this.viewFunction); |
|
|
|
|
|
this.body.emitter.emit('_startRendering'); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
this.body.emitter.emit("_redraw"); |
|
|
|
|
|
|
|
|
this.body.emitter.emit('_redraw'); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -180,7 +181,7 @@ class PhysicsEngine { |
|
|
|
|
|
|
|
|
if (this.stabilized === true) { |
|
|
if (this.stabilized === true) { |
|
|
if (this.stabilizationIterations > 1) { |
|
|
if (this.stabilizationIterations > 1) { |
|
|
// trigger the "stabilized" event.
|
|
|
|
|
|
|
|
|
// trigger the 'stabilized' event.
|
|
|
// The event is triggered on the next tick, to prevent the case that
|
|
|
// The event is triggered on the next tick, to prevent the case that
|
|
|
// it is fired while initializing the Network, in which case you would not
|
|
|
// it is fired while initializing the Network, in which case you would not
|
|
|
// be able to catch it
|
|
|
// be able to catch it
|
|
@ -191,7 +192,7 @@ class PhysicsEngine { |
|
|
this.stabilizationIterations = 0; |
|
|
this.stabilizationIterations = 0; |
|
|
this.startedStabilization = false; |
|
|
this.startedStabilization = false; |
|
|
setTimeout(function () { |
|
|
setTimeout(function () { |
|
|
me.body.emitter.emit("stabilized", params); |
|
|
|
|
|
|
|
|
me.body.emitter.emit('stabilized', params); |
|
|
}, 0); |
|
|
}, 0); |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
@ -202,7 +203,7 @@ class PhysicsEngine { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* A single simulation step (or "tick") in the physics simulation |
|
|
|
|
|
|
|
|
* A single simulation step (or 'tick') in the physics simulation |
|
|
* |
|
|
* |
|
|
* @private |
|
|
* @private |
|
|
*/ |
|
|
*/ |
|
@ -218,7 +219,7 @@ class PhysicsEngine { |
|
|
else { |
|
|
else { |
|
|
// this is here to ensure that there is no start event when the network is already stable.
|
|
|
// this is here to ensure that there is no start event when the network is already stable.
|
|
|
if (this.startedStabilization === false) { |
|
|
if (this.startedStabilization === false) { |
|
|
this.body.emitter.emit("startStabilizing"); |
|
|
|
|
|
|
|
|
this.body.emitter.emit('startStabilizing'); |
|
|
this.startedStabilization = true; |
|
|
this.startedStabilization = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -432,7 +433,7 @@ class PhysicsEngine { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (this.stabilized === false && this.stabilizationSteps < this.options.stabilization.iterations) { |
|
|
if (this.stabilized === false && this.stabilizationSteps < this.options.stabilization.iterations) { |
|
|
this.body.emitter.emit("stabilizationProgress", {steps: this.stabilizationSteps, total: this.options.stabilization.iterations}); |
|
|
|
|
|
|
|
|
this.body.emitter.emit('stabilizationProgress', {steps: this.stabilizationSteps, total: this.options.stabilization.iterations}); |
|
|
setTimeout(this._stabilizationBatch.bind(this),0); |
|
|
setTimeout(this._stabilizationBatch.bind(this),0); |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
@ -441,16 +442,17 @@ class PhysicsEngine { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
_finalizeStabilization() { |
|
|
_finalizeStabilization() { |
|
|
|
|
|
this.body.emitter.emit('_allowRedrawRequests'); |
|
|
if (this.options.stabilization.zoomExtent === true) { |
|
|
if (this.options.stabilization.zoomExtent === true) { |
|
|
this.body.emitter.emit("zoomExtent", {duration:0}); |
|
|
|
|
|
|
|
|
this.body.emitter.emit('zoomExtent', {duration:0}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (this.options.stabilization.onlyDynamicEdges === true) { |
|
|
if (this.options.stabilization.onlyDynamicEdges === true) { |
|
|
this._restoreFrozenNodes(); |
|
|
this._restoreFrozenNodes(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
this.body.emitter.emit("stabilizationIterationsDone"); |
|
|
|
|
|
this.body.emitter.emit("_requestRedraw"); |
|
|
|
|
|
|
|
|
this.body.emitter.emit('stabilizationIterationsDone'); |
|
|
|
|
|
this.body.emitter.emit('_requestRedraw'); |
|
|
|
|
|
|
|
|
this.ready = true; |
|
|
this.ready = true; |
|
|
} |
|
|
} |
|
|