anchor.diff:      shader = _CreateShader(false, body, prolog);
     }
   
  -  // InitializeShader updates the shader field from header and body.
  -  // If you have set shader manually do not call this.
  +  /// _CreateShader updates the shader field from header and body.
  +  /// If you have set shader manually do not call this.
     String _CreateShader(
         bool addWrapperForMain, List<String> body, List<String> prolog) {
       assert(shader == null);
  
positive.code: const String uLightCount = "uLightCount";
  const String uLightTypes = "uLightTypes";
  
  final Map<String, ShaderVarDesc> _VarsDb = {
    // controls
    cBlendEquation: new ShaderVarDesc("", ""),
    cDepthWrite: new ShaderVarDesc("", ""),
    cDepthTest: new ShaderVarDesc("", ""),
    cStencilFunc: new ShaderVarDesc("", ""),
  
    // transform vars
    tPosition: new ShaderVarDesc(VarTypeVec3, ""),
    tSpeed: new ShaderVarDesc(VarTypeVec3, ""),
    tForce: new ShaderVarDesc(VarTypeVec3, ""),
  
    // attribute vars
    // This should also contain an alpha channel
    aColor: new ShaderVarDesc(VarTypeVec3, "per vertex color"),
    aColorAlpha: new ShaderVarDesc(VarTypeVec4, "per vertex color"),
    aPosition: new ShaderVarDesc(VarTypeVec3, "vertex coordinates"),
    aTexUV: new ShaderVarDesc(VarTypeVec2, "texture uvs"),
    aNormal: new ShaderVarDesc(VarTypeVec3, "vertex normals"),
    aBinormal: new ShaderVarDesc(VarTypeVec3, "vertex binormals"),
    aCenter: new ShaderVarDesc(VarTypeVec4, "for wireframe"),
    aPointSize: new ShaderVarDesc(VarTypeFloat, ""),
    aBoneIndex: new ShaderVarDesc(VarTypeVec4, ""),
    aBoneWeight: new ShaderVarDesc(VarTypeVec4, ""),
    aTangent: new ShaderVarDesc(VarTypeVec3, "vertex tangents"),
    aBitangent: new ShaderVarDesc(VarTypeVec3, "vertex btangents"),
    iaRotation: new ShaderVarDesc(VarTypeVec4, ""),
    iaTranslation: new ShaderVarDesc(VarTypeVec3, ""),
    iaScale: new ShaderVarDesc(VarTypeVec3, ""),
  
    // Varying
    vColor: new ShaderVarDesc(VarTypeVec3, "per vertex color"),
    vTexUV: new ShaderVarDesc(VarTypeVec2, ""),
    vLightWeighting: new ShaderVarDesc(VarTypeVec3, ""),
    vNormal: new ShaderVarDesc(VarTypeVec3, ""),
    vPosition: new ShaderVarDesc(VarTypeVec3, "vertex coordinates"),
    vPositionFromLight: new ShaderVarDesc(VarTypeVec4, "delta from light"),
    vCenter: new ShaderVarDesc(VarTypeVec4, "for wireframe"),
    vDepth: new ShaderVarDesc(VarTypeFloat, "depth for shadowmaps"),
  
    // uniform vars
    uTransformationMatrix: new ShaderVarDesc(VarTypeMat4, ""),
    //uModelViewMatrix: new ShaderVarDesc(VarTypeMat4, ""),
    uModelMatrix: new ShaderVarDesc(VarTypeMat4, ""),
    //uViewMatrix: new ShaderVarDesc(VarTypeMat4, ""),
    uNormalMatrix: new ShaderVarDesc(VarTypeMat3, ""),
    uConvolutionMatrix: new ShaderVarDesc(VarTypeMat3, ""),
  
    //uPerspectiveMatrix: new ShaderVarDesc(VarTypeMat4, ""),
    uPerspectiveViewMatrix: new ShaderVarDesc(VarTypeMat4, ""),
    uLightPerspectiveViewMatrix: new ShaderVarDesc(VarTypeMat4, ""),
  
    uShadowMap: new ShaderVarDesc(VarTypeSampler2DShadow, ""),
  
    uTexture: new ShaderVarDesc(VarTypeSampler2D, ""),
    uTexture2: new ShaderVarDesc(VarTypeSampler2D, ""),
    uTexture3: new ShaderVarDesc(VarTypeSampler2D, ""),
    uTexture4: new ShaderVarDesc(VarTypeSampler2D, ""),
    uSpecularMap: new ShaderVarDesc(VarTypeSampler2D, ""),
    uNormalMap: new ShaderVarDesc(VarTypeSampler2D, ""),
    uBumpMap: new ShaderVarDesc(VarTypeSampler2D, ""),
    uDepthMap: new ShaderVarDesc(VarTypeSampler2D, ""),
    uCubeTexture: new ShaderVarDesc(VarTypeSamplerCube, ""),
    uAnimationTable: new ShaderVarDesc(VarTypeSampler2D, ""),
  
    uTime: new ShaderVarDesc(VarTypeFloat, "time since program start in sec"),
    uCameraNear: new ShaderVarDesc(VarTypeFloat, ""),
    uCameraFar: new ShaderVarDesc(VarTypeFloat, ""),
    uFogNear: new ShaderVarDesc(VarTypeFloat, ""),
    uFogFar: new ShaderVarDesc(VarTypeFloat, ""),
    uPointSize: new ShaderVarDesc(VarTypeFloat, ""),
    uScale: new ShaderVarDesc(VarTypeFloat, ""),
    uAngle: new ShaderVarDesc(VarTypeFloat, ""),
    uCanvasSize: new ShaderVarDesc(VarTypeVec2, ""),
    uCenter2: new ShaderVarDesc(VarTypeVec2, ""),
    uCutOff: new ShaderVarDesc(VarTypeFloat, ""),
    uShininess: new ShaderVarDesc(VarTypeFloat, ""),
    uShadowBias: new ShaderVarDesc(VarTypeFloat, ""),
    uOpacity: new ShaderVarDesc(VarTypeFloat, ""),
    uColor: new ShaderVarDesc(VarTypeVec3, ""),
    uColorAmbient: new ShaderVarDesc(VarTypeVec3, ""),
    uColorEmissive: new ShaderVarDesc(VarTypeVec3, ""),
    uColorSpecular: new ShaderVarDesc(VarTypeVec3, ""),
    uColorDiffuse: new ShaderVarDesc(VarTypeVec3, ""),
    uColorAlpha: new ShaderVarDesc(VarTypeVec4, ""),
    uColorAlpha2: new ShaderVarDesc(VarTypeVec4, ""),
    uEyePosition: new ShaderVarDesc(VarTypeVec3, ""),
    uMaterial: new ShaderVarDesc(VarTypeMat4, ""),
    uRange: new ShaderVarDesc(VarTypeVec2, ""),
    uDirection: new ShaderVarDesc(VarTypeVec2, ""),
  
  
    uBoneMatrices: new ShaderVarDesc(VarTypeMat4, "", arraySize: kMaxBones),
  
    uLightDescs: new ShaderVarDesc(VarTypeMat4, "", arraySize: kMaxLights),
    uLightCount: new ShaderVarDesc(VarTypeFloat, ""),
    uLightTypes: new ShaderVarDesc(VarTypeFloat, "", arraySize: kMaxLights),
  
    uBumpScale: new ShaderVarDesc(VarTypeFloat, "for bump maps"),
    uNormalScale: new ShaderVarDesc(VarTypeFloat, "for normal maps"),
  };
  
  void IntroduceNewShaderVar(String canonical, ShaderVarDesc desc) {
  
negative.code:   final String purpose;
    final int arraySize;
  
    const ShaderVarDesc(this.type, this.purpose, {this.arraySize: 0});
  
    int GetSize() {
      switch (type) {
  