[Bf-blender-cvs] [ef2bba87475] temp-modifiers-instancing: restructure depsgraph object iterator
Jacques Lucke
noreply at git.blender.org
Wed Nov 11 16:09:30 CET 2020
Commit: ef2bba87475843e7b4ffe181c8d08957d9304ebc
Author: Jacques Lucke
Date: Wed Nov 11 15:54:55 2020 +0100
Branches: temp-modifiers-instancing
https://developer.blender.org/rBef2bba87475843e7b4ffe181c8d08957d9304ebc
restructure depsgraph object iterator
===================================================================
M source/blender/depsgraph/DEG_depsgraph_query.h
M source/blender/depsgraph/intern/depsgraph_query_iter.cc
===================================================================
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 2877c378e5f..a0db520b4cb 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -147,9 +147,8 @@ typedef struct DEGObjectIterData {
eEvaluationMode eval_mode;
/* **** Iteration over geometry components **** */
- struct Object *geometry_set_owner;
- struct GeometrySetC *geometry_set_c;
- int next_geometry_set_component;
+ struct Object *geometry_component_owner;
+ int geometry_component_id;
struct Object temp_geometry_component_object;
/* **** Iteration over dupli-list. *** */
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index dad36260da1..ed844ecfcd4 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -123,9 +123,66 @@ bool deg_object_hide_original(eEvaluationMode eval_mode, Object *ob, DupliObject
return false;
}
-bool deg_objects_dupli_iterator_next(BLI_Iterator *iter)
+bool deg_iterator_components_step(BLI_Iterator *iter)
{
DEGObjectIterData *data = (DEGObjectIterData *)iter->data;
+ if (data->geometry_component_owner == nullptr) {
+ return false;
+ }
+
+ if (data->geometry_component_owner->type != OB_POINTCLOUD) {
+ /* Only point clouds support multiple geometry components currently. */
+ iter->current = data->geometry_component_owner;
+ data->geometry_component_owner = nullptr;
+ return true;
+ }
+
+ bke::GeometrySet *geometry_set = bke::unwrap(
+ data->geometry_component_owner->runtime.geometry_set_eval);
+ if (geometry_set == nullptr) {
+ data->geometry_component_owner = nullptr;
+ return false;
+ }
+
+ if (data->geometry_component_id == 0) {
+ data->geometry_component_id++;
+
+ /* The mesh component. */
+ const Mesh *mesh = geometry_set->get_mesh_for_read();
+ if (mesh != nullptr) {
+ Object *temp_object = &data->temp_geometry_component_object;
+ *temp_object = *data->geometry_component_owner;
+ temp_object->type = OB_MESH;
+ temp_object->data = (void *)mesh;
+ iter->current = temp_object;
+ return true;
+ }
+ }
+ if (data->geometry_component_id == 1) {
+ data->geometry_component_id++;
+
+ /* The pointcloud component. */
+ const PointCloud *pointcloud = geometry_set->get_pointcloud_for_read();
+ if (pointcloud != nullptr) {
+ Object *temp_object = &data->temp_geometry_component_object;
+ *temp_object = *data->geometry_component_owner;
+ temp_object->type = OB_POINTCLOUD;
+ temp_object->data = (void *)pointcloud;
+ iter->current = temp_object;
+ return true;
+ }
+ }
+ data->geometry_component_owner = nullptr;
+ return false;
+}
+
+/* Returns false when iterator is exhausted. */
+bool deg_iterator_duplis_step(DEGObjectIterData *data)
+{
+ if (data->dupli_list == nullptr) {
+ return false;
+ }
+
while (data->dupli_object_next != nullptr) {
DupliObject *dob = data->dupli_object_next;
Object *obd = dob->ob;
@@ -172,81 +229,87 @@ bool deg_objects_dupli_iterator_next(BLI_Iterator *iter)
copy_m4_m4(data->temp_dupli_object.obmat, dob->mat);
invert_m4_m4(data->temp_dupli_object.imat, data->temp_dupli_object.obmat);
- iter->current = &data->temp_dupli_object;
+ data->geometry_component_owner = &data->temp_dupli_object;
+ data->geometry_component_id = 0;
BLI_assert(deg::deg_validate_copy_on_write_datablock(&data->temp_dupli_object.id));
return true;
}
+ verify_id_properties_freed(data);
+ free_object_duplilist(data->dupli_list);
+ data->dupli_parent = nullptr;
+ data->dupli_list = nullptr;
+ data->dupli_object_next = nullptr;
+ data->dupli_object_current = nullptr;
+ deg_invalidate_iterator_work_data(data);
return false;
}
-void deg_iterator_objects_step(BLI_Iterator *iter, deg::IDNode *id_node)
+/* Returns false when iterator is exhausted. */
+bool deg_iterator_objects_step(DEGObjectIterData *data)
{
- /* Set it early in case we need to exit and we are running from within a loop. */
- iter->skip = true;
+ deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(data->graph);
- if (!id_node->is_directly_visible) {
- return;
- }
+ for (; data->id_node_index < data->num_id_nodes; data->id_node_index++) {
+ deg::IDNode *id_node = deg_graph->id_nodes[data->id_node_index];
- DEGObjectIterData *data = (DEGObjectIterData *)iter->data;
- const ID_Type id_type = GS(id_node->id_orig->name);
+ if (!id_node->is_directly_visible) {
+ continue;
+ }
- if (id_type != ID_OB) {
- return;
- }
+ const ID_Type id_type = GS(id_node->id_orig->name);
- switch (id_node->linked_state) {
- case deg::DEG_ID_LINKED_DIRECTLY:
- if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY) == 0) {
- return;
- }
- break;
- case deg::DEG_ID_LINKED_VIA_SET:
- if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) == 0) {
- return;
- }
- break;
- case deg::DEG_ID_LINKED_INDIRECTLY:
- if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY) == 0) {
- return;
- }
- break;
- }
+ if (id_type != ID_OB) {
+ continue;
+ }
+
+ switch (id_node->linked_state) {
+ case deg::DEG_ID_LINKED_DIRECTLY:
+ if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY) == 0) {
+ continue;
+ }
+ break;
+ case deg::DEG_ID_LINKED_VIA_SET:
+ if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) == 0) {
+ continue;
+ }
+ break;
+ case deg::DEG_ID_LINKED_INDIRECTLY:
+ if ((data->flag & DEG_ITER_OBJECT_FLAG_LINKED_INDIRECTLY) == 0) {
+ continue;
+ }
+ break;
+ }
- Object *object = (Object *)id_node->id_cow;
- BLI_assert(deg::deg_validate_copy_on_write_datablock(&object->id));
+ Object *object = (Object *)id_node->id_cow;
+ BLI_assert(deg::deg_validate_copy_on_write_datablock(&object->id));
- int ob_visibility = OB_VISIBLE_ALL;
- if (data->flag & DEG_ITER_OBJECT_FLAG_VISIBLE) {
- ob_visibility = BKE_object_visibility(object, data->eval_mode);
+ int ob_visibility = OB_VISIBLE_ALL;
+ if (data->flag & DEG_ITER_OBJECT_FLAG_VISIBLE) {
+ ob_visibility = BKE_object_visibility(object, data->eval_mode);
- if (object->type != OB_MBALL && deg_object_hide_original(data->eval_mode, object, nullptr)) {
- return;
+ if (object->type != OB_MBALL && deg_object_hide_original(data->eval_mode, object, nullptr)) {
+ continue;
+ }
}
- }
- if (ob_visibility & OB_VISIBLE_INSTANCES) {
- if ((data->flag & DEG_ITER_OBJECT_FLAG_DUPLI) &&
- ((object->transflag & OB_DUPLI) || object->runtime.geometry_set_eval != nullptr)) {
- data->dupli_parent = object;
- data->dupli_list = object_duplilist(data->graph, data->scene, object);
- data->dupli_object_next = (DupliObject *)data->dupli_list->first;
+ if (ob_visibility & OB_VISIBLE_INSTANCES) {
+ if ((data->flag & DEG_ITER_OBJECT_FLAG_DUPLI) &&
+ ((object->transflag & OB_DUPLI) || object->runtime.geometry_set_eval != nullptr)) {
+ data->dupli_parent = object;
+ data->dupli_list = object_duplilist(data->graph, data->scene, object);
+ data->dupli_object_next = (DupliObject *)data->dupli_list->first;
+ }
}
- }
- if (ob_visibility & (OB_VISIBLE_SELF | OB_VISIBLE_PARTICLES)) {
- iter->current = object;
- if (object->runtime.geometry_set_eval) {
- data->geometry_set_c = object->runtime.geometry_set_eval;
- data->next_geometry_set_component = (int)bke::GeometryComponentType::Mesh;
- data->geometry_set_owner = object;
- iter->skip = true;
- }
- else {
- iter->skip = false;
+ if (ob_visibility & (OB_VISIBLE_SELF | OB_VISIBLE_PARTICLES)) {
+ data->geometry_component_owner = object;
+ data->geometry_component_id = 0;
}
+ data->id_node_index++;
+ return true;
}
+ return false;
}
} // namespace
@@ -272,78 +335,29 @@ void DEG_iterator_objects_begin(BLI_Iterator *iter, DEGObjectIterData *data)
data->id_node_index = 0;
data->num_id_nodes = num_id_nodes;
data->eval_mode = DEG_get_mode(depsgraph);
- data->next_geometry_set_component = 0;
- data->geometry_set_owner = nullptr;
- data->geometry_set_c = nullptr;
+ data->geometry_component_id = 0;
+ data->geometry_component_owner = nullptr;
deg_invalidate_iterator_work_data(data);
- deg::IDNode *id_node = deg_graph->id_nodes[data->id_node_index];
- deg_iterator_objects_step(iter, id_node);
-
- if (iter->skip) {
- DEG_iterator_objects_next(iter);
- }
+ DEG_iterator_objects_next(iter);
}
void DEG_iterator_objects_next(BLI_Iterator *iter)
{
DEGObjectIterData *data = (DEGObjectIterData *)iter->data;
- Depsgraph *depsgraph = data->graph;
- deg::Depsgraph *deg_graph = reinterpret_cast<deg::Depsgraph *>(depsgraph);
- do {
- iter->skip = false;
-
- if (data->geometry_set_c != nullptr) {
- bke::GeometrySet *geometry_set = bke::unwrap(data->geometry_set_c);
- if (data->next_geometry_set_component == (int)bke::GeometryComponentType::Mesh) {
- data->next_geometry_set_component = (int)bke::GeometryComponentType::PointCloud;
- const Mesh *mesh = geometry_set->get_mesh_for_read();
- if (mesh != nullptr) {
- Object *temp_object = &data->temp_geometry_component_object;
- *temp_object = *data->geometry_set_owner;
- temp_object->type = OB_MESH;
- temp_object->data = (void *)mesh;
- iter->current = temp_object;
- return;
- }
- }
- if (data->next_geometry_set_component == (int)bke::GeometryComponentType::PointCloud) {
- data->geometry_set_c = nullptr;
- const PointCloud *pointcloud = geometry_set->get_pointcloud_for_read();
- if (pointcloud != nullptr) {
- Object *temp_object = &data->temp_geometry_component_object;
- *temp_object = *data->geometry_set_owner;
- temp_object->type = OB_POINTCLOUD;
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list