anchor.diff:  
   
   
  -
  -
  -
  -
  -
  
positive.code:   // F0
    double reflectivity = 0.3;
  
    PhysicallyBasedMaterial() {
      technique = new Technique();
      technique.pass = new Pass();
  
negative.code:   bool ready([Mesh mesh]) {
      if (mesh == null) return false;
  
      var defines = [];
      var scene = mesh.scene;
      var device = scene.graphicsDevice;
  
      if (diffuseTexture != null) {
        if (!diffuseTexture.ready) return false;
        defines.add("#define DIFFUSE");
      }
  
      if (device.caps.standardDerivatives && bumpTexture != null) {
        if (!bumpTexture.ready) return false;
        defines.add("#define BUMP");
      }
  
      if (scene.lightsEnabled) {
        for (var i = 0; i < scene._lights.length && i < Light.MAX_LIGHTS; i++) {
          defines.add("#define LIGHT$i");
          var light = scene._lights[i];
          if (light is SpotLight) {
            defines.add("#define SPOTLIGHT$i");
          } else if (light is HemisphericLight) {
            defines.add("#define HEMILIGHT$i");
          } else {
            defines.add("#define POINTDIRLIGHT$i");
          }
        }
      }
  
      if (mesh.geometry != null) {
        var geometry = mesh.geometry;
        if (geometry.buffers.containsKey(Semantics.texcoords)) {
          defines.add("#define UV1");
        }
        if (geometry.buffers.containsKey(Semantics.texcoords2)) {
          defines.add("#define UV2");
        }
        if (mesh.skeleton != null) {
          defines.add("#define BONES");
          defines.add("#define BonesPerMesh ${mesh.skeleton.joints.length}");
          defines.add("#define BONES4");
        }
      }
  
      var finalDefines = defines.join("\n");
      if (_cachedDefines != finalDefines) {
        _cachedDefines = finalDefines;
        if (technique.pass.shader != null) technique.pass.shader.dispose();
        technique.pass.shader = new Shader(device.ctx, SHADER_PHYSICALLY_BASED_VS, SHADER_PHYSICALLY_BASED_FS, common: finalDefines);
      }
      return technique.pass.shader.ready;
    }
  