anchor.diff:  
   void AddInstanceData(MeshData md, int count) {
     final Float32List scales = Float32List(count * 1);
  -  final Float32List colors = Float32List(count * 3);
     final Float32List translations = Float32List(count * 3);
     final Float32List rotations = Float32List(count * 4);
     final Math.Random rand = Math.Random();
   
     for (int i = 0; i < count; i++) {
  -    final VM.Vector3 t = VM.Vector3(rand.nextDouble() * 40,
  -        rand.nextDouble() * 40.0, rand.nextDouble() * 40.0);
  +    final VM.Vector3 t = VM.Vector3.random(rand) - VM.Vector3(0.5, 0.5, 0.5);
  +    t.scale(60.0);
       translations.setAll(i * 3, t.storage);
       final VM.Vector3 u =
  -        VM.Vector3(rand.nextDouble(), rand.nextDouble(), rand.nextDouble());
  -    /*
  -    final VM.Quaternion q = VM.Quaternion(
  -        Math.sqrt(1 - u.x) * Math.sin(2.0 * Math.pi * u.y),
  -        Math.sqrt(1 - u.x) * Math.cos(2.0 * Math.pi * u.y),
  -        Math.sqrt(1 - u.x) * Math.sin(2.0 * Math.pi * u.z),
  -        Math.sqrt(1 - u.x) * Math.cos(2.0 * Math.pi * u.z));
  -    */
  -    VM.Quaternion q =
  +        VM.Vector3.random(rand);
  +    final VM.Quaternion q =
           VM.Quaternion.axisAngle(u, 2.0 * rand.nextDouble() * Math.pi);
       rotations.setAll(i * 4, q.storage);
  -    final VM.Vector c =
  -        VM.Vector3(rand.nextDouble(), rand.nextDouble(), rand.nextDouble());
  -    colors.setAll(i * 3, c.storage);
  -    scales.setAll(i, [rand.nextDouble() * 5.0]);
  +
  +    scales.setAll(i, [2.0 + rand.nextDouble() * 4.0]);
     }
   
     md.AddAttribute(iaRotation, rotations, 4);
  -  md.AddAttribute(iaColor, colors, 3);
     md.AddAttribute(iaTranslation, translations, 3);
     md.AddAttribute(iaScale, scales, 1);
  +}
  +
  +final VM.Vector3 dirLight = VM.Vector3(0.0, -50.0, 0.0);
  +
  +class Phase {
  +  Phase(this.program, this.md, this.fb);
  +
  +  final Framebuffer fb;
  +  final Material mat = Material("mat");
  +  final RenderProgram program;
  +  final MeshData md;
  +
  +  void Run(int width, int height, [List<UniformGroup> extra]) {
  +    fb.Activate(GL_CLEAR_ALL, 0, 0, width, height);
  +    List<UniformGroup> uniforms = [mat];
  +    if (extra != null) {
  +      uniforms.addAll(extra);
  +    }
  +    program.Draw(md, uniforms);
  +  }
  +}
  +
  +Framebuffer MakePrepareFb(ChronosGL cgl, int width, int height) {
  +  TypedTexture tex = TypedTexture(
  +      cgl, "float", width, height, GL_RGBA32F, TexturePropertiesFramebuffer);
  +  TypedTexture depthTexture = TypedTexture(cgl, "frame::depth", width, height,
  +      GL_DEPTH_COMPONENT24, TexturePropertiesShadowMap);
  +  return Framebuffer(cgl, tex, depthTexture);
   }
   
   void main() {
  
positive.code:     orbit.azimuth += 0.001;
      orbit.animate(elapsed);
  
      mat.ForceUniform(uTime, _lastTimeMs / 2000.0);
      fb.Activate(GL_CLEAR_ALL, 0, 0, width, height);
      progPreparation.Draw(md, [mat, perspective]);
  
      screen.Activate(GL_CLEAR_ALL, 0, 0, width, height);
      progInstanced.Draw(md, [mat, perspective]);
  
      HTML.window.animationFrame.then(animate);
      fps.UpdateFrameCount(_lastTimeMs);
  
negative.code: }
  
  void main(void) {
    ColorComponents acc = CombinedLight(${vPosition},
                                        ${vNormal},
                                        ${uEyePosition},
                                        ${uLightDescs},
                                        ${uLightTypes},
                                        ${uShininess});
                                      
    float edge = Edge(${uTexture}, ivec2(gl_FragCoord.xy));
    vec4 info = texelFetch(${uTexture}, ivec2(gl_FragCoord.xy), 0);
    if (edge > 0.3) {
        //${oFragColor}.rgb = vec3(0.0); 
        ${oFragColor}.rgb = vec3(0.5 - edge); 
       // ${oFragColor}.rgb = vec3(edge / (100.0 * info.w));
      return;
    } 
      
    ${oFragColor}.rgb = texture(${uTexture2}, ${vTexUV}).rgb * 0.5 + 
                        acc.diffuse +
                        acc.specular;
  }
    """
    ], prolog: [
      StdLibShader
    ]);
  
  //
  