[Bf-blender-cvs] [5c2730f64df] geometry-nodes: Geometry Nodes: use attribute api in point distribute node
Jacques Lucke
noreply at git.blender.org
Wed Nov 18 12:29:21 CET 2020
Commit: 5c2730f64dfe433206c0b00b79848986fa951e4c
Author: Jacques Lucke
Date: Wed Nov 18 12:25:17 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB5c2730f64dfe433206c0b00b79848986fa951e4c
Geometry Nodes: use attribute api in point distribute node
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
index a2824ed7572..d7912c34645 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_distribute.cc
@@ -47,22 +47,12 @@ namespace blender::nodes {
static Vector<float3> scatter_points_from_mesh(const Mesh *mesh,
const float density,
- const int density_attribute_index)
+ const FloatReadAttribute &density_factors)
{
/* This only updates a cache and can be considered to be logically const. */
const MLoopTri *looptris = BKE_mesh_runtime_looptri_ensure(const_cast<Mesh *>(mesh));
const int looptris_len = BKE_mesh_runtime_looptri_len(mesh);
- Array<float> vertex_density_factors(mesh->totvert);
- if (density_attribute_index == -1) {
- vertex_density_factors.fill(1.0f);
- }
- else {
- MDeformVert *dverts = mesh->dvert;
- BKE_defvert_extract_vgroup_to_vertweights(
- dverts, density_attribute_index, mesh->totvert, vertex_density_factors.data(), false);
- }
-
Vector<float3> points;
for (const int looptri_index : IndexRange(looptris_len)) {
@@ -73,9 +63,9 @@ static Vector<float3> scatter_points_from_mesh(const Mesh *mesh,
const float3 v0_pos = mesh->mvert[v0_index].co;
const float3 v1_pos = mesh->mvert[v1_index].co;
const float3 v2_pos = mesh->mvert[v2_index].co;
- const float v0_density_factor = vertex_density_factors[v0_index];
- const float v1_density_factor = vertex_density_factors[v1_index];
- const float v2_density_factor = vertex_density_factors[v2_index];
+ const float v0_density_factor = std::max(0.0f, density_factors[v0_index]);
+ const float v1_density_factor = std::max(0.0f, density_factors[v1_index]);
+ const float v2_density_factor = std::max(0.0f, density_factors[v2_index]);
const float looptri_density_factor = (v0_density_factor + v1_density_factor +
v2_density_factor) /
3.0f;
@@ -121,8 +111,11 @@ static void geo_point_distribute_exec(GeoNodeExecParams params)
const MeshComponent &mesh_component = *geometry_set.get_component_for_read<MeshComponent>();
const Mesh *mesh_in = mesh_component.get_for_read();
- const int density_attribute_index = mesh_component.vertex_group_index(density_attribute);
- Vector<float3> points = scatter_points_from_mesh(mesh_in, density, density_attribute_index);
+
+ const FloatReadAttribute density_factors = bke::mesh_attribute_get_for_read<float>(
+ mesh_component, density_attribute, ATTR_DOMAIN_VERTEX, 1.0f);
+
+ Vector<float3> points = scatter_points_from_mesh(mesh_in, density, density_factors);
PointCloud *pointcloud = BKE_pointcloud_new_nomain(points.size());
memcpy(pointcloud->co, points.data(), sizeof(float3) * points.size());
More information about the Bf-blender-cvs
mailing list