[Bf-blender-cvs] [d2e83dc4b24] soc-2019-fast-io: [Fast import/export] Fixed UV and deduplicated iterator, and other bug fixes

Hugo Sales noreply at git.blender.org
Thu Jun 6 15:25:39 CEST 2019


Commit: d2e83dc4b24476ca76fb5289fae63d7f4941abd0
Author: Hugo Sales
Date:   Wed Jun 5 17:37:07 2019 +0100
Branches: soc-2019-fast-io
https://developer.blender.org/rBd2e83dc4b24476ca76fb5289fae63d7f4941abd0

[Fast import/export] Fixed UV and deduplicated iterator, and other bug fixes

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

M	source/blender/editors/io/intern/common.hpp
M	source/blender/editors/io/intern/obj.cpp

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

diff --git a/source/blender/editors/io/intern/common.hpp b/source/blender/editors/io/intern/common.hpp
index 9b7aa398e70..4e6aef2674e 100644
--- a/source/blender/editors/io/intern/common.hpp
+++ b/source/blender/editors/io/intern/common.hpp
@@ -309,13 +309,23 @@ namespace common {
 		return f;
 	}
 
+	template<size_t N>
+	inline float too_similar(const std::array<float, N> &lhs, const std::array<float, N> &rhs,
+	                         const float th) {
+		bool b = true;
+		for(int i = 0; i < N; ++i)
+			b &= (lhs[i] - rhs[i]) < th;
+		return b;
+	}
+
 	struct threshold_comparator {
-		threshold_comparator(const float th) : thsq(th * th) {}
+		threshold_comparator(const float th) : th(th) {}
 		template<typename key_t>
 		bool operator()(const key_t &lhs, const key_t &rhs) const {
-			return len_sq(lhs.first, rhs.first) < thsq && lhs.first < rhs.first;
+			return // too_similar(lhs.first, rhs.first, th) &&
+				lhs.first < rhs.first;
 		}
-		const float thsq;
+		const float th;
 	};
 
 	template<typename key_t>
@@ -337,35 +347,28 @@ namespace common {
 		                                 SourceIter, ResT, Tag, ResT> {
 		deduplicated_iterator() = default;
 		explicit deduplicated_iterator(const Mesh * const mesh, dedup_pair_t<KeyT> &dp,
-		                               ulong &total, ulong reserve, SourceIter &&it)
+		                               ulong &total, SourceIter it)
 			: deduplicated_iterator::iterator_adaptor_(it), mesh(mesh),
-			  dedup_pair(dp), total(total) {
+			  dedup_pair(dp), total(total) {}
+		explicit deduplicated_iterator(const Mesh * const mesh, dedup_pair_t<KeyT> &dp,
+		                               ulong &total, ulong reserve)
+			: deduplicated_iterator(mesh, dp, total, SourceIter{mesh}) {
 			// Reserve space so we don't constantly allocate
 			dedup_pair.second.reserve(reserve);
 			// Need to insert the first element, because we need to dereference before incrementing
-			auto p = dedup_pair.first.insert(std::make_pair(*it, total));
+			auto p = dedup_pair.first.insert(std::make_pair(*this->base(), total++));
 			dedup_pair.second.push_back(p.first);
+			++this->base_reference();
 		}
-		explicit deduplicated_iterator(const Mesh * const mesh, dedup_pair_t<KeyT> &dp,
-		                               ulong &total, ulong reserve)
-			: deduplicated_iterator(mesh, dp, total, reserve, SourceIter{mesh}) {}
-		deduplicated_iterator begin() const {
-			return deduplicated_iterator(mesh, dedup_pair, total, total);
-		}
+		deduplicated_iterator begin() const { return *this; }
 		deduplicated_iterator end() const {
-			return deduplicated_iterator(mesh, dedup_pair, total, total, this->base().end());
-		}
-		const deduplicated_iterator cbegin() const {
-			return deduplicated_iterator(mesh, dedup_pair, total, total);
-		}
-		const deduplicated_iterator cend() const {
-			return deduplicated_iterator(mesh, dedup_pair, total, total, this->base().end());
-		}
+			return deduplicated_iterator(mesh, dedup_pair, total, this->base().end()); }
 		friend class boost::iterator_core_access;
 		void increment() {
+			// Handle everything until the next different element
 			while(this->base() != this->base().end()) {
+				auto p = dedup_pair.first.insert(std::make_pair(*this->base(), total));
 				++this->base_reference();
-				auto p = dedup_pair.first.insert(std::make_pair(*this->base_reference(), total));
 				dedup_pair.second.push_back(p.first);
 				if (p.second) {
 					++total;
@@ -387,8 +390,7 @@ namespace common {
 
 	struct deduplicated_uv_iter : deduplicated_iterator<uv_key_t, uv_iter> {
 		deduplicated_uv_iter(const Mesh * const mesh, ulong &total, dedup_pair_t<uv_key_t> &dp)
-			: deduplicated_iterator<uv_key_t, uv_iter>
-			(mesh, dp, total, total + mesh->totloop) {}
+			: deduplicated_iterator<uv_key_t, uv_iter>(mesh, dp, total, total + mesh->totloop) {}
 	};
 
 	// C++14/17 would be useful here...
diff --git a/source/blender/editors/io/intern/obj.cpp b/source/blender/editors/io/intern/obj.cpp
index 7582b7ccf62..2be32db3352 100644
--- a/source/blender/editors/io/intern/obj.cpp
+++ b/source/blender/editors/io/intern/obj.cpp
@@ -144,13 +144,16 @@ namespace {
 
 		if (settings->export_normals) {
 			fs << std::fixed << std::setprecision(4);
-			if (settings->dedup_normals)
-				for (const std::array<float, 3> &no :
-					     common::deduplicated_normal_iter{mesh, no_total, no_mapping_pair})
-					fs << "vn " << no[0] << ' ' << no[1] << ' ' << no[2] << '\n';
-			else
-				for (const std::array<float, 3> &no : common::normal_iter{mesh})
-					fs << "vn " << no[0] << ' ' << no[1] << ' ' << no[2] << '\n';
+			// if (settings->dedup_normals)
+			// 	for (const std::array<float, 3> &no :
+			// 		     common::deduplicated_normal_iter{mesh, no_total, no_mapping_pair})
+			// 		fs << "vn " << no[0] << ' ' << no[1] << ' ' << no[2] << '\n';
+			// else
+			for (const std::array<float, 3> &no : common::normal_iter{mesh}) {
+				++no_total;
+				std::cerr << "vn " << no[0] << ' ' << no[1] << ' ' << no[2] << '\n';
+				fs << "vn " << no[0] << ' ' << no[1] << ' ' << no[2] << '\n';
+			}
 		}
 
 		if (settings->export_edges) {
@@ -162,9 +165,6 @@ namespace {
 		std::cerr << "Totals: "  << uv_total << " " << no_total
 		          << "\nSizes: " << uv_mapping.size() << " " << no_mapping.size()  << '\n';
 
-		char c;
-		std::cin >> c;
-
 		for (int p_i = 0, p_e = mesh->totpoly; p_i < p_e; ++p_i) {
 			fs << 'f';
 			MPoly *p = mesh->mpoly + p_i;



More information about the Bf-blender-cvs mailing list