Blender  V3.3
BKE_mesh_sample.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #pragma once
4 
9 #include "BLI_function_ref.hh"
11 #include "BLI_math_vec_types.hh"
12 
13 #include "DNA_meshdata_types.h"
14 
15 #include "BKE_attribute.h"
16 #include "BKE_attribute.hh"
17 
18 struct Mesh;
19 struct BVHTreeFromMesh;
20 
21 namespace blender {
22 class RandomNumberGenerator;
23 }
24 
26 
27 void sample_point_attribute(const Mesh &mesh,
28  Span<int> looptri_indices,
29  Span<float3> bary_coords,
30  const GVArray &data_in,
31  const IndexMask mask,
32  GMutableSpan data_out);
33 
35  Span<int> looptri_indices,
36  Span<float3> bary_coords,
37  const GVArray &data_in,
38  const IndexMask mask,
39  GMutableSpan data_out);
40 
41 void sample_face_attribute(const Mesh &mesh,
42  Span<int> looptri_indices,
43  const GVArray &data_in,
44  const IndexMask mask,
45  GMutableSpan data_out);
46 
47 enum class eAttributeMapMode {
49  NEAREST,
50 };
51 
60  private:
61  const Mesh *mesh_;
62  const IndexMask mask_;
63  const Span<float3> positions_;
64  const Span<int> looptri_indices_;
65 
66  Array<float3> bary_coords_;
67  Array<float3> nearest_weights_;
68 
69  public:
71  const IndexMask mask,
72  const Span<float3> positions,
73  const Span<int> looptri_indices);
74 
75  void sample_data(const GVArray &src,
76  eAttrDomain domain,
77  eAttributeMapMode mode,
78  const GMutableSpan dst);
79 
80  void sample_attribute(const GAttributeReader &src_attribute,
81  GSpanAttributeWriter &dst_attribute,
82  eAttributeMapMode mode);
83 
84  protected:
87 };
88 
99  const Mesh &mesh,
100  Span<int> looptri_indices_to_sample,
101  const float3 &sample_pos,
102  float sample_radius,
103  float approximate_density,
104  Vector<float3> &r_bary_coords,
105  Vector<int> &r_looptri_indices,
106  Vector<float3> &r_positions);
107 
124  const Mesh &mesh,
125  BVHTreeFromMesh &mesh_bvhtree,
126  const float2 &sample_pos_re,
127  float sample_radius_re,
128  FunctionRef<void(const float2 &pos_re, float3 &r_start, float3 &r_end)> region_position_to_ray,
129  bool front_face_only,
130  int tries_num,
131  int max_points,
132  Vector<float3> &r_bary_coords,
133  Vector<int> &r_looptri_indices,
134  Vector<float3> &r_positions);
135 
137  const MLoopTri &looptri,
138  const float3 &position);
139 
140 template<typename T>
142  const MLoopTri &looptri,
143  const Span<T> corner_attribute)
144 {
145  return attribute_math::mix3(bary_weights,
146  corner_attribute[looptri.tri[0]],
147  corner_attribute[looptri.tri[1]],
148  corner_attribute[looptri.tri[2]]);
149 }
150 
151 } // namespace blender::bke::mesh_surface_sample
Generic geometry attributes built on CustomData.
eAttrDomain
Definition: BKE_attribute.h:25
void sample_data(const GVArray &src, eAttrDomain domain, eAttributeMapMode mode, const GMutableSpan dst)
Definition: mesh_sample.cc:208
void sample_attribute(const GAttributeReader &src_attribute, GSpanAttributeWriter &dst_attribute, eAttributeMapMode mode)
Definition: mesh_sample.cc:255
MeshAttributeInterpolator(const Mesh *mesh, const IndexMask mask, const Span< float3 > positions, const Span< int > looptri_indices)
Definition: mesh_sample.cc:143
SyclQueue void void * src
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
Definition: math_float4.h:513
#define T
T mix3(const float3 &weights, const T &v0, const T &v1, const T &v2)
void sample_face_attribute(const Mesh &mesh, Span< int > looptri_indices, const GVArray &data_in, const IndexMask mask, GMutableSpan data_out)
Definition: mesh_sample.cc:127
float3 compute_bary_coord_in_triangle(const Mesh &mesh, const MLoopTri &looptri, const float3 &position)
Definition: mesh_sample.cc:421
void sample_point_attribute(const Mesh &mesh, Span< int > looptri_indices, Span< float3 > bary_coords, const GVArray &data_in, const IndexMask mask, GMutableSpan data_out)
Definition: mesh_sample.cc:44
T sample_corner_attrribute_with_bary_coords(const float3 &bary_weights, const MLoopTri &looptri, const Span< T > corner_attribute)
int sample_surface_points_spherical(RandomNumberGenerator &rng, const Mesh &mesh, Span< int > looptri_indices_to_sample, const float3 &sample_pos, float sample_radius, float approximate_density, Vector< float3 > &r_bary_coords, Vector< int > &r_looptri_indices, Vector< float3 > &r_positions)
Definition: mesh_sample.cc:264
int sample_surface_points_projected(RandomNumberGenerator &rng, const Mesh &mesh, BVHTreeFromMesh &mesh_bvhtree, const float2 &sample_pos_re, float sample_radius_re, FunctionRef< void(const float2 &pos_re, float3 &r_start, float3 &r_end)> region_position_to_ray, bool front_face_only, int tries_num, int max_points, Vector< float3 > &r_bary_coords, Vector< int > &r_looptri_indices, Vector< float3 > &r_positions)
void sample_corner_attribute(const Mesh &mesh, Span< int > looptri_indices, Span< float3 > bary_coords, const GVArray &data_in, const IndexMask mask, GMutableSpan data_out)
Definition: mesh_sample.cc:91
MutableSpan< float3 > positions
unsigned int tri[3]