[Bf-blender-cvs] [a4a1184ecea] soc-2020-io-performance: Add UV vertices to the newly created mesh.

Ankit Meel noreply at git.blender.org
Wed Jul 15 16:51:51 CEST 2020


Commit: a4a1184ecea066c348a35ffe841ebbcd3c7e4fa9
Author: Ankit Meel
Date:   Wed Jul 15 20:21:21 2020 +0530
Branches: soc-2020-io-performance
https://developer.blender.org/rBa4a1184ecea066c348a35ffe841ebbcd3c7e4fa9

Add UV vertices to the newly created mesh.

The mesh->mloopuv has the correct vertices, however it hits
the assert at  `(uniform), function GPU_batch_uniform_4fv,`
`blender/source/blender/gpu/intern/gpu_batch.c, line 617.`
if one switches to UV editing workspace.

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

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

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

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 b9774545d0f..978df62646b 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
@@ -105,6 +105,7 @@ void OBJImporter::parse_and_store(Vector<std::unique_ptr<OBJRawObject>> &list_of
       Vector<string> str_vert;
       split_by_char(s_line.str(), ' ', str_vert);
       copy_string_to_float(curr_tex_vert.uv, str_vert);
+      curr_tex_vert.flag = false;
       (*curr_ob)->texture_vertices.append(curr_tex_vert);
     }
     else if (line_key == "f") {
@@ -123,7 +124,8 @@ void OBJImporter::parse_and_store(Vector<std::unique_ptr<OBJRawObject>> &list_of
           Vector<std::string> vert_texture;
           split_by_char(str_corner, '/', vert_texture);
           corner.vert_index = std::stoi(vert_texture[0]);
-          corner.tex_vert_index = vert_texture.size() >= 2 ? -1 : std::stoi(vert_texture[1]);
+          corner.tex_vert_index = vert_texture.size() >= 2 ? std::stoi(vert_texture[1]) : -1;
+          (*curr_ob)->tot_uv_verts++;
         }
         else if (n_slash == 2) {
           /* Case: f v1//vn1 v2//vn2 v3//vn3 . */
@@ -131,7 +133,8 @@ void OBJImporter::parse_and_store(Vector<std::unique_ptr<OBJRawObject>> &list_of
           Vector<std::string> vert_tex_normal;
           split_by_char(str_corner, '/', vert_tex_normal);
           corner.vert_index = std::stoi(vert_tex_normal[0]);
-          corner.tex_vert_index = vert_tex_normal.size() >= 2 ? -1 : std::stoi(vert_tex_normal[1]);
+          corner.tex_vert_index = vert_tex_normal.size() >= 2 ? std::stoi(vert_tex_normal[1]) : -1;
+          (*curr_ob)->tot_uv_verts++;
           /* Discard normals. They'll be calculated on the basis of smooth
            * shading flag. */
         }
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 ecc870ef51a..6d329d9fad4 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
@@ -21,26 +21,33 @@
  * \ingroup obj
  */
 
+#include "BKE_customdata.h"
+
 #include "BLI_array.hh"
 
+#include "DNA_customdata_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 
+#include "ED_mesh.h"
+
 #include "wavefront_obj_im_mesh.hh"
 #include "wavefront_obj_im_objects.hh"
 
 namespace blender::io::obj {
-OBJMeshFromRaw::OBJMeshFromRaw(const class OBJRawObject &curr_object)
+OBJMeshFromRaw::OBJMeshFromRaw(class OBJRawObject &curr_object)
 {
   uint tot_verts_object = curr_object.vertices.size();
-  mesh_from_bm_.reset(BKE_mesh_new_nomain(
-      tot_verts_object, 0, 0, curr_object.tot_loop, curr_object.face_elements.size()));
+  uint tot_face_elems = curr_object.face_elements.size();
+  mesh_from_bm_.reset(
+      BKE_mesh_new_nomain(tot_verts_object, 0, 0, curr_object.tot_loop, tot_face_elems));
+
   for (int i = 0; i < tot_verts_object; ++i) {
     copy_v3_v3(mesh_from_bm_->mvert[i].co, curr_object.vertices[i].co);
   }
 
   int curr_loop_idx = 0;
-  for (int i = 0; i < curr_object.face_elements.size(); ++i) {
+  for (int i = 0; i < tot_face_elems; ++i) {
     const OBJFaceElem &curr_face = curr_object.face_elements[i];
     MPoly &mpoly = mesh_from_bm_->mpoly[i];
     mpoly.totloop = curr_face.face_corners.size();
@@ -52,6 +59,28 @@ OBJMeshFromRaw::OBJMeshFromRaw(const class OBJRawObject &curr_object)
       curr_loop_idx++;
     }
   }
+
+  int uv_vert_index = 0;
+  ED_mesh_uv_texture_ensure(mesh_from_bm_.get(), nullptr);
+  for (int i = 0; i < tot_face_elems; ++i) {
+    const OBJFaceElem curr_face = curr_object.face_elements[i];
+    for (int j = 0; j < curr_face.face_corners.size(); ++j) {
+      const OBJFaceCorner curr_corner = curr_face.face_corners[j];
+      MLoopUV *mluv_dst = (MLoopUV *)CustomData_get_layer(&mesh_from_bm_->ldata, CD_MLOOPUV);
+      if (curr_corner.tex_vert_index < 0 ||
+          curr_corner.tex_vert_index >= curr_object.tot_uv_verts || !mluv_dst) {
+        continue;
+      }
+      MLoopUV *mluv_src = &curr_object.texture_vertices[curr_corner.tex_vert_index];
+      int &set_uv = mluv_src->flag;
+      if (set_uv == false && uv_vert_index <= curr_object.tot_uv_verts) {
+        copy_v2_v2(mluv_dst[uv_vert_index].uv, mluv_src->uv);
+        uv_vert_index++;
+        set_uv = true;
+      }
+    }
+  }
+  BKE_mesh_update_customdata_pointers(mesh_from_bm_.get(), false);
   BKE_mesh_calc_edges(mesh_from_bm_.get(), false, false);
   BKE_mesh_validate(mesh_from_bm_.get(), false, true);
 }
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 81347b7fe31..87e39f5190e 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
@@ -56,7 +56,7 @@ class OBJMeshFromRaw : NonMovable, NonCopyable {
   unique_mesh_ptr mesh_from_bm_;
 
  public:
-  OBJMeshFromRaw(const class OBJRawObject &curr_object);
+  OBJMeshFromRaw(class OBJRawObject &curr_object);
 
   unique_mesh_ptr mover()
   {
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 fd4e13e69d0..d460f4cf516 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
@@ -55,6 +55,7 @@ class OBJRawObject {
   Vector<OBJFaceElem> face_elements;
   uint tot_normals = 0;
   uint tot_loop = 0;
+  uint tot_uv_verts = 0;
   Vector<std::string> material_name;
 };
 
diff --git a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
index 3db1679332c..4b9053a6a42 100644
--- a/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
+++ b/source/blender/io/wavefront_obj/intern/wavefront_obj_importer.cc
@@ -52,7 +52,7 @@ void OBJImporter::print_obj_data(Vector<std::unique_ptr<OBJRawObject>> &list_of_
     printf("\n");
     for (const OBJFaceElem &curr_face : curr_ob->face_elements) {
       for (OBJFaceCorner a : curr_face.face_corners) {
-        printf("%d %d ", a.vert_index, a.tex_vert_index);
+        printf("%d/%d ", a.vert_index, a.tex_vert_index);
       }
       printf("\n");
     }



More information about the Bf-blender-cvs mailing list