[Bf-blender-cvs] [92b8d2f7e41] temp-geometry-nodes-expandable-geometry-socket-prototype: support accessing index and normal

Jacques Lucke noreply at git.blender.org
Mon Aug 9 12:21:22 CEST 2021


Commit: 92b8d2f7e4167905013c5bac78f3ff524eaee96b
Author: Jacques Lucke
Date:   Mon Aug 9 12:17:19 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB92b8d2f7e4167905013c5bac78f3ff524eaee96b

support accessing index and normal

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

M	source/blender/blenkernel/intern/node.cc
M	source/blender/editors/space_node/node_edit.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc

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

diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 4a5fb2e4e47..93d40ec70aa 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -3949,6 +3949,9 @@ static std::string expander_output_to_name(const GeometryExpanderOutput &expande
     case GEOMETRY_EXPANDER_OUTPUT_TYPE_BUILTIN: {
       return StringRef("Built-in ▶ ") + expander_output.builtin_identifier;
     }
+    case GEOMETRY_EXPANDER_OUTPUT_TYPE_DERIVED: {
+      return StringRef("Derived ▶ ") + expander_output.derived_identifier;
+    }
   }
   return "";
 }
diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc
index 66047aa76bb..c71805bddf9 100644
--- a/source/blender/editors/space_node/node_edit.cc
+++ b/source/blender/editors/space_node/node_edit.cc
@@ -3035,6 +3035,22 @@ static void foreach_available_attribute(
     STRNCPY(attribute.builtin_identifier, "material_index");
     callback(attribute);
   }
+  {
+    GeometryExpanderOutput attribute;
+    attribute.type = GEOMETRY_EXPANDER_OUTPUT_TYPE_DERIVED;
+    attribute.socket_type = SOCK_VECTOR;
+    attribute.array_source = GEOMETRY_EXPANDER_ARRAY_SOURCE_MESH_VERTICES;
+    STRNCPY(attribute.derived_identifier, "normal");
+    callback(attribute);
+  }
+  {
+    GeometryExpanderOutput attribute;
+    attribute.type = GEOMETRY_EXPANDER_OUTPUT_TYPE_DERIVED;
+    attribute.socket_type = SOCK_INT;
+    attribute.array_source = GEOMETRY_EXPANDER_ARRAY_SOURCE_MESH_VERTICES;
+    STRNCPY(attribute.derived_identifier, "index");
+    callback(attribute);
+  }
 }
 
 static MutableSpan<GeometryExpanderOutput> get_updated_cached_available_attributes(
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 99072e48081..b0b222f5b4c 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1440,6 +1440,7 @@ typedef enum eGeometryExpanderOutputType {
   GEOMETRY_EXPANDER_OUTPUT_TYPE_LOCAL,
   GEOMETRY_EXPANDER_OUTPUT_TYPE_INPUT,
   GEOMETRY_EXPANDER_OUTPUT_TYPE_BUILTIN,
+  GEOMETRY_EXPANDER_OUTPUT_TYPE_DERIVED,
 } eGeometryExpanderOutputType;
 
 typedef enum eGeometryExpanderArraySource {
@@ -1481,6 +1482,9 @@ typedef struct GeometryExpanderOutput {
 
   /* Builtin attribute data. */
   char builtin_identifier[64];
+
+  /* Derived data. */
+  char derived_identifier[64];
 } GeometryExpanderOutput;
 
 typedef struct NodeGeometryGeometryExpander {
diff --git a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
index deaebb31bff..eca47d6981e 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
@@ -200,6 +200,32 @@ static void geo_node_geometry_expander_exec(GeoNodeExecParams params)
           }
           break;
         }
+        case GEOMETRY_EXPANDER_OUTPUT_TYPE_DERIVED: {
+          const StringRef identifier = expander_output->derived_identifier;
+          if (identifier == "index") {
+            array_cpp_type->array_construct_uninitialized(buffer, domain_size);
+            MutableSpan<int> indices = array_cpp_type->array_span(buffer).typed<int>();
+            for (int i : indices.index_range()) {
+              indices[i] = i;
+            }
+          }
+          else if (identifier == "normal") {
+            if (component->attribute_exists("normal")) {
+              GVArray_Typed<float3> normals = component->attribute_get_for_read<float3>(
+                  "normal", domain, {0, 0, 0});
+              array_cpp_type->array_construct_uninitialized(buffer, domain_size);
+              normals->materialize_to_uninitialized(
+                  array_cpp_type->array_span(buffer).typed<float3>());
+            }
+            else {
+              array_cpp_type->default_construct(buffer);
+            }
+          }
+          else {
+            array_cpp_type->default_construct(buffer);
+          }
+          break;
+        }
       }
     }



More information about the Bf-blender-cvs mailing list