anchor.diff:  }
   
   //--- Vec3Gen ------------------------------------------------------------------
  -
  -/// always return 0.
  +final _random = new math.Random();
  +
  +/// always return a clone of x.
   Vec3GenInto constant(vec3 x) => (v, dt) => v.setFrom(x);
  +
  +Vec3GenInto box(vec3 center, vec3 offsets) => (v, dt){
  +  v.setFrom(center);
  +  v.x += (_random.nextDouble() - 0.5) * 2 * offsets.x;
  +  v.y += (_random.nextDouble() - 0.5) * 2 * offsets.y;
  +  v.z += (_random.nextDouble() - 0.5) * 2 * offsets.z;
  +  return v;
  +};
   
   Vec3GenInto line(vec3 start, vec3 end, ease.Ease easing){
     var length = end - start;
  
positive.code:   });
  };
  
  //--- IntGen -------------------------------------------------------------------
  
  /// always return 0.
  IntGen zero() => (dt) => 0;
  
  /// [rate] The number of particles to emit per second.
  ///TODO manage case where rate * dt < 1000
  
negative.code:   axis = (axis  == null)?  VY_AXIS : axis;
    var _perp1 = perpendicular(axis);
    var _perp2 = axis.cross( _perp1 ).normalize();
    return (v, dt){
      var h = _random.nextDouble();
      h = truncatedHeight + ( 1 - h * h ) * ( height - truncatedHeight );
  
      var r = _random.nextDouble();
      var radiusAtHeight = math.tan( angle / 2 ) * h;
      r = ( 1 - r * r ) * ( h ) * radiusAtHeight;
  
      var a = _random.nextDouble() * 2 * math.PI;
      var p1 = _perp1.clone();
      p1.scale( r * math.cos( a ) );
      var p2  = _perp2.clone();
  