[Bf-blender-cvs] [c010cf58147] soc-2020-io-performance: Fix loose edge export & import, and offsets.

Ankit Meel noreply at git.blender.org
Tue Aug 11 23:19:40 CEST 2020


Commit: c010cf5814765563fa7e0e117e7859072604e41a
Author: Ankit Meel
Date:   Wed Aug 12 02:47:11 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBc010cf5814765563fa7e0e117e7859072604e41a

Fix loose edge export & import, and offsets.

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

M	source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
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

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

diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
index 81ec4250403..57ef74ab521 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.cc
@@ -23,6 +23,7 @@
 
 #include "BKE_blender_version.h"
 
+#include "BLI_array.hh"
 #include "BLI_math_inline.h"
 
 #include "DNA_object_types.h"
@@ -357,17 +358,20 @@ void OBJWriter::write_poly_elements(OBJMesh &obj_mesh_data, Span<Vector<uint>> u
 }
 
 /**
- * Define and write an edge of a curve converted to mesh or a primitive circle as l v1 v2 .
+ * Write loose edges of a mesh, a curve converted to mesh, or a primitive circle as l v1 v2 .
  */
-void OBJWriter::write_curve_edges(OBJMesh &obj_mesh_data)
+void OBJWriter::write_loose_edges(OBJMesh &obj_mesh_data)
 {
-  uint vertex_indices[2];
+  Array<int, 2> vertex_indices;
+  obj_mesh_data.ensure_mesh_edges();
   for (uint edge_index = 0; edge_index < obj_mesh_data.tot_edges(); edge_index++) {
-    obj_mesh_data.calc_edge_vert_indices(vertex_indices, edge_index);
-    fprintf(outfile_,
-            "l %u %u\n",
-            vertex_indices[0] + index_offset_[VERTEX_OFF],
-            vertex_indices[1] + index_offset_[VERTEX_OFF]);
+    vertex_indices = obj_mesh_data.calc_edge_vert_indices(edge_index);
+    if (vertex_indices.size() == 2) {
+      fprintf(outfile_,
+              "l %u %u\n",
+              vertex_indices[0] + index_offset_[VERTEX_OFF],
+              vertex_indices[1] + index_offset_[VERTEX_OFF]);
+    }
   }
 }
 
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
index 376208afd46..78f7d413363 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
@@ -71,7 +71,7 @@ class OBJWriter {
                           short &r_last_face_vertex_group,
                           uint poly_index);
   void write_poly_elements(OBJMesh &obj_mesh_data, Span<Vector<uint>> uv_indices);
-  void write_curve_edges(OBJMesh &obj_mesh_data);
+  void write_loose_edges(OBJMesh &obj_mesh_data);
   void write_nurbs_curve(OBJNurbs &obj_nurbs_data);
 
   void update_index_offsets(OBJMesh &obj_mesh_data);
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
index 0dbf5ed9167..df6d16a04b2 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.cc
@@ -71,16 +71,13 @@ OBJMesh::OBJMesh(Depsgraph *depsgraph, const OBJExportParams &export_params, Obj
         triangulate_mesh_eval();
       }
       tot_poly_normals_ = export_mesh_eval_->totpoly;
