Blender V5.0
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
10
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;
22
23namespace blender {
25namespace bke {
26struct BVHTreeFromMesh;
27}
28} // namespace blender
29
31
32void sample_point_attribute(Span<int> corner_verts,
33 Span<int3> corner_tris,
34 Span<int> tri_indices,
35 Span<float3> bary_coords,
36 const GVArray &src,
37 const IndexMask &mask,
38 GMutableSpan dst);
39
40void sample_point_normals(Span<int> corner_verts,
41 Span<int3> corner_tris,
42 Span<int> tri_indices,
43 Span<float3> bary_coords,
44 Span<float3> src,
47
48void sample_corner_attribute(Span<int3> corner_tris,
49 Span<int> tri_indices,
50 Span<float3> bary_coords,
51 const GVArray &src,
52 const IndexMask &mask,
53 GMutableSpan dst);
54
55void sample_corner_normals(Span<int3> corner_tris,
56 Span<int> tri_indices,
57 Span<float3> bary_coords,
58 Span<float3> src,
59 const IndexMask &mask,
61
62void sample_face_attribute(Span<int> corner_tri_faces,
63 Span<int> tri_indices,
64 const GVArray &src,
65 const IndexMask &mask,
66 GMutableSpan dst);
67
78 const Mesh &mesh,
79 Span<int> tris_to_sample,
80 const float3 &sample_pos,
81 float sample_radius,
82 float approximate_density,
83 Vector<float3> &r_bary_coords,
84 Vector<int> &r_tri_indices,
85 Vector<float3> &r_positions);
86
103 const Mesh &mesh,
104 bke::BVHTreeFromMesh &mesh_bvhtree,
105 const float2 &sample_pos_re,
106 float sample_radius_re,
107 FunctionRef<void(const float2 &pos_re, float3 &r_start, float3 &r_end)> region_position_to_ray,
108 bool front_face_only,
109 int tries_num,
110 int max_points,
111 Vector<float3> &r_bary_coords,
112 Vector<int> &r_tri_indices,
113 Vector<float3> &r_positions);
114
116 Span<int> corner_verts,
117 const int3 &corner_tri,
118 const float3 &position);
119
120template<typename T>
122 const int3 &corner_tri,
123 const Span<T> corner_attribute)
124{
125 return attribute_math::mix3(bary_weights,
126 corner_attribute[corner_tri[0]],
127 corner_attribute[corner_tri[1]],
128 corner_attribute[corner_tri[2]]);
129}
130
131template<typename T>
133 const int3 &corner_tri,
134 const VArray<T> &corner_attribute)
135{
136 return attribute_math::mix3(bary_weights,
137 corner_attribute[corner_tri[0]],
138 corner_attribute[corner_tri[1]],
139 corner_attribute[corner_tri[2]]);
140}
141
145class BaryWeightFromPositionFn : public mf::MultiFunction {
146 GeometrySet source_;
147 Span<float3> vert_positions_;
148 Span<int> corner_verts_;
149 Span<int3> corner_tris_;
150
151 public:
153 void call(const IndexMask &mask, mf::Params params, mf::Context context) const override;
154};
155
160class CornerBaryWeightFromPositionFn : public mf::MultiFunction {
161 GeometrySet source_;
162 Span<float3> vert_positions_;
163 Span<int> corner_verts_;
164 Span<int3> corner_tris_;
165
166 public:
168 void call(const IndexMask &mask, mf::Params params, mf::Context context) const override;
169};
170
175class BaryWeightSampleFn : public mf::MultiFunction {
176 mf::Signature signature_;
177
178 GeometrySet source_;
179 Span<int3> corner_tris_;
180 std::optional<bke::MeshFieldContext> source_context_;
181 std::unique_ptr<fn::FieldEvaluator> source_evaluator_;
182 const GVArray *source_data_;
183 AttrDomain domain_;
184
185 public:
187
188 void call(const IndexMask &mask, mf::Params params, mf::Context context) const override;
189
190 private:
191 void evaluate_source(fn::GField src_field);
192};
193
194} // namespace blender::bke::mesh_surface_sample
void call(const IndexMask &mask, mf::Params params, mf::Context context) const override
void call(const IndexMask &mask, mf::Params params, mf::Context context) const override
BaryWeightSampleFn(GeometrySet geometry, fn::GField src_field)
void call(const IndexMask &mask, mf::Params params, mf::Context context) const override
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
#define T
T mix3(const float3 &weights, const T &v0, const T &v1, const T &v2)
int sample_surface_points_projected(RandomNumberGenerator &rng, const Mesh &mesh, bke::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)
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)
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)
VecBase< float, 2 > float2
VecBase< int32_t, 3 > int3
VecBase< float, 3 > float3