Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/intern/object_update.c22
-rw-r--r--source/blender/depsgraph/DEG_depsgraph.h1
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc8
-rw-r--r--source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc1
-rw-r--r--source/blender/depsgraph/intern/depsgraph_tag.cc15
-rw-r--r--source/blender/depsgraph/intern/depsgraph_type_defines.cc2
-rw-r--r--source/blender/depsgraph/intern/depsgraph_types.h5
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_flush.cc1
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node.cc3
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_component.cc43
-rw-r--r--source/blender/depsgraph/intern/nodes/deg_node_component.h1
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c16
13 files changed, 90 insertions, 30 deletions
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 0826a5fa5eb..eb1c99e9d6a 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -206,6 +206,8 @@ void BKE_object_eval_cloth(const struct EvaluationContext *eval_ctx,
void BKE_object_eval_update_shading(const struct EvaluationContext *eval_ctx,
struct Object *object);
+void BKE_object_data_select_update(const struct EvaluationContext *eval_ctx,
+ struct ID *object_data);
void BKE_object_handle_data_update(
const struct EvaluationContext *eval_ctx,
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 76b72f7a308..8da3e8136b3 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -396,3 +396,25 @@ void BKE_object_eval_update_shading(const EvaluationContext *UNUSED(eval_ctx), O
BKE_mesh_batch_cache_dirty(object->data, BKE_MESH_BATCH_DIRTY_SHADING);
}
}
+
+void BKE_object_data_select_update(const EvaluationContext *UNUSED(eval_ctx),
+ struct ID *object_data)
+{
+ DEBUG_PRINT("%s on %s (%p)\n", __func__, object_data->name, object_data);
+ switch (GS(object_data->name)) {
+ case ID_ME:
+ BKE_mesh_batch_cache_dirty((Mesh *)object_data,
+ BKE_CURVE_BATCH_DIRTY_SELECT);
+ break;
+ case ID_CU:
+ BKE_curve_batch_cache_dirty((Curve *)object_data,
+ BKE_CURVE_BATCH_DIRTY_SELECT);
+ break;
+ case ID_LT:
+ BKE_lattice_batch_cache_dirty((struct Lattice *)object_data,
+ BKE_CURVE_BATCH_DIRTY_SELECT);
+ break;
+ default:
+ break;
+ }
+}
diff --git a/source/blender/depsgraph/DEG_depsgraph.h b/source/blender/depsgraph/DEG_depsgraph.h
index b224303fb84..f007ceeed9e 100644
--- a/source/blender/depsgraph/DEG_depsgraph.h
+++ b/source/blender/depsgraph/DEG_depsgraph.h
@@ -165,6 +165,7 @@ enum {
* Only parameters of material changed).
*/
DEG_TAG_SHADING_UPDATE = (1 << 9),
+ DEG_TAG_SELECT_UPDATE = (1 << 10),
};
void DEG_id_tag_update(struct ID *id, int flag);
void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 948e1410df5..0f68f317984 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1060,6 +1060,14 @@ void DepsgraphNodeBuilder::build_obdata_geom(Object *object)
DEG_NODE_TYPE_PARAMETERS,
NULL,
DEG_OPCODE_PARAMETERS_EVAL);
+
+ /* Batch cache. */
+ add_operation_node(obdata,
+ DEG_NODE_TYPE_BATCH_CACHE,
+ function_bind(BKE_object_data_select_update,
+ _1,
+ obdata_cow),
+ DEG_OPCODE_GEOMETRY_SELECT_UPDATE);
}
/* Cameras */
diff --git a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
index 618f4ced295..5111db08e03 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
@@ -383,6 +383,7 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
case DEG_NODE_TYPE_LAYER_COLLECTIONS:
case DEG_NODE_TYPE_EVAL_PARTICLES:
case DEG_NODE_TYPE_COPY_ON_WRITE:
+ case DEG_NODE_TYPE_BATCH_CACHE:
{
ComponentDepsNode *comp_node = (ComponentDepsNode *)node;
if (!comp_node->operations.empty()) {
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc
index 58bae1f5cc6..968be5269c4 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cc
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cc
@@ -282,6 +282,18 @@ void id_tag_update_copy_on_write(Depsgraph *graph, IDDepsNode *id_node)
cow_node->tag_update(graph);
}
+void id_tag_update_select_update(Depsgraph *graph, IDDepsNode *id_node)
+{
+ ComponentDepsNode *batch_cache_comp =
+ id_node->find_component(DEG_NODE_TYPE_BATCH_CACHE);
+ OperationDepsNode *select_update_node =
+ batch_cache_comp->find_operation(DEG_OPCODE_GEOMETRY_SELECT_UPDATE,
+ "", -1);
+ if (select_update_node != NULL) {
+ select_update_node->tag_update(graph);
+ }
+}
+
void id_tag_update_ntree_special(Main *bmain, Depsgraph *graph, ID *id, int flag)
{
bNodeTree *ntree = NULL;
@@ -345,6 +357,9 @@ void deg_graph_id_tag_update(Main *bmain, Depsgraph *graph, ID *id, int flag)
if (flag & DEG_TAG_COPY_ON_WRITE) {
id_tag_update_copy_on_write(graph, id_node);
}
+ if (flag & DEG_TAG_SELECT_UPDATE) {
+ id_tag_update_select_update(graph, id_node);
+ }
id_tag_update_ntree_special(bmain, graph, id, flag);
}
diff --git a/source/blender/depsgraph/intern/depsgraph_type_defines.cc b/source/blender/depsgraph/intern/depsgraph_type_defines.cc
index f5f1980557f..b6e58b13186 100644
--- a/source/blender/depsgraph/intern/depsgraph_type_defines.cc
+++ b/source/blender/depsgraph/intern/depsgraph_type_defines.cc
@@ -136,6 +136,8 @@ static const char *stringify_opcode(eDepsOperation_Code opcode)
STRINGIFY_OPCODE(PARTICLE_SYSTEM_EVAL);
STRINGIFY_OPCODE(PARTICLE_SETTINGS_EVAL);
STRINGIFY_OPCODE(PARTICLE_SETTINGS_RECALC_CLEAR);
+ /* Batch cache. */
+ STRINGIFY_OPCODE(GEOMETRY_SELECT_UPDATE);
/* Masks. */
STRINGIFY_OPCODE(MASK_ANIMATION);
STRINGIFY_OPCODE(MASK_EVAL);
diff --git a/source/blender/depsgraph/intern/depsgraph_types.h b/source/blender/depsgraph/intern/depsgraph_types.h
index d7084a38a94..c73488bd434 100644
--- a/source/blender/depsgraph/intern/depsgraph_types.h
+++ b/source/blender/depsgraph/intern/depsgraph_types.h
@@ -147,6 +147,8 @@ typedef enum eDepsNode_Type {
DEG_NODE_TYPE_SHADING_PARAMETERS,
/* Cache Component */
DEG_NODE_TYPE_CACHE,
+ /* Batch Cache Component */
+ DEG_NODE_TYPE_BATCH_CACHE,
} eDepsNode_Type;
/* Identifiers for common operations (as an enum). */
@@ -245,6 +247,9 @@ typedef enum eDepsOperation_Code {
DEG_OPCODE_MATERIAL_UPDATE,
DEG_OPCODE_WORLD_UPDATE,
+ /* Batch caches. -------------------------------------- */
+ DEG_OPCODE_GEOMETRY_SELECT_UPDATE,
+
/* Masks. ------------------------------------------ */
DEG_OPCODE_MASK_ANIMATION,
DEG_OPCODE_MASK_EVAL,
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index cbe00a98719..832d7339904 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -209,6 +209,7 @@ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph)
case DEG_NODE_TYPE_PROXY:
object->recalc |= OB_RECALC_DATA;
break;
+ case DEG_NODE_TYPE_BATCH_CACHE:
case DEG_NODE_TYPE_SHADING_PARAMETERS:
break;
}
diff --git a/source/blender/depsgraph/intern/nodes/deg_node.cc b/source/blender/depsgraph/intern/nodes/deg_node.cc
index 05138d90a7b..5f83d02082b 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node.cc
@@ -291,6 +291,9 @@ void IDDepsNode::tag_update(Depsgraph *graph)
/* Only do explicit particle settings tagging. */
do_component_tag = false;
}
+ else if (comp_node->type == DEG_NODE_TYPE_BATCH_CACHE) {
+ do_component_tag = false;
+ }
if (do_component_tag) {
comp_node->tag_update(graph);
}
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.cc b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
index aca25acd7c3..bba16316288 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
@@ -161,7 +161,22 @@ string ComponentDepsNode::identifier() const
OperationDepsNode *ComponentDepsNode::find_operation(OperationIDKey key) const
{
- OperationDepsNode *node = reinterpret_cast<OperationDepsNode *>(BLI_ghash_lookup(operations_map, &key));
+ OperationDepsNode *node = NULL;
+ if (operations_map != NULL) {
+ node = (OperationDepsNode *)BLI_ghash_lookup(operations_map, &key);
+ }
+ else {
+ BLI_assert(key.name_tag == -1);
+ foreach (OperationDepsNode *op_node, operations) {
+ if (op_node->opcode == key.opcode &&
+ STREQ(op_node->name, key.name))
+ {
+ node = op_node;
+ break;
+ }
+ }
+ }
+
if (node != NULL) {
return node;
}
@@ -339,6 +354,7 @@ static DepsNodeFactoryImpl<name ## ComponentDepsNode> DNTI_ ## NAME
DEG_COMPONENT_DEFINE(Animation, ANIMATION);
+DEG_COMPONENT_DEFINE(BatchCache, BATCH_CACHE);
DEG_COMPONENT_DEFINE(Cache, CACHE);
DEG_COMPONENT_DEFINE(CopyOnWrite, COPY_ON_WRITE);
DEG_COMPONENT_DEFINE(Geometry, GEOMETRY);
@@ -377,26 +393,21 @@ DEG_COMPONENT_DEFINE(Bone, BONE);
void deg_register_component_depsnodes()
{
- deg_register_node_typeinfo(&DNTI_PARAMETERS);
- deg_register_node_typeinfo(&DNTI_PROXY);
deg_register_node_typeinfo(&DNTI_ANIMATION);
- deg_register_node_typeinfo(&DNTI_TRANSFORM);
- deg_register_node_typeinfo(&DNTI_GEOMETRY);
- deg_register_node_typeinfo(&DNTI_SEQUENCER);
-
- deg_register_node_typeinfo(&DNTI_EVAL_POSE);
deg_register_node_typeinfo(&DNTI_BONE);
-
+ deg_register_node_typeinfo(&DNTI_CACHE);
+ deg_register_node_typeinfo(&DNTI_BATCH_CACHE);
+ deg_register_node_typeinfo(&DNTI_COPY_ON_WRITE);
+ deg_register_node_typeinfo(&DNTI_GEOMETRY);
+ deg_register_node_typeinfo(&DNTI_LAYER_COLLECTIONS);
+ deg_register_node_typeinfo(&DNTI_PARAMETERS);
deg_register_node_typeinfo(&DNTI_EVAL_PARTICLES);
-
+ deg_register_node_typeinfo(&DNTI_PROXY);
+ deg_register_node_typeinfo(&DNTI_EVAL_POSE);
+ deg_register_node_typeinfo(&DNTI_SEQUENCER);
deg_register_node_typeinfo(&DNTI_SHADING);
deg_register_node_typeinfo(&DNTI_SHADING_PARAMETERS);
-
- deg_register_node_typeinfo(&DNTI_CACHE);
-
- deg_register_node_typeinfo(&DNTI_LAYER_COLLECTIONS);
-
- deg_register_node_typeinfo(&DNTI_COPY_ON_WRITE);
+ deg_register_node_typeinfo(&DNTI_TRANSFORM);
}
} // namespace DEG
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.h b/source/blender/depsgraph/intern/nodes/deg_node_component.h
index 3fef313b1e4..9be5388e69f 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.h
@@ -162,6 +162,7 @@ struct ComponentDepsNode : public DepsNode {
}
DEG_COMPONENT_DECLARE_GENERIC(Animation);
+DEG_COMPONENT_DECLARE_GENERIC(BatchCache);
DEG_COMPONENT_DECLARE_GENERIC(Cache);
DEG_COMPONENT_DECLARE_GENERIC(CopyOnWrite);
DEG_COMPONENT_DECLARE_GENERIC(Geometry);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index c01eadce0fb..0dffab3511e 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -915,22 +915,10 @@ static void view3d_main_region_listener(
case ND_SELECT:
{
WM_manipulatormap_tag_refresh(mmap);
-
if (scene->obedit) {
Object *ob = scene->obedit;
- switch (ob->type) {
- case OB_MESH:
- BKE_mesh_batch_cache_dirty(ob->data, BKE_CURVE_BATCH_DIRTY_SELECT);
- break;
- // case OB_FONT: /* handled by text_update_edited */
- case OB_CURVE:
- case OB_SURF:
- BKE_curve_batch_cache_dirty(ob->data, BKE_CURVE_BATCH_DIRTY_SELECT);
- break;
- case OB_LATTICE:
- BKE_lattice_batch_cache_dirty(ob->data, BKE_CURVE_BATCH_DIRTY_SELECT);
- break;
- }
+ /* TODO(sergey): Notifiers shouldn't really be doing DEG tags. */
+ DEG_id_tag_update((ID *)ob->data, DEG_TAG_SELECT_UPDATE);
}
ATTR_FALLTHROUGH;
}