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/GEO_reverse_uv_sampler.hh')
-rw-r--r--source/blender/geometry/GEO_reverse_uv_sampler.hh46
1 files changed, 46 insertions, 0 deletions
diff --git a/source/blender/geometry/GEO_reverse_uv_sampler.hh b/source/blender/geometry/GEO_reverse_uv_sampler.hh
new file mode 100644
index 00000000000..ee91e0b0731
--- /dev/null
+++ b/source/blender/geometry/GEO_reverse_uv_sampler.hh
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#pragma once
+
+#include <optional>
+
+#include "BLI_math_vector.hh"
+#include "BLI_multi_value_map.hh"
+#include "BLI_span.hh"
+
+#include "DNA_meshdata_types.h"
+
+namespace blender::geometry {
+
+/**
+ * Can find the polygon/triangle that maps to a specific uv coordinate.
+ *
+ * \note this uses a trivial implementation currently that has to be replaced.
+ */
+class ReverseUVSampler {
+ private:
+ const Span<float2> uv_map_;
+ const Span<MLoopTri> looptris_;
+ int resolution_;
+ MultiValueMap<int2, int> looptris_by_cell_;
+
+ public:
+ ReverseUVSampler(const Span<float2> uv_map, const Span<MLoopTri> looptris);
+
+ enum class ResultType {
+ None,
+ Ok,
+ Multiple,
+ };
+
+ struct Result {
+ ResultType type = ResultType::None;
+ const MLoopTri *looptri = nullptr;
+ float3 bary_weights;
+ };
+
+ Result sample(const float2 &query_uv) const;
+ void sample_many(Span<float2> query_uvs, MutableSpan<Result> r_results) const;
+};
+
+} // namespace blender::geometry