2017-02-16 5 views
-4

Ich habe alten Code in einen neuen konvertiert und hässliche Code-Teile gelöscht, aber es funktioniert nicht mehr. Mögest du mir helfen. Es wäre nett!Habe ich etwas falsch gemacht, während ich alten Code in einen neuen umwandelte

ALTE - Kopf

private ArrayList vertexsets; 
private ArrayList vertexsetsnorms; 
private ArrayList vertexsetstexs; 
private ArrayList faces; 
private ArrayList facestexs; 
private ArrayList facesnorms; 
private ArrayList mattimings; 
private MtlLoader materials; 
private String mtl_path; 

alte Funktion

if (newline.startsWith("f ")) { 
    facecounter++; 
    newline = newline.substring(2, newline.length()); 
    StringTokenizer st = new StringTokenizer(newline, " "); 
    int count = st.countTokens(); 
    int v[] = new int[count]; 
    int vt[] = new int[count]; 
    int vn[] = new int[count]; 
    for (int i = 0; i < count; i++) { 
     char chars[] = st.nextToken().toCharArray(); 
     StringBuffer sb = new StringBuffer(); 
     char lc = 'x'; 
     for (int k = 0; k < chars.length; k++) { 
      if (chars[k] == '/' && lc == '/') 
       sb.append('0'); 
      lc = chars[k]; 
      sb.append(lc); 
     } 

     StringTokenizer st2 = new StringTokenizer(sb.toString(), "/"); 
     int num = st2.countTokens(); 
     v[i] = Integer.parseInt(st2.nextToken()); 
     if (num > 1) 
      vt[i] = Integer.parseInt(st2.nextToken()); 
     else 
      vt[i] = 0; 
     if (num > 2) 
      vn[i] = Integer.parseInt(st2.nextToken()); 
     else 
      vn[i] = 0; 
    } 

    faces.add(v); 
    facestexs.add(vt); 
    facesnorms.add(vn); 
} 

ich eine neue Klasse namens Gesicht hinzugefügt haben, die v hält, vt und vn.

public class Face { 
    public ArrayList<Float[]> normalIndicies;   //vn 
    public ArrayList<Float[]> textureCoordIndicies; //vt 
    public ArrayList<Float[]> vertexIndicies;   //v 
} 

NEW ONE - Kopf

protected ArrayList<Vector3f> verticies; 
protected ArrayList<Vector3f> normals; 
protected ArrayList<Vector3f> textureCoords; 
protected LinkedHashMap<String, Integer> material; 
protected ArrayList<Face> faces; 

protected String mtlLib; 

NEW ONE - Funktion

if(line.startsWith("f ")) { 
    Face face = new Face(); 
    face.vertexIndicies = new ArrayList<Float[]>(); 
    face.textureCoordIndicies = new ArrayList<Float[]>(); 
    face.normalIndicies = new ArrayList<Float[]>(); 

    faceCounter++; 

    Float[] vertexIndices = new Float[3]; 
    Float[] textureIndex = new Float[3]; 
    Float[] normalIndices = new Float[3]; 
    String[] firstVec = line.split(" ")[1].split("/"); 
    String[] secondVec = line.split(" ")[2].split("/"); 
    String[] thirdVec = line.split(" ")[3].split("/"); 

    for(int i = 0; i < firstVec.length; i++) { 
     if(i == 0) vertexIndices[0] = Float.valueOf(firstVec[i]); 
     if(i == 1) textureIndex[0] = Float.valueOf(firstVec[i]); 
     if(i == 2) normalIndices[0] = Float.valueOf(firstVec[i]); 
    } 

    for(int i = 0; i < secondVec.length; i++) { 
     if(i == 0) vertexIndices[1] = Float.valueOf(secondVec[i]); 
     if(i == 1) textureIndex[1] = Float.valueOf(secondVec[i]); 
     if(i == 2) normalIndices[1] = Float.valueOf(secondVec[i]); 
    } 

    for(int i = 0; i < thirdVec.length; i++) { 
     if(i == 0) vertexIndices[2] = Float.valueOf(thirdVec[i]); 
     if(i == 1) textureIndex[2] = Float.valueOf(thirdVec[i]); 
     if(i == 2) normalIndices[2] = Float.valueOf(thirdVec[i]); 
    } 

    face.vertexIndicies.add(vertexIndices); 
    face.textureCoordIndicies.add(textureIndex); 
    face.normalIndicies.add(normalIndices); 
    this.faces.add(face); 
} 
+4

vielleicht wurden die hässlichen Teile benötigt? – SaggingRufus

Antwort

0

Die ursprünglichen Daten wurden im Integer-Format gegeben, aber Sie erwarten, dass die Daten in dem neuen Code Schwimmer sein. Da dieser Code Teil eines Obj-Parsers zu sein scheint, ist der korrekte Datentyp Integer. Eine Faceline speichert Indizes zu anderen Arrays (Positionen, Tex-Coords, etc.).

Kommentare auf der Rewrite:

Splitting sich recht langsam ist und Sie die gleiche Zeichenfolge dreimal entlang der "„(Leerzeichen) Symbol zu splitten. (Ganz zu schweigen von den Auswirkungen der Spaltung auf das Gedächtnis).

Auch die Verwendung von Schleifen und if-Anweisungen sieht, da dies sehr seltsam:

for(int i = 0; i < firstVec.length; i++) { 
    if(i == 0) vertexIndices[0] = Float.valueOf(firstVec[i]); 
    if(i == 1) textureIndex[0] = Float.valueOf(firstVec[i]); 
    if(i == 2) normalIndices[0] = Float.valueOf(firstVec[i]); 
} 

die gleiche wie

ist
vertexIndices[0] = Float.valueOf(firstVec[0]); 
textureIndex[0] = Float.valueOf(firstVec[1]); 
normalIndices[0] = Float.valueOf(firstVec[2]); 

nur ohne unnötige Schleifen und Verzweigungen.

Verwandte Themen