[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