Dart Documentationsystem_verlet

system_verlet library

TODO lot of test (unit, ...) TODO benchmark, profiling, optimisation

Functions

dynamic setCollideOfSegment(Entity e, collide) #

setCollideOfSegment(Entity e, collide) {
 (e.getComponent(Constraints.CT) as Constraints).l.forEach((c){
   if (c is Constraint_Distance) c.segment.collide = collide;
 });
}

dynamic pinVector3(Vector3 v, Constraints cs) #

pinVector3(Vector3 v, Constraints cs) {
 cs.l.add(new Constraint_Pin(v));
}

dynamic pinParticle(Entity e, int index) #

pinParticle(Entity e, int index) {
 pinVector3(
   (e.getComponent(Particles.CT) as Particles).position3d[index],
   e.getComponent(Constraints.CT)
 );
}

Iterable<Component> makeCloth(Vector3 origin, Vector3 width, Vector3 height, int segments, int pinMod, double stiffness, ParticlesConstructor genP) #

Iterable<Component> makeCloth(Vector3 origin, Vector3 width, Vector3 height, int segments, int pinMod, double stiffness, ParticlesConstructor genP) {
 var xStride = width / segments.toDouble();
 var yStride = height / segments.toDouble();
 var diag = width - height;
 var diagl = diag.length;
 var xStiffness = stiffness * width.length / diagl;
 var yStiffness = stiffness * height.length / diagl;

 var ps = genP(segments * segments);
 var cs = new Constraints();
 for (var y=0; y < segments; ++y) {
   var x0 = ps.position3d[y*segments + 0];
   x0.setFrom(yStride).scale(y.toDouble()).add(origin);
   if (y > 0)
     cs.l.add(new Constraint_Distance.fromParticles(ps, y*segments + 0, (y-1)*segments, yStiffness));
   for (var x = 1; x < segments; ++x) {
//      var px = origin.x + x*xStride - width/2 + xStride/2;
//      var py = origin.y + y*yStride - height/2 + yStride/2;
     var xi = ps.position3d[y*segments + x];
     xi.setFrom(xStride).scale(x.toDouble()).add(x0);
     cs.l.add(new Constraint_Distance.fromParticles(ps, y*segments + x, y*segments+x-1, xStiffness));
     if (y > 0) {
       cs.l.add(new Constraint_Distance.fromParticles(ps, y*segments + x, (y-1)*segments+x, yStiffness));
       //cs.l.add(new Constraint_Distance.fromParticles(ps, y*segments + x, (y-1)*segments+x-1, stiffness));
     }
   }
 }
 ps.copyPosition3dIntoPrevious();

 for (var x=0; x< segments; ++x) {
   if ( x % pinMod == 0)
     pinVector3(ps.position3d[x], cs);
 }

 return [ps, cs];
}

Iterable<Component> makeParallelogram(Vector3 origin, Vector3 width, Vector3 height, double stiffness, ParticlesConstructor genP) #

Iterable<Component>  makeParallelogram(Vector3 origin, Vector3 width, Vector3 height, double stiffness, ParticlesConstructor genP) {
 return makeLineSegments([origin, origin + width, origin + width + height, origin + height], stiffness, true, genP);
}

Iterable<Component> makeLineSegments(List<Vector3> vertices, double stiffness, bool closed, ParticlesConstructor genP) #

Iterable<Component> makeLineSegments(List<Vector3> vertices, double stiffness, bool closed, ParticlesConstructor genP) {
 var ps = genP(vertices.length);
 for(int i = 0; i < ps.length; ++i) {
   ps.position3d[i].setFrom(vertices[i]);
 }
 ps.copyPosition3dIntoPrevious();
 var cs = new Constraints();
 for (var i = 1; i < ps.position3d.length; ++i) {
   cs.l.add(new Constraint_Distance.fromParticles(ps, i, i-1, stiffness));
 }
 if (closed) {
   cs.l.add(new Constraint_Distance.fromParticles(ps, 0, ps.position3d.length - 1, stiffness));
 }
 return [ps, cs];
}

Iterable<Component> makeTireXY(Vector3 origin, double radius, int segments, double spokeStiffness, double treadStiffness, ParticlesConstructor genP) #

Iterable<Component> makeTireXY(Vector3 origin, double radius, int segments, double spokeStiffness, double treadStiffness, ParticlesConstructor genP) {
 var stride = (2 * math.PI) / segments;

 // particles
 var ps = genP(segments + 1);
 for (var i=0; i < segments; ++i) {
   var theta = i * stride;
   var v = ps.position3d[i].setFrom(origin);
   v.x = v.x + math.cos(theta) * radius;
   v.y = v.y + math.sin(theta) * radius;
 }
 ps.position3d[segments].setFrom(origin);
 ps.copyPosition3dIntoPrevious();
 // constraints
 var cs = new Constraints();
 for (var i=0; i < segments; ++i) {
   cs.l.add(new Constraint_Distance.fromParticles(ps, i, (i + 1) % segments, treadStiffness));
   cs.l.add(new Constraint_Distance.fromParticles(ps, i, segments, spokeStiffness));
   cs.l.add(new Constraint_Distance.fromParticles(ps, i, (i + 5) % segments, treadStiffness));
 }
 return [ps,cs];
}

Abstract Classes

Classes