diff --git a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java index 0da440cb0f3a6c9a24cca74afe793dc2cd0fc52e..06c7d3eef36030e13b43e3135688e49d977d389a 100644 --- a/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java +++ b/MeshModel/src/main/java/cz/fidentis/analyst/mesh/io/MeshObjLoader.java @@ -11,13 +11,20 @@ import com.mokiat.data.front.parser.OBJObject; import com.mokiat.data.front.parser.OBJParser; import com.mokiat.data.front.parser.OBJTexCoord; import com.mokiat.data.front.parser.OBJVertex; +import cz.fidentis.analyst.mesh.core.MeshEdge; +import cz.fidentis.analyst.mesh.core.MeshFace; +import cz.fidentis.analyst.mesh.core.MeshFacet; +import cz.fidentis.analyst.mesh.core.MeshModel; +import cz.fidentis.analyst.mesh.core.MeshPoint; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.vecmath.Vector3d; @@ -41,18 +48,25 @@ public class MeshObjLoader { return null; } - OBJObject object = model.getObjects().get(0); // Předpokládá se celý obličej jako jeden prvek - - List<MeshFacet> listFacet = new ArrayList(); + // Expecting only one face in file as one object + OBJObject object = model.getObjects().get(0); - for (OBJMesh mesh : object.getMeshes()) { // Sjednotit s facet + // Our facet = loader mesh, create and fill all facets + for (OBJMesh mesh : object.getMeshes()) { MeshFacet meshFacet = new MeshFacet(); + // Map for all edges with one face. Can't use Set because missing get(); + Map<MeshEdge, MeshEdge> oneFaceEdges = new HashMap(); + + // Create and fill all faces for (OBJFace face : mesh.getFaces()) { List<OBJDataReference> references = face.getReferences(); - List<MeshPoint> points = new ArrayList(); + List<MeshPoint> facePoints = new ArrayList(); + MeshFace meshFace = new MeshFace(); + + // Load all point from one mesh for (OBJDataReference reference : references) { final OBJVertex vertex = model.getVertex(reference); Vector3d coords = new Vector3d(vertex.x, vertex.y, vertex.z); @@ -67,18 +81,33 @@ public class MeshObjLoader { texCoords = new Vector3d(texCoord.u, texCoord.v, texCoord.w); } - MeshPoint meshPoint = new MeshPoint(coords, norm, texCoords); - points.add(meshPoint); + MeshPoint meshPoint = meshFacet.getPoint(new MeshPoint(coords, norm, texCoords)); + facePoints.add(meshPoint); } - - List<MeshEdge> edges = new ArrayList(); - for (int i = 1; i < points.size(); i++) { - edges.add(new MeshEdge(points.get(i-1), points.get(i))); + // Create edges + for (int i = 1; i <= facePoints.size(); i++) { + MeshEdge meshEdge = new MeshEdge(facePoints.get((i-1)%facePoints.size()), facePoints.get((i)%facePoints.size())); + if (oneFaceEdges.containsKey(meshEdge)) { + meshEdge = oneFaceEdges.get(meshEdge); + meshFacet.getEdge(meshEdge); + //meshEdge.add this face as second face + oneFaceEdges.remove(meshEdge); + } else { + oneFaceEdges.put(meshEdge, meshEdge); + } + meshFace.addChild(meshEdge); } + + meshFacet.addChild(meshFace); } - listFacet.add(meshFacet); + + // Add remaining edges with only one asociated face, i. e. edge of facet + for (MeshEdge edge : oneFaceEdges.values()) { + meshFacet.getEdge(edge); + } + + meshModel.addChild(meshFacet); } - meshModel.addFacets(listFacet); } catch (IOException ex) { Logger.getLogger(MeshObjLoader.class.getName()).log(Level.SEVERE, null, ex); @@ -95,6 +124,5 @@ public class MeshObjLoader { Logger.getLogger(MeshObjLoader.class.getName()).log(Level.SEVERE, null, ex); } return null; - } - + } }