X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_particle%2Fplant.cpp;h=66d78b8762f5653cc273966d936752932b6d753d;hb=ad5f0566c633041148043fc60cb0103a7516a5e3;hp=39a82f9fe6ee538b2617a255bdeb3416d7051508;hpb=28f28705612902c15cd0702cc891fba35bf2d2df;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 39a82f9..66d78b8 100644 --- a/synfig-core/trunk/src/modules/mod_particle/plant.cpp +++ b/synfig-core/trunk/src/modules/mod_particle/plant.cpp @@ -1,20 +1,21 @@ /* === S Y N F I G ========================================================= */ -/*! \file bline.cpp +/*! \file plant.cpp ** \brief Template ** -** $Id: plant.cpp,v 1.2 2005/01/13 06:48:39 darco Exp $ +** $Id$ ** ** \legal -** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. ** \endlegal */ /* ========================================================================= */ @@ -64,9 +65,9 @@ using namespace etl; SYNFIG_LAYER_INIT(Plant); SYNFIG_LAYER_SET_NAME(Plant,"plant"); SYNFIG_LAYER_SET_LOCAL_NAME(Plant,_("Plant")); -SYNFIG_LAYER_SET_CATEGORY(Plant,_("Particle Systems")); +SYNFIG_LAYER_SET_CATEGORY(Plant,_("Other")); SYNFIG_LAYER_SET_VERSION(Plant,"0.1"); -SYNFIG_LAYER_SET_CVS_ID(Plant,"$Id: plant.cpp,v 1.2 2005/01/13 06:48:39 darco Exp $"); +SYNFIG_LAYER_SET_CVS_ID(Plant,"$Id$"); /* === P R O C E D U R E S ================================================= */ @@ -87,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; @@ -123,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); } @@ -153,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()); @@ -172,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(); @@ -202,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, @@ -235,7 +236,7 @@ Plant::sync()const ); } } - + needs_sync_=false; } @@ -247,10 +248,10 @@ 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())) + if(param=="seed" && value.same_type_as(int())) { random.set_seed(value.get(int())); needs_sync_=true; @@ -267,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); } /* @@ -313,7 +314,7 @@ Plant::get_param(const String& param)const EXPORT(size); EXPORT(size_as_alpha); - + EXPORT_NAME(); EXPORT_VERSION(); @@ -355,7 +356,7 @@ Plant::get_param_vocab()const ); ret.push_back(ParamDesc("size_as_alpha") - .set_local_name(_("SizeAsAlpha")) + .set_local_name(_("Size As Alpha")) ); ret.push_back(ParamDesc("step") @@ -388,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()); @@ -412,7 +413,7 @@ Plant::accelerated_render(Context context,Surface *surface,int quality, const Re std::vector::reverse_iterator iter; const float size_factor(1); - float radius(size_factor*size*sqrt(1.0f/(abs(pw)*abs(ph)))); + float radius(size_factor*size*sqrt(1.0f/(abs(pw)*abs(ph)))), temp_radius; if(radius>1.0f) { @@ -420,19 +421,20 @@ Plant::accelerated_render(Context context,Surface *surface,int quality, const Re int x1,y1,x2,y2; for(iter=particle_list.rbegin();iter!=particle_list.rend();++iter) { - float radius(radius); + temp_radius = radius; + float radius(temp_radius); Color color(iter->color); if(size_as_alpha) { 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; @@ -443,20 +445,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); } } @@ -468,7 +470,8 @@ Plant::accelerated_render(Context context,Surface *surface,int quality, const Re float a,b,c,d; for(iter=particle_list.rbegin();iter!=particle_list.rend();++iter) { - float radius(radius); + temp_radius = radius; + float radius(temp_radius); Color color(iter->color); if(size_as_alpha) { @@ -478,19 +481,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(); @@ -501,13 +504,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; } @@ -516,10 +519,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;