anchor.diff:   float theta = 2.0 * M_PI * rand(seed.zx);
    float x = r * cos(theta);
    float y = r * sin(theta);
  - vec3 rv = vec3(x, y, sqrt(1.0 - r*r));
  - float phi = getAngle(normal);
  - return rotationMatrix(cross(normal,vec3(0.0,0.0,1.0)),phi) * rv;
  + vec3 u = normalize(cross(normal,vec3(0.0,0.0,1.0)));
  + vec3 v = normalize(cross(u, normal));
  + return x*u + y*v + sqrt(1.0 - r*r)*normal;
   }
   
   // Moller-Trumbore
  
positive.code:   float phi = 2.0f * M_PI * xi.x;
    float theta = acos(sqrt((1.0f - xi.y)/((a*a - 1.0f) * xi.y + 1.0f)));
    float sinTheta = sin(theta);
    vec3 facet = vec3(cos(phi) * sinTheta, sinTheta * sin(phi), cos(theta));
    float trans = getAngle(oNormal);
    return rotationMatrix(cross(oNormal,vec3(0.0,0.0,1.0)),trans) * facet;
  }
  
  // GGX PDF
  
negative.code:   vec3 color = vec3(0);
    int bounces = 0;
    bool specular = true;
    for(int i=0; i < NUM_BOUNCES; ++i){
      result = traverseTree(ray);
      vec3 origin = ray.origin + ray.dir * result.t;
      bounces++;
  