-      tot_edges_ = 0;
       if (tot_poly_normals_ <= 0) {
         tot_poly_normals_ = 0;
-        tot_edges_ = export_mesh_eval_->totedge;
       }
       break;
     }
     case OB_CURVE: {
       tot_poly_normals_ = 0;
-      tot_edges_ = export_mesh_eval_->totedge;
       break;
     }
     default: {
@@ -171,7 +168,7 @@ uint OBJMesh::tot_uv_vertices() const
 
 uint OBJMesh::tot_edges() const
 {
-  return tot_edges_;
+  return export_mesh_eval_->totedge;
 }
 
 /**
@@ -204,6 +201,12 @@ void OBJMesh::ensure_mesh_normals()
   BKE_mesh_ensure_normals(export_mesh_eval_);
 }
 
+void OBJMesh::ensure_mesh_edges()
+{
+  BKE_mesh_calc_edges(export_mesh_eval_, true, false);
+  BKE_mesh_calc_edges_loose(export_mesh_eval_);
+}
+
 /**
  * Calculate smooth groups of a smooth shaded object.
  * \return A polygon aligned array of smooth group numbers or bitflags if export
@@ -456,17 +459,12 @@ const char *OBJMesh::get_poly_deform_group_name(const MPoly &mpoly, short &r_las
 /**
  * Only for curve converted to meshes and primitive circle: calculate vertex indices of one edge.
  */
-void OBJMesh::calc_edge_vert_indices(uint r_vert_indices[2], uint edge_index)
+Array<int, 2> OBJMesh::calc_edge_vert_indices(const uint edge_index) const
 {
-  r_vert_indices[0] = edge_index + 1;
-  r_vert_indices[1] = edge_index + 2;
-
-  /* Last edge's second vertex depends on whether the curve is cyclic or not. */
-  if (UNLIKELY(edge_index == export_mesh_eval_->totedge)) {
-    r_vert_indices[0] = edge_index + 1;
-    r_vert_indices[1] = export_mesh_eval_->totvert == export_mesh_eval_->totedge ?
-                            1 :
-                            export_mesh_eval_->totvert;
+  const MEdge &edge = export_mesh_eval_->medge[edge_index];
+  if (edge.flag & ME_LOOSEEDGE) {
+    return {edge.v1 + 1, edge.v2 + 1};
   }
+  return {};
 }
 }  // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
index 09152a8af80..e5f71cc2289 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_ex_mesh.hh
@@ -27,6 +27,7 @@
 #include "BKE_material.h"
 #include "BKE_mesh.h"
 
+#include "BLI_array.hh"
 #include "BLI_utility_mixins.hh"
 #include "BLI_vector.hh"
 
@@ -67,10 +68,6 @@ class OBJMesh : NonMovable, NonCopyable {
    * Total UV vertices in a mesh's texture map.
    */
   uint tot_uv_vertices_ = 0;
-  /**
-   * Only for curve converted to meshes: total edges in a mesh.
-   */
-  uint tot_edges_ = 0;
   /**
    * Total smooth groups in an object.
    */
@@ -93,6 +90,7 @@ class OBJMesh : NonMovable, NonCopyable {
   int ith_smooth_group(int poly_index) const;
 
   void ensure_mesh_normals();
+  void ensure_mesh_edges();
   void calc_smooth_groups();
   Material *get_object_material(short mat_nr);
   const MPoly &get_ith_poly(uint i);
@@ -109,7 +107,7 @@ class OBJMesh : NonMovable, NonCopyable {
   void calc_vertex_normal(float r_vertex_normal[3], uint vert_index);
   void calc_poly_normal_indices(Vector<uint> &r_normal_indices, uint poly_index);
   const char *get_poly_deform_group_name(const MPoly &mpoly, short &r_last_vertex_group);
-  void calc_edge_vert_indices(uint r_vert_indices[2], uint edge_index);
+  Array<int, 2> calc_edge_vert_indices(const uint edge_index) const;
 
  private:
   void triangulate_mesh_eval();
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
index d541ac27ab8..7ca7a1405b8 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_exporter.cc
@@ -132,11 +132,7 @@ static void export_frame(ViewLayer *view_layer,
     frame_writer.write_object_name(*mesh_to_export);
     frame_writer.write_vertex_coords(*mesh_to_export);
 
-    /* Write edges of curves converted to mesh and primitive circle. */
-    if (mesh_to_export->tot_polygons() == 0) {
-      frame_writer.write_curve_edges(*mesh_to_export);
-    }
-    else {
+    if (mesh_to_export->tot_polygons() > 0) {
       Vector<Vector<uint>> uv_indices;
       if (export_params.export_normals) {
         frame_writer.write_poly_normals(*mesh_to_export);
@@ -150,6 +146,8 @@ static void export_frame(ViewLayer *view_layer,
       }
       frame_writer.write_poly_elements(*mesh_to_export, uv_indices);
     }
+    frame_writer.write_loose_edges(*mesh_to_export);
+
     frame_writer.update_index_offsets(*mesh_to_export);
   }
   /* Export nurbs in parm form, not as vertices and edges. */
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 110a4f8676f..089673a9efd 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
@@ -237,8 +237,8 @@ static Geometry *create_geometry(Geometry *const prev_geometry,
 
 void IndexOffsets::update_index_offsets(const GlobalVertices &global_vertices)
 {
-  index_offsets_[VERTEX_OFF] += global_vertices.vertices.size();
-  index_offsets_[UV_VERTEX_OFF] += global_vertices.uv_vertices.size();
+  index_offsets_[VERTEX_OFF] = global_vertices.vertices.size();
+  index_offsets_[UV_VERTEX_OFF] = global_vertices.uv_vertices.size();
 }
 
 /**
@@ -317,9 +317,9 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
       copy_string_to_int(str_edge_split[1], -1, edge_v2);
       /* Always keep stored indices non-negative and zero-based. */
       edge_v1 += edge_v1 < 0 ? global_vertices.vertices.size() :
-                               -offsets.get_index_offset(VERTEX_OFF) + 1;
+                               -offsets.get_index_offset(VERTEX_OFF) - 1;
       edge_v2 += edge_v2 < 0 ? global_vertices.vertices.size() :
-                               -offsets.get_index_offset(VERTEX_OFF) + 1;
+                               -offsets.get_index_offset(VERTEX_OFF) - 1;
       BLI_assert(edge_v1 >= 0 && edge_v2 >= 0);
       current_geometry->edges_.append({static_cast<uint>(edge_v1), static_cast<uint>(edge_v2)});
     }
@@ -386,10 +386,8 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
         }
         /* Always keep stored indices non-negative and zero-based. */
         corner.vert_index += corner.vert_index < 0 ? global_vertices.vertices.size() :
-                                                     -offsets.get_index_offset(VERTEX_OFF) + 1;
-        corner.uv_vert_index += corner.uv_vert_index < 0 ?
-                                    global_vertices.uv_vertices.size() :
-                                    -offsets.get_index_offset(UV_VERTEX_OFF) + 1;
+                                                     -offsets.get_index_offset(VERTEX_OFF) - 1;
+        corner.uv_vert_index += corner.uv_vert_index < 0 ? global_vertices.uv_vertices.size() : -1;
         curr_face.face_corners.append(corner);
       }
 
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 5197ff2dbe0..

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list