anchor.diff:      if (indices != null) {
         numItems = indices.length;
         if (ChronosGL.useElementIndexUint) {
  -        _indexBuffer = CreateAndInitializeArrayElementBufferUint32(
  +        _indexBuffer = CreateAndInitializeElementArrayBuffer(
               gl, new Uint32List.fromList(indices));
         } else {
  -        _indexBuffer = CreateAndInitializeArrayElementBufferUint16(
  +        _indexBuffer = CreateAndInitializeElementArrayBuffer(
               gl, new Uint16List.fromList(indices));
  +      }
  +    } else {
  +      numItems = _meshData.GetVertexData().length ~/ 3;
  +    }
  +  }
  +
  +  void UpdateMeshData(MeshData md) {
  +    _meshData = md;
  +    ChangeBufferCanonical(
  +        aVertexPosition, new Float32List.fromList(_meshData.GetVertexData()));
  +
  +    for (String canonical in _meshData.GetAttributes()) {
  +      ChangeBufferCanonical(canonical,
  +          new Float32List.fromList(_meshData.GetAttributeData(canonical)));
  +    }
  +    List<int> indices = _meshData.GetVertexIndices();
  +    if (indices != null) {
  +      numItems = indices.length;
  +      if (ChronosGL.useElementIndexUint) {
  +        ChangeElementArrayBuffer(
  +            gl, _indexBuffer, new Uint32List.fromList(indices));
  +      } else {
  +        ChangeElementArrayBuffer(
  +            gl, _indexBuffer, new Uint16List.fromList(indices));
         }
       } else {
         numItems = _meshData.GetVertexData().length ~/ 3;
  
positive.code:   MeshData _meshData;
  
    void AddBuffer(String canonical, Float32List data) {
      if (debug) print ("AddBuffer ${canonical} ${data.length}");
      _buffers[canonical] = CreateAndInitializeArrayBufferFloat32(gl, data);
    }
  
    void ChangeBuffer(String canonical, Float32List data) {
      if (debug) print ("ChangeBuffer ${canonical} ${data.length}");
      gl.bindBuffer(WEBGL.ARRAY_BUFFER, _buffers[canonical]);
      gl.bufferDataTyped(WEBGL.ARRAY_BUFFER, data, WEBGL.DYNAMIC_DRAW);
    }
  
    Mesh(this._meshData, this.material, {this.debug: false}) {
  
negative.code: part of chronosgl;
  
  void ChangeArrayBuffer(
      WEBGL.RenderingContext gl, WEBGL.Buffer buffer, Float32List data) {
    gl.bindBuffer(WEBGL.ARRAY_BUFFER, buffer);
    gl.bufferDataTyped(WEBGL.ARRAY_BUFFER, data, WEBGL.STATIC_DRAW);
  }
  
  WEBGL.Buffer CreateAndInitializeArrayBuffer(
      WEBGL.RenderingContext gl, Float32List data) {
    WEBGL.Buffer b = gl.createBuffer();
    ChangeArrayBuffer(gl, b, data);
    return b;
  }
  
  void ChangeElementArrayBuffer(
      WEBGL.RenderingContext gl, WEBGL.Buffer buffer, TypedData data) {
    gl.bindBuffer(WEBGL.ELEMENT_ARRAY_BUFFER, buffer);
    gl.bufferDataTyped(WEBGL.ELEMENT_ARRAY_BUFFER, data, WEBGL.STATIC_DRAW);
  }
  
  WEBGL.Buffer CreateAndInitializeElementArrayBuffer(
      WEBGL.RenderingContext gl, TypedData data) {
    assert((data is Uint16List) || (data is Uint32List));
    WEBGL.Buffer b = gl.createBuffer();
    ChangeElementArrayBuffer(gl, b, data);
    return b;
  }
  
  