[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