[Bf-blender-cvs] [009b37719dd] soc-2020-io-performance: Fix new Geometry creation with empty initial object.

Ankit Meel noreply at git.blender.org
Mon Aug 10 23:23:10 CEST 2020


Commit: 009b37719ddd49bd610de0429a6a37adc01c3f5e
Author: Ankit Meel
Date:   Tue Aug 11 02:52:10 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rB009b37719ddd49bd610de0429a6a37adc01c3f5e

Fix new Geometry creation with empty initial object.

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

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

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

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 f44a64322fe..1f4ceb5ce83 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
@@ -201,9 +201,14 @@ static Geometry *create_geometry(Geometry *const prev_geometry,
   if (prev_geometry && prev_geometry->get_geom_type() == GEOM_MESH) {
     /* 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()) {
+    if (prev_geometry->tot_face_elems() || prev_geometry->tot_normals() ||
+        prev_geometry->tot_verts()) {
       return new_geometry();
     }
+    if (new_type == GEOM_MESH) {
+      prev_geometry->set_geometry_name(name);
+      return prev_geometry;
+    }
     if (new_type == GEOM_CURVE) {
       /* The object originally created is not a mesh now that curve data
        * follows the vertex coordinates list. */
@@ -259,7 +264,6 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
       mtl_libraries_.append(string(rest_line));
     }
     else if (line_key == "o") {
-      /* Update index offsets to keep track of objects which have claimed their vertices. */
       shaded_smooth = false;
       object_group = {};
       current_geometry = create_geometry(current_geometry, GEOM_MESH, rest_line, all_geometries);
@@ -300,7 +304,8 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
     }
     else if (line_key == "g") {
       object_group = rest_line;
-      if (object_group.find("off") != string::npos || object_group.find("null") != string::npos) {
+      if (object_group.find("off") != string::npos || object_group.find("null") != string::npos ||
+          object_group.find("default") != string::npos) {
         /* Set group for future elements like faces or curves to empty. */
         object_group = {};
       }
@@ -415,7 +420,6 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
     }
     else if (line_key == "end") {
       /* Curves mark their end this way. */
-      object_group = "";
     }
     else if (line_key == "usemtl") {
       current_geometry->material_name_.append(string(rest_line));
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 182c4288851..86788916641 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
@@ -49,7 +49,7 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
                                    const Map<std::string, MTLMaterial> &materials)
     : mesh_geometry_(mesh_geometry), global_vertices_(global_vertices)
 {
-  std::string ob_name{mesh_geometry_.geometry_name()};
+  std::string ob_name{mesh_geometry_.get_geometry_name()};
   if (ob_name.empty()) {
     ob_name = "Untitled";
   }
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 b75dec6ccc0..6aca7eb7a89 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
@@ -87,14 +87,15 @@ CurveFromGeometry::CurveFromGeometry(Main *bmain,
                                      const GlobalVertices &global_vertices)
     : curve_geometry_(geometry), global_vertices_(global_vertices)
 {
-  std::string ob_name = curve_geometry_.geometry_name();
+  std::string ob_name{curve_geometry_.get_geometry_name()};
   if (ob_name.empty() && !curve_geometry_.group().empty()) {
     ob_name = curve_geometry_.group();
   }
   else {
     ob_name = "Untitled";
   }
-  blender_curve_.reset(BKE_curve_add(bmain, curve_geometry_.geometry_name().c_str(), OB_CURVE));
+
+  blender_curve_.reset(BKE_curve_add(bmain, ob_name.c_str(), OB_CURVE));
   curve_object_.reset(BKE_object_add_only_object(bmain, OB_CURVE, ob_name.c_str()));
 
   blender_curve_->flag = CU_3D;
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
index ec73d74fd03..a9d161e8d31 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_objects.cc
@@ -50,11 +50,16 @@ void Geometry::set_geom_type(const eGeometryType new_type)
   geom_type_ = new_type;
 }
 
-const std::string &Geometry::geometry_name() const
+std::string_view Geometry::get_geometry_name() const
 {
   return geometry_name_;
 }
 
+void Geometry::set_geometry_name(std::string_view new_name)
+{
+  geometry_name_ = std::string(new_name);
+}
+
 /**
  * Return the vertex index ranging from zero to total vertices in a Geometry instance.
  * Key ranges from zero to total vertices in an OBJ file.
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 b94cb953e31..598b4fca80c 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
@@ -135,7 +135,8 @@ class Geometry {
 
   eGeometryType get_geom_type() const;
   void set_geom_type(const eGeometryType new_type);
-  const std::string &geometry_name() const;
+  std::string_view get_geometry_name() const;
+  void set_geometry_name(std::string_view new_name);
   int vertex_indices_lookup(const int key) const;
   int64_t tot_verts() const;
   Span<FaceElement> face_elements() const;



More information about the Bf-blender-cvs mailing list