Blender  V3.3
node_geo_object_info.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include "BLI_math_matrix.h"
4 
6 
7 #include "UI_interface.h"
8 #include "UI_resources.h"
9 
10 #include "node_geometry_util.hh"
11 
13 
15 
17 {
18  b.add_input<decl::Object>(N_("Object")).hide_label();
19  b.add_input<decl::Bool>(N_("As Instance"))
20  .description(N_("Output the entire object as single instance. "
21  "This allows instancing non-geometry object types"));
22  b.add_output<decl::Vector>(N_("Location"));
23  b.add_output<decl::Vector>(N_("Rotation"));
24  b.add_output<decl::Vector>(N_("Scale"));
25  b.add_output<decl::Geometry>(N_("Geometry"));
26 }
27 
28 static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
29 {
30  uiItemR(layout, ptr, "transform_space", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
31 }
32 
34 {
35  const NodeGeometryObjectInfo &storage = node_storage(params.node());
36  const bool transform_space_relative = (storage.transform_space ==
38 
39  Object *object = params.get_input<Object *>("Object");
40 
41  const Object *self_object = params.self_object();
42  if (object == nullptr) {
43  params.set_default_remaining_outputs();
44  return;
45  }
46 
47  const float4x4 &object_matrix = object->obmat;
48  const float4x4 transform = float4x4(self_object->imat) * object_matrix;
49 
50  if (transform_space_relative) {
51  params.set_output("Location", transform.translation());
52  params.set_output("Rotation", transform.to_euler());
53  params.set_output("Scale", transform.scale());
54  }
55  else {
56  params.set_output("Location", object_matrix.translation());
57  params.set_output("Rotation", object_matrix.to_euler());
58  params.set_output("Scale", object_matrix.scale());
59  }
60 
61  if (params.output_is_required("Geometry")) {
62  if (object == self_object) {
63  params.error_message_add(NodeWarningType::Error,
64  TIP_("Geometry cannot be retrieved from the modifier object"));
65  params.set_default_remaining_outputs();
66  return;
67  }
68 
69  GeometrySet geometry_set;
70  if (params.get_input<bool>("As Instance")) {
72  const int handle = instances.add_reference(*object);
73  if (transform_space_relative) {
74  instances.add_instance(handle, transform);
75  }
76  else {
77  instances.add_instance(handle, float4x4::identity());
78  }
79  }
80  else {
81  geometry_set = bke::object_get_evaluated_geometry_set(*object);
82  if (transform_space_relative) {
83  transform_geometry_set(params, geometry_set, transform, *params.depsgraph());
84  }
85  }
86 
87  params.set_output("Geometry", geometry_set);
88  }
89 }
90 
92 {
93  NodeGeometryObjectInfo *data = MEM_cnew<NodeGeometryObjectInfo>(__func__);
94  data->transform_space = GEO_NODE_TRANSFORM_SPACE_ORIGINAL;
95  node->storage = data;
96 }
97 
98 } // namespace blender::nodes::node_geo_object_info_cc
99 
101 {
102  namespace file_ns = blender::nodes::node_geo_object_info_cc;
103 
104  static bNodeType ntype;
105 
109  &ntype, "NodeGeometryObjectInfo", node_free_standard_storage, node_copy_standard_storage);
113  nodeRegisterType(&ntype);
114 }
#define GEO_NODE_OBJECT_INFO
Definition: BKE_node.h:1386
#define NODE_STORAGE_FUNCS(StorageT)
Definition: BKE_node.h:1563
void node_type_init(struct bNodeType *ntype, void(*initfunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4390
void node_type_storage(struct bNodeType *ntype, const char *storagename, void(*freefunc)(struct bNode *node), void(*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, const struct bNode *src_node))
Definition: node.cc:4426
#define NODE_CLASS_INPUT
Definition: BKE_node.h:345
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
#define UNUSED(x)
#define TIP_(msgid)
@ GEO_NODE_TRANSFORM_SPACE_RELATIVE
@ GEO_NODE_TRANSFORM_SPACE_ORIGINAL
float float4x4[4][4]
@ UI_ITEM_R_EXPAND
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
int add_reference(const InstanceReference &reference)
void add_instance(int instance_handle, const blender::float4x4 &transform)
OperationNode * node
void * tree
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
GeometrySet object_get_evaluated_geometry_set(const Object &object)
static void node_node_init(bNodeTree *UNUSED(tree), bNode *node)
static void node_declare(NodeDeclarationBuilder &b)
static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
static void node_geo_exec(GeoNodeExecParams params)
void transform_geometry_set(GeoNodeExecParams &params, GeometrySet &geometry, const float4x4 &transform, const Depsgraph &depsgraph)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
void register_node_type_geo_object_info()
void geo_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
void node_copy_standard_storage(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
Definition: node_util.c:55
void node_free_standard_storage(bNode *node)
Definition: node_util.c:43
GeometryComponent & get_component_for_write(GeometryComponentType component_type)
Defines a node type.
Definition: BKE_node.h:226
NodeGeometryExecFunction geometry_node_execute
Definition: BKE_node.h:316
void(* draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:244
NodeDeclareFunction declare
Definition: BKE_node.h:324
float3 scale() const
float3 translation() const
static float4x4 identity()
Definition: BLI_float4x4.hh:80
float3 to_euler() const
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480