Buggy code:
public class OBJParser implements LineBasedParser , Model { public static final Logger LOGGER = LoggerFactory . getLogger ( OBJParser . class ) ; public static final String COMMENT = "#" ; public static final String VERTEX = "v" ; public static final String NORMAL = "vn" ; public static final String UV = "vt" ; public static final String FACE = "f" ; public static final String GROUP = "g" ; @ Getter @ Setter protected ArrayList < Vector3f > positions ; @ Getter @ Setter protected ArrayList < Vector2f > texCoord ; @ Getter @ Setter protected ArrayList < Vector3f > normal ; @ Getter @ Setter protected ArrayList < OBJIndex > indices ; protected boolean hasTexCoords ; protected boolean hasNormals ; protected boolean run = false ; private static boolean no_mulit_object_warned = false ; public OBJParser ( ) { } @ Override public String parse ( String line ) throws Exception { if ( ! ( run ) ) { run = true ; } String [ ] tokens = line . split ( "<seq2seq4repair_space>" ) ; tokens = UString . removeEmptyFromArray ( tokens ) ; if ( ( tokens . length ) == 0 ) { return line ; } if ( tokens [ 0 ] . startsWith ( OBJParser . COMMENT ) ) { OBJParser . LOGGER . trace ( "Skipping<seq2seq4repair_space>commented<seq2seq4repair_space>line" ) ; } else if ( tokens [ 0 ] . equalsIgnoreCase ( OBJParser . GROUP ) ) { if ( ! ( OBJParser . no_mulit_object_warned ) ) { OBJParser . LOGGER . warn ( ( "Multi-Object<seq2seq4repair_space>OBJ<seq2seq4repair_space>files<seq2seq4repair_space>are<seq2seq4repair_space>not<seq2seq4repair_space>fully<seq2seq4repair_space>supported.<seq2seq4repair_space>" + ( "Texture<seq2seq4repair_space>Coordinates<seq2seq4repair_space>may<seq2seq4repair_space>be<seq2seq4repair_space>broken.<seq2seq4repair_space>You<seq2seq4repair_space>can<seq2seq4repair_space>combine<seq2seq4repair_space>" + "the<seq2seq4repair_space>objects<seq2seq4repair_space>in<seq2seq4repair_space>the<seq2seq4repair_space>3D<seq2seq4repair_space>Editor<seq2seq4repair_space>of<seq2seq4repair_space>your<seq2seq4repair_space>choice." ) ) ) ; OBJParser . no_mulit_object_warned = true ; } } else if ( tokens [ 0 ] . equalsIgnoreCase ( OBJParser . VERTEX ) ) { positions . add ( new Vector3f ( Float . valueOf ( tokens [ 1 ] ) , Float . valueOf ( tokens [ 2 ] ) , Float . valueOf ( tokens [ 3 ] ) ) ) ; } else if ( tokens [ 0 ] . equalsIgnoreCase ( OBJParser . UV ) ) { <START_BUG> texCoord . add ( new Vector2f ( Float . valueOf ( tokens [ 1 ] ) , Float . valueOf ( tokens [ 2 ] ) ) ) ; <END_BUG> } else if ( tokens [ 0 ] . equalsIgnoreCase ( OBJParser . NORMAL ) ) { normal . add ( new Vector3f ( Float . valueOf ( tokens [ 1 ] ) , Float . valueOf ( tokens [ 2 ] ) , Float . valueOf ( tokens [ 3 ] ) ) ) ; } else if ( tokens [ 0 ] . equalsIgnoreCase ( OBJParser . FACE ) ) { for ( int i = 0 ; i < ( ( tokens . length ) - 3 ) ; i ++ ) { indices . add ( this . parseOBJIndex ( tokens [ 1 ] ) ) ; indices . add ( this . parseOBJIndex ( tokens [ ( 2 + i ) ] ) ) ; indices . add ( this . parseOBJIndex ( tokens [ ( 3 + i ) ] ) ) ; } } return line ; } @ Override public IndexedModel toIndexedModel ( ) { } protected OBJIndex parseOBJIndex ( String token ) throws LoadingException { } public boolean hasRun ( ) { } }

Fix:
texCoord . add ( new Vector2f ( Float . valueOf ( tokens [ 1 ] ) , ( 1 - ( Float . valueOf ( tokens [ 2 ] ) ) ) ) ) ;