Geometry Nodes: Deprecate old Instance Transformation nodes in menu #120343
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
/** \} */
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ¶ms)
|
||||
{
|
||||
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
|
|
@ -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 ¶ms)
|
||||
{
|
||||
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
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue