[Bf-blender-cvs] [5a9b983263c] soc-2020-io-performance: Support meshes with edges with or without polygons.

Ankit Meel noreply at git.blender.org
Fri Jul 17 19:47:12 CEST 2020


Commit: 5a9b983263caaefc97061e3ab7695becfc3ac233
Author: Ankit Meel
Date:   Fri Jul 17 23:16:52 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB5a9b983263caaefc97061e3ab7695becfc3ac233

Support meshes with edges with or without polygons.

===================================================================

M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh

===================================================================

diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
index 9ffcd6194a9..cb2b6f3265d 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_file_reader.cc
@@ -152,6 +152,18 @@ void OBJImporter::parse_and_store(Vector<std::unique_ptr<OBJRawObject>> &list_of
       curr_tex_vert.flag = false;
       (*curr_ob)->texture_vertices.append(curr_tex_vert);
     }
+    else if (line_key == "l") {
+      MEdge curr_edge;
+      int edge_verts[2];
+      Vector<string> str_edge_split;
+      split_by_char(s_line.str(), ' ', str_edge_split);
+      copy_string_to_int(edge_verts, str_edge_split);
+      curr_edge.v1 = edge_verts[0];
+      curr_edge.v2 = edge_verts[1];
+      curr_edge.v1 -= index_offsets[VERTEX_OFF] + 1;
+      curr_edge.v2 -= index_offsets[VERTEX_OFF] + 1;
+      (*curr_ob)->edges.append(curr_edge);
+    }
     else if (line_key == "s") {
       string str_shading;
       s_line >> str_shading;
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
index a5d7e96ad3d..b88b8a52d0c 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.cc
@@ -38,9 +38,10 @@ namespace blender::io::obj {
 OBJMeshFromRaw::OBJMeshFromRaw(const OBJRawObject &curr_object)
 {
   uint tot_verts_object{curr_object.vertices.size()};
+  uint tot_edges{curr_object.edges.size()};
   uint tot_face_elems{curr_object.face_elements.size()};
   mesh_from_ob_.reset(
-      BKE_mesh_new_nomain(tot_verts_object, 0, 0, curr_object.tot_loop, tot_face_elems));
+      BKE_mesh_new_nomain(tot_verts_object, tot_edges, 0, curr_object.tot_loop, tot_face_elems));
 
   for (int i = 0; i < tot_verts_object; ++i) {
     copy_v3_v3(mesh_from_ob_->mvert[i].co, curr_object.vertices[i].co);
@@ -63,7 +64,16 @@ OBJMeshFromRaw::OBJMeshFromRaw(const OBJRawObject &curr_object)
     }
   }
 
-  BKE_mesh_calc_edges(mesh_from_ob_.get(), false, false);
+  for (int i = 0; i < tot_edges; ++i) {
+    const auto &curr_edge = curr_object.edges[i];
+    mesh_from_ob_->medge[i].v1 = curr_edge.v1;
+    mesh_from_ob_->medge[i].v2 = curr_edge.v2;
+  }
+
+  /* Set parameter `update` to true so that existing explicitly imported edges can be merged
+   * with the new ones created from polygons. */
+  BKE_mesh_calc_edges(mesh_from_ob_.get(), true, false);
+  BKE_mesh_calc_edges_loose(mesh_from_ob_.get());
 
   /* TODO ankitm merge the face iteration loops. Kept separate for ease of debugging. */
   if (curr_object.tot_uv_verts > 0 && curr_object.texture_vertices.size() > 0) {
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
index bb151f4f7a9..a6b68df2c32 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
@@ -52,6 +52,10 @@ class OBJRawObject {
   std::string object_name;
   Vector<MVert> vertices{};
   Vector<MLoopUV> texture_vertices{};
+  /**
+   * Edges written in the file in addition to (or even without polygon) elements.
+   */
+  Vector<MEdge> edges{};
   Vector<OBJFaceElem> face_elements{};
   uint tot_normals = 0;
   uint tot_loop = 0;



More information about the Bf-blender-cvs mailing list