Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAras Pranckevicius <aras@nesnausk.org>2022-08-10 13:36:48 +0300
committerAras Pranckevicius <aras@nesnausk.org>2022-08-10 13:36:48 +0300
commit089216067faa6c99d0282f9bae26f739d7e50ee9 (patch)
treeee364a92c48931ccbb849da91cfdfb2412c08419 /source/blender/io/wavefront_obj/importer
parent54c26f58d023be0471be6e6205ff91a624d87f6b (diff)
parentd76583cb4a16315c196f07f4acb9340f341bee47 (diff)
Merge branch 'blender-v3.3-release'
Diffstat (limited to 'source/blender/io/wavefront_obj/importer')
-rw-r--r--source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc3
-rw-r--r--source/blender/io/wavefront_obj/importer/obj_import_mesh.cc14
-rw-r--r--source/blender/io/wavefront_obj/importer/obj_import_objects.hh25
3 files changed, 28 insertions, 14 deletions
diff --git a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc
index 8594603867f..7069e1185e0 100644
--- a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc
+++ b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc
@@ -406,8 +406,7 @@ static void use_all_vertices_if_no_faces(Geometry *geom,
all_geometries.begin(), all_geometries.end(), [](const std::unique_ptr<Geometry> &g) {
return g->get_vertex_count() == 0;
})) {
- geom->track_vertex_index(0);
- geom->track_vertex_index(global_vertices.vertices.size() - 1);
+ geom->track_all_vertices(global_vertices.vertices.size());
}
}
}
diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc b/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
index d7b2bc2e67c..e62470588ec 100644
--- a/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
+++ b/source/blender/io/wavefront_obj/importer/obj_import_mesh.cc
@@ -157,17 +157,17 @@ void MeshFromGeometry::fixup_invalid_faces()
void MeshFromGeometry::create_vertices(Mesh *mesh)
{
- const int tot_verts_object{mesh_geometry_.get_vertex_count()};
- for (int i = 0; i < tot_verts_object; ++i) {
- int vi = mesh_geometry_.vertex_index_min_ + i;
+ int mi = 0;
+ for (int vi : mesh_geometry_.vertices_) {
if (vi < global_vertices_.vertices.size()) {
- copy_v3_v3(mesh->mvert[i].co, global_vertices_.vertices[vi]);
+ copy_v3_v3(mesh->mvert[mi].co, global_vertices_.vertices[vi]);
}
else {
std::cerr << "Vertex index:" << vi
<< " larger than total vertices:" << global_vertices_.vertices.size() << " ."
<< std::endl;
}
+ ++mi;
}
}
@@ -208,7 +208,7 @@ void MeshFromGeometry::create_polys_loops(Mesh *mesh, bool use_vertex_groups)
const PolyCorner &curr_corner = mesh_geometry_.face_corners_[curr_face.start_index_ + idx];
MLoop &mloop = mesh->mloop[tot_loop_idx];
tot_loop_idx++;
- mloop.v = curr_corner.vert_index - mesh_geometry_.vertex_index_min_;
+ mloop.v = mesh_geometry_.global_to_local_vertices_.lookup_default(curr_corner.vert_index, 0);
/* Setup vertex group data, if needed. */
if (!mesh->dvert) {
@@ -240,8 +240,8 @@ void MeshFromGeometry::create_edges(Mesh *mesh)
for (int i = 0; i < tot_edges; ++i) {
const MEdge &src_edge = mesh_geometry_.edges_[i];
MEdge &dst_edge = mesh->medge[i];
- dst_edge.v1 = src_edge.v1 - mesh_geometry_.vertex_index_min_;
- dst_edge.v2 = src_edge.v2 - mesh_geometry_.vertex_index_min_;
+ dst_edge.v1 = mesh_geometry_.global_to_local_vertices_.lookup_default(src_edge.v1, 0);
+ dst_edge.v2 = mesh_geometry_.global_to_local_vertices_.lookup_default(src_edge.v2, 0);
BLI_assert(dst_edge.v1 < total_verts && dst_edge.v2 < total_verts);
dst_edge.flag = ME_LOOSEEDGE;
}
diff --git a/source/blender/io/wavefront_obj/importer/obj_import_objects.hh b/source/blender/io/wavefront_obj/importer/obj_import_objects.hh
index 9f0079d7c53..f48b6dd55e8 100644
--- a/source/blender/io/wavefront_obj/importer/obj_import_objects.hh
+++ b/source/blender/io/wavefront_obj/importer/obj_import_objects.hh
@@ -9,6 +9,7 @@
#include "BKE_lib_id.h"
#include "BLI_map.hh"
+#include "BLI_math_base.hh"
#include "BLI_math_vec_types.hh"
#include "BLI_vector.hh"
#include "BLI_vector_set.hh"
@@ -92,6 +93,8 @@ struct Geometry {
int vertex_index_min_ = INT_MAX;
int vertex_index_max_ = -1;
+ VectorSet<int> vertices_;
+ Map<int, int> global_to_local_vertices_;
/** Edges written in the file in addition to (or even without polygon) elements. */
Vector<MEdge> edges_;
@@ -105,14 +108,26 @@ struct Geometry {
int get_vertex_count() const
{
- if (vertex_index_max_ < vertex_index_min_)
- return 0;
- return vertex_index_max_ - vertex_index_min_ + 1;
+ return (int)vertices_.size();
}
void track_vertex_index(int index)
{
- vertex_index_min_ = std::min(vertex_index_min_, index);
- vertex_index_max_ = std::max(vertex_index_max_, index);
+ if (vertices_.add(index)) {
+ global_to_local_vertices_.add_new(index, (int)vertices_.size() - 1);
+ }
+ math::min_inplace(vertex_index_min_, index);
+ math::max_inplace(vertex_index_max_, index);
+ }
+ void track_all_vertices(int count)
+ {
+ vertices_.reserve(count);
+ global_to_local_vertices_.reserve(count);
+ for (int i = 0; i < count; ++i) {
+ vertices_.add(i);
+ global_to_local_vertices_.add(i, i);
+ }
+ vertex_index_min_ = 0;
+ vertex_index_max_ = count - 1;
}
};