anchor.diff:        ctx.gl.uniform3fv(ctx.getUniformLocation(glf.SFNAME_FOCUSPOSITION), camera.focusPosition.storage);
         _os.forEach((x){if (x.at != null) { x.at(ctx); }});
       });
  +    print("_updateShader");
       _needShaderUpdate = false;
     }
   
  
positive.code:   return vec3(smoothstep(0.0, PI, PI-acos(normal.y)))*0.4;
  }
  
  const vec3 lightPosition = vec3(-2.0,3.0,6.0);
   
  color shade0(color c, vec3 normal, obj o, vec3 p) {
      
      //spotlight
      vec3 lightSegment = lightPosition - p;
      vec3 lightDir = normalize(lightSegment);
      float lightIntensity = dot(normal, lightDir);
  
negative.code: }
  ''';
  
  const nearLight0 = '''
  vec3 nearLight(vec3 p) {
    return vec3(0.0, 0.0, 0.0);
  }
  ''';
  
  nearLight_SpotAt(Vector3 v) {
    return'''
  vec3 nearLight(vec3 p) {
    return vec3(${v.x}, ${v.y}, ${v.z});
  }
  ''';
  }
  
  nearLight_SpotGrid(size) {
    var invsize = 1.0 / size;
    return'''
  vec3 nearLight(vec3 p) {
    return (floor(p * $invsize) * $size);
  }
  ''';
  }
  
  class ObjectInfo {
    /// code used to inject uniform declaration into the shader
  