X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_particle%2Fplant.cpp;h=80fde0b4f6b26dee5a496607cb912083e5fb2e63;hb=5ddcf36f04cfbd10fabda4e3c5633cb27cdd4c0a;hp=2ae6e7b74df01aa8f6a65362f2f7081a8076b255;hpb=cee5940bae97612105db8b7e1ffcf513f9d9150c;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 2ae6e7b..80fde0b 100644 --- a/synfig-core/trunk/src/modules/mod_particle/plant.cpp +++ b/synfig-core/trunk/src/modules/mod_particle/plant.cpp @@ -88,15 +88,15 @@ Plant::Plant(): bline.push_back(BLinePoint()); bline.push_back(BLinePoint()); bline.push_back(BLinePoint()); - bline[0].set_vertex(Point(0,1)); - bline[1].set_vertex(Point(0,-1)); + bline[0].set_vertex(Point(0,1)); + bline[1].set_vertex(Point(0,-1)); bline[2].set_vertex(Point(1,0)); - bline[0].set_tangent(bline[1].get_vertex()-bline[2].get_vertex()*0.5f); - bline[1].set_tangent(bline[2].get_vertex()-bline[0].get_vertex()*0.5f); - bline[2].set_tangent(bline[0].get_vertex()-bline[1].get_vertex()*0.5f); - bline[0].set_width(1.0f); - bline[1].set_width(1.0f); - bline[2].set_width(1.0f); + bline[0].set_tangent(bline[1].get_vertex()-bline[2].get_vertex()*0.5f); + bline[1].set_tangent(bline[2].get_vertex()-bline[0].get_vertex()*0.5f); + bline[2].set_tangent(bline[0].get_vertex()-bline[1].get_vertex()*0.5f); + bline[0].set_width(1.0f); + bline[1].set_width(1.0f); + bline[2].set_width(1.0f); bline_loop=true; mass=(0.5); splits=5; @@ -124,15 +124,15 @@ Plant::branch(int n,int depth,float t, float stunt_growth, synfig::Point positio )); bounding_rect.expand(position); } - + if(t>=1.0-stunt_growth)return; 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)); - + Plant::branch(n,depth+1,t,stunt_growth,position,velocity1); Plant::branch(n,depth+1,t,stunt_growth,position,velocity2); } @@ -154,7 +154,7 @@ Plant::calc_bounding_rect()const iter=--bline.end(); else iter=next++; - + for(;next!=bline.end();iter=next++) { bounding_rect.expand(iter->get_vertex()); @@ -173,28 +173,28 @@ void Plant::sync()const { particle_list.clear(); - + bounding_rect=Rect::zero(); // Bline must have at least 2 points in it if(bline.size()<=2) return; - + std::vector::const_iterator iter,next; etl::hermite curve; - + Real step(abs(this->step)); - + int seg(0); next=bline.begin(); - + if(bline_loop) iter=--bline.end(); else iter=next++; - + for(;next!=bline.end();iter=next++,seg++) { curve.p1()=iter->get_vertex(); @@ -203,29 +203,29 @@ Plant::sync()const curve.t2()=next->get_tangent1(); curve.sync(); etl::derivative > deriv(curve); - + Real f; int i(0), b(round_to_int((1.0/step)/(float)sprouts-1)); if(b<=0)b=1; for(f=0.0;f<1.0;f+=step,i++) { Point point(curve(f)); - + particle_list.push_back(Particle( point, gradient(0) )); - + bounding_rect.expand(point); - + Real stunt_growth(random(2,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); - + if(i%b==0) branch( i, @@ -236,7 +236,7 @@ Plant::sync()const ); } } - + needs_sync_=false; } @@ -248,7 +248,7 @@ Plant::set_param(const String & param, const ValueBase &value) bline=value; bline_loop=value.get_loop(); needs_sync_=true; - + return true; } if(param=="seed" && value.same_as(int())) @@ -268,7 +268,7 @@ Plant::set_param(const String & param, const ValueBase &value) IMPORT_PLUS(drag,needs_sync_=true); IMPORT(size); IMPORT(size_as_alpha); - + return Layer_Composite::set_param(param,value); } /* @@ -314,7 +314,7 @@ Plant::get_param(const String& param)const EXPORT(size); EXPORT(size_as_alpha); - + EXPORT_NAME(); EXPORT_VERSION(); @@ -389,15 +389,15 @@ Plant::get_param_vocab()const bool Plant::accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const -{ +{ bool ret(context.accelerated_render(surface,quality,renddesc,cb)); if(is_disabled() || !ret) return ret; - + Surface dest_surface; dest_surface.set_wh(surface->get_w(),surface->get_h()); dest_surface.clear(); - + const Point tl(renddesc.get_tl()); const Point br(renddesc.get_br()); @@ -428,12 +428,12 @@ Plant::accelerated_render(Context context,Surface *surface,int quality, const Re radius*=color.get_a(); color.set_a(1); } - + x1=ceil_to_int((iter->point[0]-tl[0])/pw-(radius*0.5)); y1=ceil_to_int((iter->point[1]-tl[1])/ph-(radius*0.5)); x2=x1+round_to_int(radius); y2=y1+round_to_int(radius); - + if(x1>=surface->get_w() || y1>=surface->get_h()) continue; @@ -444,20 +444,20 @@ Plant::accelerated_render(Context context,Surface *surface,int quality, const Re x2=surface->get_w(); if(y2>=surface->get_h()) y2=surface->get_h(); - + if(x1<0) x1=0; if(y1<0) y1=0; - + int w(min(round_to_int(radius),x2-x1)); int h(min(round_to_int(radius),y2-y1)); - + if(w<=0 || h<=0) continue; - + Surface::alpha_pen surface_pen(dest_surface.get_pen(x1,y1),1.0f); - + dest_surface.fill(color,surface_pen,w,h); } } @@ -479,19 +479,19 @@ Plant::accelerated_render(Context context,Surface *surface,int quality, const Re x=floor_to_int((iter->point[0]-tl[0])/pw-0.5f); y=floor_to_int((iter->point[1]-tl[1])/ph-0.5f); - + if(x>=surface->get_w()-1 || y>=surface->get_h()-1 || x<0 || y<0) { continue; } - + a=((iter->point[0]-tl[0])/pw-0.5f-x)*radius; b=((iter->point[1]-tl[1])/ph-0.5f-y)*radius; c=radius-a; d=radius-b; - + Surface::alpha_pen surface_pen(dest_surface.get_pen(x,y),1.0f); - + surface_pen.set_alpha(c*d); surface_pen.put_value(color); surface_pen.inc_x(); @@ -502,13 +502,13 @@ Plant::accelerated_render(Context context,Surface *surface,int quality, const Re surface_pen.put_value(color); surface_pen.dec_x(); surface_pen.set_alpha(c*b); - surface_pen.put_value(color); + surface_pen.put_value(color); } } - + Surface::alpha_pen pen(surface->get_pen(0,0),get_amount(),get_blend_method()); dest_surface.blit_to(pen); - + return true; } @@ -517,10 +517,10 @@ Plant::get_bounding_rect(Context context)const { if(needs_sync_==true) sync(); - + if(is_disabled()) return Rect::zero(); - + if(Color::is_onto(get_blend_method())) return context.get_full_bounding_rect() & bounding_rect;