[Bf-blender-cvs] [c583afd60b3] soc-2020-io-performance: Parse vertex normals: vn lines.

Ankit Meel noreply at git.blender.org
Tue Aug 18 09:19:57 CEST 2020


Commit: c583afd60b36f4b6dae9b5d19ea107537160b5f5
Author: Ankit Meel
Date:   Tue Aug 18 01:30:39 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBc583afd60b36f4b6dae9b5d19ea107537160b5f5

Parse vertex normals: vn lines.

Still need to understand how it translates to the
normals seen in the viewport.

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

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_mesh.hh
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 834e4e1fa85..c82aa48a4a8 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
@@ -210,8 +210,8 @@ 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() ||
-        prev_geometry->tot_edges()) {
+    if (prev_geometry->tot_verts() || prev_geometry->tot_face_elems() ||
+        prev_geometry->tot_normals() || prev_geometry->tot_edges()) {
       return new_geometry();
     }
     if (new_type == GEOM_MESH) {
@@ -304,7 +304,12 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
       current_geometry->vertex_indices_.append(global_vertices.vertices.size() - 1);
     }
     else if (line_key == "vn") {
-      current_geometry->tot_normals_++;
+      float3 curr_vert_normal{};
+      Vector<string_view> str_vert_normal_split;
+      split_by_char(rest_line, ' ', str_vert_normal_split);
+      copy_string_to_float(str_vert_normal_split, FLT_MAX, {curr_vert_normal, 2});
+      global_vertices.vertex_normals.append(curr_vert_normal);
+      current_geometry->vertex_normal_indices_.append(global_vertices.vertex_normals.size() - 1);
     }
     else if (line_key == "vt") {
       float2 curr_uv_vert{};
@@ -386,13 +391,15 @@ void OBJParser::parse_and_store(Vector<std::unique_ptr<Geometry>> &all_geometrie
           if (vert_uv_normal_split.size() == 3) {
             copy_string_to_int(vert_uv_normal_split[1], INT32_MAX, corner.uv_vert_index);
           }
-          /* Discard normals. They'll be calculated on the basis of smooth
-           * shading flag. */
+          copy_string_to_int(vert_uv_normal_split[2], INT32_MAX, corner.vertex_normal_index);
         }
         /* 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() : -1;
+        corner.vertex_normal_index += corner.vertex_normal_index < 0 ?
+                                          global_vertices.vertex_normals.size() :
+                                          -1;
         curr_face.face_corners.append(corner);
       }
 
@@ -526,7 +533,7 @@ void MTLParser::parse_and_store(Map<string, MTLMaterial> &mtl_materials)
 
     if (line_key == "newmtl") {
       if (mtl_materials.remove_as(rest_line)) {
-        fprintf(stderr, "Duplicate material name found, using the new one.\n");
+        std::cerr << "Duplicate material found:'" << rest_line << "'." << std::endl;
       }
       current_mtlmaterial = &mtl_materials.lookup_or_add_default_as(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 23729fe2e98..e7115defd39 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
@@ -69,8 +69,10 @@ MeshFromGeometry::MeshFromGeometry(Main *bmain,
   create_uv_verts();
   create_materials(bmain, materials);
 
-  BKE_mesh_validate(blender_mesh_.get(), false, true);
-
+  BKE_mesh_validate(blender_mesh_.get(), true, false);
+#if 0
+  add_custom_normals();
+#endif
   BKE_mesh_nomain_to_mesh(blender_mesh_.release(),
                           static_cast<Mesh *>(blender_object_->data),
                           blender_object_.get(),
@@ -210,4 +212,26 @@ void MeshFromGeometry::create_materials(Main *bmain,
     mat->nodetree = mat_wrap.get_nodetree();
   }
 }
+
+/**
+ * Needs more clarity upon what is expected here?
+ */
+void MeshFromGeometry::add_custom_normals()
+{
+  const int64_t tot_loop_normals{mesh_geometry_.tot_normals()};
+  float(*loop_normals)[3] = static_cast<float(*)[3]>(
+      MEM_malloc_arrayN(tot_loop_normals, sizeof(float[3]), __func__));
+
+  for (int index = 0; index < tot_loop_normals; index++) {
+    copy_v3_v3(loop_normals[index],
+               global_vertices_.vertex_normals[mesh_geometry_.vertex_normal_index(index)]);
+  }
+
+  blender_mesh_->flag |= ME_AUTOSMOOTH;
+  BKE_mesh_set_custom_normals(blender_mesh_.get(), loop_normals);
+  for (int i = 0; i < tot_loop_normals; i++) {
+    print_v3("", loop_normals[i]);
+  }
+  MEM_freeN(loop_normals);
+}
 }  // namespace blender::io::obj
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
index f29b063b5d9..e8941bbde57 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_im_mesh.hh
@@ -76,6 +76,7 @@ class MeshFromGeometry : NonMovable, NonCopyable {
   void create_edges();
   void create_uv_verts();
   void create_materials(Main *bmain, const Map<std::string, MTLMaterial> &materials);
+  void add_custom_normals();
 };
 
 }  // namespace blender::io::obj
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 c726ed4ac44..e010cd7e68b 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
@@ -102,9 +102,14 @@ int Geometry::tot_loops() const
   return tot_loops_;
 }
 
-int Geometry::tot_normals() const
+int64_t Geometry::vertex_normal_index(const int64_t index) const
 {
-  return tot_normals_;
+  return vertex_normal_indices_[index];
+}
+
+int64_t Geometry::tot_normals() const
+{
+  return vertex_normal_indices_.size();
 }
 
 Span<std::string> Geometry::material_names() const
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 cc27413111b..5d8db0864c2 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
@@ -44,6 +44,7 @@ namespace blender::io::obj {
 struct GlobalVertices {
   Vector<float3> vertices{};
   Vector<float2> uv_vertices{};
+  Vector<float3> vertex_normals;
 };
 
 /**
@@ -69,11 +70,12 @@ struct IndexOffsets {
  * A face's corner in an OBJ file. In Blender, it translates to a mloop vertex.
  */
 struct FaceCorner {
-  /* This index should stay local to a Geometry, & not index into the global list of vertices. */
+  /* These indices range from zero to total vertices in the OBJ file. */
   int vert_index;
   /* -1 is to indicate abscense of UV vertices. Only < 0 condition should be checked since
    * it can be less than -1 too. */
   int uv_vert_index = -1;
+  int vertex_normal_index;
 };
 
 struct FaceElement {
@@ -115,13 +117,13 @@ class Geometry {
    * Values range from zero to total coordinates in the global list.
    */
   Vector<int> vertex_indices_;
+  Vector<int> vertex_normal_indices_;
   /** Edges written in the file in addition to (or even without polygon) elements. */
   Vector<MEdge> edges_{};
   Vector<FaceElement> face_elements_{};
   bool use_vertex_groups_ = false;
   NurbsElement nurbs_element_;
   int tot_loops_ = 0;
-  int tot_normals_ = 0;
 
  public:
   Geometry(eGeometryType type, std::string_view ob_name)
@@ -140,7 +142,8 @@ class Geometry {
   Span<MEdge> edges() const;
   int64_t tot_edges() const;
   int tot_loops() const;
-  int tot_normals() const;
+  int64_t vertex_normal_index(const int64_t index) const;
+  int64_t tot_normals() const;
 
   Span<std::string> material_names() const;



More information about the Bf-blender-cvs mailing list