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/geometry/intern/reverse_uv_sampler.cc')
-rw-r--r--source/blender/geometry/intern/reverse_uv_sampler.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/source/blender/geometry/intern/reverse_uv_sampler.cc b/source/blender/geometry/intern/reverse_uv_sampler.cc
new file mode 100644
index 00000000000..9aa98895a86
--- /dev/null
+++ b/source/blender/geometry/intern/reverse_uv_sampler.cc
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include "GEO_reverse_uv_sampler.hh"
+
+#include "BLI_math_geom.h"
+
+namespace blender::geometry {
+
+ReverseUVSampler::ReverseUVSampler(const Span<float2> uv_map, const Span<MLoopTri> looptris)
+ : uv_map_(uv_map), looptris_(looptris)
+{
+}
+
+ReverseUVSampler::Result ReverseUVSampler::sample(const float2 &query_uv) const
+{
+ for (const MLoopTri &looptri : looptris_) {
+ const float2 &uv0 = uv_map_[looptri.tri[0]];
+ const float2 &uv1 = uv_map_[looptri.tri[1]];
+ const float2 &uv2 = uv_map_[looptri.tri[2]];
+ float3 bary_weights;
+ if (!barycentric_coords_v2(uv0, uv1, uv2, query_uv, bary_weights)) {
+ continue;
+ }
+ if (IN_RANGE_INCL(bary_weights.x, 0.0f, 1.0f) && IN_RANGE_INCL(bary_weights.y, 0.0f, 1.0f) &&
+ IN_RANGE_INCL(bary_weights.z, 0.0f, 1.0f)) {
+ return Result{ResultType::Ok, &looptri, bary_weights};
+ }
+ }
+ return Result{};
+}
+
+} // namespace blender::geometry