47using bke::bNodeTreeZone;
48using bke::bNodeTreeZones;
54 this->
value.destruct();
60 if (
string.
size() <= 100) {
72 const std::shared_ptr<const fn::FieldInputs> &field_input_nodes = field.
node().field_inputs();
76 if (field_input_nodes) {
77 field_inputs.
extend(field_input_nodes->deduplicated_nodes.begin(),
78 field_input_nodes->deduplicated_nodes.end());
83 const int index_a = int(a.category());
84 const int index_b = int(b.category());
85 if (index_a == index_b) {
86 return a.socket_inspection_name().size() < b.socket_inspection_name().size();
88 return index_a < index_b;
91 for (
const FieldInput &field_input : field_inputs) {
92 this->input_tooltips.append(field_input.socket_inspection_name());
125 switch (component->type()) {
166 if (
const bke::GizmoEditHints *gizmo_edit_hints = edit_component.gizmo_edit_hints_.get()) {
174 if (
const Volume *volume = volume_component.get()) {
188 if (
const GreasePencil *grease_pencil = grease_pencil_component.get()) {
190 info.
layers_num = grease_pencil->layers().size();
194 if (unique_layer_names.
add(layer_name)) {
206struct GridIsEmptyOp {
207 const openvdb::GridBase &base_grid;
212 result =
static_cast<const GridType &
>(base_grid).empty();
221 bke::VolumeTreeAccessToken token;
222 const openvdb::GridBase &vdb_grid = grid->grid(token);
225 GridIsEmptyOp is_empty_op{vdb_grid};
226 if (BKE_volume_grid_type_operation(grid_type, is_empty_op)) {
227 this->
is_empty = is_empty_op.result;
242 const std::optional<ClosureSourceLocation> &source_location,
243 std::shared_ptr<ClosureEvalLog>
eval_log)
246 if (source_location) {
247 const bNodeTree *tree_eval = source_location->tree;
251 source_location->closure_output_node_id,
252 source_location->compute_context_hash};
267 switch (report.
type) {
289 : root_log_(root_log), tree_loggers_(std::move(tree_loggers))
293 children_hashes_.add(
hash);
308 {node.
identifier, socket.index(), std::move(value_log)});
311 auto log_generic_value = [&](
const CPPType &type,
const void *value) {
312 void *buffer = this->
allocator->allocate(type);
329 const bke::GVolumeGrid grid = value_variant.
extract<bke::GVolumeGrid>();
333 else if (value_variant.
is_list()) {
344 items.
append({item.key, {socket_value->type}});
349 items.
append({item.key, {internal_value->value->type_name()}});
358 std::optional<ClosureSourceLocation> source_location;
359 std::shared_ptr<ClosureEvalLog> eval_log;
368 source_location = closure->source_location();
369 eval_log = closure->eval_log_ptr();
372 std::move(
inputs), std::move(
outputs), source_location, eval_log));
377 if (value.
type()->
is<std::string>()) {
378 const std::string &
string = *value.
get<std::string>();
382 log_generic_value(*value.
type(), value.
get());
387 log_generic_value(type, value.
get());
393 main_geometry_cache_mutex_.ensure([&]() {
396 if (item.value.is_volume_grid()) {
397 const bke::GVolumeGrid grid = item.value.get<bke::GVolumeGrid>();
405 if (item.value.is_single() && item.value.get_single_ptr().is_type<
bke::GeometrySet>()) {
406 main_geometry_cache_ = *item.value.get_single_ptr().get<
bke::GeometrySet>();
411 return main_geometry_cache_ ? &*main_geometry_cache_ :
nullptr;
417 switch (propagation) {
433 if (reduced_node_warnings_) {
437 reduced_node_warnings_ =
true;
445 if (ID *id = *cb_data->id_pointer) {
446 if (GS(id->name) == ID_NT) {
447 const bNodeTree *tree = reinterpret_cast<const bNodeTree *>(id);
448 map.add(id->session_uid, tree);
455 this->ensure_node_warnings(map);
460 if (reduced_node_warnings_) {
474 if (reduced_node_warnings_) {
477 if (tree_loggers_.is_empty()) {
480 const std::optional<uint32_t> tree_uid = tree_loggers_[0]->tree_orig_session_uid;
499 GeoTreeLog &child_log = root_log_->get_tree_log(child_hash);
500 if (child_log.tree_loggers_.is_empty()) {
503 const GeoTreeLogger &first_child_logger = *child_log.tree_loggers_[0];
505 const std::optional<int32_t> &caller_node_id = first_child_logger.
parent_node_id;
506 if (
tree && caller_node_id) {
507 if (
const bNode *caller_node =
tree->node_by_id(*caller_node_id)) {
512 if (caller_node_id.has_value()) {
513 this->
nodes.lookup_or_add_default(*caller_node_id)
523 reduced_node_warnings_ =
true;
528 if (reduced_execution_times_) {
533 const std::chrono::nanoseconds duration = timings.
end - timings.
start;
534 this->
nodes.lookup_or_add_default_as(timings.
node_id).execution_time += duration;
538 reduced_execution_times_ =
true;
543 if (reduced_socket_values_) {
556 reduced_socket_values_ =
true;
561 if (reduced_viewer_node_logs_) {
569 reduced_viewer_node_logs_ =
true;
574 if (reduced_existing_attributes_) {
579 auto handle_value_log = [&](
const ValueLog &value_log) {
590 for (
const ValueLog *value_log : node_log.input_values_.values()) {
591 handle_value_log(*value_log);
593 for (
const ValueLog *value_log : node_log.output_values_.values()) {
594 handle_value_log(*value_log);
597 reduced_existing_attributes_ =
true;
602 if (reduced_used_named_attributes_) {
606 auto add_attribute = [&](
const int32_t node_id,
609 this->
nodes.lookup_or_add_default(node_id).used_named_attributes.lookup_or_add(attribute_name,
620 GeoTreeLog &child_log = root_log_->get_tree_log(child_hash);
621 if (child_log.tree_loggers_.is_empty()) {
625 if (
const std::optional<int32_t> &parent_node_id = child_log.tree_loggers_[0]->parent_node_id)
628 add_attribute(*parent_node_id, item.key, item.value);
632 reduced_used_named_attributes_ =
true;
637 if (reduced_debug_messages_) {
643 .debug_messages.append(debug_message.
message);
646 reduced_debug_messages_ =
true;
651 if (reduced_evaluated_gizmo_nodes_) {
656 tree_logger->evaluated_gizmo_nodes)
662 reduced_evaluated_gizmo_nodes_ =
true;
667 if (reduced_layer_names_) {
673 auto handle_value_log = [&](
const ValueLog &value_log) {
675 if (
geo_log ==
nullptr || !
geo_log->grease_pencil_info.has_value()) {
678 for (
const std::string &
name :
geo_log->grease_pencil_info->layer_names) {
684 for (
const ValueLog *value_log : node_log.input_values_.values()) {
685 handle_value_log(*value_log);
687 for (
const ValueLog *value_log : node_log.output_values_.values()) {
688 handle_value_log(*value_log);
692 reduced_layer_names_ =
true;
704 if (query_socket.is_multi_input()) {
711 sockets_to_check.
push(&query_socket);
712 added_sockets.
add(&query_socket);
715 while (!sockets_to_check.
is_empty()) {
717 const bNode &node = socket.owner_node();
719 ValueLog *value_log = socket.is_input() ?
720 node_log->input_values_.lookup_default(socket.index(),
nullptr) :
721 node_log->output_values_.lookup_default(socket.index(),
nullptr);
722 if (value_log !=
nullptr) {
727 if (socket.is_input()) {
731 if (added_sockets.
add(&from_socket)) {
732 sockets_to_check.
push(&from_socket);
737 if (node.is_reroute()) {
738 const bNodeSocket &input_socket = node.input_socket(0);
739 if (added_sockets.
add(&input_socket)) {
740 sockets_to_check.
push(&input_socket);
745 if (added_sockets.
add(&from_socket)) {
746 sockets_to_check.
push(&from_socket);
750 else if (node.is_muted()) {
751 if (
const bNodeSocket *input_socket = socket.internal_link_input()) {
752 if (added_sockets.
add(input_socket)) {
753 sockets_to_check.
push(input_socket);
758 if (added_sockets.
add(&from_socket)) {
759 sockets_to_check.
push(&from_socket);
764 else if (node.is_group_input()) {
765 const int index = socket.index();
767 for (
const bNode *other_group_input :
tree.group_input_nodes()) {
768 const bNodeSocket &other_socket = other_group_input->output_socket(index);
769 if (added_sockets.
add(&other_socket)) {
770 sockets_to_check.
push(&other_socket);
784 const void *src_value = value_log.
value.
get();
790 if (!conversions.
is_convertible(src_type, dst_type) && src_type != dst_type) {
804 return id->session_uid;
807 return id_orig->session_uid;
814 LocalData &local_data = data_per_thread_.local();
816 local_data.tree_logger_by_context;
818 compute_context.
hash());
819 if (tree_logger_ptr) {
820 return *tree_logger_ptr;
824 tree_logger.allocator = &local_data.allocator;
826 std::optional<uint32_t> parent_tree_session_uid;
827 if (parent_compute_context !=
nullptr) {
828 tree_logger.parent_hash = parent_compute_context->
hash();
834 tree_logger.parent_node_id.emplace(context->node_id());
835 if (
const bNode *caller_node = context->node()) {
842 tree_logger.parent_node_id.emplace(context->output_node_id());
843 tree_logger.tree_orig_session_uid = parent_tree_session_uid;
845 else if (
const auto *context =
849 tree_logger.parent_node_id.emplace(context->output_node_id());
850 tree_logger.tree_orig_session_uid = parent_tree_session_uid;
855 tree_logger.parent_node_id.emplace(context->output_node_id());
856 tree_logger.tree_orig_session_uid = parent_tree_session_uid;
861 tree_logger.parent_node_id.emplace(context->node_id());
862 const std::optional<nodes::ClosureSourceLocation> &location =
863 context->closure_source_location();
864 if (location.has_value()) {
874 reinterpret_cast<const ID *
>(nmd->node_group));
881 tree_logger.tree_orig_session_uid =
tree->id.session_uid;
889 GeoTreeLog &reduced_tree_log = *tree_logs_.lookup_or_add_cb(compute_context_hash, [&]() {
891 for (LocalData &local_data : data_per_thread_) {
893 compute_context_hash);
894 if (tree_log !=
nullptr) {
895 tree_logs.
append(tree_log->get());
898 return std::make_unique<GeoTreeLog>(
this, std::move(tree_logs));
900 return reduced_tree_log;
924 snode, compute_context_cache);
930 if (tree_zones ==
nullptr) {
949 std::optional<ed::space_node::ObjectAndModifier> object_and_modifier =
951 if (!object_and_modifier) {
954 return object_and_modifier->nmd->runtime->eval_log.get();
962 return log.log.get();
978 for (
const auto item : hash_by_zone.
items()) {
980 tree_logs_by_zone.
add(item.key, &tree_log);
982 return {tree_logs_by_zone};
987 const std::optional<ed::viewer_path::ViewerPathForGeometryNodesViewer> parsed_path =
989 if (!parsed_path.has_value()) {
992 const Object *
object = parsed_path->object;
995 if (md->persistent_uid == parsed_path->modifier_uid) {
1001 if (nmd ==
nullptr) {
1004 if (!nmd->
runtime->eval_log) {
1013 *elem, compute_context_cache, compute_context);
1014 if (!compute_context) {
1023 parsed_path->viewer_node_id,
nullptr);
1029 : tree_logs_by_zone_(std::move(tree_logs_by_zone))
1035 return tree_logs_by_zone_.lookup_default(zone,
nullptr);
1062 for (
GeoTreeLog *tree_log : tree_logs_by_zone_.values()) {
1064 callback(*tree_log);
Low-level operations for curves.
Low-level operations for grease pencil.
void * BKE_id_new_nomain(short type, const char *name)
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, LibraryForeachIDFlag flag)
#define FOREACH_NODETREE_END
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
void BKE_volume_grid_add(Volume *volume, const blender::bke::VolumeGridData &grid)
int BKE_volume_num_grids(const Volume *volume)
const blender::bke::VolumeGridData * BKE_volume_grid_get(const Volume *volume, int grid_index)
#define BLI_assert_unreachable()
#define LISTBASE_FOREACH(type, var, list)
const char * BLI_str_find_prev_char_utf8(const char *p, const char *str_start) ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1
bool DEG_is_original(const T *id)
bool DEG_is_evaluated(const T *id)
ID * DEG_get_original_id(ID *id)
T * DEG_get_original(T *id)
@ NODE_WARNING_PROPAGATION_NONE
@ NODE_WARNING_PROPAGATION_ONLY_ERRORS_AND_WARNINGS
@ NODE_WARNING_PROPAGATION_ONLY_ERRORS
@ NODE_WARNING_PROPAGATION_ALL
SpaceNodeGeometryNodesType
@ SNODE_GEOMETRY_MODIFIER
bool ED_node_is_geometry(const SpaceNode *snode)
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
GeometryInfoLog(const bke::GeometrySet &geometry_set)
void append(const T &value)
void copy_construct(const void *src, void *dst) const
void destruct(void *ptr) const
const ComputeContext * parent() const
const ComputeContextHash & hash() const
const CPPType * type() const
const CPPType * type() const
destruct_ptr< T > construct(Args &&...args)
StringRefNull copy_string(StringRef str)
Value & lookup_or_add_default(const Key &key)
bool add(const Key &key, const Value &value)
Value lookup_default(const Key &key, const Value &default_value) const
void add_new(const Key &key, const Value &value)
ItemIterator items() const &
void push(const T &value)
void append(const T &value)
void extend(Span< T > array)
const ModifierComputeContext & for_modifier(const ComputeContext *parent, const NodesModifierData &nmd)
void convert_to_uninitialized(const CPPType &from_type, const CPPType &to_type, const void *from_value, void *to_value) const
bool is_convertible(const CPPType &from_type, const CPPType &to_type) const
bool is_context_dependent_field() const
bool valid_for_socket(eNodeSocketDatatype socket_type) const
bool is_volume_grid() const
GPointer get_single_ptr() const
Vector< bNodeTreeZone * > child_zones
Vector< bNodeTreeZone * > root_zones
const bNodeTreeZone * get_zone_by_node(const int32_t node_id) const
const bNodeTreeZone * get_zone_by_socket(const bNodeSocket &socket) const
const FieldNode & node() const
CustomIDVectorSet< Item, ItemKeyGetter > inputs
CustomIDVectorSet< Item, ItemKeyGetter > outputs
BundleValueLog(Vector< Item > items)
std::optional< Source > source
ClosureValueLog(Vector< Item > inputs, Vector< Item > outputs, const std::optional< ClosureSourceLocation > &source_location, std::shared_ptr< ClosureEvalLog > eval_log)
std::shared_ptr< ClosureEvalLog > eval_log
GeoTreeLog * get_main_tree_log(const bke::bNodeTreeZone *zone) const
ContextualGeoTreeLogs(Map< const bke::bNodeTreeZone *, GeoTreeLog * > tree_logs_by_zone={})
void foreach_tree_log(FunctionRef< void(GeoTreeLog &)> callback) const
FieldInfoLog(const GField &field)
~GenericValueLog() override
static ContextualGeoTreeLogs get_contextual_tree_logs(const SpaceNode &snode)
static Map< const bke::bNodeTreeZone *, ComputeContextHash > get_context_hash_by_zone_for_node_editor(const SpaceNode &snode, bke::ComputeContextCache &compute_context_cache)
static const ViewerNodeLog * find_viewer_node_log_for_path(const ViewerPath &viewer_path)
GeoTreeLogger & get_local_tree_logger(const ComputeContext &compute_context)
GeoTreeLog & get_tree_log(const ComputeContextHash &compute_context_hash)
Vector< const GeometryAttributeInfo * > existing_attributes
void ensure_evaluated_gizmo_nodes()
void ensure_node_warnings(const NodesModifierData &nmd)
void ensure_used_named_attributes()
VectorSet< NodeWarning > all_warnings
Set< int > evaluated_gizmo_nodes
void ensure_existing_attributes()
void ensure_socket_values()
bool try_convert_primitive_socket_value(const GenericValueLog &value_log, const CPPType &dst_type, void *dst)
std::chrono::nanoseconds execution_time
void ensure_execution_times()
void ensure_viewer_node_logs()
Map< int32_t, ViewerNodeLog *, 0 > viewer_node_logs
Vector< std::string > all_layer_names
Map< StringRefNull, NamedAttributeUsage > used_named_attributes
Map< int32_t, GeoNodeLog > nodes
void ensure_layer_names()
void ensure_debug_messages()
GeoTreeLog(GeoNodesLog *root_log, Vector< GeoTreeLogger * > tree_loggers)
ValueLog * find_socket_value_log(const bNodeSocket &query_socket)
std::optional< int32_t > parent_node_id
LinearAllocator * allocator
linear_allocator::ChunkedList< SocketValueLog, 16 > input_socket_values
void log_value(const bNode &node, const bNodeSocket &socket, GPointer value)
std::optional< uint32_t > tree_orig_session_uid
linear_allocator::ChunkedList< SocketValueLog, 16 > output_socket_values
Vector< ComputeContextHash > children_hashes
std::optional< EditDataInfo > edit_data_info
std::optional< MeshInfo > mesh_info
std::optional< GreasePencilInfo > grease_pencil_info
std::optional< PointCloudInfo > pointcloud_info
Vector< bke::GeometryComponent::Type > component_types
std::optional< InstancesInfo > instances_info
std::optional< VolumeInfo > volume_info
Vector< GeometryAttributeInfo > attributes
std::optional< CurveInfo > curve_info
GridInfoLog(const bke::GVolumeGrid &grid)
ListInfoLog(const List *list)
const bke::GeometrySet * main_geometry() const
CustomIDVectorSet< Item, ItemIdentifierGetter > items
VolumeGridType get_type(const VolumeGridData &grid)
bool attribute_name_is_anonymous(const StringRef name)
const DataTypeConversions & get_implicit_type_conversions()
const GeoOperatorLog & node_group_operator_static_eval_log()
const ComputeContext * compute_context_for_edittree(const SpaceNode &snode, bke::ComputeContextCache &compute_context_cache)
const ComputeContext * compute_context_for_zone(const bke::bNodeTreeZone &zone, bke::ComputeContextCache &compute_context_cache, const ComputeContext *parent_compute_context)
std::optional< ObjectAndModifier > get_modifier_for_node_editor(const SpaceNode &snode)
std::optional< ViewerPathForGeometryNodesViewer > parse_geometry_nodes_viewer(const ViewerPath &viewer_path)
const ComputeContext * compute_context_for_viewer_path_elem(const ViewerPathElem &elem, bke::ComputeContextCache &compute_context_cache, const ComputeContext *parent_compute_context)
static void find_tree_zone_hash_recursive(const bNodeTreeZone &zone, bke::ComputeContextCache &compute_context_cache, const ComputeContext *current, Map< const bNodeTreeZone *, ComputeContextHash > &r_hash_by_zone)
static std::optional< uint32_t > get_original_session_uid(const ID *id)
static GeoNodesLog * get_root_log(const SpaceNode &snode)
static bool warning_is_propagated(const NodeWarningPropagation propagation, const NodeWarningType warning_type)
ImplicitSharingPtr< Bundle > BundlePtr
ImplicitSharingPtr< List > ListPtr
ImplicitSharingPtr< Closure > ClosurePtr
std::unique_ptr< T, DestructValueAtAddress< T > > destruct_ptr
static blender::bke::bNodeSocketTemplate outputs[]
static blender::bke::bNodeSocketTemplate inputs[]
struct bNodeTree * node_group
NodesModifierRuntimeHandle * runtime
struct bNodeTree * selected_node_group
struct bNodeTree * edittree
Vector< const GeometryComponent * > get_components() const
static GeometrySet from_volume(Volume *volume, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
void attribute_foreach(Span< GeometryComponent::Type > component_types, bool include_instances, AttributeForeachCallback callback) const
const bke::bNodeSocketType * type
NamedAttributeUsage usage
StringRefNull attribute_name
destruct_ptr< ValueLog > value
destruct_ptr< ViewerNodeLog > viewer_log
bool has_deformed_positions
Vector< std::string > layer_names
Vector< VolumeGridInfo > grids
NodeWarning(NodeWarningType type, StringRef message)
StringLog(StringRef string, LinearAllocator<> &allocator)