Depsgraph: Replace LIB_TAG_DOIT with hash lookup
[blender.git] / source / blender / depsgraph / intern / builder / deg_builder_relations.cc
index bcb70792af12841ba62cf8a1d92cd1dbd9251b29..c47006a78956e8f8a0da19b23b24910cd8b79531 100644 (file)
@@ -406,26 +406,11 @@ Depsgraph *DepsgraphRelationBuilder::getGraph()
 
 void DepsgraphRelationBuilder::begin_build()
 {
-       /* LIB_TAG_DOIT is used to indicate whether node for given ID was already
-        * created or not.
-        */
-       BKE_main_id_tag_all(bmain_, LIB_TAG_DOIT, false);
-       /* XXX nested node trees are notr included in tag-clearing above,
-        * so we need to do this manually.
-        */
-       FOREACH_NODETREE(bmain_, nodetree, id)
-       {
-               if (id != (ID *)nodetree) {
-                       nodetree->id.tag &= ~LIB_TAG_DOIT;
-               }
-       }
-       FOREACH_NODETREE_END;
 }
 
 void DepsgraphRelationBuilder::build_group(Object *object, Group *group)
 {
-       ID *group_id = &group->id;
-       bool group_done = (group_id->tag & LIB_TAG_DOIT) != 0;
+       const bool group_done = built_map_.checkIsBuiltAndTag(group);
        OperationKey object_local_transform_key(object != NULL ? &object->id : NULL,
                                                DEG_NODE_TYPE_TRANSFORM,
                                                DEG_OPCODE_TRANSFORM_LOCAL);
@@ -438,15 +423,13 @@ void DepsgraphRelationBuilder::build_group(Object *object, Group *group)
                        add_relation(dupli_transform_key, object_local_transform_key, "Dupligroup");
                }
        }
