Files
esengine/source/src/Physics/Verlet/Composites/Composite.ts

67 lines
2.2 KiB
TypeScript
Raw Normal View History

class Composite {
private _constraints: Constraint[] = [];
public friction = new Vector2(0.98, 1);
public drawParticles: boolean = true;
public drawConstraints: boolean = true;
public particles: Particle[] = [];
/**
*
*/
public solveConstraints(){
for (let i = this._constraints.length - 1; i >= 0; i --){
this._constraints[i].solve();
}
}
public addParticle(particle: Particle){
this.particles.push(particle);
return particle;
}
public addConstraint<T extends Constraint>(constraint: T): T{
this._constraints.push(constraint);
constraint.composite = this;
return constraint;
}
public removeConstraint(constraint: Constraint){
this._constraints.remove(constraint);
}
public updateParticles(deltaTimeSquared: number, gravity: Vector2){
for (let j = 0; j < this.particles.length; j ++){
let p = this.particles[j];
if (p.isPinned){
p.position = p.pinnedPosition;
continue;
}
p.applyForce(Vector2.multiply(new Vector2(p.mass, p.mass), gravity));
let vel = Vector2.multiply(Vector2.subtract(p.position, p.lastPosition), this.friction);
let nextPos = Vector2.add(Vector2.add(p.position, vel), Vector2.multiply(p.acceleration, new Vector2(0.5 * deltaTimeSquared, 0.5 * deltaTimeSquared)));
p.lastPosition = p.position;
p.position = nextPos;
p.acceleration.x = p.acceleration.y = 0;
}
}
public debugRender(graphics: egret.Graphics){
if (this.drawConstraints){
for (let i = 0; i < this._constraints.length; i ++){
this._constraints[i].debugRender(graphics);
}
}
if (this.drawParticles){
for (let i = 0; i < this.particles.length; i ++){
let size = this.particles[i].radius ? this.particles[i].radius : 4;
graphics.lineStyle(4, DebugDefaults.verletParticle);
graphics.drawRect(this.particles[i].position.x, this.particles[i].position.y, size, size);
graphics.endFill();
}
}
}
}