diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-01-23 23:40:52 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-01-23 23:40:52 +0400 |
commit | 555ae1f4b0476c6ce4f72974f7f829b31e6704d2 (patch) | |
tree | b98e2732bcbe6e91a0f53def3b2875d759b3953f /source/blender/editors/physics/particle_edit.c | |
parent | 976c6b7b6e9113f7c80e2ee5ac41dfc72a66db4a (diff) |
Fix #33896: particle add brush with radius 1 would give duplicated and NaN hairs.
Diffstat (limited to 'source/blender/editors/physics/particle_edit.c')
-rw-r--r-- | source/blender/editors/physics/particle_edit.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 75b4cbf78a5..d661e8d7fb6 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -3254,7 +3254,7 @@ static int brush_add(PEData *data, short number) ParticleEditSettings *pset= PE_settings(scene); int i, k, n= 0, totpart= psys->totpart; float mco[2]; - short dmx= 0, dmy= 0; + float dmx, dmy; float co1[3], co2[3], min_d, imat[4][4]; float framestep, timestep; short size= pset->brush[PE_BRUSH_ADD].size; @@ -3282,12 +3282,19 @@ static int brush_add(PEData *data, short number) for (i=0; i<number; i++) { if (number>1) { - dmx=dmy=size; - while (dmx*dmx+dmy*dmy>size2) { - dmx=(short)((2.0f*BLI_frand()-1.0f)*size); - dmy=(short)((2.0f*BLI_frand()-1.0f)*size); + dmx = size; + dmy = size; + + /* rejection sampling to get points in circle */ + while (dmx*dmx + dmy*dmy > size2) { + dmx= (2.0f*BLI_frand() - 1.0f)*size; + dmy= (2.0f*BLI_frand() - 1.0f)*size; } } + else { + dmx = 0.0f; + dmy = 0.0f; + } mco[0] = data->mval[0] + dmx; mco[1] = data->mval[1] + dmy; @@ -3390,8 +3397,14 @@ static int brush_add(PEData *data, short number) weight[w] = 0.0f; } - for (w=0; w<maxw; w++) - weight[w] /= totw; + if(totw > 0.0f) { + for (w=0; w<maxw; w++) + weight[w] /= totw; + } + else { + for (w=0; w<maxw; w++) + weight[w] = 1.0f/maxw; + } ppa= psys->particles+ptn[0].index; @@ -3403,7 +3416,7 @@ static int brush_add(PEData *data, short number) psys_get_particle_on_path(&sim, ptn[0].index, key3, 0); mul_v3_fl(key3[0].co, weight[0]); - /* TODO: interpolatint the weight would be nicer */ + /* TODO: interpolating the weight would be nicer */ thkey->weight= (ppa->hair+MIN2(k, ppa->totkey-1))->weight; if (maxw>1) { |