Commit: 29448bd99bb05ae61e4d540981026bab87702f90
Author: Campbell Barton
Date:   Thu Jun 23 07:53:49 2016 +1000
Branches: master
https://developer.blender.org/rB29448bd99bb05ae61e4d540981026bab87702f90

Fix T48658: Cycles render & render preview corrupts particles

Replaces `G.is_rendering` with `use_render_params` argument.

This is needed for Cycles, which attempts to restore render-preview settings 
from particles,
after it gets its own particle data, but fails to restore because
`G.is_rendering` was being checked in psys_cache_paths (and other places).

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

M       source/blender/blenkernel/BKE_particle.h
M       source/blender/blenkernel/intern/depsgraph.c
M       source/blender/blenkernel/intern/dynamicpaint.c
M       source/blender/blenkernel/intern/effect.c
M       source/blender/blenkernel/intern/object_dupli.c
M       source/blender/blenkernel/intern/object_update.c
M       source/blender/blenkernel/intern/particle.c
M       source/blender/blenkernel/intern/particle_system.c
M       source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M       source/blender/editors/physics/particle_edit.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/makesrna/intern/rna_particle.c
M       source/blender/modifiers/intern/MOD_particlesystem.c
M       source/blender/render/intern/source/convertblender.c
M       source/blender/render/intern/source/pointdensity.c

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

diff --git a/source/blender/blenkernel/BKE_particle.h 
b/source/blender/blenkernel/BKE_particle.h
index e17fb9f..5daa94c 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -148,7 +148,8 @@ typedef struct ParticleThreadContext {
        struct ParticleData *tpars;
 
        /* path caching */
-       int editupdate, between, segments, extra_segments;
+       bool editupdate;
+       int between, segments, extra_segments;
        int totchild, totparent, parent_pass;
 
        float cfra;
@@ -293,7 +294,7 @@ void psys_set_current_num(Object *ob, int index);
 struct LatticeDeformData *psys_create_lattice_deform_data(struct 
ParticleSimulationData *sim);
 
 bool psys_in_edit_mode(struct Scene *scene, struct ParticleSystem *psys);
-bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys);
+bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, const 
bool use_render_params);
 bool psys_check_edited(struct ParticleSystem *psys);
 
 void psys_check_group_weights(struct ParticleSettings *part);
@@ -327,11 +328,11 @@ void BKE_particlesettings_make_local(struct 
ParticleSettings *part);
 
 void psys_reset(struct ParticleSystem *psys, int mode);
 
-void psys_find_parents(struct ParticleSimulationData *sim);
+void psys_find_parents(struct ParticleSimulationData *sim, const bool 
use_render_params);
 
-void psys_cache_paths(struct ParticleSimulationData *sim, float cfra);
-void psys_cache_edit_paths(struct Scene *scene, struct Object *ob, struct 
PTCacheEdit *edit, float cfra);
-void psys_cache_child_paths(struct ParticleSimulationData *sim, float cfra, 
int editupdate);
+void psys_cache_paths(struct ParticleSimulationData *sim, float cfra, const 
bool use_render_params);
+void psys_cache_edit_paths(struct Scene *scene, struct Object *ob, struct 
PTCacheEdit *edit, float cfra, const bool use_render_params);
+void psys_cache_child_paths(struct ParticleSimulationData *sim, float cfra, 
const bool editupdate, const bool use_render_params);
 int do_guides(struct ParticleSettings *part, struct ListBase *effectors, 
ParticleKey *state, int pa_num, float time);
 void precalc_guides(struct ParticleSimulationData *sim, struct ListBase 
*effectors);
 float psys_get_timestep(struct ParticleSimulationData *sim);
@@ -379,7 +380,7 @@ void psys_check_boid_data(struct ParticleSystem *psys);
 
 void psys_get_birth_coords(struct ParticleSimulationData *sim, struct 
ParticleData *pa, struct ParticleKey *state, float dtime, float cfra);
 
