anchor.diff:      addNewEntity(world, makeTireXY(new vec3(400.0, 50.0, 0.0), 70.0, 7, 0.1, 0.2).toList()..add(new proto.Drawable(defaultDraw)));
       addNewEntity(world, makeTireXY(new vec3(600.0, 50.0, 0.0), 70.0, 3, 1.0, 1.0).toList()..add(new proto.Drawable(defaultDraw)));
       return new Future.value(world);
  +  },
  +  'quadtree' : (world) {
  +    world.getSystem(System_Simulator).friction = 1.0;
  +    addNewEntity(world, [
  +      new Transform.w2d(50.0, 50.0, 0.0),
  +      new Emitter()
  +      ..genParticles = true
  +      ..counter = singleWave(500)
  +      ..initializers.add(particlesStartPosition(
  +        //constant(new vec3.zero())
  +          box(new vec3(500.0, 500.0, 0.0), new vec3(400.0, 400.0, 0.0))
  +        , true
  +      ))
  +      ..initializers.add(particlesStartPositionPrevious(box(new vec3.zero(), new vec3(3.0, 3.0, 0.0))))
  +      ..initializers.add(particlesAddComponents([
  +        (lg){
  +          var b = new ParticleInfo0s(lg);
  +          b.l.forEach((p){
  +            p.radius = 3.0;
  +          });
  +          return b;
  +        }
  +      ]))
  +      ..initializers.add(addComponents([
  +        () => new proto.Drawable(proto.particleInfo0s(3.0, fillStyle : STYLE0, strokeStyle : STYLE1)),
  +        () => new Constraints(),
  +        () => new Animatable()
  +          ..add(new Animation()
  +            ..onTick = (e, t, t0) {
  +               var ps = e.getComponent(Particles.CT);
  +               var cont = true;
  +               for( var i = ps.l.length - 1; i > -1; --i) {
  +                 cont = true;
  +                 cont = cont && ps.l[i].position3d.y > 0;
  +                 cont = cont && ps.l[i].position3d.y < 1000;
  +                 cont = cont && ps.l[i].position3d.x > 0;
  +                 cont = cont && ps.l[i].position3d.x < 1000;
  +                 if (!cont) {
  +                   ps.l[i].position3d.setFrom(ps.l[i].position3dPrevious);
  +                 }
  +               }
  +               return true;//cont;
  +             }
  +             ..onEnd = (e, t, t0) {
  +               e.deleteFromWorld();
  +             }
  +          )
  +      ])),
  +    ]);
  +    return new Future.value(world);
     }
   };
   
  
positive.code: import 'dart:html';
  import 'package:web_ui/web_ui.dart';
  import 'package:dartemis_addons/ease.dart' as ease;
  import 'package:dartemis_addons/transform.dart';
  
negative.code:   return new Future.value(world);
  }
  
  const STYLE0 = '#e3e3f8';
  const STYLE1 = '#f7e4ed'; //tetrad
  const STYLE2 = '#f7f7e4';
  