Commit: 382db124d1227eaf530a1f08087532591cacb386
Author: Antonio Vazquez
Date:   Thu Jun 21 10:33:50 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB382db124d1227eaf530a1f08087532591cacb386

Changes to integrate depsgraph evaluation for modifiers

Still pending:

- void DepsgraphNodeBuilder::build_object
- void DepsgraphRelationBuilder::build_object

===================================================================

M       source/blender/blenkernel/BKE_gpencil_modifier.h
M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/intern/gpencil_modifier.c
M       source/blender/blenkernel/intern/object.c
M       source/blender/depsgraph/intern/builder/deg_builder_relations.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h 
b/source/blender/blenkernel/BKE_gpencil_modifier.h
index c1071b34619..e4a49f38f54 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -232,6 +232,7 @@ struct GpencilModifierData  *BKE_gpencil_modifier_new(int 
type);
 void BKE_gpencil_modifier_free_ex(struct GpencilModifierData *md, const int 
flag);
 void BKE_gpencil_modifier_free(struct GpencilModifierData *md);
 bool BKE_gpencil_modifier_unique_name(struct ListBase *modifiers, struct 
GpencilModifierData *gmd);
+bool BKE_gpencil_modifier_dependsOnTime(struct GpencilModifierData *md);
 struct GpencilModifierData *BKE_gpencil_modifiers_findByType(struct Object 
*ob, GpencilModifierType type);
 struct GpencilModifierData *BKE_gpencil_modifiers_findByName(struct Object 
*ob, const char *name);
 void BKE_gpencil_modifier_copyData_generic(const struct GpencilModifierData 
*md_src, struct GpencilModifierData *md_dst);
diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index 20b9cfd2c07..46b6bd29ac5 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -73,6 +73,7 @@ void BKE_object_free_caches(struct Object *object);
 
 void BKE_object_modifier_hook_reset(struct Object *ob, struct HookModifierData 
*hmd);
 void BKE_object_modifier_gpencil_hook_reset(struct Object *ob, struct 
HookGpencilModifierData *hmd);
+bool BKE_object_modifier_gpencil_use_time(struct Object *ob, struct 
GpencilModifierData *md);
 
 bool BKE_object_support_modifier_type_check(const struct Object *ob, int 
modifier_type);
 
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c 
b/source/blender/blenkernel/intern/gpencil_modifier.c
index 00e6d0784b3..17ad2ba3809 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -524,6 +524,13 @@ bool BKE_gpencil_modifier_unique_name(ListBase *modifiers, 
GpencilModifierData *
        return false;
 }
 
+bool BKE_gpencil_modifier_dependsOnTime(GpencilModifierData *md)
+{
+       const GpencilModifierTypeInfo *mti = 
BKE_gpencil_modifierType_getInfo(md->type);
+
+       return mti->dependsOnTime && mti->dependsOnTime(md);
+}
+
 const GpencilModifierTypeInfo 
*BKE_gpencil_modifierType_getInfo(GpencilModifierType type)
 {
        /* type unsigned, no need to check < 0 */
diff --git a/source/blender/blenkernel/intern/object.c 
b/source/blender/blenkernel/intern/object.c
index 1b7a0ea4c73..45120c90179 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3793,6 +3793,47 @@ bool BKE_object_modifier_use_time(Object *ob, 
ModifierData *md)
        return false;
 }
 
+bool BKE_object_modifier_gpencil_use_time(Object *ob, GpencilModifierData *md)
+{
+       if (BKE_gpencil_modifier_dependsOnTime(md)) {
+               return true;
+       }
+
+       /* Check whether modifier is animated. */
+       /* TODO (Aligorith): this should be handled as part of build_animdata() 
*/
+       if (ob->adt) {
+               AnimData *adt = ob->adt;
+               FCurve *fcu;
+
+               char pattern[MAX_NAME + 32];
+               BLI_snprintf(pattern, sizeof(pattern), 
"grease_pencil_modifiers[\"%s\"]", md->name);
+
+               /* action - check for F-Curves with paths containing 
'grease_pencil_modifiers[' */
+               if (adt->action) {
+                       for (fcu = (FCurve *)adt->action->curves.first;
+                               fcu != NULL;
+                               fcu = (FCurve *)fcu->next)
+                       {
+                               if (fcu->rna_path && strstr(fcu->rna_path, 
pattern))
+                                       return true;
+                       }
+               }
+
+               /* This here allows modifier properties to get driven and still 
update properly
+               *
+               */
+               for (fcu = (FCurve *)adt->drivers.first;
+                       fcu != NULL;
+                       fcu = (FCurve *)fcu->next)
+               {
+                       if (fcu->rna_path && strstr(fcu->rna_path, pattern))
+                               return true;
+               }
+       }
+
+       return false;
+}
+
 /* set "ignore cache" flag for all caches on this object */
 static void object_cacheIgnoreClear(Object *ob, int state)
 {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc 
b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 1252940f754..31cb07b9335 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -84,6 +84,7 @@ extern "C" {
 #include "BKE_material.h"
 #include "BKE_mball.h"
 #include "BKE_modifier.h"
+#include "BKE_gpencil_modifier.h"
 #include "BKE_node.h"
 #include "BKE_object.h"
 #include "BKE_particle.h"
@@ -1765,6 +1766,24 @@ void 
DepsgraphRelationBuilder::build_object_data_geometry(Object *object)
                        }
                }
        }
+       /* Grease Pencil Modifiers */
+       if (object->greasepencil_modifiers.first != NULL) {
+               ModifierUpdateDepsgraphContext ctx = {};
+               ctx.scene = scene_;
+               ctx.object = object;
+               LISTBASE_FOREACH(GpencilModifierData *, md, 
&object->greasepencil_modifiers) {
+                       const GpencilModifierTypeInfo *mti = 
BKE_gpencil_modifierType_getInfo((GpencilModifierType)md->type);
+                       if (mti->updateDepsgraph) {
+                               DepsNodeHandle handle = 
create_node_handle(obdata_ubereval_key);
+                               ctx.node = reinterpret_cast< ::DepsNodeHandle* 
>(&handle);
+                               mti->updateDepsgraph(md, &ctx);
+                       }
+                       if (BKE_object_modifier_gpencil_use_time(object, md)) {
+                               TimeSourceKey time_src_key;
+                               add_relation(time_src_key, obdata_ubereval_key, 
"Time Source");
+                       }
+               }
+       }
        /* Materials. */
        if (object->totcol) {
                for (int a = 1; a <= object->totcol; a++) {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to