anchor.diff:    return vec3(smoothstep(0.0, PI, PI-acos(normal.y)))*0.4;
   }
   
  -const vec3 lightPosition = vec3(-2.0,3.0,6.0);
  - 
  +\${nearLight}
  +
   color shade0(color c, vec3 normal, obj o, vec3 p) {
       
       //spotlight
  +    vec3 lightPosition = nearLight(p);
       vec3 lightSegment = lightPosition - p;
       vec3 lightDir = normalize(lightSegment);
       float lightIntensity = dot(normal, lightDir);
  
positive.code:   glf.RunOnProgramContext at;
  }
  
  makeShader(List<ObjectInfo> os, {String tmpl: rayMarchingFrag0, stepmax:256, epsilon_de: 0.005}) {
    var kv = {
     'stepmax' : stepmax,
     'epsilon_de': epsilon_de
    };
  
    var mats = [];
  
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
  