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: // Domain operations
  
  // rotation/translation
  vec3 opTx( vec3 p, mat4 m)
  {
      vec4 q = m * vec4(p, 1.0); //invert(m) * p
      return q.xyz;
  }
  //------------------------------------------------------------------------------
  // Objects definitions (distance functions)
  
negative.code:   }
  
    _updateShader() {
      var frag = makeShader(_os, tmpl:tmpl, stepmax: stepmax, epsilon_de:epsilon_de, nearLight: nearLight);
      _post2d.filters[0] = new glf.Filter2D(gl, frag, (ctx){
        ctx.gl.uniform1f(ctx.getUniformLocation(glf.SFNAME_NEAR), camera.near);
        ctx.gl.uniform1f(ctx.getUniformLocation(glf.SFNAME_FAR), camera.far);
  