Fix T43471, based on patch submitted by @sean_loh.
authorLukas Tönne <lukas.toenne@gmail.com>
Thu, 12 Feb 2015 09:15:25 +0000 (10:15 +0100)
committerLukas Tönne <lukas.toenne@gmail.com>
Thu, 12 Feb 2015 09:15:25 +0000 (10:15 +0100)
Particle textures always override timing information of particles.
Previously particle times could be scripted, but now these changes are
discarded by the texture evaluation function.

The patch disables texture overriding when no textures are defined, this
way at least some old scripts can keep working.

source/blender/blenkernel/BKE_particle.h
source/blender/blenkernel/intern/particle.c
source/blender/blenkernel/intern/particle_system.c

index a5f12bb9a3cead2eddea13aa19b78711d1e99e92..6b94797b000928791a8cfcda3f975f40d92b58da 100644 (file)
@@ -403,7 +403,7 @@ float psys_get_dietime_from_cache(struct PointCache *cache, int index);
 void psys_free_pdd(struct ParticleSystem *psys);
 
 float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
-void psys_get_texture(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleTexture *ptex, int event, float cfra);
+bool psys_get_texture(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleTexture *ptex, int event, float cfra);
 void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFace *tface,
                            float (*orcodata)[3], float w[4], float vec[3], float nor[3], float utan[3], float vtan[3],
                            float orco[3], float ornor[3]);
index 2de5f460da2e71033ad2cc3cd6baf60e4feda76e..72aed1b02f62e50139e14b58f13e339407a8491c 100644 (file)
@@ -3429,7 +3429,7 @@ static void get_cpa_texture(DerivedMesh *dm, ParticleSystem *psys, ParticleSetti
        CLAMP_PARTICLE_TEXTURE_POS(PAMAP_ROUGH, ptex->rough1);
        CLAMP_PARTICLE_TEXTURE_POS(PAMAP_DENS, ptex->exist);
 }
-void psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTexture *ptex, int event, float cfra)
+bool psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTexture *ptex, int event, float cfra)
 {
        Object *ob = sim->ob;
        Mesh *me = (Mesh *)ob->data;
@@ -3439,6 +3439,7 @@ void psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTex
        int m;
        float value, rgba[4], co[3], texvec[3];
        int setvars = 0;
+       bool has_texture = false;
 
        /* initialize ptex */
        ptex->ivel = ptex->life = ptex->exist = ptex->size = ptex->damp =
@@ -3514,6 +3515,8 @@ void psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTex
                        SET_PARTICLE_TEXTURE(PAMAP_GRAVITY, ptex->gravity, mtex->gravityfac);
                        SET_PARTICLE_TEXTURE(PAMAP_DAMP, ptex->damp, mtex->dampfac);
                        SET_PARTICLE_TEXTURE(PAMAP_LENGTH, ptex->length, mtex->lengthfac);
+                       
+                       has_texture = true;
                }
        }
 
@@ -3526,6 +3529,8 @@ void psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTex
        CLAMP_PARTICLE_TEXTURE_POSNEG(PAMAP_GRAVITY, ptex->gravity);
        CLAMP_PARTICLE_TEXTURE_POS(PAMAP_DAMP, ptex->damp);
        CLAMP_PARTICLE_TEXTURE_POS(PAMAP_LENGTH, ptex->length);
+       
+       return has_texture;
 }
 /************************************************/
 /*                     Particle State                                          */
index 04181606796ee770daae3b224fdd49db7d9e574c..4a1573fe88e5218d9834136bd527f511068bd4bb 100644 (file)
@@ -521,22 +521,25 @@ static void initialize_particle_texture(ParticleSimulationData *sim, ParticleDat
        ParticleSystem *psys = sim->psys;
        ParticleSettings *part = psys->part;
        ParticleTexture ptex;
+       bool has_texture = false;
 
-       psys_get_texture(sim, pa, &ptex, PAMAP_INIT, 0.f);
+       has_texture = psys_get_texture(sim, pa, &ptex, PAMAP_INIT, 0.f);
        
-       switch (part->type) {
-       case PART_EMITTER:
-               if (ptex.exist < psys_frand(psys, p+125))
-                       pa->flag |= PARS_UNEXIST;
-               pa->time = part->sta + (part->end - part->sta)*ptex.time;
-               break;
-       case PART_HAIR:
-               if (ptex.exist < psys_frand(psys, p+125))
-                       pa->flag |= PARS_UNEXIST;
-               pa->time = 0.f;
-               break;
-       case PART_FLUID:
-               break;
+       if (has_texture) {
+               switch (part->type) {
+                       case PART_EMITTER:
+                               if (ptex.exist < psys_frand(psys, p+125))
+                                       pa->flag |= PARS_UNEXIST;
+                               pa->time = part->sta + (part->end - part->sta)*ptex.time;
+                               break;
+                       case PART_HAIR:
+                               if (ptex.exist < psys_frand(psys, p+125))
+                                       pa->flag |= PARS_UNEXIST;
+                               pa->time = 0.f;
+                               break;
+                       case PART_FLUID:
+                               break;
+               }
        }
 }
 
@@ -969,6 +972,7 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
        ParticleSettings *part;
        ParticleTexture ptex;
        int p = pa - psys->particles;
+       
        part=psys->part;
        
        /* get precise emitter matrix if particle is born */