Revision: 21361
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21361
Author:   jhk
Date:     2009-07-04 05:50:12 +0200 (Sat, 04 Jul 2009)

Log Message:
-----------
A bunch of fun stuff now possible because of new pointcache code:
* Baked normal particles can now use the "Path" visualization.
* Path "max length" & "abs length" are now history:
        - New option to set path start & end times + random variation to length.
        - Much more flexible (and calculated better) than previous options.
        - This works with parents, children, hair & normal particles unlike old 
length option.
        - Only known issue for now is that children from faces don't get 
calculated correctly when using path start time.
* New option "trails" for "halo", "line" and "billboard" visualizations:
        - Draws user controllable number of particle instances along particles 
path backwards from current position.
        - Works with children too for cool/weird visualizations that weren't 
possible before.
* Normal particle children's velocities are now approximated better when needed 
so that "line" visualization trails will look nice.
* New particle instance modifier options:
        - "path"-option works better and has controllable (max)position along 
path (with random variation possible).
        - "keep shape"-option for hair, keyed, or baked particles allows to 
place the instances to a single point (with random variation possible) along 
particle path.
        - "axis" option to make rotation handling better (still not perfect, 
but will have to do for now).

Some fixes & cleanup done along the way:
* Random path length didn't work for non-child particles.
* Cached & unborn particles weren't reset to emit locations.
* Particle numbers weren't drawn in the correct place.
* Setting proper render & draw visualizations was lost somewhere when 
initializing new particle settings.
* Changing child mode wasn't working correctly.
* Some cleanup & modularization of particle child effector code and particle 
drawing & rendering code.
* Object & group visualizations didn't work.
* Child simplification didn't work.

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/buttons_data_modifier.py
    branches/blender2.5/blender/release/ui/buttons_particle.py
    branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/anim.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c
    
branches/blender2.5/blender/source/blender/blenkernel/intern/particle_system.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    
branches/blender2.5/blender/source/blender/editors/interface/interface_templates.c
    branches/blender2.5/blender/source/blender/editors/object/object_modifier.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_particle_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_particle.c
    
branches/blender2.5/blender/source/blender/render/intern/source/convertblender.c

Modified: branches/blender2.5/blender/release/ui/buttons_data_modifier.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_data_modifier.py     
2009-07-04 00:33:50 UTC (rev 21360)
+++ branches/blender2.5/blender/release/ui/buttons_data_modifier.py     
2009-07-04 03:50:12 UTC (rev 21361)
@@ -300,10 +300,19 @@
                col.itemR(md, "normal")
                col.itemR(md, "children")
                col.itemR(md, "path")
+               if md.path:
+                       col.itemR(md, "keep_shape")
                col.itemR(md, "unborn")
                col.itemR(md, "alive")
                col.itemR(md, "dead")
+               if md.path:
+                       col.itemR(md, "axis", text="")
                
+               if md.path:
+                       row = layout.row()
+                       row.itemR(md, "position", slider=True)
+                       row.itemR(md, "random_position", text = "Random", 
slider=True)
+               
        def particlesystem(self, layout, ob, md):
                layout.itemL(text="See Particle panel.")
                

Modified: branches/blender2.5/blender/release/ui/buttons_particle.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_particle.py  2009-07-04 
00:33:50 UTC (rev 21360)
+++ branches/blender2.5/blender/release/ui/buttons_particle.py  2009-07-04 
03:50:12 UTC (rev 21361)
@@ -353,19 +353,14 @@
                        colsub.itemR(part, "adaptive_pix")
                        sub.itemR(part, "hair_bspline")
                        sub.itemR(part, "render_step", text="Steps")
-                       sub = split.column()
-                       sub.itemL(text="Length:")
-                       sub.itemR(part, "abs_length", text="Absolute")
-                       sub.itemR(part, "absolute_length", text="Maximum")
+                       sub = split.column()    
+
+                       sub.itemL(text="Timing:")
+                       sub.itemR(part, "abs_path_time")
+                       sub.itemR(part, "path_start", text="Start", slider= not 
part.abs_path_time)
+                       sub.itemR(part, "path_end", text="End", slider= not 
part.abs_path_time)         
                        sub.itemR(part, "random_length", text="Random", 
slider=True)
                        
-                       #row = layout.row()
-                       #row.itemR(part, "timed_path")
-                       #col = row.column(align=True)
-                       #col.active = part.timed_path == True
-                       #col.itemR(part, "line_length_tail", text="Start")
-                       #col.itemR(part, "line_length_head", text="End")
-                       
                        row = layout.row()
                        col = row.column()
                        
@@ -384,7 +379,6 @@
                        
 
                elif part.ren_as == 'OBJECT':
