[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