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 IDPropertyid_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, OutputAttributeInfofind_output_attributes_to_store (const NodesModifierData &nmd, const NodeRef &output_node, Span< GMutablePointer > output_values)
 
static Vector< OutputAttributeToStorecompute_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 MeshmodifyMesh (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 NodesModifierDataget_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