Revision: 23317
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23317
Author:   jhk
Date:     2009-09-18 00:00:49 +0200 (Fri, 18 Sep 2009)

Log Message:
-----------
Particles cleanup, optimizations and some small new stuff.

New stuff
- Bending springs for hair dynamics.

Code cleanup & optimization
- Disabled reactor particles temporarily for cleanup, it's a clumsy system that 
will be replaced with something better.
- Removed child seams, something better will come here too :)
- Normal particle drawing data is now saved between redraws if the particles 
don't move between redraws.
        * For example rotating the 3d view is now realtime even with 1M 
particles.
- Many random values for particles now come from a lookup table making things 
much faster.
- Most accessed small point cache functions are now much faster as macros.
- Lot's of general code cleanup.
- Nothing big should have changed so if something doesn't work like it used to 
it's probably just a typo somewhere :)

Modified Paths:
--------------
    trunk/blender/release/ui/buttons_particle.py
    trunk/blender/source/blender/blenkernel/BKE_boids.h
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/boids.c
    trunk/blender/source/blender/blenkernel/intern/cloth.c
    trunk/blender/source/blender/blenkernel/intern/depsgraph.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenkernel/intern/pointcache.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/physics/editparticle.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/makesdna/DNA_particle_types.h
    trunk/blender/source/blender/makesrna/intern/rna_particle.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/pointdensity.c

Modified: trunk/blender/release/ui/buttons_particle.py
===================================================================
--- trunk/blender/release/ui/buttons_particle.py        2009-09-17 21:36:02 UTC 
(rev 23316)
+++ trunk/blender/release/ui/buttons_particle.py        2009-09-17 22:00:49 UTC 
(rev 23317)
@@ -255,6 +255,7 @@
                sub = col.column(align=True)
                sub.itemR(cloth, "pin_stiffness", text="Stiffness")
                sub.itemR(cloth, "mass")
+               sub.itemR(cloth, "bending_stiffness", text="Bending")
                col.itemL(text="Damping:")
                sub = col.column(align=True)
                sub.itemR(cloth, "spring_damping", text="Spring")

Modified: trunk/blender/source/blender/blenkernel/BKE_boids.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_boids.h 2009-09-17 21:36:02 UTC 
(rev 23316)
+++ trunk/blender/source/blender/blenkernel/BKE_boids.h 2009-09-17 22:00:49 UTC 
(rev 23317)
@@ -35,9 +35,7 @@
 #include "DNA_boid_types.h"
 
 typedef struct BoidBrainData {
-       Scene *scene;
-       struct Object *ob;
-       struct ParticleSystem *psys;
+       struct ParticleSimulationData *sim;
        struct ParticleSettings *part;
        float timestep, cfra, dfra;
        float wanted_co[3], wanted_speed;

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h      2009-09-17 
21:36:02 UTC (rev 23316)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h      2009-09-17 
22:00:49 UTC (rev 23317)
@@ -61,7 +61,24 @@
 
 #define PARTICLE_P                             ParticleData *pa; int p
 #define LOOP_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; p++, pa++)
+#define LOOP_EXISTING_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; 
p++, pa++) if(!(pa->flag & PARS_UNEXIST))
+#define LOOP_SHOWN_PARTICLES for(p=0, pa=psys->particles; p<psys->totpart; 
p++, pa++) if(!(pa->flag & (PARS_UNEXIST|PARS_NO_DISP)))
 
