anchor.diff:      return shader;
     }
   
  -
     @override
     void begin() {
       gl.useProgram(program);
     }
  +
  +  void buffer(int index, Float32List items, int itemSize) {
  +    var vertexBuffer = gl.createBuffer();
  +    gl.bindBuffer(RenderingContext.ARRAY_BUFFER, vertexBuffer);
  +    gl.bufferData(RenderingContext.ARRAY_BUFFER, items, RenderingContext.STREAM_DRAW);
  +    gl.vertexAttribPointer(index, itemSize, RenderingContext.FLOAT, false, 0, 0);
  +    gl.enableVertexAttribArray(index);
  +  }
  +
  +  @override
  +  bool checkProcessing() => success;
  +
  +  String get vShaderSource;
  +  String get fShaderSource;
  +}
  +
  +class BackgroundDotRenderingSystem extends WebGlRenderingSystem {
  +  Mapper<Position> pm;
  +  Mapper<Color> cm;
  +  Mapper<Background> bm;
  +  BackgroundDotRenderingSystem(RenderingContext gl)
  +      : super(gl, Aspect.getAspectForAllOf([Background, Position, Color]));
   
     @override
     void processEntities(Iterable<Entity> entities) {
  
positive.code:     }
    }
  
    void buffer(int index, Float32List items, int itemSize) {
      var vertexBuffer = gl.createBuffer();
      gl.bindBuffer(RenderingContext.ARRAY_BUFFER, vertexBuffer);
      gl.bufferData(RenderingContext.ARRAY_BUFFER, items, RenderingContext.STATIC_DRAW);
      gl.vertexAttribPointer(index, itemSize, RenderingContext.FLOAT, false, 0, 0);
      gl.enableVertexAttribArray(index);
    }
  
    @override
    bool checkProcessing() => success;
  }
  
negative.code:         var c = cm[entity];
          var b = bm[entity];
  
          positions[index * 2] = p.x;
          positions[index * 2 + 1] = p.y;
          sizes[index] = b.size;
          colors[index * 4] = c.red;
          colors[index * 4 + 1] = c.green;
  