-                       #sub = split.column()
                        sub.itemR(part, "dupli_object")
                elif part.ren_as == 'GROUP':
                        sub.itemR(part, "dupli_group")
@@ -428,7 +422,19 @@
                        row.itemR(part, "billboard_animation", expand=True)
                        row.itemL(text="Offset:")
                        row.itemR(part, "billboard_split_offset", expand=True)
-               
+               if part.ren_as == 'HALO' or part.ren_as == 'LINE' or 
part.ren_as=='BILLBOARD':
+                       row = layout.row()
+                       col = row.column()
+                       col.itemR(part, "trail_count")
+                       if part.trail_count > 1:
+                               col.itemR(part, "abs_path_time", text="Length 
in frames")
+                               col = row.column()
+                               col.itemR(part, "path_end", text="Length", 
slider=not part.abs_path_time)
+                               col.itemR(part, "random_length", text="Random", 
slider=True)
+                       else:
+                               col = row.column()
+                               col.itemL(text="")
+                               
 class PARTICLE_PT_draw(ParticleButtonsPanel):
        __idname__= "PARTICLE_PT_draw"
        __label__ = "Display"
@@ -475,11 +481,12 @@
                        col.itemR(part, "draw_health")
                
                col = row.column()
+               col.itemR(part, "material_color", text="Use material color")
+               
                if (path):
                        box = col.box()                         
                        box.itemR(part, "draw_step")
                else:
-                       col.itemR(part, "material_color", text="Use material 
color")
                        subcol = col.column()
                        subcol.active = part.material_color==False
                        #subcol.itemL(text="color")

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h        
2009-07-04 00:33:50 UTC (rev 21360)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_particle.h        
2009-07-04 03:50:12 UTC (rev 21361)
@@ -91,7 +91,8 @@
        float ivel;                                                     /* used 
in reset */
        float time, life, exist, size;          /* used in init */
        float pvel[3];                                          /* used in 
physics */
-       float length, clump, kink, rough;       /* used in path caching */
+       float length, clump, kink, effector;/* used in path caching */
+       float rough1, rough2, roughe;           /* used in path caching */
 } ParticleTexture;
 
 typedef struct BoidVecFunc{
@@ -270,7 +271,7 @@
 int do_guide(struct Scene *scene, struct ParticleKey *state, int pa_num, float 
time, struct ListBase *lb);
 float psys_get_size(struct Object *ob, struct Material *ma, struct 
ParticleSystemModifierData *psmd, struct IpoCurve *icu_size, struct 
ParticleSystem *psys, struct ParticleSettings *part, struct ParticleData *pa, 
float *vg_size);
 float psys_get_timestep(struct ParticleSettings *part);
-float psys_get_child_time(struct ParticleSystem *psys, struct ChildParticle 
*cpa, float cfra);
+float psys_get_child_time(struct ParticleSystem *psys, struct ChildParticle 
*cpa, float cfra, float *birthtime, float *dietime);
 float psys_get_child_size(struct ParticleSystem *psys, struct ChildParticle 
*cpa, float cfra, float *pa_time);
 void psys_get_particle_on_path(struct Scene *scene, struct Object *ob, struct 
ParticleSystem *psys, int pa_num, struct ParticleKey *state, int vel);
 int psys_get_particle_state(struct Scene *scene, struct Object *ob, struct 
ParticleSystem *psys, int p, struct ParticleKey *state, int always);

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/anim.c 
2009-07-04 00:33:50 UTC (rev 21360)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/anim.c 
2009-07-04 03:50:12 UTC (rev 21361)
@@ -786,8 +786,9 @@
        BLI_srandom(31415926 + psys->seed);
        
        lay= scene->lay;
-       if((part->draw_as == PART_DRAW_OB && part->dup_ob) ||
-               (part->draw_as == PART_DRAW_GR && part->dup_group && 
part->dup_group->gobject.first)) {
+       if((psys->renderdata || part->draw_as==PART_DRAW_REND) &&
+               ((part->ren_as == PART_DRAW_OB && part->dup_ob) ||
+               (part->ren_as == PART_DRAW_GR && part->dup_group && 
part->dup_group->gobject.first))) {
 
                /* if we have a hair particle system, use the path cache */
                if(part->type == PART_HAIR) {
@@ -804,7 +805,7 @@
                psys->lattice = psys_get_lattice(scene, par, psys);
 
                /* gather list of objects or single object */
-               if(part->draw_as==PART_DRAW_GR) {
+               if(part->ren_as==PART_DRAW_GR) {
                        group_handle_recalc_and_update(scene, par, 
part->dup_group);
 
                        for(go=part->dup_group->gobject.first; go; go=go->next)
@@ -850,7 +851,7 @@
                                size = psys_get_child_size(psys, cpa, ctime, 0);
                        }
 
-                       if(part->draw_as==PART_DRAW_GR) {
+                       if(part->ren_as==PART_DRAW_GR) {
                                /* for groups, pick the object based on 
settings */
                                if(part->draw&PART_DRAW_RAND_GR)
                                        b= BLI_rand() % totgroup;
@@ -894,7 +895,7 @@
                                pamat[3][3]= 1.0f;
                        }
 
-                       if(part->draw_as==PART_DRAW_GR && psys->part->draw & 
PART_DRAW_WHOLE_GR) {
+                       if(part->ren_as==PART_DRAW_GR && psys->part->draw & 
PART_DRAW_WHOLE_GR) {
                                for(go= part->dup_group->gobject.first, b=0; 
go; go= go->next, b++) {
                                        Mat4MulMat4(tmat, oblist[b]->obmat, 
pamat);
                                        Mat4MulFloat3((float *)tmat, 
size*scale);
@@ -930,7 +931,7 @@
                }
 
                /* restore objects since they were changed in 
where_is_object_time */
-               if(part->draw_as==PART_DRAW_GR) {
+               if(part->ren_as==PART_DRAW_GR) {
                        for(a=0; a<totgroup; a++)
                                *(oblist[a])= obcopylist[a];
                }

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c    
2009-07-04 00:33:50 UTC (rev 21360)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/depsgraph.c    
2009-07-04 03:50:12 UTC (rev 21361)
@@ -568,14 +568,14 @@
                                dag_add_relation(dag, node2, node, 
DAG_RL_DATA_DATA, "Particle Keyed Physics");
                        }
 
-                       if(part->draw_as == PART_DRAW_OB && part->dup_ob) {
+                       if(part->ren_as == PART_DRAW_OB && part->dup_ob) {
                                node2 = dag_get_node(dag, part->dup_ob);
                                dag_add_relation(dag, node, node2, 
DAG_RL_OB_OB, "Particle Object Visualisation");
                                if(part->dup_ob->type == OB_MBALL)
                                        dag_add_relation(dag, node, node2, 
DAG_RL_DATA_DATA, "Particle Object Visualisation");
                        }
 
-                       if(part->draw_as == PART_DRAW_GR && part->dup_group) {
+                       if(part->ren_as == PART_DRAW_GR && part->dup_group) {
                                for(go=part->dup_group->gobject.first; go; 
go=go->next) {
                                        node2 = dag_get_node(dag, go->ob);
                                        dag_add_relation(dag, node, node2, 
DAG_RL_OB_OB, "Particle Group Visualisation");

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c     
2009-07-04 00:33:50 UTC (rev 21360)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c     
2009-07-04 03:50:12 UTC (rev 21361)
@@ -6390,6 +6390,7 @@
                  }
 
                  if(psys){
+                         psmd->flag &= ~eParticleSystemFlag_psys_updated;
                          particle_system_update(md->scene, ob, psys);
                          psmd->flag |= eParticleSystemFlag_psys_updated;
                          psmd->flag &= ~eParticleSystemFlag_DM_changed;
@@ -6421,6 +6422,8 @@
        pimd->flag = eParticleInstanceFlag_Parents|eParticleInstanceFlag_Unborn|
                        eParticleInstanceFlag_Alive|eParticleInstanceFlag_Dead;
        pimd->psys = 1;
+       pimd->position = 1.0f;
+       pimd->axis = 2;
 
 }
 static void particleInstanceModifier_copyData(ModifierData *md, ModifierData 
*target)
@@ -6431,6 +6434,8 @@
        tpimd->ob = pimd->ob;
        tpimd->psys = pimd->psys;
        tpimd->flag = pimd->flag;
+       tpimd->position = pimd->position;
+       tpimd->random_position = pimd->random_position;
 }
 
 static int particleInstanceModifier_dependsOnTime(ModifierData *md) 
@@ -6470,7 +6475,7 @@
        MFace *mface, *orig_mface;
        MVert *mvert, *orig_mvert;
        int i,totvert, totpart=0, totface, maxvert, maxface, first_particle=0;
-       short track=ob->trackflag%3, trackneg;
+       short track=ob->trackflag%3, trackneg, axis = pimd->axis;
        float max_co=0.0, min_co=0.0, temp_co[3], cross[3];
 
        trackneg=((ob->trackflag>2)?1:0);
@@ -6508,7 +6513,7 @@
 
        psys->lattice=psys_get_lattice(md->scene, ob, psys);
 
-       if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)){
+       if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) || psys->pointcache->flag & 
PTCACHE_BAKED){
 
                float min_r[3], max_r[3];
                INIT_MINMAX(min_r, max_r);
@@ -6533,33 +6538,50 @@
 

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to