[Bf-blender-cvs] [98c53f660a5] master: Fix T92369: Raycast node crash with no target attribute

Hans Goudey noreply at git.blender.org
Wed Oct 20 21:22:31 CEST 2021


Commit: 98c53f660a57af837a160a842eb2e7a9a4c37de8
Author: Hans Goudey
Date:   Wed Oct 20 14:22:25 2021 -0500
Branches: master
https://developer.blender.org/rB98c53f660a57af837a160a842eb2e7a9a4c37de8

Fix T92369: Raycast node crash with no target attribute

The corrected hit mask should only be generated when there is
data to transfer. Also correct two of the warning messages.

===================================================================

M	source/blender/nodes/geometry/nodes/node_geo_raycast.cc

===================================================================

diff --git a/source/blender/nodes/geometry/nodes/node_geo_raycast.cc b/source/blender/nodes/geometry/nodes/node_geo_raycast.cc
index e5ed5c02090..1e687f163e6 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_raycast.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_raycast.cc
@@ -264,26 +264,26 @@ class RaycastFunction : public fn::MultiFunction {
                     params.uninitialized_single_output_if_required<float>(6, "Distance"),
                     hit_count);
 
-    IndexMask hit_mask;
-    Vector<int64_t> hit_mask_indices;
-    if (hit_count < mask.size()) {
-      /* Not all rays hit the target. Create a corrected mask to avoid transferring attribute data
-       * to invalid indices. An alternative would be handling -1 indices in a separate case in
-       * #MeshAttributeInterpolator, but since it already has an IndexMask in its constructor, it's
-       * simpler to use that. */
-      hit_mask_indices.reserve(hit_count);
-      for (const int64_t i : mask) {
-        if (hit_indices[i] != -1) {
-          hit_mask_indices.append(i);
+    if (target_data_) {
+      IndexMask hit_mask;
+      Vector<int64_t> hit_mask_indices;
+      if (hit_count < mask.size()) {
+        /* Not all rays hit the target. Create a corrected mask to avoid transferring attribute
+         * data to invalid indices. An alternative would be handling -1 indices in a separate case
+         * in #MeshAttributeInterpolator, but since it already has an IndexMask in its constructor,
+         * it's simpler to use that. */
+        hit_mask_indices.reserve(hit_count);
+        for (const int64_t i : mask) {
+          if (hit_indices[i] != -1) {
+            hit_mask_indices.append(i);
+          }
+          hit_mask = IndexMask(hit_mask_indices);
         }
-        hit_mask = IndexMask(hit_mask_indices);
       }
-    }
-    else {
-      hit_mask = mask;
-    }
+      else {
+        hit_mask = mask;
+      }
 
-    if (target_data_) {
       GMutableSpan result = params.uninitialized_single_output_if_required(7, "Attribute");
       if (!result.is_empty()) {
         MeshAttributeInterpolator interp(&mesh, hit_mask, hit_positions, hit_indices);
@@ -393,11 +393,11 @@ static void geo_node_raycast_exec(GeoNodeExecParams params)
     if (target.has_realized_data()) {
       params.error_message_add(
           NodeWarningType::Info,
-          TIP_("Only realized geometry is supported, instances will not be used"));
+          TIP_("The node only supports realized mesh data, instances are ignored"));
     }
     else {
       params.error_message_add(NodeWarningType::Error,
-                               TIP_("Target target must contain realized data"));
+                               TIP_("The target geometry must contain realized data"));
       return return_default();
     }
   }



More information about the Bf-blender-cvs mailing list