+#define PSYS_FRAND_COUNT       1024
+#define PSYS_FRAND(seed)       psys->frand[(seed) % PSYS_FRAND_COUNT]
+
+/* fast but sure way to get the modifier*/
+#define PARTICLE_PSMD ParticleSystemModifierData *psmd = sim->psmd ? sim->psmd 
: psys_get_modifier(sim->ob, sim->psys)
+
+/* common stuff that many particle functions need */
+typedef struct ParticleSimulationData {
+       struct Scene *scene;
+       struct Object *ob;
+       struct ParticleSystem *psys;
+       struct ParticleSystemModifierData *psmd;
+       float timestep;
+} ParticleSimulationData;
+
 typedef struct ParticleEffectorCache {
        struct ParticleEffectorCache *next, *prev;
        struct Object *ob;
@@ -118,11 +135,8 @@
 
 typedef struct ParticleThreadContext {
        /* shared */
-       struct Scene *scene;
-       struct Object *ob;
+       struct ParticleSimulationData sim;
        struct DerivedMesh *dm;
-       struct ParticleSystemModifierData *psmd;
-       struct ParticleSystem *psys;
        struct Material *ma;
 
        /* distribution */
@@ -166,8 +180,7 @@
        int lock, num;
        int totnum;
        short align, uv_split, anim, split_offset;
-}
-ParticleBillboardData;
+} ParticleBillboardData;
 
 /* container for moving data between deflet_particle and 
particle_intersect_face */
 typedef struct ParticleCollision
@@ -179,40 +192,40 @@
        float co1[3], co2[3]; // ray start and end points
        float ray_len; // original length of co2-co1, needed for collision time 
evaluation
        float t;        // time of previous collision, needed for substracting 
face velocity
-}
-ParticleCollision;
+} ParticleCollision;
 
+typedef struct ParticleDrawData {
+       float *vdata, *vd;              /* vertice data */
+       float *ndata, *nd;              /* normal data */
+       float *cdata, *cd;              /* color data */
+       float *vedata, *ved;    /* velocity data */
+       float *ma_r, *ma_g, *ma_b;
+       int tot_vec_size, flag;
+       int totpoint, totve;
+} ParticleDrawData;
+
+#define PARTICLE_DRAW_DATA_UPDATED  1
+
 /* ----------- functions needed outside particlesystem ---------------- */
 /* particle.c */
 int count_particles(struct ParticleSystem *psys);
 int count_particles_mod(struct ParticleSystem *psys, int totgr, int cur);
-int psys_count_keys(struct ParticleSystem *psys);
-char *psys_menu_string(struct Object *ob, int for_sb);
 
 struct ParticleSystem *psys_get_current(struct Object *ob);
+/* for rna */
 short psys_get_current_num(struct Object *ob);
 void psys_set_current_num(Object *ob, int index);
 struct Object *psys_find_object(struct Scene *scene, struct ParticleSystem 
*psys);
-//struct ParticleSystem *psys_get(struct Object *ob, int index);
-struct ParticleData *psys_get_selected_particle(struct ParticleSystem *psys, 
int *index);
-struct ParticleKey *psys_get_selected_key(struct ParticleSystem *psys, int 
pa_index, int *key_index);
-void psys_change_act(void *ob_v, void *act_v);
-struct Object *psys_get_lattice(struct Scene *scene, struct Object *ob, struct 
ParticleSystem *psys);
-void psys_disable_all(struct Object *ob);
-void psys_enable_all(struct Object *ob);
-int psys_ob_has_hair(struct Object *ob);
+
+struct Object *psys_get_lattice(struct ParticleSimulationData *sim);
+
 int psys_in_edit_mode(struct Scene *scene, struct ParticleSystem *psys);
 int psys_check_enabled(struct Object *ob, struct ParticleSystem *psys);
 
-void psys_free_boid_rules(struct ListBase *list);
+/* free */
 void psys_free_settings(struct ParticleSettings *part);
-void free_child_path_cache(struct ParticleSystem *psys);
 void psys_free_path_cache(struct ParticleSystem *psys, struct PTCacheEdit 
*edit);
-void free_hair(struct Object *ob, struct ParticleSystem *psys, int dynamics);
-void free_keyed_keys(struct ParticleSystem *psys);
-void psys_free_particles(struct ParticleSystem *psys);
 void psys_free(struct Object * ob, struct ParticleSystem * psys);
