anchor.diff:  
   MeshData createCylinderInternalWireframeFriendly(
       double radTop, double radBot, double height, int radialSubdivisions) {
  +  // Compute points on edges
     final double halfHeight = height / 2;
     List<VM.Vector3> top = [];
     List<VM.Vector3> bot = [];
     for (int i = 0; i < radialSubdivisions; i++) {
  -    double u = i / radialSubdivisions;
  -    top.add(new VM.Vector3(radTop * Math.sin(u * Math.PI * 2), halfHeight,
  -        radTop * Math.cos(u * Math.PI * 2)));
  -    bot.add(new VM.Vector3(radBot * Math.sin(u * Math.PI * 2), -halfHeight,
  -        radBot * Math.cos(u * Math.PI * 2)));
  +    double u = i / radialSubdivisions * Math.PI * 2.0;
  +    double x = Math.sin(u);
  +    double z = Math.cos(u);
  +    top.add(new VM.Vector3(radTop * x, halfHeight, radTop * z));
  +    bot.add(new VM.Vector3(radBot * x, -halfHeight, radBot * z));
     }
  +  // repeat thre first point so we can safely index with +1
     top.add(top[0]);
     bot.add(bot[0]);
  +  assert(top.length == radialSubdivisions + 1);
  +  assert(bot.length == radialSubdivisions + 1);
   
  -  VM.Vector2 zero = new VM.Vector2(0.0, 0.0);
  +  final VM.Vector2 zero = new VM.Vector2(0.0, 0.0);
  +  final VM.Vector3 centerTop = new VM.Vector3(0.0, halfHeight, 0.0);
  +  final VM.Vector3 centerBot = new VM.Vector3(0.0, -halfHeight, 0.0);
  +
     MeshData md = new MeshData();
     md.name = "cylinder-wireframe-friendly";
     md.EnableAttribute(aTextureCoordinates);
  -  final VM.Vector3 centerTop = new VM.Vector3(0.0, halfHeight, 0.0);
  -  final VM.Vector3 centerBot = new VM.Vector3(0.0, -halfHeight, 0.0);
  +
  +  // top and bottom are Face3
     md.AddFaces3(2 * radialSubdivisions);
     for (int i = 0; i < radialSubdivisions; i++) {
       md.AddVertices([centerTop, top[i], top[i + 1]]);
  
positive.code: // uv mapping is weird to help with debugging
  
  MeshData createCylinderInternal(
      double radiusTop, double radiusBot, double height, int radialSubdivisions) {
    MeshData md = new MeshData();
    md.name = "cylinder";
    md.EnableAttribute(aTextureCoordinates);
  
negative.code: 
    md.AddFaces4(radialSubdivisions);
    for (int i = 0; i < radialSubdivisions; i++) {
      md.AddVertices([top[i + 1], top[i], bot[i], bot[i + 1]]);
      // TODO: fix these
      md.AddAttributesVector2(aTextureCoordinates, [zero, zero, zero, zero]);
    }
  