Blender V4.3
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
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#ifdef __cplusplus
18extern "C" {
19#endif
20
21struct KDTree;
22typedef struct KDTree KDTree;
23
24typedef struct KDTreeNearest {
25 int index;
26 float dist;
27 float co[KD_DIMS];
29
33KDTree *BLI_kdtree_nd_(new)(unsigned int nodes_len_capacity);
36
37void BLI_kdtree_nd_(insert)(KDTree *tree, int index, const float co[KD_DIMS]) ATTR_NONNULL(1, 3);
39 const float co[KD_DIMS],
40 KDTreeNearest *r_nearest) ATTR_NONNULL(1, 2);
41
43 const float co[KD_DIMS],
44 KDTreeNearest *r_nearest,
45 uint nearest_len_capacity) ATTR_NONNULL(1, 2, 3);
46
48 const float co[KD_DIMS],
49 KDTreeNearest **r_nearest,
51
53 const KDTree *tree,
54 const float co[KD_DIMS],
55 int (*filter_cb)(void *user_data, int index, const float co[KD_DIMS], float dist_sq),
56 void *user_data,
57 KDTreeNearest *r_nearest);
59 const KDTree *tree,
60 const float co[KD_DIMS],
61 float range,
62 bool (*search_cb)(void *user_data, int index, const float co[KD_DIMS], float dist_sq),
63 void *user_data);
64
66 float range,
67 bool use_index_order,
68 int *duplicates);
69
71
74 const KDTree *tree,
75 const float co[KD_DIMS],
76 KDTreeNearest *r_nearest,
77 uint nearest_len_capacity,
78 float (*len_sq_fn)(const float co_search[KD_DIMS],
79 const float co_test[KD_DIMS],
80 const void *user_data),
81 const void *user_data) ATTR_NONNULL(1, 2, 3);
83 const KDTree *tree,
84 const float co[KD_DIMS],
85 KDTreeNearest **r_nearest,
86 float range,
87 float (*len_sq_fn)(const float co_search[KD_DIMS],
88 const float co_test[KD_DIMS],
89 const void *user_data),
90 const void *user_data) ATTR_NONNULL(1, 2) ATTR_WARN_UNUSED_RESULT;
91
92#ifdef __cplusplus
93}
94#endif
95
96#ifdef __cplusplus
97template<typename Fn>
98inline void BLI_kdtree_nd_(range_search_cb_cpp)(const KDTree *tree,
99 const float co[KD_DIMS],
100 float distance,
101 const Fn &fn)
102{
104 tree,
105 co,
106 distance,
107 [](void *user_data, const int index, const float *co, const float dist_sq) {
108 const Fn &fn = *static_cast<const Fn *>(user_data);
109 return fn(index, co, dist_sq);
110 },
111 const_cast<Fn *>(&fn));
112}
113
114template<typename Fn>
115inline int BLI_kdtree_nd_(find_nearest_cb_cpp)(const KDTree *tree,
116 const float co[KD_DIMS],
117 KDTreeNearest *r_nearest,
118 Fn &&fn)
119{
121 tree,
122 co,
123 [](void *user_data, const int index, const float *co, const float dist_sq) {
124 Fn &fn = *static_cast<Fn *>(user_data);
125 return fn(index, co, dist_sq);
126 },
127 &fn,
128 r_nearest);
129}
130#endif
131
132#undef _BLI_CONCAT_AUX
133#undef _BLI_CONCAT
134#undef BLI_kdtree_nd_
#define ATTR_NONNULL(...)
#define KD_DIMS
Definition BLI_kdtree.h:13
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_ int BLI_kdtree_nd_ int BLI_kdtree_nd_ ATTR_WARN_UNUSED_RESULT
struct KDTreeNearest KDTreeNearest
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_ 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)
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
KDTree_3d * tree
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
IndexRange range
float distance(float a, float b)
float co[KD_DIMS]