-void particle_system_update(struct Scene *scene, struct Object *ob, struct 
ParticleSystem *psys);
+void particle_system_update(struct Scene *scene, struct Object *ob, struct 
ParticleSystem *psys, const bool use_render_params);
 
 /* Callback format for performing operations on ID-pointers for particle 
systems */
 typedef void (*ParticleSystemIDFunc)(struct ParticleSystem *psys, struct ID 
**idpoin, void *userdata, int cd_flag);
diff --git a/source/blender/blenkernel/intern/depsgraph.c 
b/source/blender/blenkernel/intern/depsgraph.c
index 14c230e..8ea65bf 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -770,7 +770,7 @@ static void build_dag_object(DagForest *dag, DagNode 
*scenenode, Main *bmain, Sc
 
                        dag_add_relation(dag, node, node, DAG_RL_OB_DATA, 
"Particle-Object Relation");
 
-                       if (!psys_check_enabled(ob, psys))
+                       if (!psys_check_enabled(ob, psys, G.is_rendering))
                                continue;
 
                        if (ELEM(part->phystype, PART_PHYS_KEYED, 
PART_PHYS_BOIDS)) {
@@ -2285,7 +2285,7 @@ static void dag_object_time_update_flags(Main *bmain, 
Scene *scene, Object *ob)
                        ParticleSystem *psys = ob->particlesystem.first;
 
                        for (; psys; psys = psys->next) {
-                               if (psys_check_enabled(ob, psys)) {
+                               if (psys_check_enabled(ob, psys, 
G.is_rendering)) {
                                        ob->recalc |= OB_RECALC_DATA;
                                        break;
                                }
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c 
b/source/blender/blenkernel/intern/dynamicpaint.c
index cc495b3..6207217 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -5503,7 +5503,7 @@ static int dynamicPaint_doStep(Scene *scene, Object *ob, 
DynamicPaintSurface *su
                                        if (brush->collision == 
MOD_DPAINT_COL_PSYS) {
                                                if (brush->psys && 
brush->psys->part &&
                                                    
ELEM(brush->psys->part->type, PART_EMITTER, PART_FLUID) &&
-                                                   
psys_check_enabled(brushObj, brush->psys))
+                                                   
psys_check_enabled(brushObj, brush->psys, G.is_rendering))
                                                {
                                                        /* Paint a particle 
system */
                                                        
BKE_animsys_evaluate_animdata(scene, &brush->psys->part->id, 
brush->psys->part->adt,
diff --git a/source/blender/blenkernel/intern/effect.c 
b/source/blender/blenkernel/intern/effect.c
index a8268c0..5090e46 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -179,7 +179,7 @@ static void add_particles_to_effectors(ListBase 
**effectors, Scene *scene, Effec
 {
        ParticleSettings *part= psys->part;
 
-       if ( !psys_check_enabled(ob, psys) )
+       if ( !psys_check_enabled(ob, psys, G.is_rendering) )
                return;
 
        if ( psys == psys_src && (part->flag & PART_SELF_EFFECT) == 0)
diff --git a/source/blender/blenkernel/intern/object_dupli.c 
b/source/blender/blenkernel/intern/object_dupli.c
index 63c37fd..c03f7c2 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -851,7 +851,7 @@ static void make_duplis_particle_system(const DupliContext 
*ctx, ParticleSystem
        if (part == NULL)
                return;
 
-       if (!psys_check_enabled(par, psys))
+       if (!psys_check_enabled(par, psys, (ctx->eval_ctx->mode == 
DAG_EVAL_RENDER)))
                return;
 
        if (!for_render)
diff --git a/source/blender/blenkernel/intern/object_update.c 
b/source/blender/blenkernel/intern/object_update.c
index 2468cb8..6d41c5c 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -269,7 +269,7 @@ void BKE_object_handle_data_update(EvaluationContext 
*eval_ctx,
                                psys_changed_type(ob, psys);
                        }
 
-                       if (psys_check_enabled(ob, psys)) {
+                       if (psys_check_enabled(ob, psys, eval_ctx->mode == 
DAG_EVAL_RENDER)) {
                                /* check use of dupli objects here */
                                if (psys->part && (psys->part->draw_as == 
PART_DRAW_REND || eval_ctx->mode == DAG_EVAL_RENDER) &&
                                    ((psys->part->ren_as == PART_DRAW_OB && 
psys->part->dup_ob) ||
@@ -278,7 +278,7 @@ void BKE_object_handle_data_update(EvaluationContext 
*eval_ctx,
                                        ob->transflag |= OB_DUPLIPARTS;
                                }
 
-                               particle_system_update(scene, ob, psys);
+                               particle_system_update(scene, ob, psys, 
(eval_ctx->mode == DAG_EVAL_RENDER));
                                psys = psys->next;
                        }
                        else if (psys->flag & PSYS_DELETE) {
diff --git a/source/blender/blenkernel/intern/particle.c 
b/source/blender/blenkernel/intern/particle.c
index 633227d..d1f5afa 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -283,7 +283,7 @@ bool psys_in_edit_mode(Scene *scene, ParticleSystem *psys)
 {
        return (scene->basact && (scene->basact->object->mode & 
OB_MODE_PARTICLE_EDIT) && psys == psys_get_current((scene->basact)->object) && 
(psys->edit || psys->pointcache->edit) && !psys->renderdata);
 }
-bool psys_check_enabled(Object *ob, ParticleSystem *psys)
+bool psys_check_enabled(Object *ob, ParticleSystem *psys, const bool 
use_render_params)
 {
        ParticleSystemModifierData *psmd;
 
@@ -291,7 +291,7 @@ bool psys_check_enabled(Object *ob, ParticleSystem *psys)
                return 0;
 
        psmd = psys_get_modifier(ob, psys);
-       if (psys->renderdata || G.is_rendering) {
+       if (psys->renderdata || use_render_params) {
                if (!(psmd->modifier.mode & eModifierMode_Render))
                        return 0;
        }
@@ -2007,7 +2007,7 @@ float *psys_cache_vgroup(DerivedMesh *dm, ParticleSystem 
*psys, int vgroup)
        }
        return vg;
 }
-void psys_find_parents(ParticleSimulationData *sim)
+void psys_find_parents(ParticleSimulationData *sim, const bool 
use_render_params)
 {
        ParticleSystem *psys = sim->psys;
        ParticleSettings *part = sim->psys->part;
@@ -2019,7 +2019,7 @@ void psys_find_parents(ParticleSimulationData *sim)
        int from = PART_FROM_FACE;
        totparent = (int)(totchild * part->parents * 0.3f);
 
-       if ((sim->psys->renderdata || G.is_rendering) && part->child_nbr && 
part->ren_child_nbr)
+       if ((sim->psys->renderdata || use_render_params) && part->child_nbr && 
part->ren_child_nbr)
                totparent *= (float)part->child_nbr / 
(float)part->ren_child_nbr;
 
        /* hard limit, workaround for it being ignored above */
@@ -2050,7 +2050,9 @@ void psys_find_parents(ParticleSimulationData *sim)
        BLI_kdtree_free(tree);
 }
 
-static bool psys_thread_context_init_path(ParticleThreadContext *ctx, 
ParticleSimulationData *sim, Scene *scene, float cfra, int editupdate)
+static bool psys_thread_context_init_path(
+        ParticleThreadContext *ctx, ParticleSimulationData *sim, Scene *scene,
+        float cfra, const bool editupdate, const bool use_render_params)
 {
        ParticleSystem *psys = sim->psys;
        ParticleSettings *part = psys->part;
@@ -2064,7 +2066,7 @@ static bool 
psys_thread_context_init_path(ParticleThreadContext *ctx, ParticleSi
        if (psys_in_edit_mode(scene, psys)) {
                ParticleEditSettings *pset = &scene->toolsettings->particle;
 
-               if ((psys->renderdata == 0 && G.is_rendering == 0) && 
(psys->edit == NULL || pset->flag & PE_DRAW_PART) == 0)
+               if ((psys->renderdata == 0 && use_render_params == 0) && 
(psys->edit == NULL || pset->flag & PE_DRAW_PART) == 0)
                        totchild = 0;
 
                segments = 1 << pset->draw_step;
@@ -2073,14 +2075,14 @@ static bool 
psys_thread_context_init_path(ParticleThreadContext *ctx, ParticleSi
        if (totchild && part->childtype == PART_CHILD_FACES) {
                totparent = (int)(totchild * part->parents * 0.3f);
                
-               if ((psys->renderdata || G.is_rendering) && part->child_nbr && 
part->ren_child_nbr)
+               if ((psys->renderdata || use_render_params) && part->child_nbr 
&& part->ren_child_nbr)
                        totparent *= (float)part->child_nbr / 
(float)part->ren_child_nbr;
 
                /* part->parents could still be 0 so we can't test with 
totparent */
                between = 1;
        }
 
-       if (psys->renderdata || G.is_rendering)
+       if (psys->renderdata || use_render_params

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to