Blender  V3.3
Classes | Functions | Variables
MOD_nodes.cc File Reference
#include <cstring>
#include <iostream>
#include <string>
#include "MEM_guardedalloc.h"
#include "BLI_array.hh"
#include "BLI_listbase.h"
#include "BLI_math_vec_types.hh"
#include "BLI_multi_value_map.hh"
#include "BLI_set.hh"
#include "BLI_string.h"
#include "BLI_string_search.h"
#include "BLI_utildefines.h"
#include "DNA_collection_types.h"
#include "DNA_curves_types.h"
#include "DNA_defaults.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_pointcloud_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_windowmanager_types.h"
#include "BKE_attribute_math.hh"
#include "BKE_customdata.h"
#include "BKE_geometry_fields.hh"
#include "BKE_geometry_set_instances.hh"
#include "BKE_global.h"
#include "BKE_idprop.h"
#include "BKE_lib_id.h"
#include "BKE_lib_query.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_node_runtime.hh"
#include "BKE_node_tree_update.h"
#include "BKE_object.h"
#include "BKE_pointcloud.h"
#include "BKE_screen.h"
#include "BKE_simulation.h"
#include "BKE_workspace.h"
#include "BLO_read_write.h"
#include "UI_interface.h"
#include "UI_interface.hh"
#include "UI_resources.h"
#include "BLT_translation.h"
#include "WM_types.h"
#include "RNA_access.h"
#include "RNA_enum_types.h"
#include "RNA_prototypes.h"
#include "DEG_depsgraph_build.h"
#include "DEG_depsgraph_query.h"
#include "MOD_modifiertypes.h"
#include "MOD_nodes.h"
#include "MOD_nodes_evaluator.hh"
#include "MOD_ui_common.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_spreadsheet.h"
#include "ED_undo.h"
#include "NOD_derived_node_tree.hh"
#include "NOD_geometry.h"
#include "NOD_geometry_nodes_eval_log.hh"
#include "NOD_node_declaration.hh"
#include "FN_field.hh"
#include "FN_field_cpp_type.hh"
#include "FN_multi_function.hh"

Go to the source code of this file.

Classes

struct  OutputAttributeInfo
 
struct  OutputAttributeToStore
 
struct  AttributeSearchData
 

Functions

static void initData (ModifierData *md)
 
static void add_used_ids_from_sockets (const ListBase &sockets, Set< ID * > &ids)
 
static bool node_needs_own_transform_relation (const bNode &node)
 
static void process_nodes_for_depsgraph (const bNodeTree &tree, Set< ID * > &ids, bool &r_needs_own_transform_relation)
 
static void find_used_ids_from_settings (const NodesModifierSettings &settings, Set< ID * > &ids)
 
static void add_collection_relation (const ModifierUpdateDepsgraphContext *ctx, Collection &collection)
 
static void add_object_relation (const ModifierUpdateDepsgraphContext *ctx, Object &object)
 
