Fixes in static particles. Result of going over details with Chris Burt,
authorTon Roosendaal <ton@blender.org>
Fri, 3 Dec 2004 20:22:37 +0000 (20:22 +0000)
committerTon Roosendaal <ton@blender.org>
Fri, 3 Dec 2004 20:22:37 +0000 (20:22 +0000)
thanks for that!

- static particles that are being deformed (curve/lattice/armature) now
  display correct in 3d window. Only updates when particle system updates
  normally though
- static particles without "animate" set didn't deform even
- static particles used as duplicators had errors with extreme low "life"
  value for particles. Also, still cases could happen with unrotated duplis
  at the end of a static particle line (with Vect option)
- Added tooltip for "Step" option in particles

source/blender/blenkernel/intern/anim.c
source/blender/blenkernel/intern/effect.c
source/blender/renderconverter/intern/convertBlenderScene.c
source/blender/src/buttons_object.c

index 4a386a737c06b13a4f6e375ae29c88e07f503d2f..f92294df3d1cd0e8cc100c3e59ec3e72422381a2 100644 (file)
@@ -459,7 +459,7 @@ void particle_duplilist(Scene *sce, Object *par, PartEff *paf)
                                                        float mtime;
                                                        
                                                        where_is_particle(paf, pa, pa->time, vec1);
