Geometry Nodes: Object and Collection Input #106997

Open
DorianB wants to merge 3 commits from dodododorian/blender:missing_input_nodes into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
9 changed files with 133 additions and 19 deletions

View File

@ -246,10 +246,12 @@ class NODE_MT_geometry_node_GEO_INPUT_CONSTANT(Menu):
def draw(self, _context):
layout = self.layout
node_add_menu.add_node_type(layout, "FunctionNodeInputBool")
node_add_menu.add_node_type(layout, "GeometryNodeInputCollection")
node_add_menu.add_node_type(layout, "FunctionNodeInputColor")
node_add_menu.add_node_type(layout, "GeometryNodeInputImage")
node_add_menu.add_node_type(layout, "FunctionNodeInputInt")
node_add_menu.add_node_type(layout, "GeometryNodeInputMaterial")
node_add_menu.add_node_type(layout, "GeometryNodeInputObject")
node_add_menu.add_node_type(layout, "FunctionNodeInputString")
node_add_menu.add_node_type(layout, "ShaderNodeValue")
node_add_menu.add_node_type(layout, "FunctionNodeInputVector")

View File

@ -1575,6 +1575,8 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i
#define GEO_NODE_SDF_VOLUME_SPHERE 1196
#define GEO_NODE_MEAN_FILTER_SDF_VOLUME 1197
#define GEO_NODE_OFFSET_SDF_VOLUME 1198
#define GEO_NODE_INPUT_COLLECTION 1199
#define GEO_NODE_INPUT_OBJECT 1200
/** \} */
@ -1582,25 +1584,25 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i
/** \name Function Nodes
* \{ */
#define FN_NODE_BOOLEAN_MATH 1200
#define FN_NODE_COMPARE 1202
#define FN_NODE_LEGACY_RANDOM_FLOAT 1206
#define FN_NODE_INPUT_VECTOR 1207
#define FN_NODE_INPUT_STRING 1208
#define FN_NODE_FLOAT_TO_INT 1209
#define FN_NODE_VALUE_TO_STRING 1210
#define FN_NODE_STRING_LENGTH 1211
#define FN_NODE_SLICE_STRING 1212
#define FN_NODE_INPUT_SPECIAL_CHARACTERS 1213
#define FN_NODE_RANDOM_VALUE 1214
#define FN_NODE_ROTATE_EULER 1215
#define FN_NODE_ALIGN_EULER_TO_VECTOR 1216
#define FN_NODE_INPUT_COLOR 1217
#define FN_NODE_REPLACE_STRING 1218
#define FN_NODE_INPUT_BOOL 1219
#define FN_NODE_INPUT_INT 1220
#define FN_NODE_SEPARATE_COLOR 1221
#define FN_NODE_COMBINE_COLOR 1222
#define FN_NODE_BOOLEAN_MATH 1300
Review

Stumble on index conflict, unsure what's the procedure.

PS: index code gen would be nice in this file

Stumble on index conflict, unsure what's the procedure. PS: _index code gen would be nice in this file_
#define FN_NODE_COMPARE 1302
#define FN_NODE_LEGACY_RANDOM_FLOAT 1306
#define FN_NODE_INPUT_VECTOR 1307
#define FN_NODE_INPUT_STRING 1308
#define FN_NODE_FLOAT_TO_INT 1309
#define FN_NODE_VALUE_TO_STRING 1310
#define FN_NODE_STRING_LENGTH 1311
#define FN_NODE_SLICE_STRING 1312
#define FN_NODE_INPUT_SPECIAL_CHARACTERS 1313
#define FN_NODE_RANDOM_VALUE 1314
#define FN_NODE_ROTATE_EULER 1315
#define FN_NODE_ALIGN_EULER_TO_VECTOR 1316
#define FN_NODE_INPUT_COLOR 1317
#define FN_NODE_REPLACE_STRING 1318
#define FN_NODE_INPUT_BOOL 1319
#define FN_NODE_INPUT_INT 1320
#define FN_NODE_SEPARATE_COLOR 1321
#define FN_NODE_COMBINE_COLOR 1322
/** \} */

View File

