Files
test/source/blender/nodes/NOD_geometry_nodes_dependencies.hh
2025-01-07 13:20:19 +11:00

92 lines
2.8 KiB
C++

/* SPDX-FileCopyrightText: 2024 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#include "BLI_map.hh"
#include "BLI_struct_equality_utils.hh"
struct ID;
struct Object;
struct bNodeTree;
namespace blender::nodes {
/**
* Gathers dependencies that the node tree requires before it can be evaluated.
*/
struct GeometryNodesEvalDependencies {
/**
* Stores additional dependency information for objects. It can be more efficient to only depend
* on an object partially.
*/
struct ObjectDependencyInfo {
bool transform = false;
bool geometry = false;
BLI_STRUCT_EQUALITY_OPERATORS_2(ObjectDependencyInfo, transform, geometry);
};
static constexpr ObjectDependencyInfo all_object_deps{true, true};
/**
* Maps `session_uid` to the corresponding data-block.
* The data-block pointer is not used as key in this map, so that it can be modified in
* #node_foreach_id.
*/
Map<uint32_t, ID *> ids;
/** Additional information for object dependencies. */
Map<uint32_t, ObjectDependencyInfo> objects_info;
bool needs_own_transform = false;
bool needs_active_camera = false;
bool time_dependent = false;
/**
* Adds a generic data-block dependency. Note that this does not add a dependency to e.g. the
* transform or geometry of an object. If that is desired, use #add_object or
* #add_generic_id_full instead.
*/
void add_generic_id(ID *id);
/**
* Adds a data-block as dependency. For objects, it also adds a dependency to the transform and
* geometry.
*/
void add_generic_id_full(ID *id);
/**
* Add an object as dependency. It's customizable whether e.g. the transform and/or geometry is
* required.
*/
void add_object(Object *object, const ObjectDependencyInfo &object_deps = all_object_deps);
/**
* Add all the given dependencies to this one.
*/
void merge(const GeometryNodesEvalDependencies &other);
BLI_STRUCT_EQUALITY_OPERATORS_5(GeometryNodesEvalDependencies,
ids,
objects_info,
needs_own_transform,
needs_active_camera,
time_dependent);
};
/**
* Finds all evaluation dependencies for the given node. This does not include dependencies that
* are passed into the node group. It also may not contain all data-blocks referenced by the node
* tree if some of them can statically be detected to not be used by the evaluation.
*/
GeometryNodesEvalDependencies gather_geometry_nodes_eval_dependencies_recursive(
const bNodeTree &ntree);
/**
* Same as above, but assumes that dependencies are already cached on the referenced node groups.
*/
GeometryNodesEvalDependencies gather_geometry_nodes_eval_dependencies_with_cache(
const bNodeTree &ntree);
} // namespace blender::nodes