X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_particle%2Fplant.cpp;h=1e7a948de5a01dee00ecbbc553658f2917e1ba39;hb=bdb2a02c99f8b219519ef0acb5101407d16af089;hp=66d78b8762f5653cc273966d936752932b6d753d;hpb=ad5f0566c633041148043fc60cb0103a7516a5e3;p=synfig.git diff --git a/synfig-core/trunk/src/modules/mod_particle/plant.cpp b/synfig-core/trunk/src/modules/mod_particle/plant.cpp index 66d78b8..1e7a948 100644 --- a/synfig-core/trunk/src/modules/mod_particle/plant.cpp +++ b/synfig-core/trunk/src/modules/mod_particle/plant.cpp @@ -102,6 +102,7 @@ Plant::Plant(): splits=5; drag=0.1; size=0.015; + needs_sync_=true; sync(); size_as_alpha=false; } @@ -130,8 +131,10 @@ Plant::branch(int n,int depth,float t, float stunt_growth, synfig::Point positio synfig::Real sin_v=synfig::Angle::cos(split_angle).get(); synfig::Real cos_v=synfig::Angle::sin(split_angle).get(); - synfig::Vector velocity1(vel[0]*sin_v-vel[1]*cos_v+random_factor*random(2,30+n+depth,t*splits,0.0f,0.0f),vel[0]*cos_v+vel[1]*sin_v+random_factor*random(2,32+n+depth,t*splits,0.0f,0.0f)); - synfig::Vector velocity2(vel[0]*sin_v+vel[1]*cos_v+random_factor*random(2,31+n+depth,t*splits,0.0f,0.0f),-vel[0]*cos_v+vel[1]*sin_v+random_factor*random(2,33+n+depth,t*splits,0.0f,0.0f)); + synfig::Vector velocity1(vel[0]*sin_v - vel[1]*cos_v + random_factor*random(Random::SMOOTH_COSINE, 30+n+depth, t*splits, 0.0f, 0.0f), + vel[0]*cos_v + vel[1]*sin_v + random_factor*random(Random::SMOOTH_COSINE, 32+n+depth, t*splits, 0.0f, 0.0f)); + synfig::Vector velocity2(vel[0]*sin_v + vel[1]*cos_v + random_factor*random(Random::SMOOTH_COSINE, 31+n+depth, t*splits, 0.0f, 0.0f), + -vel[0]*cos_v + vel[1]*sin_v + random_factor*random(Random::SMOOTH_COSINE, 33+n+depth, t*splits, 0.0f, 0.0f)); Plant::branch(n,depth+1,t,stunt_growth,position,velocity1); Plant::branch(n,depth+1,t,stunt_growth,position,velocity2); @@ -145,7 +148,7 @@ Plant::calc_bounding_rect()const bounding_rect=Rect::zero(); // Bline must have at least 2 points in it - if(bline.size()<=2) + if(bline.size()<2) return; next=bline.begin(); @@ -172,13 +175,18 @@ Plant::calc_bounding_rect()const void Plant::sync()const { + Mutex::Lock lock(mutex); + if (!needs_sync_) return; particle_list.clear(); bounding_rect=Rect::zero(); // Bline must have at least 2 points in it - if(bline.size()<=2) + if(bline.size()<2) + { + needs_sync_=false; return; + } std::vector::const_iterator iter,next; @@ -218,13 +226,13 @@ Plant::sync()const bounding_rect.expand(point); - Real stunt_growth(random(2,i,f+seg,0.0f,0.0f)/2.0+0.5); + Real stunt_growth(random(Random::SMOOTH_COSINE,i,f+seg,0.0f,0.0f)/2.0+0.5); stunt_growth*=stunt_growth; Vector branch_velocity(deriv(f).norm()*velocity); - branch_velocity[0]+=random_factor*random(2,1,f*splits,0.0f,0.0f); - branch_velocity[1]+=random_factor*random(2,2,f*splits,0.0f,0.0f); + branch_velocity[0]+=random_factor*random(Random::SMOOTH_COSINE,1,f*splits,0.0f,0.0f); + branch_velocity[1]+=random_factor*random(Random::SMOOTH_COSINE,2,f*splits,0.0f,0.0f); if(i%b==0) branch(