Blender V4.3
BKE_mesh_sample.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
11#include "BLI_function_ref.hh"
14
15#include "FN_field.hh"
16#include "FN_multi_function.hh"
17
18#include "BKE_attribute_math.hh"
20
21struct Mesh;
22struct BVHTreeFromMesh;
23
24namespace blender {
25class RandomNumberGenerator;
26}
27
29
30void sample_point_attribute(Span<int> corner_verts,
31 Span<int3> corner_tris,
32 Span<int> tri_indices,
33 Span<float3> bary_coords,
34 const GVArray &src,
35 const IndexMask &mask,
36 GMutableSpan dst);
37
38void sample_point_normals(Span<int> corner_verts,
39 Span<int3> corner_tris,
40 Span<int> tri_indices,
41 Span<float3> bary_coords,
42 Span<float3> src,
43 IndexMask mask,
45
46void sample_corner_attribute(Span<int3> corner_tris,
47 Span<int> tri_indices,
48 Span<float3> bary_coords,
49 const GVArray &src,
50 const IndexMask &mask,
51 GMutableSpan dst);
52
53void sample_corner_normals(Span<int3> corner_tris,
54 Span<int> tri_indices,
55 Span<float3> bary_coords,
56 Span<float3> src,
57 const IndexMask &mask,
59
60void sample_face_attribute(Span<int> corner_tri_faces,
61 Span<int> tri_indices,
62 const GVArray &src,
63 const IndexMask &mask,
64 GMutableSpan dst);
65
76 const Mesh &mesh,
77 Span<int> tris_to_sample,
78 const float3 &sample_pos,
79 float sample_radius,
80 float approximate_density,
81 Vector<float3> &r_bary_coords,
82 Vector<int> &r_tri_indices,
83 Vector<float3> &r_positions);
84
101 const Mesh &mesh,
102 BVHTreeFromMesh &mesh_bvhtree,
103 const float2 &sample_pos_re,
104 float sample_radius_re,
105 FunctionRef<void(const float2 &pos_re, float3 &r_start, float3 &r_end)> region_position_to_ray,
106 bool front_face_only,
107 int tries_num,
108 int max_points,
109 Vector<float3> &r_bary_coords,
110 Vector<int> &r_tri_indices,
111 Vector<float3> &r_positions);
112
114 Span<int> corner_verts,
115 const int3 &corner_tri,
116 const float3 &position);
117
118template<typename T>
120 const int3 &corner_tri,
121 const Span<T> corner_attribute)
122{
123 return attribute_math::mix3(bary_weights,
124 corner_attribute[corner_tri[0]],
125 corner_attribute[corner_tri[1]],
126 corner_attribute[corner_tri[2]]);
127}
128
129template<typename T>
131 const int3 &corner_tri,
132 const VArray<T> &corner_attribute)
133{
134 return attribute_math::mix3(bary_weights,
135 corner_attribute[corner_tri[0]],
136 corner_attribute[corner_tri[1]],
137 corner_attribute[corner_tri[2]]);
138}
139
144 GeometrySet source_;
145 Span<float3> vert_positions_;
146 Span<int> corner_verts_;
147 Span<int3> corner_tris_;
148
149 public:
151 void call(const IndexMask &mask, mf::Params params, mf::Context context) const;
152};
153
159 GeometrySet source_;
160 Span<float3> vert_positions_;
161 Span<int> corner_verts_;
162 Span<int3> corner_tris_;
163
164 public:
166 void call(const IndexMask &mask, mf::Params params, mf::Context context) const;
167};
168
174 mf::Signature signature_;
175
176 GeometrySet source_;
177 Span<int3> corner_tris_;
178 std::optional<bke::MeshFieldContext> source_context_;
179 std::unique_ptr<fn::FieldEvaluator> source_evaluator_;
180 const GVArray *source_data_;
181 AttrDomain domain_;
182
183 public:
184 BaryWeightSampleFn(GeometrySet geometry, fn::GField src_field);
185
186 void call(const IndexMask &mask, mf::Params params, mf::Context context) const;
187
188 private:
189 void evaluate_source(fn::GField src_field);
190};
191
192} // namespace blender::bke::mesh_surface_sample
void call(const IndexMask &mask, mf::Params params, mf::Context context) const
void call(const IndexMask &mask, mf::Params params, mf::Context context) const
BaryWeightSampleFn(GeometrySet geometry, fn::GField src_field)
void call(const IndexMask &mask, mf::Params params, mf::Context context) const
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
T mix3(const float3 &weights, const T &v0, const T &v1, const T &v2)
int sample_surface_points_spherical(RandomNumberGenerator &rng, const Mesh &mesh, Span< int > tris_to_sample, const float3 &sample_pos, float sample_radius, float approximate_density, Vector< float3 > &r_bary_coords, Vector< int > &r_tri_indices, Vector< float3 > &r_positions)
void sample_corner_normals(Span< int3 > corner_tris, Span< int > tri_indices, Span< float3 > bary_coords, Span< float3 > src, const IndexMask &mask, MutableSpan< float3 > dst)
void sample_point_attribute(Span< int > corner_verts, Span< int3 > corner_tris, Span< int > tri_indices, Span< float3 > bary_coords, const GVArray &src, const IndexMask &mask, GMutableSpan dst)
float3 compute_bary_coord_in_triangle(Span< float3 > vert_positions, Span< int > corner_verts, const int3 &corner_tri, const float3 &position)
void sample_corner_attribute(Span< int3 > corner_tris, Span< int > tri_indices, Span< float3 > bary_coords, const GVArray &src, const IndexMask &mask, GMutableSpan dst)
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_tri_indices, Vector< float3 > &r_positions)
void sample_face_attribute(Span< int > corner_tri_faces, Span< int > tri_indices, const GVArray &src, const IndexMask &mask, GMutableSpan dst)
T sample_corner_attribute_with_bary_coords(const float3 &bary_weights, const int3 &corner_tri, const Span< T > corner_attribute)
void sample_point_normals(Span< int > corner_verts, Span< int3 > corner_tris, Span< int > tri_indices, Span< float3 > bary_coords, Span< float3 > src, IndexMask mask, MutableSpan< float3 > dst)