@ -10567,6 +10567,32 @@ static void def_geo_sample_uv_surface(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
}
static void def_geo_input_collection(StructRNA *srna)
{
PropertyRNA *prop;
prop = RNA_def_property(srna, "collection", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "id");
RNA_def_property_struct_type(prop, "Collection");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_ui_text(prop, "Collection", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void def_geo_input_object(StructRNA *srna)
{
PropertyRNA *prop;
prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "id");
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
RNA_def_property_ui_text(prop, "Object", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void def_geo_input_material(StructRNA *srna)
{
PropertyRNA *prop;

View File

@ -325,6 +325,7 @@ DefNode(GeometryNode, GEO_NODE_GEOMETRY_TO_INSTANCE, 0, "GEOMETRY_TO_INSTANCE",
DefNode(GeometryNode, GEO_NODE_IMAGE_INFO, 0, "IMAGE_INFO", ImageInfo, "Image Info", "Retrieve information about an image")
DefNode(GeometryNode, GEO_NODE_IMAGE_TEXTURE, def_geo_image_texture, "IMAGE_TEXTURE", ImageTexture, "Image Texture", "Sample values from an image texture")
DefNode(GeometryNode, GEO_NODE_IMAGE, def_geo_image, "IMAGE", InputImage, "Image", "Input image")
DefNode(GeometryNode, GEO_NODE_INPUT_COLLECTION, def_geo_input_collection, "INPUT_COLLECTION", InputCollection, "Collection", "Output a single collection")
DefNode(GeometryNode, GEO_NODE_INPUT_CURVE_HANDLES, 0, "INPUT_CURVE_HANDLES", InputCurveHandlePositions,"Curve Handle Positions", "Retrieve the position of each Bézier control point's handles")
DefNode(GeometryNode, GEO_NODE_INPUT_CURVE_TILT, 0, "INPUT_CURVE_TILT", InputCurveTilt, "Curve Tilt", "Retrieve the angle at each control point used to twist the curve's normal around its tangent")
DefNode(GeometryNode, GEO_NODE_INPUT_ID, 0, "INPUT_ID", InputID, "ID", "Retrieve a stable random identifier value from the \"id\" attribute on the point domain, or the index if the attribute does not exist")
@ -343,6 +344,7 @@ DefNode(GeometryNode, GEO_NODE_INPUT_MESH_ISLAND, 0, "MESH_ISLAND", InputMeshIsl
DefNode(GeometryNode, GEO_NODE_INPUT_MESH_VERTEX_NEIGHBORS, 0, "MESH_VERTEX_NEIGHBORS", InputMeshVertexNeighbors, "Vertex Neighbors", "Retrieve topology information relating to each vertex of a mesh")
DefNode(GeometryNode, GEO_NODE_INPUT_NAMED_ATTRIBUTE, def_geo_input_named_attribute, "INPUT_ATTRIBUTE", InputNamedAttribute, "Named Attribute", "Retrieve the data of a specified attribute")
DefNode(GeometryNode, GEO_NODE_INPUT_NORMAL, 0, "INPUT_NORMAL", InputNormal, "Normal", "Retrieve a unit length vector indicating the direction pointing away from the geometry at each element")
DefNode(GeometryNode, GEO_NODE_INPUT_OBJECT, def_geo_input_object, "INPUT_OBJECT", InputObject, "Object", "Output a single object")
DefNode(GeometryNode, GEO_NODE_INPUT_POSITION, 0, "POSITION", InputPosition, "Position", "Retrieve a vector indicating the location of each element")
DefNode(GeometryNode, GEO_NODE_INPUT_RADIUS, 0, "INPUT_RADIUS", InputRadius, "Radius", "Retrieve the radius at each point on curve or point cloud geometry")
DefNode(GeometryNode, GEO_NODE_INPUT_SCENE_TIME, 0, "INPUT_SCENE_TIME", InputSceneTime, "Scene Time", "Retrieve the current time in the scene's animation in units of seconds or frames")

View File

@ -78,6 +78,7 @@ set(SRC
nodes/node_geo_image.cc
nodes/node_geo_image_info.cc
nodes/node_geo_image_texture.cc
nodes/node_geo_input_collection.cc
nodes/node_geo_input_curve_handles.cc
nodes/node_geo_input_curve_tilt.cc
nodes/node_geo_input_id.cc
@ -96,6 +97,7 @@ set(SRC
nodes/node_geo_input_mesh_vertex_neighbors.cc
nodes/node_geo_input_named_attribute.cc
nodes/node_geo_input_normal.cc
nodes/node_geo_input_object.cc
nodes/node_geo_input_position.cc
nodes/node_geo_input_radius.cc
nodes/node_geo_input_scene_time.cc

View File

@ -62,6 +62,7 @@ void register_geometry_nodes()
register_node_type_geo_image_info();
register_node_type_geo_image_texture();
register_node_type_geo_image();
register_node_type_geo_input_collection();
register_node_type_geo_input_curve_handles();
register_node_type_geo_input_curve_tilt();
register_node_type_geo_input_id();
@ -80,6 +81,7 @@ void register_geometry_nodes()
register_node_type_geo_input_mesh_vertex_neighbors();
register_node_type_geo_input_named_attribute();
register_node_type_geo_input_normal();
register_node_type_geo_input_object();
register_node_type_geo_input_position();
register_node_type_geo_input_radius();
register_node_type_geo_input_scene_time();

View File

@ -59,6 +59,7 @@ void register_node_type_geo_geometry_to_instance();
void register_node_type_geo_image_info();
void register_node_type_geo_image_texture();
void register_node_type_geo_image();
void register_node_type_geo_input_collection();
void register_node_type_geo_input_curve_handles();
void register_node_type_geo_input_curve_tilt();
void register_node_type_geo_input_id();
@ -77,6 +78,7 @@ void register_node_type_geo_input_mesh_island();
void register_node_type_geo_input_mesh_vertex_neighbors();
void register_node_type_geo_input_named_attribute();
void register_node_type_geo_input_normal();
void register_node_type_geo_input_object();
void register_node_type_geo_input_position();
void register_node_type_geo_input_radius();
void register_node_type_geo_input_scene_time();

View File

@ -0,0 +1,38 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "node_geometry_util.hh"
#include "UI_interface.h"
#include "UI_resources.h"
namespace blender::nodes::node_geo_input_collection_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_output<decl::Collection>(N_("Collection"));
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
{
uiItemR(layout, ptr, "collection", 0, "", ICON_NONE);
}
static void node_geo_exec(GeoNodeExecParams params)
{
params.set_output("Collection", reinterpret_cast<Collection *>(params.node().id));
}
} // namespace blender::nodes::node_geo_input_collection_cc
void register_node_type_geo_input_collection()
{
namespace file_ns = blender::nodes::node_geo_input_collection_cc;
static bNodeType ntype;
geo_node_type_base(&ntype, GEO_NODE_INPUT_COLLECTION, "Collection", NODE_CLASS_INPUT);
ntype.geometry_node_execute = file_ns::node_geo_exec;
ntype.draw_buttons = file_ns::node_layout;
ntype.declare = file_ns::node_declare;
nodeRegisterType(&ntype);
}

View File

@ -0,0 +1,38 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "node_geometry_util.hh"
#include "UI_interface.h"
#include "UI_resources.h"
namespace blender::nodes::node_geo_input_object_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_output<decl::Object>(N_("Object"));
}
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
{
uiItemR(layout, ptr, "object", 0, "", ICON_NONE);
}
static void node_geo_exec(GeoNodeExecParams params)
{
params.set_output("Object", reinterpret_cast<Object *>(params.node().id));
}
} // namespace blender::nodes::node_geo_input_object_cc
void register_node_type_geo_input_object()
{
namespace file_ns = blender::nodes::node_geo_input_object_cc;
static bNodeType ntype;
geo_node_type_base(&ntype, GEO_NODE_INPUT_OBJECT, "Object", NODE_CLASS_INPUT);
ntype.geometry_node_execute = file_ns::node_geo_exec;
ntype.draw_buttons = file_ns::node_layout;
ntype.declare = file_ns::node_declare;
nodeRegisterType(&ntype);
}