diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-02-25 22:29:58 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-02-25 22:29:58 +0300 |
commit | 9ac7c8e91a9e699ff3490881c554e08fc348f442 (patch) | |
tree | 6b38e208514291ae47bda0fa61a277ef9d60ce96 /source/blender/blenkernel | |
parent | c3078c94fb48cc1376b170bb3c7ce1f2e14fa2f3 (diff) |
2.5: Particle edit mode more functional now. Transform, brush
editing, paint cursor, radial control, mouse/border/circle/lasso
select, mirroring, bad level calls fixed, etc.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_particle.h | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 26 |
3 files changed, 46 insertions, 16 deletions
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 616bf737889..8bf6d91e325 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -139,15 +139,20 @@ typedef struct ParticleUndo { char name[64]; } ParticleUndo; -typedef struct ParticleEdit{ +typedef struct ParticleEdit { ListBase undo; struct ParticleUndo *curundo; - struct KDTree *emitter_field; + ParticleEditKey **keys; + int totkeys; + int *mirror_cache; + + struct KDTree *emitter_field; float *emitter_cosnos; - int totkeys; + char sel_col[3]; + char nosel_col[3]; } ParticleEdit; typedef struct ParticleThreadContext { @@ -244,6 +249,7 @@ void psys_find_parents(struct Object *ob, struct ParticleSystemModifierData *psm void psys_cache_paths(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, float cfra, int editupdate); void psys_cache_child_paths(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys, float cfra, int editupdate); +void psys_update_world_cos(struct Object *ob, struct ParticleSystem *psys); 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); diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index cac95a85d54..2b1dcc782c6 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -391,7 +391,8 @@ void psys_free(Object *ob, ParticleSystem * psys) free_keyed_keys(psys); - //XXX PE_free_particle_edit(psys); + if(psys->edit && psys->free_edit) + psys->free_edit(psys); if(psys->particles){ MEM_freeN(psys->particles); @@ -2338,7 +2339,6 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra int k,i; int steps = (int)pow(2.0, (double)psys->part->draw_step); int totpart = psys->totpart; - char nosel[4], sel[4]; float sel_col[3]; float nosel_col[3]; float length, vec[3]; @@ -2350,25 +2350,25 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra if((psys->flag & PSYS_HAIR_DONE)==0 && (psys->flag & PSYS_KEYED)==0) return; - if(psys->renderdata) + if(psys->renderdata) { steps = (int)pow(2.0, (double)psys->part->ren_step); - else if(psys_in_edit_mode(scene, psys)){ + } + else if(psys_in_edit_mode(scene, psys)) { edit=psys->edit; //timed = edit->draw_timed; - //XXX PE_get_colors(sel,nosel); - if(pset->brushtype == PE_BRUSH_WEIGHT){ + if(pset->brushtype == PE_BRUSH_WEIGHT) { sel_col[0] = sel_col[1] = sel_col[2] = 1.0f; nosel_col[0] = nosel_col[1] = nosel_col[2] = 0.0f; } else{ - sel_col[0] = (float)sel[0] / 255.0f; - sel_col[1] = (float)sel[1] / 255.0f; - sel_col[2] = (float)sel[2] / 255.0f; - nosel_col[0] = (float)nosel[0] / 255.0f; - nosel_col[1] = (float)nosel[1] / 255.0f; - nosel_col[2] = (float)nosel[2] / 255.0f; + sel_col[0] = (float)edit->sel_col[0] / 255.0f; + sel_col[1] = (float)edit->sel_col[1] / 255.0f; + sel_col[2] = (float)edit->sel_col[2] / 255.0f; + nosel_col[0] = (float)edit->nosel_col[0] / 255.0f; + nosel_col[1] = (float)edit->nosel_col[1] / 255.0f; + nosel_col[2] = (float)edit->nosel_col[2] / 255.0f; } } diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 516cdc76125..afb4fb68c8c 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -4174,6 +4174,30 @@ static void psys_update_path_cache(Scene *scene, Object *ob, ParticleSystemModif psys_free_path_cache(psys); } +/* calculate and store key locations in world coordinates */ +void psys_update_world_cos(Object *ob, ParticleSystem *psys) +{ + ParticleSystemModifierData *psmd= psys_get_modifier(ob, psys); + ParticleData *pa; + ParticleEditKey *key; + int i, k, totpart; + float hairmat[4][4]; + + if(psys==0 || psys->edit==0) + return; + + totpart= psys->totpart; + + for(i=0, pa=psys->particles; i<totpart; i++, pa++) { + psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat); + + for(k=0, key=psys->edit->keys[i]; k<pa->totkey; k++, key++) { + VECCOPY(key->world_co,key->co); + Mat4MulVecfl(hairmat, key->world_co); + } + } +} + static void hair_step(Scene *scene, Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra) { ParticleSettings *part = psys->part; @@ -4200,7 +4224,7 @@ static void hair_step(Scene *scene, Object *ob, ParticleSystemModifierData *psmd precalc_effectors(scene, ob,psys,psmd,cfra); if(psys_in_edit_mode(scene, psys)) - ; //XXX PE_recalc_world_cos(ob, psys); + psys_update_world_cos(ob, psys); psys_update_path_cache(scene, ob,psmd,psys,cfra); } |