Core: Add ObjectRuntime::last_update transform, geometry and shading #115196

Merged
Miguel Pozo merged 8 commits from pragma37/blender:pull-recalc-last_updated into main 2023-11-27 12:03:27 +01:00
11 changed files with 73 additions and 9 deletions

View File

@ -452,6 +452,8 @@ void BKE_object_eval_transform_final(Depsgraph *depsgraph, Object *ob);
void BKE_object_eval_uber_transform(Depsgraph *depsgraph, Object *object);
void BKE_object_eval_uber_data(Depsgraph *depsgraph, Scene *scene, Object *ob);
void BKE_object_eval_shading(Depsgraph *depsgraph, Object *ob);
void BKE_object_eval_light_linking(Depsgraph *depsgraph, Object *object);
/**

View File

@ -121,6 +121,11 @@ struct ObjectRuntime {
Array<float3x3, 0> crazyspace_deform_imats;
Array<float3, 0> crazyspace_deform_cos;
/* The Depsgraph::update_count when this object was last updated. */
uint64_t last_update_transform = 0;
uint64_t last_update_geometry = 0;
uint64_t last_update_shading = 0;
};
} // namespace blender::bke
} // namespace blender::bke

View File

@ -137,6 +137,8 @@ void BKE_object_eval_transform_final(Depsgraph *depsgraph, Object *ob)
else {
ob->transflag &= ~OB_NEG_SCALE;
}
ob->runtime->last_update_transform = DEG_get_update_count(depsgraph);
}
void BKE_object_handle_data_update(Depsgraph *depsgraph, Scene *scene, Object *ob)
@ -339,6 +341,8 @@ void BKE_object_eval_uber_data(Depsgraph *depsgraph, Scene *scene, Object *ob)
BLI_assert(ob->type != OB_ARMATURE);
BKE_object_handle_data_update(depsgraph, scene, ob);
BKE_object_batch_cache_dirty_tag(ob);
ob->runtime->last_update_geometry = DEG_get_update_count(depsgraph);
}
void BKE_object_eval_ptcache_reset(Depsgraph *depsgraph, Scene *scene, Object *object)
@ -458,3 +462,10 @@ void BKE_object_eval_light_linking(Depsgraph *depsgraph, Object *object)
DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
deg::light_linking::eval_runtime_data(depsgraph, *object);
}
void BKE_object_eval_shading(Depsgraph *depsgraph, Object *object)
{
DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
object->runtime->last_update_shading = DEG_get_update_count(depsgraph);
}

View File

@ -211,6 +211,9 @@ bool DEG_is_active(const Depsgraph *depsgraph);
void DEG_make_active(Depsgraph *depsgraph);
void DEG_make_inactive(Depsgraph *depsgraph);
/* Returns the number of times the graph has been evaluated. */
uint64_t DEG_get_update_count(const Depsgraph *depsgraph);
/**
* Disable the visibility optimization making it so IDs which affect hidden objects or disabled
* modifiers are still evaluated.

View File

@ -842,6 +842,8 @@ void DepsgraphNodeBuilder::build_object(int base_index,
build_object_light_linking(object);
build_object_shading(object);
/* Synchronization back to original object. */
add_operation_node(&object->id,
NodeType::SYNCHRONIZATION,
@ -1168,6 +1170,16 @@ void DepsgraphNodeBuilder::build_light_linking_collection(Collection *collection
}
}
void DepsgraphNodeBuilder::build_object_shading(Object *object)
{
Object *object_cow = get_cow_datablock(object);
add_operation_node(
&object->id,
NodeType::SHADING,
OperationCode::SHADING,
[object_cow](::Depsgraph *depsgraph) { BKE_object_eval_shading(depsgraph, object_cow); });
}
void DepsgraphNodeBuilder::build_animdata(ID *id)
{
/* Special handling for animated images/sequences. */
@ -1652,6 +1664,9 @@ void DepsgraphNodeBuilder::build_object_data_geometry(Object *object)
NodeType::BATCH_CACHE,
OperationCode::GEOMETRY_SELECT_UPDATE,
[object_cow](::Depsgraph *depsgraph) { BKE_object_select_update(depsgraph, object_cow); });
/* Shading (No-Op).
* Needed to allow the Material shading updates reach the Object. */
add_operation_node((ID *)object->data, NodeType::SHADING, OperationCode::SHADING);
}
void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata)

View File

