anchor.diff:  
     int GetSize() {
       switch (type) {
  -      case "float":
  +      case VarTypeFloat:
           return 1;
  -      case "vec2":
  +      case VarTypeVec2:
           return 2;
  -      case "vec3":
  +      case VarTypeVec3:
           return 3;
  -      case "vec4":
  +      case VarTypeVec4:
           return 4;
         default:
           assert(false);
  
positive.code: 
    // attribute vars
    // This should also contain an alpha channel
    aColor: new ShaderVarDesc("vec3", "per vertex color"),
    aColorAlpha: new ShaderVarDesc("vec4", "per vertex color"),
    aVertexPosition: new ShaderVarDesc("vec3", "vertex coordinates"),
    aTextureCoordinates: new ShaderVarDesc("vec2", "texture uvs"),
    aNormal: new ShaderVarDesc("vec3", "vertex normals"),
    aBinormal: new ShaderVarDesc("vec3", "vertex binormals"),
    aCenter: new ShaderVarDesc("vec4", "for wireframe"),
    aPointSize: new ShaderVarDesc("float", ""),
    aBoneIndex: new ShaderVarDesc("vec4", ""),
    aBoneWeight: new ShaderVarDesc("vec4", ""),
    aTangent: new ShaderVarDesc("vec3", "vertex tangents"),
    aBitangent: new ShaderVarDesc("vec3", "vertex btangents"),
    iaRotation: new ShaderVarDesc("vec4", ""),
    iaTranslation: new ShaderVarDesc("vec3", ""),
    iaScale: new ShaderVarDesc("vec3", ""),
  
    // Varying
    vColor: new ShaderVarDesc("vec3", "per vertex color"),
    vTextureCoordinates: new ShaderVarDesc("vec2", ""),
    vLightWeighting: new ShaderVarDesc("vec3", ""),
    vNormal: new ShaderVarDesc("vec3", ""),
    vVertexPosition: new ShaderVarDesc("vec3", "vertex coordinates"),
    vPositionFromLight: new ShaderVarDesc("vec4", "delta from light"),
    vCenter: new ShaderVarDesc("vec4", "for wireframe"),
  
    // uniform vars
    uTransformationMatrix: new ShaderVarDesc("mat4", ""),
    //uModelViewMatrix: new ShaderVarDesc("mat4", ""),
    uModelMatrix: new ShaderVarDesc("mat4", ""),
    //uViewMatrix: new ShaderVarDesc("mat4", ""),
    uNormalMatrix: new ShaderVarDesc("mat3", ""),
    //uPerspectiveMatrix: new ShaderVarDesc("mat4", ""),
    uPerspectiveViewMatrix: new ShaderVarDesc("mat4", ""),
    uLightPerspectiveViewMatrix: new ShaderVarDesc("mat4", ""),
  
    uShadowMap: new ShaderVarDesc("sampler2D", ""),
  
    uTexture: new ShaderVarDesc("sampler2D", ""),
    uTexture2: new ShaderVarDesc("sampler2D", ""),
    uTexture3: new ShaderVarDesc("sampler2D", ""),
    uTexture4: new ShaderVarDesc("sampler2D", ""),
    uSpecularMap: new ShaderVarDesc("sampler2D", ""),
    uNormalMap: new ShaderVarDesc("sampler2D", ""),
    uBumpMap: new ShaderVarDesc("sampler2D", ""),
    uDepthMap: new ShaderVarDesc("sampler2D", ""),
    uCubeTexture: new ShaderVarDesc("samplerCube", ""),
  
    uTime: new ShaderVarDesc("float", "time since program start in sec"),
    uCameraNear: new ShaderVarDesc("float", ""),
    uCameraFar: new ShaderVarDesc("float", ""),
    uFogNear: new ShaderVarDesc("float", ""),
    uFogFar: new ShaderVarDesc("float", ""),
    uPointSize: new ShaderVarDesc("float", ""),
    uScale: new ShaderVarDesc("float", ""),
    uAngle: new ShaderVarDesc("float", ""),
    uCanvasSize: new ShaderVarDesc("vec2", ""),
    uCenter2: new ShaderVarDesc("vec2", ""),
    uCutOff: new ShaderVarDesc("float", ""),
    uShininess: new ShaderVarDesc("float", ""),
    uShadowBias: new ShaderVarDesc("float", ""),
    uOpacity: new ShaderVarDesc("float", ""),
    uColor: new ShaderVarDesc("vec3", ""),
    uColorEmissive: new ShaderVarDesc("vec3", ""),
    uColorSpecular: new ShaderVarDesc("vec3", ""),
    uColorDiffuse: new ShaderVarDesc("vec3", ""),
    uColorAlpha: new ShaderVarDesc("vec4", ""),
    uColorAlpha2: new ShaderVarDesc("vec4", ""),
    uEyePosition: new ShaderVarDesc("vec3", ""),
    uMaterial: new ShaderVarDesc("mat4", ""),
    uBoneMatrices: new ShaderVarDesc("mat4", "", arraySize: kMaxBones),
  
    uLightDescs: new ShaderVarDesc("mat4", "", arraySize: kMaxLights),
    uLightCount: new ShaderVarDesc("float", ""),
    uLightTypes: new ShaderVarDesc("float", "", arraySize: kMaxLights),
  
    uBumpScale: new ShaderVarDesc("float", "for bump maps"),
    uNormalScale: new ShaderVarDesc("float", "for normal maps"),
  };
  
  void IntroduceNewShaderVar(String canonical, ShaderVarDesc desc) {
  
negative.code: const String lightTypeSpotFloat = "${lightTypeSpot}.0";
  const String lightTypePointFloat = "${lightTypePoint}.0";
  
  const String VarTypeFloat = "float";
  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;
    final String purpose;
  