-       group_id->tag |= LIB_TAG_DOIT;
 }
 
 void DepsgraphRelationBuilder::build_object(Object *object)
 {
-       if (object->id.tag & LIB_TAG_DOIT) {
+       if (built_map_.checkIsBuiltAndTag(object)) {
                return;
        }
-       object->id.tag |= LIB_TAG_DOIT;
        /* Object Transforms */
        eDepsOperation_Code base_op = (object->parent) ? DEG_OPCODE_TRANSFORM_PARENT
                                                       : DEG_OPCODE_TRANSFORM_LOCAL;
@@ -1233,24 +1216,18 @@ void DepsgraphRelationBuilder::build_driver_variables(ID *id, FCurve *fcu)
 
 void DepsgraphRelationBuilder::build_world(World *world)
 {
-       ID *world_id = &world->id;
-       if (world_id->tag & LIB_TAG_DOIT) {
+       if (built_map_.checkIsBuiltAndTag(world)) {
                return;
        }
-       world_id->tag |= LIB_TAG_DOIT;
-
-       build_animdata(world_id);
-
+       build_animdata(&world->id);
        /* TODO: other settings? */
-
        /* textures */
        build_texture_stack(world->mtex);
-
        /* world's nodetree */
        if (world->nodetree != NULL) {
                build_nodetree(world->nodetree);
                ComponentKey ntree_key(&world->nodetree->id, DEG_NODE_TYPE_PARAMETERS);
-               ComponentKey world_key(world_id, DEG_NODE_TYPE_PARAMETERS);
+               ComponentKey world_key(&world->id, DEG_NODE_TYPE_PARAMETERS);
                add_relation(ntree_key, world_key, "NTree->World Parameters");
        }
 }
@@ -1609,10 +1586,9 @@ void DepsgraphRelationBuilder::build_obdata_geom(Object *object)
                add_relation(geom_init_key, obdata_ubereval_key, "Object Geometry UberEval");
        }
 
-       if (obdata->tag & LIB_TAG_DOIT) {
+       if (built_map_.checkIsBuiltAndTag(obdata)) {
                return;
        }
-       obdata->tag |= LIB_TAG_DOIT;
 
        /* Link object data evaluation node to exit operation. */
        OperationKey obdata_geom_eval_key(obdata, DEG_NODE_TYPE_GEOMETRY, DEG_OPCODE_PLACEHOLDER, "Geometry Eval");
@@ -1708,16 +1684,14 @@ void DepsgraphRelationBuilder::build_obdata_geom(Object *object)
 // TODO: Link scene-camera links in somehow...
 void DepsgraphRelationBuilder::build_camera(Object *object)
 {
-       Camera *cam = (Camera *)object->data;
-       ID *camera_id = &cam->id;
-       if (camera_id->tag & LIB_TAG_DOIT) {
+       Camera *camera = (Camera *)object->data;
+       if (built_map_.checkIsBuiltAndTag(camera)) {
                return;
        }
-       camera_id->tag |= LIB_TAG_DOIT;
        /* DOF */
-       if (cam->dof_ob) {
+       if (camera->dof_ob) {
                ComponentKey ob_param_key(&object->id, DEG_NODE_TYPE_PARAMETERS);
-               ComponentKey dof_ob_key(&cam->dof_ob->id, DEG_NODE_TYPE_TRANSFORM);
+               ComponentKey dof_ob_key(&camera->dof_ob->id, DEG_NODE_TYPE_TRANSFORM);
                add_relation(dof_ob_key, ob_param_key, "Camera DOF");
        }
 }
@@ -1725,36 +1699,33 @@ void DepsgraphRelationBuilder::build_camera(Object *object)
 /* Lamps */
 void DepsgraphRelationBuilder::build_lamp(Object *object)
 {
-       Lamp *la = (Lamp *)object->data;
-       ID *lamp_id = &la->id;
-       if (lamp_id->tag & LIB_TAG_DOIT) {
+       Lamp *lamp = (Lamp *)object->data;
+       if (built_map_.checkIsBuiltAndTag(lamp)) {
                return;
        }
-       lamp_id->tag |= LIB_TAG_DOIT;
        /* lamp's nodetree */
-       if (la->nodetree != NULL) {
-               build_nodetree(la->nodetree);
-               ComponentKey parameters_key(lamp_id, DEG_NODE_TYPE_PARAMETERS);
-               ComponentKey nodetree_key(&la->nodetree->id, DEG_NODE_TYPE_PARAMETERS);
+       if (lamp->nodetree != NULL) {
+               build_nodetree(lamp->nodetree);
+               ComponentKey parameters_key(&lamp->id, DEG_NODE_TYPE_PARAMETERS);
+               ComponentKey nodetree_key(&lamp->nodetree->id, DEG_NODE_TYPE_PARAMETERS);
                add_relation(nodetree_key, parameters_key, "NTree->Lamp Parameters");
        }
        /* textures */
-       build_texture_stack(la->mtex);
+       build_texture_stack(lamp->mtex);
 }
 
 void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
 {
-       if (!ntree)
+       if (ntree == NULL) {
                return;
-
-       ID *ntree_id = &ntree->id;
-
-       build_animdata(ntree_id);
-
-       OperationKey parameters_key(ntree_id,
+       }
+       if (built_map_.checkIsBuiltAndTag(ntree)) {
+               return;
+       }
+       build_animdata(&ntree->id);
+       OperationKey parameters_key(&ntree->id,
                                    DEG_NODE_TYPE_PARAMETERS,
                                    DEG_OPCODE_PARAMETERS_EVAL);
-
        /* nodetree's nodes... */
        LISTBASE_FOREACH (bNode *, bnode, &ntree->nodes) {
                ID *id = bnode->id;
@@ -1784,10 +1755,7 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
                }
                else if (bnode->type == NODE_GROUP) {
                        bNodeTree *group_ntree = (bNodeTree *)id;
-                       if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) {
-                               build_nodetree(group_ntree);
-                               group_ntree->id.tag |= LIB_TAG_DOIT;
-                       }
+                       build_nodetree(group_ntree);
                        OperationKey group_parameters_key(&group_ntree->id,
                                                          DEG_NODE_TYPE_PARAMETERS,
                                                          DEG_OPCODE_PARAMETERS_EVAL);
@@ -1800,27 +1768,22 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree)
 }
 
 /* Recursively build graph for material */
-void DepsgraphRelationBuilder::build_material(Material *ma)
+void DepsgraphRelationBuilder::build_material(Material *material)
 {
-       ID *ma_id = &ma->id;
-       if (ma_id->tag & LIB_TAG_DOIT) {
+       if (built_map_.checkIsBuiltAndTag(material)) {
                return;
        }
-       ma_id->tag |= LIB_TAG_DOIT;
-
        /* animation */
-       build_animdata(ma_id);
-
+       build_animdata(&material->id);
        /* textures */
-       build_texture_stack(ma->mtex);
-
+       build_texture_stack(material->mtex);
        /* material's nodetree */
-       if (ma->nodetree != NULL) {
-               build_nodetree(ma->nodetree);
-               OperationKey ntree_key(&ma->nodetree->id,
+       if (material->nodetree != NULL) {
+               build_nodetree(material->nodetree);
+               OperationKey ntree_key(&material->nodetree->id,
                                       DEG_NODE_TYPE_PARAMETERS,
                                       DEG_OPCODE_PARAMETERS_EVAL);
-               OperationKey material_key(&ma->id,
+               OperationKey material_key(&material->id,
                                          DEG_NODE_TYPE_SHADING,
                                          DEG_OPCODE_PLACEHOLDER,
                                          "Material Update");
@@ -1829,28 +1792,22 @@ void DepsgraphRelationBuilder::build_material(Material *ma)
 }
 
 /* Recursively build graph for texture */
-void DepsgraphRelationBuilder::build_texture(Tex *tex)
+void DepsgraphRelationBuilder::build_texture(Tex *texture)
 {
-       ID *tex_id = &tex->id;
-       if (tex_id->tag & LIB_TAG_DOIT) {
+       if (built_map_.checkIsBuiltAndTag(texture)) {
                return;
        }
-       tex_id->tag |= LIB_TAG_DOIT;
-
        /* texture itself */
-       build_animdata(tex_id);
-
+       build_animdata(&texture->id);
        /* texture's nodetree */
-       build_nodetree(tex->nodetree);
+       build_nodetree(texture->nodetree);
 }
 
 /* Texture-stack attached to some shading datablock */
 void DepsgraphRelationBuilder::build_texture_stack(MTex **texture_stack)
 {
-       int i;
-
        /* for now assume that all texture-stacks have same number of max items */
-       for (i = 0; i < MAX_MTEX; i++) {
+       for (int i = 0; i < MAX_MTEX; i++) {
                MTex *mtex = texture_stack[i];
                if (mtex && mtex->tex)
                        build_texture(mtex->tex);