Fix for bug: [#8269] Particle / Vizualization / Draw / Disp reduces rendered particles
authorJanne Karhu <jhkarh@gmail.com>
Tue, 12 Feb 2008 15:26:20 +0000 (15:26 +0000)
committerJanne Karhu <jhkarh@gmail.com>
Tue, 12 Feb 2008 15:26:20 +0000 (15:26 +0000)
- Hair didn't update the visibility flag of each particle
- Changing the disp value gave a too strong update call to particles
- Changed disp value behavior for dynamic particles a bit, now all particles are always calculated for uncached frames so that every particle gets it's data cached. Now the disp value actually does what it's supposed to do, it alters the amount of particles DISPlayed in viewport, but doesn't change the simulations. (With old particles it was possible to only calculate the disp amount of particles too as everything was always recalculated from scratch anyways, but now that particles are more complicated and cached etc. it's not an option anymore.)

source/blender/blenkernel/intern/particle_system.c
source/blender/src/buttons_object.c

index 998d0f7cf61583a47064157f1831e084baf09c48..c4ad6faadc26473e08ddc97d13a5493578e1acde 100644 (file)
@@ -4026,7 +4026,7 @@ static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifi
                        vg_size=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_SIZE);
 
                for(p=0, pa=psys->particles; p<totpart; p++,pa++){
-                       if(pa->flag & (PARS_NO_DISP+PARS_UNEXIST)) continue;
+                       if(pa->flag & PARS_UNEXIST) continue;
 
                        /* set correct ipo timing */
                        if((part->flag&PART_ABS_TIME)==0 && part->ipo){
@@ -4095,7 +4095,7 @@ static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifi
 
                /* main loop: calculate physics for all particles */
                for(p=0, pa=psys->particles, key=outstate; p<totpart; p++,pa++,key++){
-                       if(pa->flag & (PARS_NO_DISP|PARS_UNEXIST)) continue;
+                       if(pa->flag & PARS_UNEXIST) continue;
 
                        copy_particle_key(key,&pa->state,1);
                        
@@ -4260,6 +4260,16 @@ static void psys_update_path_cache(Object *ob, ParticleSystemModifierData *psmd,
 static void hair_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
 {
        ParticleSettings *part = psys->part;
+       ParticleData *pa;
+       int p;
+       float disp = (float)get_current_display_percentage(psys)/50.0f-1.0f;
+
+       for(p=0, pa=psys->particles; p<psys->totpart; p++,pa++){
+               if(pa->r_rot[0] > disp)
+                       pa->flag |= PARS_NO_DISP;
+               else
+                       pa->flag &= ~PARS_NO_DISP;
+       }
 
        if(psys->recalc & PSYS_DISTR)
                /* need this for changing subsurf levels */
index 62f7300fc9885365b4e59e99498e67f199d6785a..66b7ea62b121d96601154757e4b2b332066b007e 100644 (file)
@@ -4244,7 +4244,7 @@ static void object_panel_particle_visual(Object *ob)
        uiDefButBitS(block, TOG, PART_DRAW_SIZE, B_PART_REDRAW, "Size", butx+butw/3,buty,butw/3,buth, &part->draw, 0, 0, 0, 0, "Show particle size");
        uiDefButBitS(block, TOG, PART_DRAW_NUM, B_PART_REDRAW, "Num",   butx+2*butw/3,buty,butw/3,buth, &part->draw, 0, 0, 0, 0, "Show particle number");
        uiDefButS(block, NUM, B_PART_REDRAW, "Draw Size:", butx,(buty-=buth),butw,buth, &part->draw_size, 0.0, 10.0, 0, 0, "Size of particles on viewport in pixels (0=default)");
-       uiDefButS(block, NUM, B_PART_RECALC, "Disp:",           butx,(buty-=buth),butw,buth, &part->disp, 0.0, 100.0, 10, 0, "Percentage of particles to calculate for 3d view");
+       uiDefButS(block, NUM, B_PART_RECALC_CHILD, "Disp:",             butx,(buty-=buth),butw,buth, &part->disp, 0.0, 100.0, 10, 0, "Percentage of particles to display in 3d view");
        uiBlockEndAlign(block);
 
        uiDefBut(block, LABEL, 0, "Render:",    butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");