[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