anchor.diff:      assert(shader == null);
       // Hack
       bool isFragmentShader = attributeVars.isEmpty;
  -    List<String> out = [];
  -    out.add("#version 300 es");
  -    out.add("precision highp float;");
  -    out.add("");
  +    List<String> out = [
  +      "#version 300 es",
  +      "precision highp float;",
  +      "precision highp sampler2DShadow;",
  +      ""
  +    ];
       for (String v in attributeVars.keys) {
         ShaderVarDesc d = _VarsDb[v];
         out.add("in ${d.type} ${attributeVars[v]};");
  
positive.code: const String VarTypeVec2 = "vec2";
  const String VarTypeVec3 = "vec3";
  const String VarTypeVec4 = "vec4";
  const String VarTypeMat3 = "mat3";
  const String VarTypeMat4 = "mat4";
  const String VarTypeSampler2D = "sampler2D";
  const String VarTypeSamplerCube = "samplerCube";
  const String VarTypeInt = "int";
  const String VarTypeIndex = "index";
  
  
  class ShaderVarDesc {
    final String type;
  
negative.code: const String uBumpMap = "uBumpMap";
  const String uNormalMap = "uNormalMap";
  const String uSpecularMap = "uSpecularMap";
  const String uAnimationTable = "uAnimationTable";
  
  const String uDepthMap = "uDepthMap";
  const String uShadowMap = "uShadowMap";
  