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

reverse_uv_sampler.cc « intern « geometry « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 9aa98895a8611c3c2e338dcfdd30f2e4293ae554 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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