[Bf-blender-cvs] [e0c0b8ffd17] soc-2020-io-performance: Fix vertex offsets for MEdges and MLoops.

Ankit Meel noreply at git.blender.org
Tue Aug 11 18:47:41 CEST 2020


Commit: e0c0b8ffd17875687ccd9809429dcac81564dd74
Author: Ankit Meel
Date:   Tue Aug 11 20:34:56 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBe0c0b8ffd17875687ccd9809429dcac81564dd74

Fix vertex offsets for MEdges and MLoops.

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

M	source/blender/io/wavefront_obj/intern/wavefront_obj_ex_file_writer.hh
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_nurbs.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
M	source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.hh
M	source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc

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

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 9550ebb8117..376208afd46 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
@@ -31,7 +31,7 @@
 namespace blender::io::obj {
 
 /* Types of index offsets. */
-enum index_offsets {
+enum eIndexOffsets {
   VERTEX_OFF = 0,
   UV_VERTEX_OFF = 1,
   NORMAL_OFF = 2,
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 920341644df..110a4f8676f 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
@@ -30,6 +30,7 @@
 #include "BLI_string_ref.hh"
 #include "BLI_vector.hh"
 
+#include "wavefront_obj_ex_file_writer.hh"
 #include "wavefront_obj_im_file_reader.hh"
 
 namespace blender::io::obj {
@@ -185,17 +186,17 @@ BLI_INLINE void copy_string_to_int(Span<string_view> src,
 }
 
 /**
- * Based on the properties of the given Geometry instance, return whether a new Geometry instance
- * should be created. Caller should get some hint that the encountered object is a curve before
- * calling this function.
+ * Based on the properties of the given Geometry instance, create a new Geometry instance
+ * or return the previous one.
  *
- * This relies on the fact that the object type is updated to include CU_NURBS only _after_
- * this function returns true.
+ * Also update index offsets which should always happen if a new Geometry instance is created.
  */
 static Geometry *create_geometry(Geometry *const prev_geometry,
                                  const eGeometryType new_type,
                                  string_view name,
-                                 Vector<std::unique_ptr<Geometry>> &r_all_geometries)
+                                 const GlobalVertices &global_vertices,
+                                 Vector<std::unique_ptr<Geometry>> &r_all_geometries,
+                                 IndexOffsets &r_offsets)
 {
   auto new_geometry = [&]() {
     if (name.empty()) {
@@ -204,6 +205,7 @@ static Geometry *create_geometry(Geometry *const prev_geometry,
     else {
       r_all_geometries.append(std::make_unique<Geometry>(new_type, name));
     }
+    r_offsets.update_index_offsets(global_vertices);
     return r_all_geometries.last().get();
   };
 
@@ -211,7 +213,7 @@ static Geometry *create_geometry(Geometry *const prev_geometry,
     /* After the creation of a Geometry instance, at least one element has been found in the OBJ
      * file that indicates that it is a mesh. */
     if (prev_geometry->tot_face_elems() || prev_geometry->tot_normals() ||
-        prev_geometry->tot_verts()) {
+        prev_geometry->tot_edges()) {
       return new_geometry();
     }
     if (new_type == GEOM_MESH) {
@@ -233,6 +235,12 @@ static Geometry *create_geometry(Geometry *const prev_geometry,
   return new_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();
+}
+
 /**
  * Open OBJ file at the path given in import parameters.
  */
@@ -254,9 +262,12 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
   }
 
   string line;
+  IndexOffsets offsets;
   /* Non owning raw pointer to a Geometry.
    * Needed to update object data in the same while loop. */
-  Geometry *current_geometry = create_geometry(nullptr, GEOM_MESH, "", all_geometries);
+  Geometry *current_geometry = create_geometry(
+      nullptr, GEOM_MESH, "", global_vertices, all_geometries, offsets);
+
   /* State-setting variables: if set, they remain the same for the remaining
    * elements in the object. */
   bool shaded_smooth = false;
@@ -275,19 +286,17 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
     else if (line_key == "o") {
       shaded_smooth = false;
       object_group = {};
-      current_geometry = create_geometry(current_geometry, GEOM_MESH, rest_line, all_geometries);
+      current_geometry = create_geometry(
+          current_geometry, GEOM_MESH, rest_line, global_vertices, all_geometries, offsets);
     }
     else if (line_key == "v") {
+      BLI_assert(current_geometry);
       float3 curr_vert{};
       Vector<string_view> str_vert_split;
       split_by_char(rest_line, ' ', str_vert_split);
       copy_string_to_float(str_vert_split, FLT_MAX, {curr_vert, 3});
       global_vertices.vertices.append(curr_vert);
-      if (current_geometry) {
-        /* Use old size of vertex indices Map to keep them zero-based. */
-        current_geometry->vertex_indices_.add_new(global_vertices.vertices.size() - 1,
-                                                  current_geometry->vertex_indices_.size());
-      }
+      current_geometry->vertex_indices_.append(global_vertices.vertices.size() - 1);
     }
     else if (line_key == "vn") {
       current_geometry->tot_normals_++;
@@ -307,7 +316,10 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
       copy_string_to_int(str_edge_split[0], -1, edge_v1);
       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()) : -1;
+      edge_v1 += edge_v1 < 0 ? global_vertices.vertices.size() :
+                               -offsets.get_index_offset(VERTEX_OFF) + 1;
+      edge_v2 += edge_v2 < 0 ? global_vertices.vertices.size() :
+                               -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)});
     }
@@ -373,9 +385,11 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
            * shading flag. */
         }
         /* Always keep stored indices non-negative and zero-based. */
-        corner.vert_index += corner.vert_index < 0 ? (global_vertices.vertices.size()) : -1;
-        corner.uv_vert_index += corner.uv_vert_index < 0 ? (global_vertices.uv_vertices.size()) :
-                                                           -1;
+        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;
         curr_face.face_corners.append(corner);
       }
 
@@ -385,7 +399,7 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
     else if (line_key == "cstype") {
       if (rest_line.find("bspline") != string::npos) {
         current_geometry = create_geometry(
-            current_geometry, GEOM_CURVE, object_group, all_geometries);
+            current_geometry, GEOM_CURVE, object_group, global_vertices, all_geometries, offsets);
         current_geometry->nurbs_element_.group_ = object_group;
       }
       else {
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 1fa559b13a6..5197ff2dbe0 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
@@ -80,14 +80,10 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
 
 void MeshFromGeometry::create_vertices()
 {
-  /* Since the keys in a Geometry's vertex coordinates Map almost always exceed the total
-   * vertices in that Mesh, account for it using the offset. */
-  int offset = global_vertices_.vertex_offset->get_vertex_offset();
   const int64_t tot_verts_object{mesh_geometry_.tot_verts()};
-  global_vertices_.vertex_offset->add_vertex_offset(tot_verts_object);
-
   for (int i = 0; i < tot_verts_object; ++i) {
-    copy_v3_v3(blender_mesh_->mvert[i].co, global_vertices_.vertices[offset + i]);
+    copy_v3_v3(blender_mesh_->mvert[i].co,
+               global_vertices_.vertices[mesh_geometry_.vertex_index(i)]);
   }
 }
 
@@ -123,7 +119,8 @@ void MeshFromGeometry::create_polys_loops()
     for (const FaceCorner &curr_corner : curr_face.face_corners) {
       MLoop *mloop = &blender_mesh_->mloop[tot_loop_idx];
       tot_loop_idx++;
-      mloop->v = mesh_geometry_.vertex_indices_lookup(curr_corner.vert_index);
+      mloop->v = curr_corner.vert_index;
+      std::cout << curr_corner.vert_index;
       if (blender_mesh_->dvert) {
         /* Iterating over mloop results in finding the same vertex multiple times.
          * Another way is to allocate memory for dvert while creating vertices and fill them here.
@@ -161,8 +158,8 @@ void MeshFromGeometry::create_edges()
   const int64_t tot_edges{mesh_geometry_.tot_edges()};
   for (int i = 0; i < tot_edges; ++i) {
     const MEdge &curr_edge = mesh_geometry_.edges()[i];
-    blender_mesh_->medge[i].v1 = mesh_geometry_.vertex_indices_lookup(curr_edge.v1);
-    blender_mesh_->medge[i].v2 = mesh_geometry_.vertex_indices_lookup(curr_edge.v2);
+    blender_mesh_->medge[i].v1 = curr_edge.v1;
+    blender_mesh_->medge[i].v2 = curr_edge.v2;
   }
 
   /* Set argument `update` to true so that existing, explicitly imported edges can be merged
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
index 7795ee41167..1467b7ff8bb 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_nurbs.cc
@@ -47,7 +47,6 @@ void CurveFromGeometry::create_nurbs()
   nurb->resolu = nurb->resolv = blender_curve_->resolu;
 
   const int64_t tot_vert{curve_geometry_.nurbs_elem().cur

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list