96#include "RNA_prototypes.hh"
142 if (id_info.id_cow !=
nullptr) {
154 IDNode *id_node =
nullptr;
155 ID *id_cow =
nullptr;
157 uint32_t previous_eval_flags = 0;
160 if (id_info !=
nullptr) {
166 id_info->
id_cow =
nullptr;
168 id_node =
graph_->add_id_node(
id, id_cow);
174 const bool is_newly_created = id_node->
components.is_empty();
176 if (is_newly_created) {
182 graph_->operations.append(op_cow);
191 if (id_type ==
ID_OB) {
199 visibility_operation = visibility_component->
add_operation(
nullptr,
207 graph_->operations.append(visibility_operation);
214 return graph_->find_id_node(
id);
219 return graph_->add_time_source();
224 const char *comp_name)
228 comp_node->
owner = id_node;
234 const char *comp_name)
237 if (id_node ==
nullptr) {
250 if (op_node ==
nullptr) {
252 graph_->operations.append(op_node);
256 "add_operation: Operation already exists - %s has %s at %p\n",
267 const char *comp_name,
289 const char *comp_name,
296 if (operation !=
nullptr) {
310 if (operation !=
nullptr) {
318 const char *comp_name,
335 const char *comp_name,
341 if (comp_node ==
nullptr) {
361 return graph_->get_cow_id(id_orig);
401 id_node->
id_cow =
nullptr;
415 graph_->clear_all_nodes();
416 graph_->operations.clear();
417 graph_->entry_tags.clear();
433 if (id_pointer->
orig_id ==
nullptr) {
437 if (id_node !=
nullptr && id_node->
id_cow !=
nullptr) {
453 if (id_node ==
nullptr) {
538 if (operation_node ==
nullptr) {
551 if (operation_node ==
nullptr) {
699 const bool is_collection_restricted = (collection->
flag & visibility_flag);
702 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) {
845 (object->
pd->
tex !=
nullptr))
875 BKE_object_sync_to_original(depsgraph, object_cow);
898 if (base_index == -1) {
909 [view_layer_index =
view_layer_index_, scene_cow, object_cow, base_index, is_from_set](
911 BKE_object_eval_eval_base_flags(
912 depsgraph, scene_cow, view_layer_index, object_cow, base_index, is_from_set);
942 deg_evaluate_object_modifiers_mode_node_visibility(depsgraph, id_node);
951 [id_node, modifier_index, modifier_node](
::Depsgraph * ) {
969 if ((
modifier->mode & modifier_mode) == 0) {
974 graph_->has_animated_visibility =
true;
991 if (object->
data ==
nullptr) {
995 switch (object->
type) {
1035 if (materials_ptr !=
nullptr) {
1066 if (parent ==
nullptr) {
1095 if (object->
parent !=
nullptr) {
1150 BKE_object_eval_constraints(depsgraph, scene_cow, object_cow);
1165 BKE_object_eval_ptcache_reset(depsgraph, scene_cow, object_cow);
1179 BKE_object_eval_light_linking(depsgraph, object_cow);
1182 graph_->light_linking_cache.add_emitter(*
graph_->scene, *
object);
1192 if (collection ==
nullptr) {
1243 if (adt ==
nullptr) {
1246 if (adt->
action !=
nullptr) {
1280 if (strip->act !=
nullptr) {
1283 else if (strip->strips.first !=
nullptr) {
1293 bool has_image_animation =
false;
1298 has_image_animation =
true;
1314 if (
built_map_.check_is_built_and_tag(action)) {
1328 bool needs_unshare =
false;
1337 if (!needs_unshare) {
1399 scene_, target_prop, dtar->rna_path))
1410 const char *camera_path)
1414 if (!
ELEM(marker->camera,
nullptr, scene->
camera)) {
1422 const char *rna_path_from_target_prop)
1424 if (rna_path_from_target_prop ==
nullptr || rna_path_from_target_prop[0] ==
'\0') {
1434 if (prop ==
nullptr) {
1494 if (
built_map_.check_is_built_and_tag(world)) {
1552 BKE_rigidbody_eval_simulation(depsgraph,
1559 if (rbw->
group !=
nullptr) {
1562 if (object->type !=
OB_MESH) {
1565 if (object->rigidbody_object ==
nullptr) {
1581 BKE_rigidbody_object_sync_transforms(depsgraph, scene_cow, object_cow);
1590 if (rbc ==
nullptr || rbc->
ob1 ==
nullptr || rbc->
ob2 ==
nullptr) {
1640 if (
ELEM(particle_target->ob,
nullptr,
object)) {
1666 if (
built_map_.check_is_built_and_tag(particle_settings)) {
1684 BKE_particle_settings_eval_reset(depsgraph, particle_settings_cow);
1690 for (
MTex *mtex : particle_settings->
mtex) {
1691 if (mtex ==
nullptr || mtex->
tex ==
nullptr) {
1700 if (
built_map_.check_is_built_and_tag(key)) {
1734 BKE_object_eval_uber_data(depsgraph, scene_cow, object_cow);
1754 if (
built_map_.check_is_built_and_tag(obdata)) {
1798 if (cu->
bevobj !=
nullptr) {
1821 Curves *curves_id =
reinterpret_cast<Curves *
>(obdata);
1826 if (curves_id->
surface !=
nullptr) {
1880 if (
built_map_.check_is_built_and_tag(armature)) {
1919 if (
built_map_.check_is_built_and_tag(camera)) {
1933 if (
built_map_.check_is_built_and_tag(lamp)) {
1973 if (ntree ==
nullptr) {
1976 if (
built_map_.check_is_built_and_tag(ntree)) {
1995 bNodeTree *ntree_cow = reinterpret_cast<bNodeTree *>(id_cow);
1996 bke::node_tree_runtime::preprocess_geometry_node_tree_for_evaluation(
2002 for (
bNode *bnode : ntree->all_nodes()) {
2012 if (
id ==
nullptr) {
2016 if (id_type ==
ID_MA) {
2019 else if (id_type ==
ID_TE) {
2022 else if (id_type ==
ID_IM) {
2025 else if (id_type ==
ID_OB) {
2029 else if (id_type ==
ID_SCE) {
2036 if (node_scene->
camera !=
nullptr) {
2041 else if (id_type ==
ID_TXT) {
2044 else if (id_type ==
ID_MSK) {
2047 else if (id_type ==
ID_MC) {
2050 else if (id_type ==
ID_VF) {
2053 else if (id_type ==
ID_GR) {
2056 else if (bnode->is_group()) {
2068 ntree->ensure_interface_cache();
2081 if (
built_map_.check_is_built_and_tag(material)) {
2104 for (
int i = 0;
i < num_materials;
i++) {
2105 if (materials[
i] ==
nullptr) {
2128 if (
texture->ima !=
nullptr) {
2136 texture_cow->runtime.last_update = DEG_get_update_count(depsgraph);
2142 if (
built_map_.check_is_built_and_tag(image)) {
2154 if (
built_map_.check_is_built_and_tag(cache_file)) {
2157 ID *cache_file_id = &cache_file->
id;
2200 for (
int i = 0;
i < spline->tot_point;
i++) {
2203 if (parent ==
nullptr || parent->
id ==
nullptr) {
2214 if (
built_map_.check_is_built_and_tag(linestyle)) {
2218 ID *linestyle_id = &linestyle->
id;
2228 if (
built_map_.check_is_built_and_tag(clip)) {
2231 ID *clip_id = &clip->
id;
2249 if (
built_map_.check_is_built_and_tag(probe)) {
2262 if (
built_map_.check_is_built_and_tag(speaker)) {
2271 if (speaker->
sound !=
nullptr) {
2278 if (
built_map_.check_is_built_and_tag(sound)) {
2287 BKE_sound_evaluate(depsgraph, bmain, sound_cow);
2297 if (
built_map_.check_is_built_and_tag(vfont)) {
2312 if (strip->
sound !=
nullptr) {
2315 if (strip->
scene !=
nullptr) {
2343 if (scene->
ed ==
nullptr) {
2355 seq::eval_strips(depsgraph, scene_cow, &scene_cow->ed->seqbase);
2378 BKE_scene_update_tag_audio_volume(depsgraph, scene_cow);
2386 Object *
object = base->object;
2404 if (
id ==
nullptr) {
2412 data->builder->build_id(
id);
2424 if (
id ==
nullptr) {
2432 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)
#define ID_TYPE_USE_COPY_ON_EVAL(_id_type)
#define ID_TYPE_SUPPORTS_PARAMS_WITHOUT_COW(id_type)
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.
@ eSeqModifierType_Compositor
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
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 foreach_strip(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
IDProperty * system_properties
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 * node_group
struct IDProperty * system_properties
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