[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