static void updateDepsgraph (ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 
static bool check_tree_for_time_node (const bNodeTree &tree, Set< const bNodeTree * > &r_checked_trees)
 
static bool dependsOnTime (struct Scene *UNUSED(scene), ModifierData *md)
 
static void foreachIDLink (ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
 
static void foreachTexLink (ModifierData *md, Object *ob, TexWalkFunc walk, void *userData)
 
static bool isDisabled (const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
 
static bool logging_enabled (const ModifierEvalContext *ctx)
 
static bool socket_type_has_attribute_toggle (const bNodeSocket &socket)
 
static bool input_has_attribute_toggle (const bNodeTree &node_tree, const int socket_index)
 
static IDProperty * id_property_create_from_socket (const bNodeSocket &socket)
 
static bool id_property_type_matches_socket (const bNodeSocket &socket, const IDProperty &property)
 
static void init_socket_cpp_value_from_property (const IDProperty &property, const eNodeSocketDatatype socket_value_type, void *r_value)
 
void MOD_nodes_update_interface (Object *object, NodesModifierData *nmd)
 
static void initialize_group_input (NodesModifierData &nmd, const OutputSocketRef &socket, void *r_value)
 
static Vector< SpaceSpreadsheet * > find_spreadsheet_editors (Main *bmain)
 
static void find_sockets_to_preview_for_spreadsheet (SpaceSpreadsheet *sspreadsheet, NodesModifierData *nmd, const ModifierEvalContext *ctx, const DerivedNodeTree &tree, Set< DSocket > &r_sockets_to_preview)
 
static void find_sockets_to_preview (NodesModifierData *nmd, const ModifierEvalContext *ctx, const DerivedNodeTree &tree, Set< DSocket > &r_sockets_to_preview)
 
static void clear_runtime_data (NodesModifierData *nmd)
 
static MultiValueMap< eAttrDomain, OutputAttributeInfo > find_output_attributes_to_store (const NodesModifierData &nmd, const NodeRef &output_node, Span< GMutablePointer > output_values)
 
static Vector< OutputAttributeToStore > compute_attributes_to_store (const GeometrySet &geometry, const MultiValueMap< eAttrDomain, OutputAttributeInfo > &outputs_by_domain)
 
static void store_computed_output_attributes (GeometrySet &geometry, const Span< OutputAttributeToStore > attributes_to_store)
 
static void store_output_attributes (GeometrySet &geometry, const NodesModifierData &nmd, const NodeRef &output_node, Span< GMutablePointer > output_values)
 
static GeometrySet compute_geometry (const DerivedNodeTree &tree, Span< const NodeRef * > group_input_nodes, const NodeRef &output_node, GeometrySet input_geometry_set, NodesModifierData *nmd, const ModifierEvalContext *ctx)
 
static void check_property_socket_sync (const Object *ob, ModifierData *md)
 
static void modifyGeometry (ModifierData *md, const ModifierEvalContext *ctx, GeometrySet &geometry_set)
 
static Mesh * modifyMesh (ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
 
static void modifyGeometrySet (ModifierData *md, const ModifierEvalContext *ctx, GeometrySet *geometry_set)
 
 BLI_STATIC_ASSERT (std::is_trivially_destructible_v< AttributeSearchData >, "")
 
static NodesModifierData * get_modifier_data (Main &bmain, const wmWindowManager &wm, const AttributeSearchData &data)
 
static void attribute_search_update_fn (const bContext *C, void *arg, const char *str, uiSearchItems *items, const bool is_first)
 
static void attribute_search_exec_fn (bContext *C, void *data_v, void *item_v)
 
static void add_attribute_search_button (const bContext &C, uiLayout *layout, const NodesModifierData &nmd, PointerRNA *md_ptr, const StringRefNull rna_path_attribute_name, const bNodeSocket &socket, const bool is_output)
 
static void add_attribute_search_or_value_buttons (const bContext &C, uiLayout *layout, const NodesModifierData &nmd, PointerRNA *md_ptr, const bNodeSocket &socket)
 
static void draw_property_for_socket (const bContext &C, uiLayout *layout, NodesModifierData *nmd, PointerRNA *bmain_ptr, PointerRNA *md_ptr, const bNodeSocket &socket, const int socket_index)
 
static void draw_property_for_output_socket (const bContext &C, uiLayout *layout, const NodesModifierData &nmd, PointerRNA *md_ptr, const bNodeSocket &socket)
 
static void panel_draw (const bContext *C, Panel *panel)
 
static void output_attribute_panel_draw (const bContext *C, Panel *panel)
 
static void internal_dependencies_panel_draw (const bContext *UNUSED(C), Panel *panel)
 
static void panelRegister (ARegionType *region_type)
 
static void blendWrite (BlendWriter *writer, const ID *UNUSED(id_owner), const ModifierData *md)
 
static void blendRead (BlendDataReader *reader, ModifierData *md)
 
static void copyData (const ModifierData *md, ModifierData *target, const int flag)
 
static void freeData (ModifierData *md)
 
static void requiredDataMask (Object *UNUSED(ob), ModifierData *UNUSED(md), CustomData_MeshMasks *r_cddata_masks)
 

Variables

static const CustomData_MeshMasks dependency_data_mask
 
static const std::string use_attribute_suffix = "_use_attribute"
 
static const std::string attribute_name_suffix = "_attribute_name"
 
ModifierTypeInfo modifierType_Nodes
 

Function Documentation

◆ add_attribute_search_button()

static void add_attribute_search_button ( const bContext &  C,
uiLayout *  layout,
const NodesModifierData &  nmd,
PointerRNA *  md_ptr,
const StringRefNull  rna_path_attribute_name,
const bNodeSocket &  socket,
const bool  is_output 
)
static

◆ add_attribute_search_or_value_buttons()

static void add_attribute_search_or_value_buttons ( const bContext &  C,
uiLayout *  layout,
const NodesModifierData &  nmd,
PointerRNA *  md_ptr,
const bNodeSocket &  socket 
)
static

◆ add_collection_relation()

static void add_collection_relation ( const ModifierUpdateDepsgraphContext *  ctx,
Collection &  collection 
)
static

◆ add_object_relation()

static void add_object_relation ( const ModifierUpdateDepsgraphContext *  ctx,
Object &  object 
)
static

◆ add_used_ids_from_sockets()

static void add_used_ids_from_sockets ( const ListBase &  sockets,
Set< ID * > &  ids 
)
static

◆ attribute_search_exec_fn()

static void attribute_search_exec_fn ( bContext *  C,
void *  data_v,
void *  item_v 
)
static

◆ attribute_search_update_fn()

static void attribute_search_update_fn ( const bContext *  C,
void *  arg,
const char *  str,
uiSearchItems *  items,
const bool  is_first 
)
static

◆ blendRead()

static void blendRead ( BlendDataReader *  reader,
ModifierData *  md 
)
static

◆ blendWrite()

static void blendWrite ( BlendWriter *  writer,
const ID *  UNUSEDid_owner,
const ModifierData *  md 
)
static

◆ BLI_STATIC_ASSERT()

BLI_STATIC_ASSERT ( std::is_trivially_destructible_v< AttributeSearchData >  ,
""   
)

◆ check_property_socket_sync()

static void check_property_socket_sync ( const Object *  ob,
ModifierData *  md 
)
static
Note
This could be done in initialize_group_input, though that would require adding the the object as a parameter, so it's likely better to this check as a separate step.

Definition at line 1183 of file MOD_nodes.cc.

References BKE_modifier_set_error(), ListBase::first, id_property_type_matches_socket(), IDP_GetPropertyFromGroup(), bNodeTree::inputs, LISTBASE_FOREACH_INDEX, ModifierData::name, NodesModifierData::node_group, NodesModifierSettings::properties, NodesModifierData::settings, and SOCK_GEOMETRY.

Referenced by modifyGeometry().

◆ check_tree_for_time_node()

static bool check_tree_for_time_node ( const bNodeTree &  tree,
Set< const bNodeTree * > &  r_checked_trees 
)
static

◆ clear_runtime_data()

static void clear_runtime_data ( NodesModifierData *  nmd)
static

Definition at line 922 of file MOD_nodes.cc.

References NodesModifierData::runtime_eval_log.

Referenced by compute_geometry(), and freeData().

◆ compute_attributes_to_store()

static Vector<OutputAttributeToStore> compute_attributes_to_store ( const GeometrySet &  geometry,
const MultiValueMap< eAttrDomain, OutputAttributeInfo > &  outputs_by_domain 
)
static

◆ compute_geometry()

static GeometrySet compute_geometry ( const DerivedNodeTree &  tree,
Span< const NodeRef * >  group_input_nodes,
const NodeRef &  output_node,
GeometrySet  input_geometry_set,
NodesModifierData *  nmd,
const ModifierEvalContext *  ctx 
)
static

Evaluate a node group to compute the output geometry.

Definition at line 1089 of file MOD_nodes.cc.

References blender::Map< Key, Value, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add_new(), blender::CPPType::alignment(), blender::LinearAllocator< Allocator >::allocate(), blender::Vector< T, InlineBufferCapacity, Allocator >::append(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::begin(), BKE_modifier_get_original(), blender::nodes::SocketRef::bsocket(), GeometrySet::clear(), clear_runtime_data(), blender::LinearAllocator< Allocator >::construct(), ModifierEvalContext::depsgraph, blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::depsgraph, blender::GMutablePointer::destruct(), blender::Span< T >::drop_back(), blender::Span< T >::drop_front(), blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::end(), blender::modifiers::geometry_nodes::evaluate_geometry_nodes(), blender::Vector< T, InlineBufferCapacity, Allocator >::extend(), find_sockets_to_preview(), blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::force_compute_sockets, blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::geo_logger, initialize_group_input(), blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::input_values, blender::nodes::NodeRef::inputs(), blender::Span< T >::is_empty(), blender::ResourceScope::linear_allocator(), logging_enabled(), blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::mf_by_node, NodesModifierData::modifier, blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::modifier_, ModifierEvalContext::object, blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::output_sockets, blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::r_output_values, NodesModifierData::runtime_eval_log, blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams::self_object, blender::CPPType::size(), SOCK_GEOMETRY, store_output_attributes(), tree, and bNodeSocket::type.

Referenced by modifyGeometry().

◆ copyData()

static void copyData ( const ModifierData *  md,
ModifierData *  target,
const int  flag 
)
static

◆ dependsOnTime()

static bool dependsOnTime ( struct Scene *  UNUSEDscene,
ModifierData *  md 
)
static

Definition at line 334 of file MOD_nodes.cc.

References check_tree_for_time_node(), NodesModifierData::node_group, and tree.

◆ draw_property_for_output_socket()

static void draw_property_for_output_socket ( const bContext &  C,
uiLayout *  layout,
const NodesModifierData &  nmd,
PointerRNA *  md_ptr,
const bNodeSocket &  socket 
)
static

◆ draw_property_for_socket()

static void draw_property_for_socket ( const bContext &  C,
uiLayout *  layout,
NodesModifierData *  nmd,
PointerRNA *  bmain_ptr,
PointerRNA *  md_ptr,
const bNodeSocket &  socket,
const int  socket_index 
)
static

◆ find_output_attributes_to_store()

static MultiValueMap<eAttrDomain, OutputAttributeInfo> find_output_attributes_to_store ( const NodesModifierData &  nmd,
const NodeRef &  output_node,
Span< GMutablePointer >  output_values 
)
static

◆ find_sockets_to_preview()

static void find_sockets_to_preview ( NodesModifierData *  nmd,
const ModifierEvalContext *  ctx,
const DerivedNodeTree &  tree,
Set< DSocket > &  r_sockets_to_preview 
)
static

◆ find_sockets_to_preview_for_spreadsheet()

static void find_sockets_to_preview_for_spreadsheet ( SpaceSpreadsheet *  sspreadsheet,
NodesModifierData *  nmd,
const ModifierEvalContext *  ctx,
const DerivedNodeTree &  tree,
Set< DSocket > &  r_sockets_to_preview 
)
static

◆ find_spreadsheet_editors()

static Vector<SpaceSpreadsheet *> find_spreadsheet_editors ( Main *  bmain)
static

◆ find_used_ids_from_settings()

static void find_used_ids_from_settings ( const NodesModifierSettings &  settings,
Set< ID * > &  ids 
)
static

◆ foreachIDLink()

static void foreachIDLink ( ModifierData *  md,
Object *  ob,
IDWalkFunc  walk,
void *  userData 
)
static

◆ foreachTexLink()

static void foreachTexLink ( ModifierData *  md,
Object *  ob,
TexWalkFunc  walk,
void *  userData 
)
static

Definition at line 367 of file MOD_nodes.cc.

◆ freeData()

static void freeData ( ModifierData *  md)
static

◆ get_modifier_data()

static NodesModifierData* get_modifier_data ( Main &  bmain,
const wmWindowManager &  wm,
const AttributeSearchData &  data 
)
static

◆ id_property_create_from_socket()

static IDProperty* id_property_create_from_socket ( const bNodeSocket &  socket)
static

◆ id_property_type_matches_socket()

static bool id_property_type_matches_socket ( const bNodeSocket &  socket,
const IDProperty &  property 
)
static

◆ init_socket_cpp_value_from_property()

static void init_socket_cpp_value_from_property ( const IDProperty &  property,
const eNodeSocketDatatype  socket_value_type,
void *  r_value 
)
static

◆ initData()

static void initData ( ModifierData *  md)
static

◆ initialize_group_input()

static void initialize_group_input ( NodesModifierData &  nmd,
const OutputSocketRef &  socket,
void *  r_value 
)
static

◆ input_has_attribute_toggle()

static bool input_has_attribute_toggle ( const bNodeTree &  node_tree,
const int  socket_index 
)
static
Returns
Whether using an attribute to input values of this type is supported, and the node group's input for this socket accepts a field rather than just single values.

Definition at line 411 of file MOD_nodes.cc.

References BLI_assert, and blender::nodes::FieldInferencingInterface::inputs.

Referenced by draw_property_for_socket(), and initialize_group_input().

◆ internal_dependencies_panel_draw()

static void internal_dependencies_panel_draw ( const bContext *  UNUSEDC,
Panel *  panel 
)
static

◆ isDisabled()

static bool isDisabled ( const struct Scene *  UNUSEDscene,
ModifierData *  md,
bool   UNUSEDuseRenderParams 
)
static

Definition at line 372 of file MOD_nodes.cc.

References NodesModifierData::node_group.

◆ logging_enabled()

static bool logging_enabled ( const ModifierEvalContext *  ctx)
static

◆ MOD_nodes_update_interface()

void MOD_nodes_update_interface ( struct Object *  object,
struct NodesModifierData *  nmd 
)

◆ modifyGeometry()

static void modifyGeometry ( ModifierData *  md,
const ModifierEvalContext *  ctx,
GeometrySet &  geometry_set 
)
static

◆ modifyGeometrySet()

static void modifyGeometrySet ( ModifierData *  md,
const ModifierEvalContext *  ctx,
GeometrySet *  geometry_set 
)
static

Definition at line 1312 of file MOD_nodes.cc.

References modifyGeometry().

◆ modifyMesh()

static Mesh* modifyMesh ( ModifierData *  md,
const ModifierEvalContext *  ctx,
Mesh *  mesh 
)
static

◆ node_needs_own_transform_relation()

static bool node_needs_own_transform_relation ( const bNode &  node)
static
Note
We can only check properties here that cause the dependency graph to update relations when they are changed, otherwise there may be a missing relation after editing. So this could check more properties like whether the node is muted, but we would have to accept the cost of updating relations when those properties are changed.

Definition at line 180 of file MOD_nodes.cc.

References GEO_NODE_COLLECTION_INFO, GEO_NODE_DEFORM_CURVES_ON_SURFACE, GEO_NODE_OBJECT_INFO, GEO_NODE_TRANSFORM_SPACE_RELATIVE, node, NodeGeometryObjectInfo::transform_space, and NodeGeometryCollectionInfo::transform_space.

Referenced by process_nodes_for_depsgraph().

◆ output_attribute_panel_draw()

static void output_attribute_panel_draw ( const bContext *  C,
Panel *  panel 
)
static

◆ panel_draw()

static void panel_draw ( const bContext *  C,
Panel *  panel 
)
static

◆ panelRegister()

static void panelRegister ( ARegionType *  region_type)
static

◆ process_nodes_for_depsgraph()

static void process_nodes_for_depsgraph ( const bNodeTree &  tree,
Set< ID * > &  ids,
bool &  r_needs_own_transform_relation 
)
static

◆ requiredDataMask()

static void requiredDataMask ( Object *  UNUSEDob,
ModifierData *  UNUSEDmd,
CustomData_MeshMasks *  r_cddata_masks 
)
static

Definition at line 1817 of file MOD_nodes.cc.

References CD_MASK_MDEFORMVERT, CD_MASK_PROP_ALL, and CustomData_MeshMasks::vmask.

◆ socket_type_has_attribute_toggle()

static bool socket_type_has_attribute_toggle ( const bNodeSocket &  socket)
static
Returns
Whether using an attribute to input values of this type is supported.

Definition at line 402 of file MOD_nodes.cc.

References ELEM, SOCK_BOOLEAN, SOCK_FLOAT, SOCK_INT, SOCK_RGBA, SOCK_VECTOR, and bNodeSocket::type.

Referenced by find_output_attributes_to_store(), MOD_nodes_update_interface(), and output_attribute_panel_draw().

◆ store_computed_output_attributes()

static void store_computed_output_attributes ( GeometrySet &  geometry,
const Span< OutputAttributeToStore >  attributes_to_store 
)
static

◆ store_output_attributes()

static void store_output_attributes ( GeometrySet &  geometry,
const NodesModifierData &  nmd,
const NodeRef &  output_node,
Span< GMutablePointer >  output_values 
)
static

◆ updateDepsgraph()

static void updateDepsgraph ( ModifierData *  md,
const ModifierUpdateDepsgraphContext *  ctx 
)
static

Variable Documentation

◆ attribute_name_suffix

const std::string attribute_name_suffix = "_attribute_name"
static

◆ dependency_data_mask

const CustomData_MeshMasks dependency_data_mask
static

◆ modifierType_Nodes

ModifierTypeInfo modifierType_Nodes

Definition at line 1827 of file MOD_nodes.cc.

◆ use_attribute_suffix

const std::string use_attribute_suffix = "_use_attribute"
static