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:
Diffstat (limited to 'source/blender/blenlib/intern/mesh_intersect.cc')
-rw-r--r--source/blender/blenlib/intern/mesh_intersect.cc53
1 files changed, 28 insertions, 25 deletions
diff --git a/source/blender/blenlib/intern/mesh_intersect.cc b/source/blender/blenlib/intern/mesh_intersect.cc
index 4eff3c52e63..64ea25ccc90 100644
--- a/source/blender/blenlib/intern/mesh_intersect.cc
+++ b/source/blender/blenlib/intern/mesh_intersect.cc
@@ -39,6 +39,7 @@
# include "BLI_math_mpq.hh"
# include "BLI_mpq2.hh"
# include "BLI_mpq3.hh"
+# include "BLI_set.hh"
# include "BLI_span.hh"
# include "BLI_task.h"
# include "BLI_threads.h"
@@ -76,7 +77,13 @@ bool Vert::operator==(const Vert &other) const
uint64_t Vert::hash() const
{
- return co_exact.hash();
+ uint64_t x = *reinterpret_cast<const uint64_t *>(&co.x);
+ uint64_t y = *reinterpret_cast<const uint64_t *>(&co.y);
+ uint64_t z = *reinterpret_cast<const uint64_t *>(&co.z);
+ x = (x >> 56) ^ (x >> 46) ^ x;
+ y = (y >> 55) ^ (y >> 45) ^ y;
+ z = (z >> 54) ^ (z >> 44) ^ z;
+ return x ^ y ^ z;
}
std::ostream &operator<<(std::ostream &os, const Vert *v)
@@ -145,15 +152,15 @@ bool Plane::exact_populated() const
uint64_t Plane::hash() const
{
- constexpr uint64_t h1 = 33;
- constexpr uint64_t h2 = 37;
- constexpr uint64_t h3 = 39;
- uint64_t hashx = hash_mpq_class(this->norm_exact.x);
- uint64_t hashy = hash_mpq_class(this->norm_exact.y);
- uint64_t hashz = hash_mpq_class(this->norm_exact.z);
- uint64_t hashd = hash_mpq_class(this->d_exact);
- uint64_t ans = hashx ^ (hashy * h1) ^ (hashz * h1 * h2) ^ (hashd * h1 * h2 * h3);
- return ans;
+ uint64_t x = *reinterpret_cast<const uint64_t *>(&this->norm.x);
+ uint64_t y = *reinterpret_cast<const uint64_t *>(&this->norm.y);
+ uint64_t z = *reinterpret_cast<const uint64_t *>(&this->norm.z);
+ uint64_t d = *reinterpret_cast<const uint64_t *>(&this->d);
+ x = (x >> 56) ^ (x >> 46) ^ x;
+ y = (y >> 55) ^ (y >> 45) ^ y;
+ z = (z >> 54) ^ (z >> 44) ^ z;
+ d = (d >> 53) ^ (d >> 43) ^ d;
+ return x ^ y ^ z ^ d;
}
std::ostream &operator<<(std::ostream &os, const Plane *plane)
@@ -315,7 +322,7 @@ class IMeshArena::IMeshArenaImpl : NonCopyable, NonMovable {
{
}
- uint32_t hash() const
+ uint64_t hash() const
{
return vert->hash();
}
@@ -326,7 +333,7 @@ class IMeshArena::IMeshArenaImpl : NonCopyable, NonMovable {
}
};
- VectorSet<VSetKey> vset_; /* TODO: replace with Set */
+ Set<VSetKey> vset_;
/**
* Ownership of the Vert memory is here, so destroying this reclaims that memory.
@@ -434,8 +441,7 @@ class IMeshArena::IMeshArenaImpl : NonCopyable, NonMovable {
const Vert *find_vert(const mpq3 &co)
{
- const Vert *ans;
- Vert vtry(co, double3(), NO_INDEX, NO_INDEX);
+ Vert vtry(co, double3(co[0].get_d(), co[1].get_d(), co[2].get_d()), NO_INDEX, NO_INDEX);
VSetKey vskey(&vtry);
if (intersect_use_threading) {
# ifdef USE_SPINLOCK
@@ -444,13 +450,7 @@ class IMeshArena::IMeshArenaImpl : NonCopyable, NonMovable {
BLI_mutex_lock(mutex_);
# endif
}
- int i = vset_.index_of_try(vskey);
- if (i == -1) {
- ans = nullptr;
- }
- else {
- ans = vset_[i].vert;
- }
+ const VSetKey *lookup = vset_.lookup_key_ptr(vskey);
if (intersect_use_threading) {
# ifdef USE_SPINLOCK
BLI_spin_unlock(&lock_);
@@ -458,7 +458,10 @@ class IMeshArena::IMeshArenaImpl : NonCopyable, NonMovable {
BLI_mutex_unlock(mutex_);
# endif
}
- return ans;
+ if (!lookup) {
+ return nullptr;
+ }
+ return lookup->vert;
}
/**
@@ -493,8 +496,8 @@ class IMeshArena::IMeshArenaImpl : NonCopyable, NonMovable {
BLI_mutex_lock(mutex_);
# endif
}
- int i = vset_.index_of_try(vskey);
- if (i == -1) {
+ const VSetKey *lookup = vset_.lookup_key_ptr(vskey);
+ if (!lookup) {
vskey.vert = new Vert(mco, dco, next_vert_id_++, orig);
vset_.add_new(vskey);
allocated_verts_.append(std::unique_ptr<Vert>(vskey.vert));
@@ -506,7 +509,7 @@ class IMeshArena::IMeshArenaImpl : NonCopyable, NonMovable {
* This is the intended semantics: if the Vert already
* exists then we are merging verts and using the first-seen
* one as the canonical one. */
- ans = vset_[i].vert;
+ ans = lookup->vert;
}
if (intersect_use_threading) {
# ifdef USE_SPINLOCK