-                                                       mtime= pa->time+pa->lifetime+paf->staticstep-1;
+                                                       mtime= pa->time+pa->lifetime;
                                                        
                                                        for(ctime= pa->time; ctime<mtime; ctime+=paf->staticstep) {
                                                                newob= new_dupli_object(&duplilist, ob, par);
@@ -470,11 +470,11 @@ void particle_duplilist(Scene *sce, Object *par, PartEff *paf)
                                                                /* to give ipos in object correct offset */
                                                                where_is_object_time(newob, ctime-pa->time);
 
-                                                               where_is_particle(paf, pa, ctime-0.5, vec);     // makes sure there's always a vec
+                                                               where_is_particle(paf, pa, ctime, vec); // makes sure there's always a vec
                                                                Mat4MulVecfl(par->obmat, vec);
                                                                
                                                                if(paf->stype==PAF_VECT) {
-                                                                       where_is_particle(paf, pa, ctime+0.5, vec1); // makes sure there's always a vec
+                                                                       where_is_particle(paf, pa, ctime+1.0, vec1); // makes sure there's always a vec
                                                                        Mat4MulVecfl(par->obmat, vec1);
 
                                                                        VecSubf(vec1, vec1, vec);
index 321dd50d0c8c524ecf197124a095d8047737767d..ed2936af03453239d484d1cb0a4e482de1f0cf1b 100644 (file)
 #include "BLI_arithb.h"
 #include "BLI_rand.h"
 
-#include "BKE_utildefines.h"
+#include "BKE_action.h"
 #include "BKE_bad_level_calls.h"
-#include "BKE_global.h"
-#include "BKE_material.h"
-#include "BKE_effect.h"
-#include "BKE_key.h"
-#include "BKE_ipo.h"
-#include "BKE_screen.h"
-#include "BKE_main.h"
 #include "BKE_blender.h"
-#include "BKE_object.h"
+#include "BKE_constraint.h"
+#include "BKE_deform.h"
 #include "BKE_displist.h"
+#include "BKE_effect.h"
+#include "BKE_global.h"
+#include "BKE_ipo.h"
+#include "BKE_key.h"
 #include "BKE_lattice.h"
 #include "BKE_mesh.h"
-#include "BKE_action.h"
-#include "BKE_constraint.h"
+#include "BKE_material.h"
+#include "BKE_main.h"
+#include "BKE_object.h"
+#include "BKE_screen.h"
+#include "BKE_utildefines.h"
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -286,6 +287,7 @@ void where_is_particle(PartEff *paf, Particle *pa, float ctime, float *vec)
        /* first find the first particlekey */
        a= (int)((paf->totkey-1)*(ctime-pa->time)/pa->lifetime);
        if(a>=paf->totkey) a= paf->totkey-1;
+       else if(a<0) a= 0;
        
        pa+= a;
        
@@ -1132,7 +1134,7 @@ void build_particle_system(Object *ob)
        int armature_parent;
        float framelenont, ftime, dtime, force[3], imat[3][3], vec[3];
        float fac, prevobmat[4][4], sfraont, co[3];
-       int deform=0, a, b, c, cur, cfraont, cfralast, totpart;
+       int deform=0, a, cur, cfraont, cfralast, totpart;
        short no[3];
 
        if(ob->type!=OB_MESH) return;
@@ -1150,6 +1152,9 @@ void build_particle_system(Object *ob)
        waitcursor(1);
 
        disable_speed_curve(1);
+       
+       /* warning! we cannot call this when modifier is active! */
+       mesh_modifier(ob, 's');
 
        /* generate all particles */
        if(paf->keys) MEM_freeN(paf->keys);
@@ -1235,24 +1240,29 @@ void build_particle_system(Object *ob)
        
        /* init */
        give_mesh_mvert(me, totpart, co, no, paf->seed);
-
-       printf("\n");
-       printf("Calculating particles......... \n");
-
+       
+       if(G.f & G_DEBUG) {
+               printf("\n");
+               printf("Calculating particles......... \n");
+       }
        for(a=0; a<totpart; a++, ftime+=dtime) {
                
                pa= new_particle(paf);
                pa->time= ftime;
                
-               c = totpart/100;
-               if (c==0){
-                       c = 1;
-               }
+               if(G.f & G_DEBUG) {
+                       int b, c;
+                       
+                       c = totpart/100;
+                       if (c==0){
+                               c = 1;
+                       }
 
-               b=(a%c);
-               if (b==0) {
-                       printf("\r Particle: %d / %d ", a, totpart);
-                       fflush(stdout);
+                       b=(a%c);
+                       if (b==0) {
+                               printf("\r Particle: %d / %d ", a, totpart);
+                               fflush(stdout);
+                       }
                }
                /* set ob at correct time */
                
@@ -1334,9 +1344,10 @@ void build_particle_system(Object *ob)
                make_particle_keys(0, a, paf, pa, force, deform, mtexmove, ob->lay);
        }
        
-       printf("\r Particle: %d / %d \n", totpart, totpart);
-       fflush(stdout);
-       
+       if(G.f & G_DEBUG) {
+               printf("\r Particle: %d / %d \n", totpart, totpart);
+               fflush(stdout);
+       }       
        if(deform) end_latt_deform();
                
        /* restore */
@@ -1373,6 +1384,8 @@ void build_particle_system(Object *ob)
 
        if(ma) do_mat_ipo(ma);  // set back on current time
        disable_speed_curve(0);
+       
+       mesh_modifier(ob, 'e');
 
        waitcursor(0);
 
index f612a29e93ad31def898a59360be447abe45efe6..5727c967ff024aa46f860b42ceeda9bfaaf232f9 100644 (file)
@@ -1285,12 +1285,9 @@ static void init_render_mesh(Object *ob)
 
        paf = give_parteff(ob);
        if(paf) {
-               mesh_modifier(ob, 's');
-               
+               /* warning; build_particle_system does modifier calls itself */
                if(paf->flag & PAF_STATIC) render_static_particle_system(ob, paf);
                else render_particle_system(ob, paf);
-               
-               mesh_modifier(ob, 'e');  // end
                return;
        }
 
index f3150199b73499534aafbeba3374aabb83a2dd31..89f25888d13f83a8043d1fb55741f84cfa63999b 100644 (file)
@@ -1522,6 +1522,7 @@ void object_panel_effects(Object *ob)
                        paf= (PartEff *)eff;
                        
                        uiDefBut(block, BUT, B_RECALCAL, "RecalcAll", 741,187,67,27, 0, 0, 0, 0, 0, "Update the particle system");
+                       uiBlockBeginAlign(block);
                        uiDefButS(block, TOG|BIT|2, B_CALCEFFECT, "Static",     825,187,67,27, &paf->flag, 0, 0, 0, 0, "Make static particles (deform only works with SubSurf)");
                        if(paf->flag & PAF_STATIC)
                                uiDefButS(block, TOG|BIT|4, B_DIFF, "Animated",825,167,67,20, &paf->flag, 0, 0, 0, 0, "Static particles are recalculated each rendered frame");
@@ -1529,7 +1530,7 @@ void object_panel_effects(Object *ob)
                        uiBlockBeginAlign(block);
                        uiDefButI(block, NUM, B_CALCEFFECT, "Tot:",                     550,146,91,20, &paf->totpart, 1.0, 100000.0, 0, 0, "Set the total number of particles");
                        if(paf->flag & PAF_STATIC) {
-                               uiDefButS(block, NUM, REDRAWVIEW3D, "Step:",    644,146,84+97,20, &paf->staticstep, 1.0, 100.0, 10, 0, "");
+                               uiDefButS(block, NUM, REDRAWVIEW3D, "Step:",    644,146,84+97,20, &paf->staticstep, 1.0, 100.0, 10, 0, "For static duplicators, the Step value skips particles");
                        }
                        else {
                                uiDefButF(block, NUM, B_CALCEFFECT, "Sta:",             644,146,84,20, &paf->sta, -250.0, 9000.0, 100, 0, "Specify the startframe");