package utils; import java.util.LinkedList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PlyLoader extends AbstractModelLoader { private LinkedList vertices; private LinkedList faces; private Pattern floatPattern; private Pattern facePattern; private Pattern vertexCountPattern; private Pattern faceCountPattern; private FileProperties currentIteration; private int maxVertices; private int maxfaces; private Pattern endHeaderPattern; private Matcher matcher = null; public PlyLoader() { super(); String floatNumber = "([-]??([\\d]*?[\\.]??[\\d]*?)([eE][-]??[\\d]*?)??)"; String integerNumber = "([-]??\\d+?)"; String vertexCount = "element vertex " + integerNumber; String faceCount = "element face " + integerNumber; String exitHeader = "[\\w]*?(end)[\\w]*?"; floatPattern = Pattern.compile(floatNumber + " " + floatNumber + " " + floatNumber + " " + floatNumber); facePattern = Pattern.compile(integerNumber); vertexCountPattern = Pattern.compile(vertexCount); faceCountPattern = Pattern.compile(faceCount); endHeaderPattern = Pattern.compile(exitHeader); this.vertices = new LinkedList(); this.faces = new LinkedList(); matcher = floatPattern.matcher("ass"); currentIteration = FileProperties.HEADER; } @Override protected void interpret(String text) { matcher.reset(text); switch(currentIteration) { case BODY: if(this.vertices.size() < this.maxVertices) { if(matcher.matches()) { this.vertices.add(Float.parseFloat(matcher.group(1))); this.vertices.add(Float.parseFloat(matcher.group(4))); this.vertices.add(Float.parseFloat(matcher.group(7))); } } break; case HEADER: if((matcher = endHeaderPattern.matcher(text)).matches()) { this.currentIteration = FileProperties.BODY; matcher = floatPattern.matcher(text); } else if((matcher = vertexCountPattern.matcher(text)).matches()) { this.maxVertices = Integer.parseInt(matcher.group(1)); } else if((matcher = faceCountPattern.matcher(text)).matches()) { this.maxfaces = Integer.parseInt(matcher.group(1)); } break; case FOOTER: break; default: assert true : "Invalid iteration! Value cannot be null or of another type than the enum FileProperties."; } } }