Program: 164041
Project: 164041
Buggy source:
@Override public void draw(){
  super.draw();
  if (!updated.isEmpty()) {
    updateVertices();
    quads.limit(bufferLength * 16);
    if (buffer == null)     buffer=new Vertexbuffer(quads);
 else {
      if (fullUpdate) {
        buffer.updateVertices(quads);
        fullUpdate=false;
      }
 else {
        buffer.updateVertices(quads,topLeftUpdating * 16,bottomRightUpdating * 16);
      }
    }
    topLeftUpdating=0;
    updating.setEmpty();
  }
  Camera c=Camera.main;
  if (camX == null || camX != (int)c.scroll.x / 16 || camY != (int)c.scroll.y / 16 || camW != (int)Math.ceil(c.width / cellW) || camH != (int)Math.ceil(c.height / cellH)) {
    camX=(int)c.scroll.x / 16;
    camY=(int)c.scroll.y / 16;
    camW=(int)Math.ceil(c.width / cellW);
    camH=(int)Math.ceil(c.height / cellH);
    if (camX >= mapWidth || camY >= mapHeight || camW + camW <= 0 || camH + camH <= 0)     return;
    topLeft=Math.max(camX,0) + Math.max(camY * mapWidth,0);
    while (topLeft < bufferPositions.length && bufferPositions[topLeft] == -1)     topLeft++;
    bottomRight=Math.min(camX + camW,mapWidth - 1) + Math.min((camY + camH) * mapWidth,(mapHeight - 1) * mapWidth);
    while (bottomRight >= topLeft && bufferPositions[bottomRight] == -1)     bottomRight--;
    length=bufferPositions[bottomRight] - bufferPositions[topLeft] + 1;
  }
  if (camX >= mapWidth || camY >= mapHeight || camW + camW <= 0 || camH + camH <= 0 || length <= 0)   return;
  NoosaScript script=NoosaScriptNoLighting.get();
  texture.bind();
  script.uModel.valueM4(matrix);
  script.camera(camera);
  script.drawQuadSet(buffer,length,bufferPositions[topLeft]);
}

Fixed version (ground truth):
@Override public void draw(){
  super.draw();
  if (!updated.isEmpty()) {
    updateVertices();
    quads.limit(bufferLength * 16);
    if (buffer == null)     buffer=new Vertexbuffer(quads);
 else {
      if (fullUpdate) {
        buffer.updateVertices(quads);
        fullUpdate=false;
      }
 else {
        buffer.updateVertices(quads,topLeftUpdating * 16,bottomRightUpdating * 16);
      }
    }
    topLeftUpdating=0;
    updating.setEmpty();
  }
  Camera c=Camera.main;
  if (camX == null || camX != (int)c.scroll.x / 16 || camY != (int)c.scroll.y / 16 || camW != (int)Math.ceil(c.width / cellW) || camH != (int)Math.ceil(c.height / cellH)) {
    camX=(int)c.scroll.x / 16;
    camY=(int)c.scroll.y / 16;
    camW=(int)Math.ceil(c.width / cellW);
    camH=(int)Math.ceil(c.height / cellH);
    if (camX >= mapWidth || camY >= mapHeight || camW + camW <= 0 || camH + camH <= 0)     return;
    topLeft=Math.max(camX,0) + Math.max(camY * mapWidth,0);
    while (topLeft < bufferPositions.length && bufferPositions[topLeft] == -1)     topLeft++;
    bottomRight=Math.min(camX + camW,mapWidth - 1) + Math.min((camY + camH) * mapWidth,(mapHeight - 1) * mapWidth);
    while (bottomRight >= topLeft && bufferPositions[bottomRight] == -1)     bottomRight--;
    if (topLeft >= bufferPositions.length || bottomRight <= 0)     length=0;
 else     length=bufferPositions[bottomRight] - bufferPositions[topLeft] + 1;
  }
  if (camX >= mapWidth || camY >= mapHeight || camW + camW <= 0 || camH + camH <= 0 || length <= 0)   return;
  NoosaScript script=NoosaScriptNoLighting.get();
  texture.bind();
  script.uModel.valueM4(matrix);
  script.camera(camera);
  script.drawQuadSet(buffer,length,bufferPositions[topLeft]);
}