[Bf-blender-cvs] [c2b0d8b6d6c] blender2.8: Fix T57633: Particle texture update problem

Sergey Sharybin noreply at git.blender.org
Mon Dec 10 15:12:05 CET 2018


Commit: c2b0d8b6d6c771da70b8fd9da5ac9cc53d04184d
Author: Sergey Sharybin
Date:   Mon Dec 10 15:09:46 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBc2b0d8b6d6c771da70b8fd9da5ac9cc53d04184d

Fix T57633: Particle texture update problem

Textures are now hooked up to the RESET operation of particle
settings, which ensures particles being re-distributed when
texture is changed.

This is limited to a direct user modifications, which matches
old behavior in 2.79.

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

M	source/blender/blenkernel/BKE_particle.h
M	source/blender/blenkernel/intern/particle_system.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
M	source/blender/depsgraph/intern/debug/deg_debug_relations_graphviz.cc
M	source/blender/depsgraph/intern/depsgraph_tag.cc
M	source/blender/depsgraph/intern/depsgraph_type_defines.cc
M	source/blender/depsgraph/intern/depsgraph_types.h
M	source/blender/depsgraph/intern/nodes/deg_node_component.cc
M	source/blender/depsgraph/intern/nodes/deg_node_component.h
M	source/blender/gpu/intern/gpu_shader.c

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

diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index aa00024b27b..cf123f78ae0 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -464,9 +464,12 @@ float psys_get_current_display_percentage(struct ParticleSystem *psys, const boo
 
 struct Depsgraph;
 
+void BKE_particle_settings_eval_reset(
+        struct Depsgraph *depsgraph,
+        struct ParticleSettings *particle_settings);
+
 void BKE_particle_system_eval_init(struct Depsgraph *depsgraph,
-                                   struct Scene *scene,
-                                   struct Object *ob);
+                                   struct Object *object);
 
 #endif
 
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 2cb9dd0e6f7..8d09215c564 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -4427,16 +4427,25 @@ void BKE_particlesystem_id_loop(ParticleSystem *psys, ParticleSystemIDFunc func,
 
 /* **** Depsgraph evaluation **** */
 
+void BKE_particle_settings_eval_reset(
+        struct Depsgraph *depsgraph,
+        ParticleSettings *particle_settings)
+{
+	DEG_debug_print_eval(depsgraph,
+	                     __func__,
+	                     particle_settings->id.name,
+	                     particle_settings);
+	particle_settings->id.recalc |= ID_RECALC_PSYS_RESET;
+}
+
 void BKE_particle_system_eval_init(struct Depsgraph *depsgraph,
-                                   Scene *scene,
-                                   Object *ob)
+                                   Object *object)
 {
-	DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
-	for (ParticleSystem *psys = ob->particlesystem.first;
+	DEG_debug_print_eval(depsgraph, __func__, object->id.name, object);
+	for (ParticleSystem *psys = object->particlesystem.first;
 	     psys != NULL;
 	     psys = psys->next)
 	{
 		psys->recalc |= (psys->part->id.recalc & ID_RECALC_PSYS_ALL);
 	}
-	BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH);
 }
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 3fcaa12f036..d65acbcad1d 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -640,7 +640,7 @@ void DepsgraphNodeBuilder::build_object(int base_index,
 	build_animdata(&object->id);
 	/* Particle systems. */
 	if (object->particlesystem.first != NULL) {
-		build_particles(object, is_visible);
+		build_particle_systems(object, is_visible);
 	}
 	/* Proxy object to copy from. */
 	if (object->proxy_from != NULL) {
@@ -1109,8 +1109,8 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene)
 	}
 }
 
