[Bf-blender-cvs] [cd40bac3234] temp-greasepencil-vfx: Add shader fx to depsgraph

Antonio Vazquez noreply at git.blender.org
Tue Jun 26 22:37:52 CEST 2018


Commit: cd40bac323413060b13798e35b5e5026c3abf4a1
Author: Antonio Vazquez
Date:   Tue Jun 26 22:37:39 2018 +0200
Branches: temp-greasepencil-vfx
https://developer.blender.org/rBcd40bac323413060b13798e35b5e5026c3abf4a1

Add shader fx to depsgraph

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

M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/BKE_shader_fx.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc

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

diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index c13983018a9..63401289a57 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -39,6 +39,7 @@ struct Base;
 struct Depsgraph;
 struct GpencilModifierData;
 struct Scene;
+struct ShaderFxData;
 struct ViewLayer;
 struct ID;
 struct Object;
@@ -76,6 +77,8 @@ void BKE_object_modifier_hook_reset(struct Object *ob, struct HookModifierData *
 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_shaderfx_use_time(struct Object *ob, struct ShaderFxData *md);
+
 bool BKE_object_support_modifier_type_check(const struct Object *ob, int modifier_type);
 
 void BKE_object_link_modifiers(struct Scene *scene, struct Object *ob_dst, const struct Object *ob_src);
diff --git a/source/blender/blenkernel/BKE_shader_fx.h b/source/blender/blenkernel/BKE_shader_fx.h
index ede3cb40e3b..38d37e10bc8 100644
--- a/source/blender/blenkernel/BKE_shader_fx.h
+++ b/source/blender/blenkernel/BKE_shader_fx.h
@@ -57,7 +57,7 @@ typedef enum {
 
 	/* grease pencil effects */
 	eShaderFxType_GpencilType,
-}  ShaderFxType;
+}  ShaderFxTypeType;
 
 typedef enum {
 	eShaderFxTypeFlag_SupportsEditmode = (1 << 0),
@@ -91,7 +91,7 @@ typedef struct ShaderFxTypeInfo {
 	/* The size of the effect data type, used by allocation. */
 	int struct_size;
 
-	ShaderFxType type;
+	ShaderFxTypeType type;
 	ShaderFxTypeFlag flags;
 
 	/* Copy instance data for this effect type. Should copy all user
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index bc168db1d97..bafc1e171d9 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -3844,6 +3844,47 @@ bool BKE_object_modifier_gpencil_use_time(Object *ob, GpencilModifierData *md)
 	return false;
 }
 
+bool BKE_object_shaderfx_use_time(Object *ob, ShaderFxData *fx)
+{
+	if (BKE_shaderfx_dependsOnTime(fx)) {
+		return true;
+	}
+
+	/* Check whether effect 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), "shader_effects[\"%s\"]", fx->name);
+
+		/* action - check for F-Curves with paths containing string[' */
+		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 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_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index d7449a5e0cf..19f089a07b1 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -95,6 +95,7 @@ extern "C" {
 #include "BKE_particle.h"
 #include "BKE_pointcache.h"
 #include "BKE_rigidbody.h"
+#include "BKE_shader_fx.h"
 #include "BKE_sound.h"
 #include "BKE_tracking.h"
 #include "BKE_world.h"
@@ -522,6 +523,12 @@ void DepsgraphNodeBuilder::build_object(int base_index,
 		data.builder = this;
 		BKE_gpencil_modifiers_foreachIDLink(object, modifier_walk, &data);
 	}
+	/* Shadr FX. */
+	if (object->shader_fx.first != NULL) {
+		BuilderWalkUserData data;
+		data.builder = this;
+		BKE_shaderfx_foreachIDLink(object, modifier_walk, &data);
+	}
 	/* Constraints. */
 	if (object->constraints.first != NULL) {
 		BuilderWalkUserData data;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 042844bdf78..911ff990bf3 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -90,6 +90,7 @@ extern "C" {
 #include "BKE_object.h"
 #include "BKE_particle.h"
 #include "BKE_rigidbody.h"
+#include "BKE_shader_fx.h"
 #include "BKE_sound.h"
 #include "BKE_tracking.h"
 #include "BKE_world.h"
@@ -532,6 +533,12 @@ void DepsgraphRelationBuilder::build_object(Base *base, Object *object)
 		data.builder = this;
 		BKE_gpencil_modifiers_foreachIDLink(object, modifier_walk, &data);
 	}
+	/* Shader FX. */
+	if (object->shader_fx.first != NULL) {
+		BuilderWalkUserData data;
+		data.builder = this;
+		BKE_shaderfx_foreachIDLink(object, modifier_walk, &data);
+	}
 	/* Constraints. */
 	if (object->constraints.first != NULL) {
 		BuilderWalkUserData data;
@@ -1796,6 +1803,24 @@ void DepsgraphRelationBuilder::build_object_data_geometry(Object *object)
 			}
 		}
 	}
+	/* Shader FX */
+	if (object->shader_fx.first != NULL) {
+		ModifierUpdateDepsgraphContext ctx = {};
+		ctx.scene = scene_;
+		ctx.object = object;
+		LISTBASE_FOREACH(ShaderFxData *, fx, &object->shader_fx) {
+			const ShaderFxTypeInfo *fxi = BKE_shaderfxType_getInfo((ShaderFxType)fx->type);
+			if (fxi->updateDepsgraph) {
+				DepsNodeHandle handle = create_node_handle(obdata_ubereval_key);
+				ctx.node = reinterpret_cast< ::DepsNodeHandle* >(&handle);
+				fxi->updateDepsgraph(fx, &ctx);
+			}
+			if (BKE_object_shaderfx_use_time(object, fx)) {
+				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++) {



More information about the Bf-blender-cvs mailing list