Blender V5.0
BLI_kdtree_impl.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9
10#include "BLI_compiler_attrs.h"
11#include "BLI_sys_types.h"
12
13#define _BLI_CONCAT_AUX(MACRO_ARG1, MACRO_ARG2) MACRO_ARG1##MACRO_ARG2
14#define _BLI_CONCAT(MACRO_ARG1, MACRO_ARG2) _BLI_CONCAT_AUX(MACRO_ARG1, MACRO_ARG2)
15#define BLI_kdtree_nd_(id) _BLI_CONCAT(KDTREE_PREFIX_ID, _##id)
16
17/* For auto-complete / `clangd`. */
18#ifndef KD_DIMS
19# define KD_DIMS 0
20#endif
21
22struct KDTree;
23typedef struct KDTree KDTree;
24
25typedef struct KDTreeNearest {
26 int index;
27 float dist;
28 float co[KD_DIMS];
30
34KDTree *BLI_kdtree_nd_(new)(unsigned int nodes_len_capacity);
37
38void BLI_kdtree_nd_(insert)(KDTree *tree, int index, const float co[KD_DIMS]) ATTR_NONNULL(1, 3);
40 const float co[KD_DIMS],
41 KDTreeNearest *r_nearest) ATTR_NONNULL(1, 2);
42
44 const float co[KD_DIMS],
45 KDTreeNearest *r_nearest,
46 uint nearest_len_capacity) ATTR_NONNULL(1, 2, 3);
47
49 const float co[KD_DIMS],
50 KDTreeNearest **r_nearest,
52
61 const KDTree *tree,
62 const float co[KD_DIMS],
63 int (*filter_cb)(void *user_data, int index, const float co[KD_DIMS], float dist_sq),
64 void *user_data,
65 KDTreeNearest *r_nearest);
76 const KDTree *tree,
77 const float co[KD_DIMS],
78 float range,
79 bool (*search_cb)(void *user_data, int index, const float co[KD_DIMS], float dist_sq),
80 void *user_data);
81
101 float range,
102 bool use_index_order,
103 int *duplicates);
104
124 const float range,
125 int *duplicates,
126 bool has_self_index,
127 int (*deduplicate_cb)(void *user_data,
128 const int *cluster,
129 int cluster_num),
130 void *user_data);
131
138
145 const KDTree *tree,
146 const float co[KD_DIMS],
147 KDTreeNearest *r_nearest,
148 uint nearest_len_capacity,
149 float (*len_sq_fn)(const float co_search[KD_DIMS],
150 const float co_test[KD_DIMS],
151 const void *user_data),
152 const void *user_data) ATTR_NONNULL(1, 2, 3);
159 const KDTree *tree,
160 const float co[KD_DIMS],
161 KDTreeNearest **r_nearest,
162 float range,
163 float (*len_sq_fn)(const float co_search[KD_DIMS],
164 const float co_test[KD_DIMS],
165 const void *user_data),
166 const void *user_data) ATTR_NONNULL(1, 2) ATTR_WARN_UNUSED_RESULT;
167
168template<typename Fn>
170 const float co[KD_DIMS],
171 const float distance,
172 const Fn &fn)
173{
175 tree,
176 co,
177 distance,
178 [](void *user_data, const int index, const float *co, const float dist_sq) {
179 const Fn &fn = *static_cast<const Fn *>(user_data);
180 return fn(index, co, dist_sq);
181 },
182 const_cast<Fn *>(&fn));
183}
184
185template<typename Fn>
187 const float co[KD_DIMS],
188 KDTreeNearest *r_nearest,
189 Fn &&fn)
190{
192 tree,
193 co,
194 [](void *user_data, const int index, const float *co, const float dist_sq) {
195 Fn &fn = *static_cast<Fn *>(user_data);
196 return fn(index, co, dist_sq);
197 },
198 &fn,
199 r_nearest);
200}
201
202template<typename Fn>
204 const float distance,
205 int *duplicates,
206 const bool has_self_index,
207 const Fn &fn)
208{
210 tree,
211 distance,
212 duplicates,
213 has_self_index,
214 [](void *user_data, const int *cluster, int cluster_num) -> int {
215 const Fn &fn = *static_cast<const Fn *>(user_data);
216 return fn(cluster, cluster_num);
217 },
218 const_cast<Fn *>(&fn));
219}
220
221#undef _BLI_CONCAT_AUX
222#undef _BLI_CONCAT
223#undef BLI_kdtree_nd_
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define KDTreeNearest
Definition BLI_kdtree.h:16
#define KDTree
Definition BLI_kdtree.h:15
#define KD_DIMS
Definition BLI_kdtree.h:13
void BLI_kdtree_nd_ range_search_cb_cpp(const KDTree *tree, const float co[KD_DIMS], const float distance, const Fn &fn)
void BLI_kdtree_nd_ int BLI_kdtree_nd_ int BLI_kdtree_nd_ find_nearest_n(const KDTree *tree, const float co[KD_DIMS], KDTreeNearest *r_nearest, uint nearest_len_capacity) ATTR_NONNULL(1
void BLI_kdtree_nd_ free(KDTree *tree)
int BLI_kdtree_nd_ calc_duplicates_fast(const KDTree *tree, float range, bool use_index_order, int *duplicates)
void BLI_kdtree_nd_ range_search_cb(const KDTree *tree, const float co[KD_DIMS], float range, bool(*search_cb)(void *user_data, int index, const float co[KD_DIMS], float dist_sq), void *user_data)
void BLI_kdtree_nd_ int BLI_kdtree_nd_ find_nearest(const KDTree *tree, const float co[KD_DIMS], KDTreeNearest *r_nearest) ATTR_NONNULL(1
int BLI_kdtree_nd_ find_nearest_cb(const KDTree *tree, const float co[KD_DIMS], int(*filter_cb)(void *user_data, int index, const float co[KD_DIMS], float dist_sq), void *user_data, KDTreeNearest *r_nearest)
int BLI_kdtree_nd_ calc_duplicates_cb_cpp(const KDTree *tree, const float distance, int *duplicates, const bool has_self_index, const Fn &fn)
int BLI_kdtree_nd_ calc_duplicates_cb(const KDTree *tree, const float range, int *duplicates, bool has_self_index, int(*deduplicate_cb)(void *user_data, const int *cluster, int cluster_num), void *user_data)
int BLI_kdtree_nd_ find_nearest_n_with_len_squared_cb(const KDTree *tree, const float co[KD_DIMS], KDTreeNearest *r_nearest, uint nearest_len_capacity, float(*len_sq_fn)(const float co_search[KD_DIMS], const float co_test[KD_DIMS], const void *user_data), const void *user_data) ATTR_NONNULL(1
int BLI_kdtree_nd_ deduplicate(KDTree *tree)
int BLI_kdtree_nd_ find_nearest_cb_cpp(const KDTree *tree, const float co[KD_DIMS], KDTreeNearest *r_nearest, Fn &&fn)
#define KD_DIMS
void BLI_kdtree_nd_ int BLI_kdtree_nd_ int BLI_kdtree_nd_ int BLI_kdtree_nd_ range_search(const KDTree *tree, const float co[KD_DIMS], KDTreeNearest **r_nearest, float range) ATTR_NONNULL(1
void BLI_kdtree_nd_ balance(KDTree *tree) ATTR_NONNULL(1)
int BLI_kdtree_nd_ int BLI_kdtree_nd_ range_search_with_len_squared_cb(const KDTree *tree, const float co[KD_DIMS], KDTreeNearest **r_nearest, float range, float(*len_sq_fn)(const float co_search[KD_DIMS], const float co_test[KD_DIMS], const void *user_data), const void *user_data) ATTR_NONNULL(1
#define BLI_kdtree_nd_(id)
void BLI_kdtree_nd_ insert(KDTree *tree, int index, const float co[KD_DIMS]) ATTR_NONNULL(1
unsigned int uint
nullptr float
KDTree_3d * tree
float distance(VecOp< float, D >, VecOp< float, D >) RET
float co[KD_DIMS]