-void DepsgraphNodeBuilder::build_particles(Object *object,
-                                           bool is_object_visible)
+void DepsgraphNodeBuilder::build_particle_systems(Object *object,
+                                                  bool is_object_visible)
 {
 	/**
 	 * Particle Systems Nodes
@@ -1128,25 +1128,22 @@ void DepsgraphNodeBuilder::build_particles(Object *object,
 	 */
 	/* Component for all particle systems. */
 	ComponentDepsNode *psys_comp =
-	        add_component_node(&object->id, DEG_NODE_TYPE_EVAL_PARTICLES);
+	        add_component_node(&object->id, DEG_NODE_TYPE_PARTICLE_SYSTEM);
 
-	/* TODO(sergey): Need to get COW of PSYS. */
-	Scene *scene_cow = get_cow_datablock(scene_);
 	Object *ob_cow = get_cow_datablock(object);
-
-	add_operation_node(psys_comp,
-	                   function_bind(BKE_particle_system_eval_init,
-	                                 _1,
-	                                 scene_cow,
-	                                 ob_cow),
-	                   DEG_OPCODE_PARTICLE_SYSTEM_EVAL_INIT);
+	OperationDepsNode *op_node;
+	op_node = add_operation_node(psys_comp,
+	                             function_bind(BKE_particle_system_eval_init,
+	                                           _1,
+	                                           ob_cow),
+	                             DEG_OPCODE_PARTICLE_SYSTEM_INIT);
+	op_node->set_as_entry();
 	/* Build all particle systems. */
 	LISTBASE_FOREACH (ParticleSystem *, psys, &object->particlesystem) {
 		ParticleSettings *part = psys->part;
 		/* Build particle settings operations.
 		 *
-		 * NOTE: The call itself ensures settings are only build once.
-		 */
+		 * NOTE: The call itself ensures settings are only build once.  */
 		build_particle_settings(part);
 		/* Particle system evaluation. */
 		add_operation_node(psys_comp,
@@ -1170,19 +1167,49 @@ void DepsgraphNodeBuilder::build_particles(Object *object,
 				break;
 		}
 	}
+	op_node = add_operation_node(psys_comp,
+	                             NULL,
+	                             DEG_OPCODE_PARTICLE_SYSTEM_DONE);
+	op_node->set_as_exit();
 }
 
-void DepsgraphNodeBuilder::build_particle_settings(ParticleSettings *part) {
-	if (built_map_.checkIsBuiltAndTag(part)) {
+void DepsgraphNodeBuilder::build_particle_settings(
+        ParticleSettings *particle_settings) {
+	if (built_map_.checkIsBuiltAndTag(particle_settings)) {
 		return;
 	}
+	/* Make sure we've got proper copied ID pointer. */
+	add_id_node(&particle_settings->id);
+	ParticleSettings *particle_settings_cow =
+	        get_cow_datablock(particle_settings);
 	/* Animation data. */
-	build_animdata(&part->id);
+	build_animdata(&particle_settings->id);
 	/* Parameters change. */
-	add_operation_node(&part->id,
-	                   DEG_NODE_TYPE_PARAMETERS,
-	                   NULL,
-	                   DEG_OPCODE_PARTICLE_SETTINGS_EVAL);
+	OperationDepsNode *op_node;
+	op_node = add_operation_node(&particle_settings->id,
+	                             DEG_NODE_TYPE_PARTICLE_SETTINGS,
+	                             NULL,
+	                             DEG_OPCODE_PARTICLE_SETTINGS_INIT);
+	op_node->set_as_entry();
+	add_operation_node(&particle_settings->id,
+	                   DEG_NODE_TYPE_PARTICLE_SETTINGS,
+	                   function_bind(BKE_particle_settings_eval_reset,
+	                                 _1,
+	                                 particle_settings_cow),
+	                   DEG_OPCODE_PARTICLE_SETTINGS_RESET);
+	op_node = add_operation_node(&particle_settings->id,
+	                             DEG_NODE_TYPE_PARTICLE_SETTINGS,
+	                             NULL,
+	                             DEG_OPCODE_PARTICLE_SETTINGS_EVAL);
+	op_node->set_as_exit();
+	/* Texture slots. */
+	for (int mtex_index = 0; mtex_index < MAX_MTEX; ++mtex_index) {
+		MTex *mtex = particle_settings->mtex[mtex_index];
+		if (mtex == NULL || mtex->tex == NULL) {
+			continue;
+		}
+		build_texture(mtex->tex);
+	}
 }
 
 /* Shapekeys */
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index cdf1f6ed03d..3357f6cb0a2 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -190,7 +190,7 @@ struct DepsgraphNodeBuilder {
 	                            int pchan_index,
 	                            bool is_object_visible);
 	void build_rigidbody(Scene *scene);
-	void build_particles(Object *object, bool is_object_visible);
+	void build_particle_systems(Object *object, bool is_object_visible);
 	void build_particle_settings(ParticleSettings *part);
 	void build_animdata(ID *id);
 	void build_animdata_nlastrip_targets(ListBase *strips);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index f66a0a8963a..1d5ff8cd3e5 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -410,7 +410,8 @@ void DepsgraphRelationBuilder::add_forcefield_relations(
 		}
 		if (relation->psys) {
 			if (relation->ob != object) {
-				ComponentKey eff_key(&relation->ob->id, DEG_NODE_TYPE_EVAL_PARTICLES);
+				ComponentKey eff_key(&relation->ob->id,
+				                     DEG_NODE_TYPE_PARTICLE_SYSTEM);
 				add_relation(eff_key, key, name);
 				/* TODO: remove this when/if EVAL_PARTICLES is sufficient
 				 * for up to date particles.
@@ -420,7 +421,7 @@ void DepsgraphRelationBuilder::add_forcefield_relations(
 			}
 			else if (relation->psys != psys) {
 				OperationKey eff_key(&relation->ob->id,
-				                     DEG_NODE_TYPE_EVAL_PARTICLES,
+				                     DEG_NODE_TYPE_PARTICLE_SYSTEM,
 				                     DEG_OPCODE_PARTICLE_SYSTEM_EVAL,
 				                     relation->psys->name);
 				add_relation(eff_key, key, name);
@@ -661,7 +662,7 @@ void DepsgraphRelationBuilder::build_object(Base *base, Object *object)
 	build_object_data(object);
 	/* Particle systems. */
 	if (object->particlesystem.first != NULL) {
-		build_particles(object);
+		build_particle_systems(object);
 	}
 	/* Proxy object to copy from. */
 	if (object->proxy_from != NULL) {
@@ -1692,16 +1693,21 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene)
 	}
 }
 
-void DepsgraphRelationBuilder::build_particles(Object *object)
+void DepsgraphRelationBuilder::build_particle_systems(Object *object)
 {
 	TimeSourceKey time_src_key;
 	OperationKey obdata_ubereval_key(&object->id,
 	                                 DEG_NODE_TYPE_GEOMETRY,
 	                                 DEG_OPCODE_GEOMETRY_UBEREVAL);
 	OperationKey eval_init_key(&object->id,
-	                           DEG_NODE_TYPE_EVAL_PARTICLES,
-	                           DEG_OPCODE_PARTICLE_SYSTEM_EVAL_INIT);
-
+	                           DEG_NODE_TYPE_PARTICLE_SYSTEM,
+	                           DEG_OPCODE_PARTICLE_SYSTEM_INIT);
+	OperationKey eval_done_key(&object->id,
+	                           DEG_NODE_TYPE_PARTICLE_SYSTEM,
+	                           DEG_OPCODE_PARTICLE_SYSTEM_DONE);
+	ComponentKey eval_key(&object->id, DEG_NODE_TYPE_PARTICLE_SYSTEM);
+	ComponentKey point_cache_key(&object->id, DEG_NODE_TYPE_POINT_CACHE);
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list