@ -195,6 +195,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder {
virtual void build_object_transform(Object *object);
virtual void build_object_constraints(Object *object);
virtual void build_object_pointcache(Object *object);
virtual void build_object_shading(Object *object);
virtual void build_object_light_linking(Object *object);
virtual void build_light_linking_collection(Collection *collection);

View File

@ -1014,7 +1014,8 @@ void DepsgraphRelationBuilder::build_object_data(Object *object)
Material ***materials_ptr = BKE_object_material_array_p(object);
if (materials_ptr != nullptr) {
short *num_materials_ptr = BKE_object_material_len_p(object);
build_materials(*materials_ptr, *num_materials_ptr);
ID *obdata = (ID *)object->data;
build_materials(obdata, *materials_ptr, *num_materials_ptr);
}
}
@ -1034,6 +1035,8 @@ void DepsgraphRelationBuilder::build_object_data_light(Object *object)
ComponentKey lamp_parameters_key(&lamp->id, NodeType::PARAMETERS);
ComponentKey object_parameters_key(&object->id, NodeType::PARAMETERS);
add_relation(lamp_parameters_key, object_parameters_key, "Light -> Object");
OperationKey object_shading_key(&object->id, NodeType::SHADING, OperationCode::SHADING);
add_relation(lamp_parameters_key, object_shading_key, "Light -> Object Shading");
}
void DepsgraphRelationBuilder::build_object_data_lightprobe(Object *object)
@ -1043,6 +1046,8 @@ void DepsgraphRelationBuilder::build_object_data_lightprobe(Object *object)
OperationKey probe_key(&probe->id, NodeType::PARAMETERS, OperationCode::LIGHT_PROBE_EVAL);
OperationKey object_key(&object->id, NodeType::PARAMETERS, OperationCode::LIGHT_PROBE_EVAL);
add_relation(probe_key, object_key, "LightProbe Update");
OperationKey object_shading_key(&object->id, NodeType::SHADING, OperationCode::SHADING);
add_relation(probe_key, object_shading_key, "LightProbe -> Object Shading");
}
void DepsgraphRelationBuilder::build_object_data_speaker(Object *object)
@ -2499,7 +2504,7 @@ void DepsgraphRelationBuilder::build_object_data_geometry(Object *object)
}
}
/* Materials. */
build_materials(object->mat, object->totcol);
build_materials(&object->id, object->mat, object->totcol);
/* Geometry collision. */
if (ELEM(object->type, OB_MESH, OB_CURVES_LEGACY, OB_LATTICE)) {
// add geometry collider relations
@ -2564,6 +2569,10 @@ void DepsgraphRelationBuilder::build_object_data_geometry(Object *object)
add_relation(object_data_select_key, object_select_key, "Data Selection -> Object Selection");
add_relation(
geom_key, object_select_key, "Object Geometry -> Select Update", RELATION_FLAG_NO_FLUSH);
/* Shading. */
ComponentKey geometry_shading_key(obdata, NodeType::SHADING);
OperationKey object_shading_key(&object->id, NodeType::SHADING, OperationCode::SHADING);
add_relation(geometry_shading_key, object_shading_key, "Geometry Shading -> Object Shading");
}
void DepsgraphRelationBuilder::build_object_data_geometry_datablock(ID *obdata)
@ -2953,8 +2962,14 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
}
/* Recursively build graph for material */
void DepsgraphRelationBuilder::build_material(Material *material)
void DepsgraphRelationBuilder::build_material(Material *material, ID *owner)
{
if (owner) {
ComponentKey material_key(&material->id, NodeType::SHADING);
OperationKey owner_shading_key(owner, NodeType::SHADING, OperationCode::SHADING);
add_relation(material_key, owner_shading_key, "Material -> Owner Shading");
}
if (built_map_.checkIsBuiltAndTag(material)) {
return;
}
@ -2981,13 +2996,13 @@ void DepsgraphRelationBuilder::build_material(Material *material)
}
}
void DepsgraphRelationBuilder::build_materials(Material **materials, int num_materials)
void DepsgraphRelationBuilder::build_materials(ID *owner, Material **materials, int num_materials)
{
for (int i = 0; i < num_materials; i++) {
if (materials[i] == nullptr) {
continue;
}
build_material(materials[i]);
build_material(materials[i], owner);
}
}

View File

@ -231,8 +231,8 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder {
virtual void build_light(Light *lamp);
virtual void build_nodetree(bNodeTree *ntree);
virtual void build_nodetree_socket(bNodeSocket *socket);
virtual void build_material(Material *ma);
virtual void build_materials(Material **materials, int num_materials);
virtual void build_material(Material *ma, ID *owner = nullptr);
virtual void build_materials(ID *owner, Material **materials, int num_materials);
virtual void build_freestyle_lineset(FreestyleLineSet *fls);
virtual void build_freestyle_linestyle(FreestyleLineStyle *linestyle);
virtual void build_texture(Tex *tex);

View File

@ -62,7 +62,8 @@ Depsgraph::Depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluati
use_visibility_optimization(true),
is_evaluating(false),
is_render_pipeline_depsgraph(false),
use_editors_update(false)
use_editors_update(false),
update_count(0)
{
BLI_spin_init(&lock);
memset(id_type_updated, 0, sizeof(id_type_updated));
@ -344,3 +345,9 @@ void DEG_disable_visibility_optimization(Depsgraph *depsgraph)
deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(depsgraph);
deg_graph->use_visibility_optimization = false;
}
uint64_t DEG_get_update_count(const Depsgraph *depsgraph)
{
const deg::Depsgraph *deg_graph = reinterpret_cast<const deg::Depsgraph *>(depsgraph);
return deg_graph->update_count;
}

View File

@ -171,6 +171,9 @@ struct Depsgraph {
light_linking::Cache light_linking_cache;
/* The number of times this graph has been evaluated. */
uint64_t update_count;
MEM_CXX_CLASS_ALLOC_FUNCS("Depsgraph");
};

View File

@ -387,6 +387,8 @@ void deg_evaluate_on_refresh(Depsgraph *graph)
return;
}
graph->update_count++;
graph->debug.begin_graph_evaluation();
#ifdef WITH_PYTHON