diff options
author | Victor-Louis De Gusseme <victorlouis> | 2021-02-05 17:28:31 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2021-02-05 17:28:31 +0300 |
commit | 4d39a0f8eb1103aa58611fff7219f4bf3d70f70f (patch) | |
tree | cd36763c81288f8c35e25deb05bf6da4de57b20b /source/blender/blenkernel | |
parent | 7054d03701250b245df9cf60b80c3c5e9aca308f (diff) |
Geometry Nodes: Add Attribute Proximity Node
This node calculates a distance from each point to the closest position
on a target geometry, similar to the vertex weight proximity modifier.
Mapping the output distance to a different range can be done with an
attribute math node after this node.
A drop-down changes whether to calculate distances from points,
edges, or faces. In points mode, the node also calculates distances
from point cloud points.
Design task and use cases: T84842
Differential Revision: https://developer.blender.org/D10154
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_bvhutils.h | 15 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/bvhutils.c | 39 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.cc | 1 |
4 files changed, 56 insertions, 0 deletions
diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h index 84a17136361..78908908343 100644 --- a/source/blender/blenkernel/BKE_bvhutils.h +++ b/source/blender/blenkernel/BKE_bvhutils.h @@ -38,6 +38,7 @@ struct BMEditMesh; struct MFace; struct MVert; struct Mesh; +struct PointCloud; struct BVHCache; @@ -249,6 +250,20 @@ float bvhtree_sphereray_tri_intersection(const BVHTreeRay *ray, const float v1[3], const float v2[3]); +typedef struct BVHTreeFromPointCloud { + struct BVHTree *tree; + + BVHTree_NearestPointCallback nearest_callback; + + const float (*coords)[3]; +} BVHTreeFromPointCloud; + +BVHTree *BKE_bvhtree_from_pointcloud_get(struct BVHTreeFromPointCloud *data, + const struct PointCloud *pointcloud, + const int tree_type); + +void free_bvhtree_from_pointcloud(struct BVHTreeFromPointCloud *data); + /** * BVHCache */ diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 9ee21c6e825..0b8ef70de2a 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1368,6 +1368,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define GEO_NODE_POINTS_TO_VOLUME 1022 #define GEO_NODE_COLLECTION_INFO 1023 #define GEO_NODE_IS_VIEWPORT 1024 +#define GEO_NODE_ATTRIBUTE_PROXIMITY 1025 /** \} */ diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c index fd5cb33f02d..790fb128c7c 100644 --- a/source/blender/blenkernel/intern/bvhutils.c +++ b/source/blender/blenkernel/intern/bvhutils.c @@ -27,6 +27,7 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" +#include "DNA_pointcloud_types.h" #include "BLI_linklist.h" #include "BLI_math.h" @@ -1717,3 +1718,41 @@ void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data) memset(data, 0, sizeof(*data)); } + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Point Cloud BVH Building + * \{ */ + +BVHTree *BKE_bvhtree_from_pointcloud_get(BVHTreeFromPointCloud *data, + const PointCloud *pointcloud, + const int tree_type) +{ + BVHTree *tree = BLI_bvhtree_new(pointcloud->totpoint, 0.0f, tree_type, 6); + if (!tree) { + return NULL; + } + + for (int i = 0; i < pointcloud->totpoint; i++) { + BLI_bvhtree_insert(tree, i, pointcloud->co[i], 1); + } + BLI_assert(BLI_bvhtree_get_len(tree) == pointcloud->totpoint); + BLI_bvhtree_balance(tree); + + data->coords = pointcloud->co; + data->tree = tree; + data->nearest_callback = NULL; + + return tree; +} + +void free_bvhtree_from_pointcloud(BVHTreeFromPointCloud *data) +{ + if (data->tree) { + BLI_bvhtree_free(data->tree); + } + memset(data, 0, sizeof(*data)); +} + +/** \} */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index d78ba2a414e..44efbe64202 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -4753,6 +4753,7 @@ static void registerGeometryNodes() register_node_type_geo_attribute_compare(); register_node_type_geo_attribute_fill(); + register_node_type_geo_attribute_proximity(); register_node_type_geo_attribute_vector_math(); register_node_type_geo_triangulate(); register_node_type_geo_edge_split(); |