-void psys_free_children(struct ParticleSystem *psys);
 
 void psys_render_set(struct Object *ob, struct ParticleSystem *psys, float 
viewmat[][4], float winmat[][4], int winx, int winy, int timeoffset);
 void psys_render_restore(struct Object *ob, struct ParticleSystem *psys);
@@ -234,45 +247,38 @@
 void psys_flush_particle_settings(struct Scene *scene, struct ParticleSettings 
*part, int recalc);
 void make_local_particlesettings(struct ParticleSettings *part);
 
-struct LinkNode *psys_using_settings(struct Scene *scene, struct 
ParticleSettings *part, int flush_update);
 void psys_reset(struct ParticleSystem *psys, int mode);
 
-void psys_find_parents(struct Object *ob, struct ParticleSystemModifierData 
*psmd, struct ParticleSystem *psys);
+void psys_find_parents(struct ParticleSimulationData *sim);
 
-void psys_cache_paths(struct Scene *scene, struct Object *ob, struct 
ParticleSystem *psys, float cfra);
+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 Scene *scene, struct Object *ob, struct 
ParticleSystem *psys, float cfra, int editupdate);
+void psys_cache_child_paths(struct ParticleSimulationData *sim, float cfra, 
int editupdate);
 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_timestep(struct ParticleSimulationData *sim);
 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);
+void psys_get_particle_on_path(struct ParticleSimulationData *sim, int pa_num, 
struct ParticleKey *state, int vel);
+int psys_get_particle_state(struct ParticleSimulationData *sim, int p, struct 
ParticleKey *state, int always);
+
+/* for anim.c */
 void psys_get_dupli_texture(struct Object *ob, struct ParticleSettings *part, 
struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct 
ChildParticle *cpa, float *uv, float *orco);
-void psys_get_dupli_path_transform(struct Object *ob, struct ParticleSystem 
*psys, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct 
ChildParticle *cpa, struct ParticleCacheKey *cache, float mat[][4], float 
*scale);
+void psys_get_dupli_path_transform(struct ParticleSimulationData *sim, struct 
ParticleData *pa, struct ChildParticle *cpa, struct ParticleCacheKey *cache, 
float mat[][4], float *scale);
 
-ParticleThread *psys_threads_create(struct Scene *scene, struct Object *ob, 
struct ParticleSystem *psys);
-int psys_threads_init_distribution(ParticleThread *threads, struct Scene 
*scene, struct DerivedMesh *dm, int from);
-int psys_threads_init_path(ParticleThread *threads, struct Scene *scene, float 
cfra, int editupdate);
+ParticleThread *psys_threads_create(struct ParticleSimulationData *sim);
 void psys_threads_free(ParticleThread *threads);
 
-void psys_thread_distribute_particle(ParticleThread *thread, struct 
ParticleData *pa, struct ChildParticle *cpa, int p);
-void psys_thread_create_path(ParticleThread *thread, struct ChildParticle 
*cpa, ParticleCacheKey *keys, int i);
-
 void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float 
yvec[3], float zvec[3], float center[3]);
 
 /* particle_system.c */
 struct ParticleSystem *psys_get_target_system(struct Object *ob, struct 
ParticleTarget *pt);
-void psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
-void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, 
struct Object **target_ob, struct ParticleSystem **target_psys);
+void psys_count_keyed_targets(struct ParticleSimulationData *sim);
+//void psys_get_reactor_target(struct ParticleSimulationData *sim, struct 
Object **target_ob, struct ParticleSystem **target_psys);
 
-void psys_init_effectors(struct Scene *scene, struct Object *obsrc, struct 
Group *group, struct ParticleSystem *psys);
-void psys_end_effectors(struct ParticleSystem *psys);
+int psys_update_effectors(ParticleSimulationData *sim, float cfra, int 
precalc);
 

@@ 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