Geometry Nodes: Deprecate old Instance Transformation nodes in menu #120343

Closed
Iliya Katushenock wants to merge 8 commits from mod_moder:deprecate_in_menu into main

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

View File

@ -298,22 +298,34 @@ class NODE_MT_geometry_node_GEO_INPUT_SCENE(Menu):
node_add_menu.draw_assets_for_catalog(layout, "Input/Scene")
class NODE_MT_geometry_node_GEO_INSTANCE(Menu):
bl_idname = "NODE_MT_geometry_node_GEO_INSTANCE"
bl_label = "Instances"
class NODE_MT_geometry_node_GEO_INSTANCE_DEPRECATED(Menu):
bl_idname = "NODE_MT_geometry_node_GEO_INSTANCE_DEPRECATED"
bl_label = "Deprecated"
def draw(self, _context):
layout = self.layout
node_add_menu.add_node_type(layout, "GeometryNodeInstanceOnPoints")
node_add_menu.add_node_type(layout, "GeometryNodeInstancesToPoints")
layout.separator()
node_add_menu.add_node_type(layout, "GeometryNodeRealizeInstances")
node_add_menu.add_node_type(layout, "GeometryNodeRotateInstances")
node_add_menu.add_node_type(layout, "GeometryNodeScaleInstances")
node_add_menu.add_node_type(layout, "GeometryNodeTranslateInstances")
layout.separator()
node_add_menu.add_node_type(layout, "GeometryNodeInputInstanceRotation")
node_add_menu.add_node_type(layout, "GeometryNodeInputInstanceScale")
class NODE_MT_geometry_node_GEO_INSTANCE(Menu):
bl_idname = "NODE_MT_geometry_node_GEO_INSTANCE"
bl_label = "Instances"
def draw(self, context):
layout = self.layout
node_add_menu.add_node_type(layout, "GeometryNodeInstanceOnPoints")
node_add_menu.add_node_type(layout, "GeometryNodeInstancesToPoints")
layout.separator()
node_add_menu.add_node_type(layout, "GeometryNodeRealizeInstances")
node_add_menu.add_node_type(layout, "GeometryNodeTransformInstances")
layout.separator()
node_add_menu.add_node_type(layout, "GeometryNodeInstanceTransform")
layout.menu("NODE_MT_geometry_node_GEO_INSTANCE_DEPRECATED")
node_add_menu.draw_assets_for_catalog(layout, self.bl_label)
@ -794,6 +806,7 @@ classes = (
NODE_MT_geometry_node_GEO_GEOMETRY_OPERATIONS,
NODE_MT_geometry_node_GEO_GEOMETRY_SAMPLE,
NODE_MT_geometry_node_GEO_INSTANCE,
NODE_MT_geometry_node_GEO_INSTANCE_DEPRECATED,
NODE_MT_geometry_node_GEO_MESH,
NODE_MT_geometry_node_GEO_MESH_READ,
NODE_MT_geometry_node_GEO_MESH_SAMPLE,

View File

@ -1268,6 +1268,8 @@ void BKE_nodetree_remove_layer_n(bNodeTree *ntree, Scene *scene, int layer_index
#define GEO_NODE_POINTS_TO_SDF_GRID 2128
#define GEO_NODE_GRID_TO_MESH 2129
#define GEO_NODE_DISTRIBUTE_POINTS_IN_GRID 2130
#define GEO_NODE_TRANSFORM_INSTANCES 2131
#define GEO_NODE_INPUT_INSTANCE_TRANSFORM 2132
/** \} */

View File

@ -1546,7 +1546,7 @@ static void std_node_socket_interface_draw(ID *id,
const bNodeTree *node_tree = reinterpret_cast<const bNodeTree *>(id);
if (interface_socket->flag & NODE_INTERFACE_SOCKET_INPUT && node_tree->type == NTREE_GEOMETRY) {
if (ELEM(type, SOCK_INT, SOCK_VECTOR)) {
if (ELEM(type, SOCK_INT, SOCK_VECTOR, SOCK_MATRIX)) {
uiItemR(col, &ptr, "default_input", DEFAULT_FLAGS, nullptr, ICON_NONE);
}
}

View File

@ -580,6 +580,7 @@ void position(const bNode &node, void *r_value);
void normal(const bNode &node, void *r_value);
void index(const bNode &node, void *r_value);
void id_or_index(const bNode &node, void *r_value);
void transform(const bNode &node, void *r_value);
} // namespace implicit_field_inputs
void build_node_declaration(const bNodeType &typeinfo,

View File

@ -358,6 +358,7 @@ DefNode(GeometryNode, GEO_NODE_INPUT_INDEX, 0, "INDEX", InputIndex, "Index", "Re
DefNode(GeometryNode, GEO_NODE_INPUT_INSTANCE_ROTATION, 0, "INPUT_INSTANCE_ROTATION", InputInstanceRotation, "Instance Rotation", "Retrieve the rotation of each instance in the geometry")
DefNode(GeometryNode, GEO_NODE_INPUT_INSTANCE_SCALE, 0, "INPUT_INSTANCE_SCALE", InputInstanceScale, "Instance Scale", "Retrieve the scale of each instance in the geometry")
DefNode(GeometryNode, GEO_NODE_INPUT_MATERIAL_INDEX, 0, "INPUT_MATERIAL_INDEX", InputMaterialIndex, "Material Index", "Retrieve the index of the material used for each element in the geometry's list of materials")
DefNode(GeometryNode, GEO_NODE_INPUT_INSTANCE_TRANSFORM, 0, "INPUT_INSTANCE_TRANSFORM", InstanceTransform, "Instance Transform", "")
DefNode(GeometryNode, GEO_NODE_INPUT_MATERIAL, def_geo_input_material, "INPUT_MATERIAL", InputMaterial, "Material", "Output a single material")
DefNode(GeometryNode, GEO_NODE_INPUT_MESH_EDGE_ANGLE, 0, "MESH_EDGE_ANGLE", InputMeshEdgeAngle, "Edge Angle", "Calculate the surface area of each face in a mesh")
DefNode(GeometryNode, GEO_NODE_INPUT_MESH_EDGE_NEIGHBORS, 0, "MESH_EDGE_NEIGHBORS",InputMeshEdgeNeighbors, "Edge Neighbors", "Retrieve the number of faces that use each edge as one of their sides")
@ -468,6 +469,7 @@ DefNode(GeometryNode, GEO_NODE_TOOL_SELECTION, 0, "TOOL_SELECTION", ToolSelectio
DefNode(GeometryNode, GEO_NODE_TOOL_SET_FACE_SET, 0, "TOOL_SET_FACE_SET", ToolSetFaceSet, "Set Face Set", "Set sculpt face set values for faces")
DefNode(GeometryNode, GEO_NODE_TOOL_SET_SELECTION, 0, "TOOL_SELECTION_SET", ToolSetSelection, "Set Selection", "Set selection of the edited geometry, for tool execution")
DefNode(GeometryNode, GEO_NODE_TRANSFORM_GEOMETRY, 0, "TRANSFORM_GEOMETRY", Transform, "Transform Geometry", "Translate, rotate or scale the geometry")
DefNode(GeometryNode, GEO_NODE_TRANSFORM_INSTANCES, 0, "TRANSFORM_INSTANCES", TransformInstances, "Transform Instances", "")
DefNode(GeometryNode, GEO_NODE_TRANSLATE_INSTANCES, 0, "TRANSLATE_INSTANCES",TranslateInstances, "Translate Instances", "Move top-level geometry instances in local or global space")
DefNode(GeometryNode, GEO_NODE_TRIANGULATE, 0, "TRIANGULATE", Triangulate, "Triangulate", "Convert all faces in a mesh to triangular faces")
DefNode(GeometryNode, GEO_NODE_TRIM_CURVE, 0, "TRIM_CURVE", TrimCurve, "Trim Curve", "Shorten curves by removing portions at the start or end")

View File

@ -94,6 +94,7 @@ set(SRC
nodes/node_geo_input_index.cc
nodes/node_geo_input_instance_rotation.cc
nodes/node_geo_input_instance_scale.cc
nodes/node_geo_input_instance_transform.cc
nodes/node_geo_input_material.cc
nodes/node_geo_input_material_index.cc
nodes/node_geo_input_mesh_edge_angle.cc
@ -197,6 +198,7 @@ set(SRC
nodes/node_geo_tool_set_face_set.cc
nodes/node_geo_tool_set_selection.cc
nodes/node_geo_transform_geometry.cc
nodes/node_geo_transform_instances.cc
nodes/node_geo_translate_instances.cc
nodes/node_geo_triangulate.cc
nodes/node_geo_uv_pack_islands.cc

View File

@ -0,0 +1,44 @@
/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "BKE_geometry_fields.hh"
#include "NOD_socket_search_link.hh"
#include "node_geometry_util.hh"
namespace blender::nodes::node_geo_input_instance_transform_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_output<decl::Matrix>("Transform").field_source();
}
static void search_link_ops(GatherLinkSearchOpParams &params)
{
if (U.experimental.use_new_matrix_socket) {
nodes::search_link_ops_for_basic_node(params);
}
}
static void node_geo_exec(GeoNodeExecParams params)
{
Field<float4x4> position_field{AttributeFieldInput::Create<float4x4>("instance_transform")};
params.set_output("Transform", std::move(position_field));
}
static void node_register()
{
static bNodeType ntype;
geo_node_type_base(
&ntype, GEO_NODE_INPUT_INSTANCE_TRANSFORM, "Instance Transform", NODE_CLASS_INPUT);
ntype.geometry_node_execute = node_geo_exec;
ntype.gather_link_search_ops = search_link_ops;
ntype.declare = node_declare;
nodeRegisterType(&ntype);
}
NOD_REGISTER_NODE(node_register)
} // namespace blender::nodes::node_geo_input_instance_transform_cc

View File

@ -0,0 +1,64 @@
/* SPDX-FileCopyrightText: 2023 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "BKE_geometry_fields.hh"
#include "BKE_geometry_set.hh"
#include "BKE_instances.hh"
#include "BLI_math_matrix.hh"
#include "NOD_socket_search_link.hh"
#include "node_geometry_util.hh"
namespace blender::nodes::node_geo_transform_instances_cc {
static void node_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Instances");
b.add_input<decl::Matrix>("Transform").implicit_field_on_all(implicit_field_inputs::transform);
b.add_input<decl::Bool>("Selection").default_value(true).hide_value().field_on_all();
b.add_output<decl::Geometry>("Instances").propagate_all();
}
static void search_link_ops(GatherLinkSearchOpParams &params)
{
if (U.experimental.use_new_matrix_socket) {
nodes::search_link_ops_for_basic_node(params);
}
}
static void node_geo_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Instances");
const Field<float4x4> transform_field = params.extract_input<Field<float4x4>>("Transform");
const Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
if (bke::Instances *instances = geometry_set.get_instances_for_write()) {
const bke::InstancesFieldContext context(*instances);
bke::try_capture_field_on_geometry(instances->attributes_for_write(),
context,
"instance_transform",
bke::AttrDomain::Instance,
selection_field,
transform_field);
}
params.set_output("Instances", std::move(geometry_set));
}
static void register_node()
{
static bNodeType ntype;
geo_node_type_base(
&ntype, GEO_NODE_TRANSFORM_INSTANCES, "Transform Instances", NODE_CLASS_GEOMETRY);
ntype.declare = node_declare;
ntype.gather_link_search_ops = search_link_ops;
ntype.geometry_node_execute = node_geo_exec;
nodeRegisterType(&ntype);
}
NOD_REGISTER_NODE(register_node)
} // namespace blender::nodes::node_geo_transform_instances_cc

View File

@ -842,6 +842,12 @@ void id_or_index(const bNode & /*node*/, void *r_value)
bke::SocketValueVariant(fn::Field<int>(std::make_shared<bke::IDAttributeFieldInput>()));
}
void transform(const bNode & /*node*/, void *r_value)
{
new (r_value)
bke::SocketValueVariant(bke::AttributeFieldInput::Create<float4x4>("instance_transform"));
}
} // namespace implicit_field_inputs
} // namespace blender::nodes