97#include "RNA_prototypes.hh"
143 if (id_info.id_cow !=
nullptr) {
155 IDNode *id_node =
nullptr;
156 ID *id_cow =
nullptr;
158 uint32_t previous_eval_flags = 0;
161 if (id_info !=
nullptr) {
167 id_info->
id_cow =
nullptr;
169 id_node =
graph_->add_id_node(
id, id_cow);
175 const bool is_newly_created = id_node->
components.is_empty();
177 if (is_newly_created) {
183 graph_->operations.append(op_cow);
192 if (id_type ==
ID_OB) {
200 visibility_operation = visibility_component->
add_operation(
nullptr,
208 graph_->operations.append(visibility_operation);
215 return graph_->find_id_node(
id);
220 return graph_->add_time_source();
225 const char *comp_name)
229 comp_node->
owner = id_node;
235 const char *comp_name)
238 if (id_node ==
nullptr) {
251 if (op_node ==
nullptr) {
252 op_node = comp_node->
add_operation(op, opcode, name, name_tag);
253 graph_->operations.append(op_node);
257 "add_operation: Operation already exists - %s has %s at %p\n",
268 const char *comp_name,
290 const char *comp_name,
297 if (operation !=
nullptr) {
311 if (operation !=
nullptr) {
319 const char *comp_name,
336 const char *comp_name,
342 if (comp_node ==
nullptr) {
362 return graph_->get_cow_id(id_orig);
402 id_node->
id_cow =
nullptr;
416 graph_->clear_all_nodes();
417 graph_->operations.clear();
418 graph_->entry_tags.clear();
434 if (id_pointer->
orig_id ==
nullptr) {
438 if (id_node !=
nullptr && id_node->
id_cow !=
nullptr) {
454 if (id_node ==
nullptr) {
539 if (operation_node ==
nullptr) {
552 if (operation_node ==
nullptr) {
700 const bool is_collection_restricted = (collection->
flag & visibility_flag);
703 if (
built_map_.check_is_built_and_tag(collection)) {
731 if (from_layer_collection !=
nullptr) {
758 const bool has_object =
built_map_.check_is_built_and_tag(
object);
771 id_node->
has_base |= (base_index != -1);
794 id_node->
has_base |= (base_index != -1);
803 if (object->
parent !=
nullptr) {
844 (object->
pd->
tex !=
nullptr))
874 BKE_object_sync_to_original(depsgraph, object_cow);
897 if (base_index == -1) {
908 [view_layer_index =
view_layer_index_, scene_cow, object_cow, base_index, is_from_set](
910 BKE_object_eval_eval_base_flags(
911 depsgraph, scene_cow, view_layer_index, object_cow, base_index, is_from_set);
941 deg_evaluate_object_modifiers_mode_node_visibility(depsgraph, id_node);
950 [id_node, modifier_index, modifier_node](
::Depsgraph * ) {
962 if ((
modifier->mode & modifier_mode) == 0) {
967 graph_->has_animated_visibility =
true;
984 if (object->
data ==
nullptr) {
988 switch (object->
type) {
1028 if (materials_ptr !=
nullptr) {
1059 if (parent ==
nullptr) {
1088 if (object->
parent !=
nullptr) {
1143 BKE_object_eval_constraints(depsgraph, scene_cow, object_cow);
1158 BKE_object_eval_ptcache_reset(depsgraph, scene_cow, object_cow);
1172 BKE_object_eval_light_linking(depsgraph, object_cow);
1175 graph_->light_linking_cache.add_emitter(*
graph_->scene, *
object);
1185 if (collection ==
nullptr) {
1236 if (adt ==
nullptr) {
1239 if (adt->
action !=
nullptr) {
1273 if (strip->act !=
nullptr) {
1276 else if (strip->strips.first !=
nullptr) {
1286 bool has_image_animation =
false;
1291 has_image_animation =
true;
1307 if (
built_map_.check_is_built_and_tag(action)) {
1320 bool needs_unshare =
false;
1329 if (!needs_unshare) {
1391 scene_, target_prop, dtar->rna_path))
1402 const char *camera_path)
1406 if (!
ELEM(marker->camera,
nullptr, scene->
camera)) {
1414 const char *rna_path_from_target_prop)
1416 if (rna_path_from_target_prop ==
nullptr || rna_path_from_target_prop[0] ==
'\0') {
1426 if (prop ==
nullptr) {
1486 if (
built_map_.check_is_built_and_tag(world)) {
1543 BKE_rigidbody_eval_simulation(depsgraph,
1550 if (rbw->
group !=
nullptr) {
1553 if (object->type !=
OB_MESH) {
1556 if (object->rigidbody_object ==
nullptr) {
1572 BKE_rigidbody_object_sync_transforms(depsgraph, scene_cow, object_cow);
1581 if (rbc ==
nullptr || rbc->
ob1 ==
nullptr || rbc->
ob2 ==
nullptr) {
1631 if (
ELEM(particle_target->ob,
nullptr,
object)) {
1657 if (
built_map_.check_is_built_and_tag(particle_settings)) {
1675 BKE_particle_settings_eval_reset(depsgraph, particle_settings_cow);
1681 for (
MTex *mtex : particle_settings->
mtex) {
1682 if (mtex ==
nullptr || mtex->
tex ==
nullptr) {
1691 if (
built_map_.check_is_built_and_tag(key)) {
1724 BKE_object_eval_uber_data(depsgraph, scene_cow, object_cow);
1744 if (
built_map_.check_is_built_and_tag(obdata)) {
1787 if (cu->
bevobj !=
nullptr) {
1810 Curves *curves_id =
reinterpret_cast<Curves *
>(obdata);
1815 if (curves_id->
surface !=
nullptr) {
1869 if (
built_map_.check_is_built_and_tag(armature)) {
1905 if (
built_map_.check_is_built_and_tag(camera)) {
1918 if (
built_map_.check_is_built_and_tag(lamp)) {
1957 if (ntree ==
nullptr) {
1960 if (
built_map_.check_is_built_and_tag(ntree)) {
1978 bNodeTree *ntree_cow = reinterpret_cast<bNodeTree *>(id_cow);
1979 bke::node_tree_runtime::preprocess_geometry_node_tree_for_evaluation(
1985 for (
bNode *bnode : ntree->all_nodes()) {
1995 if (
id ==
nullptr) {
1999 if (id_type ==
ID_MA) {
2002 else if (id_type ==
ID_TE) {
2005 else if (id_type ==
ID_IM) {
2008 else if (id_type ==
ID_OB) {
2012 else if (id_type ==
ID_SCE) {
2019 if (node_scene->
camera !=
nullptr) {
2024 else if (id_type ==
ID_TXT) {
2027 else if (id_type ==
ID_MSK) {
2030 else if (id_type ==
ID_MC) {
2033 else if (id_type ==
ID_VF) {
2036 else if (id_type ==
ID_GR) {
2039 else if (bnode->is_group()) {
2051 ntree->ensure_interface_cache();
2064 if (
built_map_.check_is_built_and_tag(material)) {
2086 for (
int i = 0;
i < num_materials;
i++) {
2087 if (materials[
i] ==
nullptr) {
2109 if (
texture->ima !=
nullptr) {
2117 texture_cow->runtime.last_update = DEG_get_update_count(depsgraph);
2123 if (
built_map_.check_is_built_and_tag(image)) {
2134 if (
built_map_.check_is_built_and_tag(cache_file)) {
2137 ID *cache_file_id = &cache_file->
id;
2178 for (
int i = 0;
i < spline->tot_point;
i++) {
2181 if (parent ==
nullptr || parent->
id ==
nullptr) {
2192 if (
built_map_.check_is_built_and_tag(linestyle)) {
2196 ID *linestyle_id = &linestyle->
id;
2205 if (
built_map_.check_is_built_and_tag(clip)) {
2208 ID *clip_id = &clip->
id;
2225 if (
built_map_.check_is_built_and_tag(probe)) {
2237 if (
built_map_.check_is_built_and_tag(speaker)) {
2245 if (speaker->
sound !=
nullptr) {
2252 if (
built_map_.check_is_built_and_tag(sound)) {
2261 BKE_sound_evaluate(depsgraph, bmain, sound_cow);
2270 if (
built_map_.check_is_built_and_tag(vfont)) {
2283 if (strip->
sound !=
nullptr) {
2286 if (strip->
scene !=
nullptr) {
2302 if (scene->
ed ==
nullptr) {
2314 seq::eval_strips(depsgraph, scene_cow, &scene_cow->ed->seqbase);
2337 BKE_scene_update_tag_audio_volume(depsgraph, scene_cow);
2345 Object *
object = base->object;
2363 if (
id ==
nullptr) {
2371 data->builder->build_id(
id);
2383 if (
id ==
nullptr) {
2391 data->builder->build_id(
id);
Blender kernel action and pose functionality.
AnimData * BKE_animdata_from_id(const ID *id)
void BKE_animsys_eval_driver_unshare(Depsgraph *depsgraph, ID *id)
void BKE_animsys_eval_animdata(struct Depsgraph *depsgraph, struct ID *id)
void BKE_animsys_eval_driver(struct Depsgraph *depsgraph, struct ID *id, int driver_index, struct FCurve *fcu_orig)
void BKE_cachefile_eval(Main *bmain, Depsgraph *depsgraph, CacheFile *cache_file)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_END
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object)
void BKE_constraints_id_loop(struct ListBase *list, ConstraintIDFunc func, const int flag, void *userdata)
void BKE_curve_eval_geometry(Depsgraph *depsgraph, Curve *curve)
bool driver_get_target_property(const DriverTargetContext *driver_target_context, struct DriverVar *dvar, struct DriverTarget *dtar, struct PointerRNA *r_prop)
#define DRIVER_TARGETS_USED_LOOPER_BEGIN(dvar)
#define DRIVER_TARGETS_LOOPER_END
void BKE_gpencil_modifiers_foreach_ID_link(struct Object *ob, GreasePencilIDWalkFunc walk, void *user_data)
Low-level operations for grease pencil.
void BKE_grease_pencil_eval_geometry(Depsgraph *depsgraph, GreasePencil *grease_pencil)
void IDP_foreach_property(IDProperty *id_property_root, int type_filter, blender::FunctionRef< void(IDProperty *id_property)> callback)
bool BKE_image_user_id_has_animation(ID *id)
void BKE_image_user_id_eval_animation(Depsgraph *depsgraph, ID *id)
Key * BKE_key_from_id(ID *id)
void BKE_lattice_eval_geometry(Depsgraph *depsgraph, Lattice *latt)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
ViewLayer * BKE_view_layer_default_render(const Scene *scene)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
#define MAIN_ID_SESSION_UID_UNSET
void BKE_id_eval_properties_copy(ID *id_cow, ID *id)
LibraryForeachIDCallbackFlag
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, LibraryForeachIDFlag flag)
@ IDWALK_IGNORE_EMBEDDED_ID
General operations, lookup, etc. for blender lights.
void BKE_mask_eval_update(struct Depsgraph *depsgraph, struct Mask *mask)
void BKE_mask_eval_animation(struct Depsgraph *depsgraph, struct Mask *mask)
General operations, lookup, etc. for materials.
short * BKE_object_material_len_p(Object *ob)
Material *** BKE_object_material_array_p(Object *ob)
void BKE_mesh_eval_geometry(Depsgraph *depsgraph, Mesh *mesh)
void void void BKE_modifiers_foreach_ID_link(Object *ob, IDWalkFunc walk, void *user_data)
void BKE_movieclip_eval_update(struct Depsgraph *depsgraph, struct Main *bmain, struct MovieClip *clip)
bool BKE_nlatrack_is_enabled(const AnimData &adt, const NlaTrack &nlt)
General operations, lookup, etc. for blender objects.
void BKE_object_data_select_update(Depsgraph *depsgraph, ID *object_data)
void BKE_particle_system_eval_init(struct Depsgraph *depsgraph, struct Object *object)
bool BKE_ptcache_object_has(struct Scene *scene, struct Object *ob, int duplis)
API for Blender-side Rigid Body stuff.
void BKE_shaderfx_foreach_ID_link(struct Object *ob, ShaderFxIDWalkFunc walk, void *user_data)
void BKE_volume_eval_geometry(Depsgraph *depsgraph, Volume *volume)
#define BLI_assert_msg(a, msg)
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
#define SET_FLAG_FROM_TEST(value, test, flag)
Object groups, one object can be in many groups at once.
@ COLLECTION_HIDE_VIEWPORT
@ eModifierFlag_UserModified
@ NTREE_RUNTIME_FLAG_HAS_IMAGE_ANIMATION
Object is a sort of wrapper for general info.
Types and defines for representing Rigid Body entities.
Read Guarded memory(de)allocation.
BMesh const char void * data
BPy_StructRNA * depsgraph
virtual bool need_pull_base_into_graph(const Base *base)
static const char * get_rna_path_relative_to_scene_camera(const Scene *scene, const PointerRNA &target_prop, const char *rna_path)
DepsgraphBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache)
virtual bool is_modifier_visibility_animated(const Object *object, const ModifierData *modifier)
ComponentNode * find_component_node(const ID *id, NodeType comp_type, const char *comp_name="")
virtual void build_scene_parameters(Scene *scene)
virtual void build_scene_sequencer(Scene *scene)
virtual void build_object_data_camera(Object *object)
virtual void build_object_data_geometry(Object *object)
ID * ensure_cow_id(ID *id_orig)
virtual void build_object_pointcache(Object *object)
virtual void build_animdata(ID *id)
virtual void build_world(World *world)
virtual void build_object(int base_index, Object *object, eDepsNode_LinkedState_Type linked_state, bool is_visible)
OperationNode * ensure_operation_node(ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const DepsEvalOperationCb &op=nullptr, const char *name="", int name_tag=-1)
virtual void build_id(ID *id, bool force_be_visible=false)
IDNode * add_id_node(ID *id)
virtual void build_freestyle_linestyle(FreestyleLineStyle *linestyle)
virtual void build_scene_speakers(Scene *scene, ViewLayer *view_layer)
virtual void build_cachefile(CacheFile *cache_file)
virtual void build_object_instance_collection(Object *object, bool is_object_visible)
virtual void build_object_data_speaker(Object *object)
OperationNode * add_operation_node(ComponentNode *comp_node, OperationCode opcode, const DepsEvalOperationCb &op=nullptr, const char *name="", int name_tag=-1)
virtual void build_vfont(VFont *vfont)
virtual void build_texture(Tex *tex)
OperationNode * find_operation_node(const ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const char *name="", int name_tag=-1)
virtual void build_object_data(Object *object)
virtual void build_particle_settings(ParticleSettings *part)
static void constraint_walk(bConstraint *constraint, ID **idpoin, bool is_reference, void *user_data)
Map< uint, IDInfo > id_info_hash_
virtual void build_driver_id_property(const PointerRNA &target_prop, const char *rna_path_from_target_prop)
virtual void build_particle_systems(Object *object, bool is_object_visible)
virtual void build_dimensions(Object *object)
virtual void build_armature(bArmature *armature)
virtual void build_scene_audio(Scene *scene)
ComponentNode * add_component_node(ID *id, NodeType comp_type, const char *comp_name="")
virtual void build_driver_variables(ID *id, FCurve *fcurve)
virtual void build_shapekeys(Key *key)
virtual void build_action(bAction *action)
virtual void build_driver_scene_camera_variable(Scene *scene, const char *camera_path)
virtual void build_animdata_nlastrip_targets(ListBase *strips)
virtual void build_animation_images(ID *id)
virtual void build_material(Material *ma)
virtual void build_materials(Material **materials, int num_materials)
virtual void build_collection(LayerCollection *from_layer_collection, Collection *collection)
virtual void build_rigidbody(Scene *scene)
virtual void build_object_transform(Object *object)
virtual void build_light_linking_collection(Collection *collection)
static void modifier_walk(void *user_data, struct Object *object, struct ID **idpoin, LibraryForeachIDCallbackFlag cb_flag)
virtual void build_movieclip(MovieClip *clip)
T * get_cow_datablock(const T *orig) const
virtual void build_object_data_light(Object *object)
bool is_parent_collection_visible_
virtual void build_image(Image *image)
virtual void build_speaker(Speaker *speaker)
virtual void build_sound(bSound *sound)
Vector< PersistentOperationKey > needs_update_operations_
virtual void build_object_data_geometry_datablock(ID *obdata)
DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph, DepsgraphBuilderCache *cache)
Vector< PersistentOperationKey > saved_entry_tags_
void update_invalid_cow_pointers()
virtual void build_object_flags(int base_index, Object *object, eDepsNode_LinkedState_Type linked_state)
ID * get_cow_id(const ID *id_orig) const
virtual void build_rig(Object *object)
TimeSourceNode * add_time_source()
virtual void build_parameters(ID *id)
virtual void build_lightprobe(LightProbe *probe)
int foreach_id_cow_detect_need_for_update_callback(ID *id_cow_self, ID *id_pointer)
virtual void build_nodetree(bNodeTree *ntree)
virtual void build_idproperties(IDProperty *id_property)
virtual void build_camera(Camera *camera)
virtual void build_light(Light *lamp)
IDNode * find_id_node(const ID *id)
virtual void build_armature_bones(ListBase *bones)
virtual void build_driver(ID *id, FCurve *fcurve, int driver_index)
virtual void build_object_light_linking(Object *object)
virtual void begin_build()
virtual void build_mask(Mask *mask)
bool has_operation_node(ID *id, NodeType comp_type, const char *comp_name, OperationCode opcode, const char *name="", int name_tag=-1)
virtual void build_nodetree_socket(bNodeSocket *socket)
virtual void build_armature_bone_collections(blender::Span< BoneCollection * > collections)
virtual void build_object_data_lightprobe(Object *object)
virtual void build_animdata_drivers(ID *id, AnimData *adt)
virtual void build_object_data_grease_pencil(Object *object)
virtual void build_generic_id(ID *id)
virtual void build_object_constraints(Object *object)
virtual void build_object_shading(Object *object)
void tag_previously_tagged_nodes()
virtual void build_object_modifiers(Object *object)
virtual void build_object_from_layer(int base_index, Object *object, eDepsNode_LinkedState_Type linked_state)
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
#define ID_TYPE_USE_COPY_ON_EVAL(_id_type)
#define ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW(id_type)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bNodeTree ** node_tree_ptr_from_id(ID *id)
uint64_t IDComponentsMask
@ NTREE_GEOMETRY_PREPROCESS
bool rna_prop_affects_parameters_node(const PointerRNA *ptr, const PropertyRNA *prop)
void deg_evaluate_object_node_visibility(::Depsgraph *depsgraph, IDNode *id_node)
void deg_create_eval_copy(::Depsgraph *graph, const IDNode *id_node)
static bool strip_node_build_cb(Strip *strip, void *user_data)
bool deg_eval_copy_is_expanded(const ID *id_cow)
@ GENERIC_DATABLOCK_UPDATE
@ TRANSFORM_SIMULATION_INIT
@ OBJECT_FROM_LAYER_ENTRY
@ RIGIDBODY_TRANSFORM_COPY
@ SYNCHRONIZE_TO_ORIGINAL
@ PARTICLE_SETTINGS_RESET
@ NTREE_GEOMETRY_PREPROCESS
void deg_free_eval_copy_datablock(ID *id_cow)
bool deg_eval_copy_is_needed(const ID *id_orig)
std::function< void(::Depsgraph *)> DepsEvalOperationCb
bool data_path_maybe_shared(const ID &id, const StringRef data_path)
eDepsNode_LinkedState_Type
@ DEG_ID_LINKED_INDIRECTLY
@ DEPSOP_FLAG_NEEDS_UPDATE
@ DEPSOP_FLAG_AFFECTS_VISIBILITY
@ DEPSOP_FLAG_USER_MODIFIED
static int foreach_id_cow_detect_need_for_update_callback(LibraryIDLinkCallbackData *cb_data)
void graph_id_tag_update(Main *bmain, Depsgraph *graph, ID *id, uint flags, eUpdateSource update_source)
@ DEG_UPDATE_SOURCE_USER_EDIT
@ DEG_UPDATE_SOURCE_RELATIONS
void for_each_callback(ListBase *seqbase, ForEachFunc callback, void *user_data)
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
const char * RNA_property_identifier(const PropertyRNA *prop)
PointerRNA RNA_id_pointer_create(ID *id)
bool RNA_path_resolve_full(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
struct Object * focus_object
struct CameraDOFSettings dof
struct Object * textoncurve
struct ViewLayer * view_layer
struct bNodeTree * nodetree
struct Collection * blocker_collection
struct Collection * receiver_collection
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct Collection * instance_collection
ListBase greasepencil_modifiers
LightLinking * light_linking
struct Collection * instance_collection
struct Object * instance_object
struct Collection * constraints
struct Collection * group
struct RigidBodyWorld * rigidbody_world
struct bNodeTree * nodetree
bNodeTreeRuntimeHandle * runtime
std::string identifier() const override
OperationNode * find_operation(OperationIDKey key) const
OperationNode * add_operation(const DepsEvalOperationCb &op, OperationCode opcode, const StringRef name="", int name_tag=-1)
OperationNode * entry_operation
DEGCustomDataMeshMasks previous_customdata_masks
IDComponentsMask previously_visible_components_mask
uint32_t previous_eval_flags
IDComponentsMask previously_visible_components_mask
DEGCustomDataMeshMasks customdata_masks
DEGCustomDataMeshMasks previous_customdata_masks
ComponentNode * add_component(NodeType type, StringRef name="")
IDComponentsMask visible_components_mask
bool is_collection_fully_expanded
Map< ComponentIDKey, ComponentNode * > components
eDepsNode_LinkedState_Type linked_state
ComponentNode * find_component(NodeType type, StringRef name="") const
uint32_t previous_eval_flags
const char * component_name
void tag_update(Depsgraph *graph, eUpdateSource source) override
DepsEvalOperationCb evaluate
std::string identifier() const override