diff options
Diffstat (limited to 'source/blender/editors/physics/particle_edit.c')
-rw-r--r-- | source/blender/editors/physics/particle_edit.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index a1570810e94..a4bad0c708f 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -851,7 +851,7 @@ static void pe_deflect_emitter(Scene *scene, Object *ob, PTCacheEdit *edit) ParticleSystemModifierData *psmd; POINT_P; KEY_K; int index; - float *vec, *nor, dvec[3], dot, dist_1st; + float *vec, *nor, dvec[3], dot, dist_1st=0.0f; float hairimat[4][4], hairmat[4][4]; if(edit==NULL || edit->psys==NULL || (pset->flag & PE_DEFLECT_EMITTER)==0 || (edit->psys->flag & PSYS_GLOBAL_HAIR)) @@ -2708,6 +2708,10 @@ static void brush_cut(PEData *data, int pa_index) /* blunt scissors */ if(BLI_frand() > data->cutfac) return; + /* don't cut hidden */ + if(edit->points[pa_index].flag & PEP_HIDE) + return; + rad2= data->rad * data->rad; cut=0; @@ -2791,7 +2795,7 @@ static void brush_length(PEData *data, int point_index) PTCacheEdit *edit= data->edit; PTCacheEditPoint *point = edit->points + point_index; KEY_K; - float dvec[3],pvec[3]; + float dvec[3],pvec[3] = {0.0f, 0.0f, 0.0f}; LOOP_KEYS { if(k==0) { @@ -2815,7 +2819,7 @@ static void brush_puff(PEData *data, int point_index) PTCacheEditPoint *point = edit->points + point_index; KEY_K; float mat[4][4], imat[4][4]; - float lastco[3], rootco[3], co[3], nor[3], kco[3], dco[3], fac, length; + float lastco[3], rootco[3] = {0.0f, 0.0f, 0.0f}, co[3], nor[3], kco[3], dco[3], fac=0.0f, length=0.0f; if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) { psys_mat_hair_to_global(data->ob, data->dm, psys->part->from, psys->particles + point_index, mat); @@ -2897,7 +2901,7 @@ static void brush_smooth_do(PEData *data, float mat[][4], float imat[][4], int p (data->edit->points + point_index)->flag |= PEP_EDIT_RECALC; } -static void brush_add(PEData *data, short number) +static int brush_add(PEData *data, short number) { Scene *scene= data->scene; Object *ob= data->ob; @@ -2918,7 +2922,7 @@ static void brush_add(PEData *data, short number) Mat4Invert(imat,ob->obmat); if(psys->flag & PSYS_GLOBAL_HAIR) - return; + return 0; BLI_srandom(psys->seed+data->mval[0]+data->mval[1]); @@ -3093,6 +3097,8 @@ static void brush_add(PEData *data, short number) if(!psmd->dm->deformedOnly) dm->release(dm); + + return n; } /************************* brush edit operator ********************/ @@ -3143,7 +3149,7 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) ARegion *ar= CTX_wm_region(C); float vec[3], mousef[2]; short mval[2], mvalo[2]; - int flip, mouse[2], dx, dy, removed= 0, selected= 0; + int flip, mouse[2], dx, dy, removed= 0, added=0, selected= 0; int lock_root = pset->flag & PE_LOCK_FIRST; if(!PE_start_edit(edit)) @@ -3221,6 +3227,9 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) if(pset->flag & PE_KEEP_LENGTHS) recalc_lengths(edit); } + else + removed= 0; + break; } case PE_BRUSH_LENGTH: @@ -3275,11 +3284,13 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) PE_set_view3d_data(C, &data); data.mval= mval; - brush_add(&data, brush->strength); + added= brush_add(&data, brush->strength); if(pset->flag & PE_KEEP_LENGTHS) recalc_lengths(edit); } + else + added= 0; break; } case PE_BRUSH_SMOOTH: @@ -3310,13 +3321,15 @@ static void brush_edit_apply(bContext *C, wmOperator *op, PointerRNA *itemptr) if((pset->flag & PE_KEEP_LENGTHS)==0) recalc_lengths(edit); - if(pset->brushtype == PE_BRUSH_ADD || removed) { - if(pset->brushtype == PE_BRUSH_ADD && (pset->flag & PE_X_MIRROR)) - PE_mirror_x(scene, ob, 1); + if(ELEM(pset->brushtype, PE_BRUSH_ADD, PE_BRUSH_CUT)) { + if(added || removed) { + if(pset->brushtype == PE_BRUSH_ADD && (pset->flag & PE_X_MIRROR)) + PE_mirror_x(scene, ob, 1); - update_world_cos(ob,edit); - psys_free_path_cache(NULL, edit); - DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + update_world_cos(ob,edit); + psys_free_path_cache(NULL, edit); + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + } } else PE_update_object(scene, ob, 1); |