Program: 653
Project: 653
Buggy source:
@Override public void drawTexture(TextureRegion texture,Color color,ScaleMode mode,Rect2i absoluteRegion,float ux,float uy,float uw,float uh,float alpha){
  if (!texture.getTexture().isLoaded()) {
    return;
  }
  if (!currentTextureCropRegion.equals(requestedCropRegion) && !(currentTextureCropRegion.contains(absoluteRegion) && requestedCropRegion.contains(absoluteRegion))) {
    textureMat.setFloat4(CROPPING_BOUNDARIES_PARAM,requestedCropRegion.minX(),requestedCropRegion.maxX() + 1,requestedCropRegion.minY(),requestedCropRegion.maxY() + 1);
    currentTextureCropRegion=requestedCropRegion;
  }
  Vector2f scale=mode.scaleForRegion(absoluteRegion,texture.getWidth(),texture.getHeight());
  Rect2f textureArea=texture.getRegion();
  Mesh mesh=billboard;
switch (mode) {
case TILED:
{
      TextureCacheKey key=new TextureCacheKey(texture.size(),absoluteRegion.size());
      usedTextures.add(key);
      mesh=cachedTextures.get(key);
      if (mesh == null || mesh.isDisposed()) {
        MeshBuilder builder=new MeshBuilder();
        addTiles(builder,absoluteRegion,FULL_REGION,texture.size(),FULL_REGION);
        mesh=builder.build();
        cachedTextures.put(key,mesh);
      }
      textureMat.setFloat2("String_Node_Str",scale);
      textureMat.setFloat2("String_Node_Str",absoluteRegion.minX(),absoluteRegion.minY());
      textureMat.setFloat2("String_Node_Str",textureArea.minX() + ux * textureArea.width(),textureArea.minY() + uy * textureArea.height());
      textureMat.setFloat2("String_Node_Str",uw * textureArea.width(),uh * textureArea.height());
      break;
    }
case SCALE_FILL:
{
    textureMat.setFloat2("String_Node_Str",absoluteRegion.minX(),absoluteRegion.minY());
    textureMat.setFloat2("String_Node_Str",absoluteRegion.width(),absoluteRegion.height());
    float texBorderX=(scale.x - absoluteRegion.width()) / scale.x * uw;
    float texBorderY=(scale.y - absoluteRegion.height()) / scale.y * uh;
    textureMat.setFloat2("String_Node_Str",textureArea.minX() + (ux + 0.5f * texBorderX) * textureArea.width(),textureArea.minY() + (uy + 0.5f * texBorderY) * textureArea.height());
    textureMat.setFloat2("String_Node_Str",(uw - texBorderX) * textureArea.width(),(uh - texBorderY) * textureArea.height());
    break;
  }
default :
{
  textureMat.setFloat2("String_Node_Str",scale);
  textureMat.setFloat2("String_Node_Str",absoluteRegion.minX() + 0.5f * (absoluteRegion.width() - scale.x),absoluteRegion.minY() + 0.5f * (absoluteRegion.height() - scale.y));
  textureMat.setFloat2("String_Node_Str",textureArea.minX() + ux * textureArea.width(),textureArea.minY() + uy * textureArea.height());
  textureMat.setFloat2("String_Node_Str",uw * textureArea.width(),uh * textureArea.height());
  break;
}
}
textureMat.setTexture("String_Node_Str",texture.getTexture());
textureMat.setFloat4("String_Node_Str",color.rf(),color.gf(),color.bf(),color.af() * alpha);
textureMat.bindTextures();
mesh.render();
}

Fixed version (ground truth):
@Override public void drawTexture(TextureRegion texture,Color color,ScaleMode mode,Rect2i absoluteRegion,float ux,float uy,float uw,float uh,float alpha){
  if (!texture.getTexture().isLoaded()) {
    return;
  }
  if (!currentTextureCropRegion.equals(requestedCropRegion) && !(currentTextureCropRegion.contains(absoluteRegion) && requestedCropRegion.contains(absoluteRegion))) {
    textureMat.setFloat4(CROPPING_BOUNDARIES_PARAM,requestedCropRegion.minX(),requestedCropRegion.maxX(),requestedCropRegion.minY(),requestedCropRegion.maxY());
    currentTextureCropRegion=requestedCropRegion;
  }
  Vector2f scale=mode.scaleForRegion(absoluteRegion,texture.getWidth(),texture.getHeight());
  Rect2f textureArea=texture.getRegion();
  Mesh mesh=billboard;
switch (mode) {
case TILED:
{
      TextureCacheKey key=new TextureCacheKey(texture.size(),absoluteRegion.size());
      usedTextures.add(key);
      mesh=cachedTextures.get(key);
      if (mesh == null || mesh.isDisposed()) {
        MeshBuilder builder=new MeshBuilder();
        addTiles(builder,absoluteRegion,FULL_REGION,texture.size(),FULL_REGION);
        mesh=builder.build();
        cachedTextures.put(key,mesh);
      }
      textureMat.setFloat2("String_Node_Str",scale);
      textureMat.setFloat2("String_Node_Str",absoluteRegion.minX(),absoluteRegion.minY());
      textureMat.setFloat2("String_Node_Str",textureArea.minX() + ux * textureArea.width(),textureArea.minY() + uy * textureArea.height());
      textureMat.setFloat2("String_Node_Str",uw * textureArea.width(),uh * textureArea.height());
      break;
    }
case SCALE_FILL:
{
    textureMat.setFloat2("String_Node_Str",absoluteRegion.minX(),absoluteRegion.minY());
    textureMat.setFloat2("String_Node_Str",absoluteRegion.width(),absoluteRegion.height());
    float texBorderX=(scale.x - absoluteRegion.width()) / scale.x * uw;
    float texBorderY=(scale.y - absoluteRegion.height()) / scale.y * uh;
    textureMat.setFloat2("String_Node_Str",textureArea.minX() + (ux + 0.5f * texBorderX) * textureArea.width(),textureArea.minY() + (uy + 0.5f * texBorderY) * textureArea.height());
    textureMat.setFloat2("String_Node_Str",(uw - texBorderX) * textureArea.width(),(uh - texBorderY) * textureArea.height());
    break;
  }
default :
{
  textureMat.setFloat2("String_Node_Str",scale);
  textureMat.setFloat2("String_Node_Str",absoluteRegion.minX() + 0.5f * (absoluteRegion.width() - scale.x),absoluteRegion.minY() + 0.5f * (absoluteRegion.height() - scale.y));
  textureMat.setFloat2("String_Node_Str",textureArea.minX() + ux * textureArea.width(),textureArea.minY() + uy * textureArea.height());
  textureMat.setFloat2("String_Node_Str",uw * textureArea.width(),uh * textureArea.height());
  break;
}
}
textureMat.setTexture("String_Node_Str",texture.getTexture());
textureMat.setFloat4("String_Node_Str",color.rf(),color.gf(),color.bf(),color.af() * alpha);
textureMat.bindTextures();
mesh.render();
}