X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fexample%2Fmetaballs.cpp;h=c689449257347ad16477b7d076eef4de50c9e5e5;hb=4dc57ca027fbe1dce954961812788703f0feeb8a;hp=74fb884e125901f662ae5ee23ae6b3fabf42bfbd;hpb=8ef042c40521681cea99944097c4f90a5ac6cf74;p=synfig.git diff --git a/synfig-core/trunk/src/modules/example/metaballs.cpp b/synfig-core/trunk/src/modules/example/metaballs.cpp index 74fb884..c689449 100644 --- a/synfig-core/trunk/src/modules/example/metaballs.cpp +++ b/synfig-core/trunk/src/modules/example/metaballs.cpp @@ -1,6 +1,6 @@ /* === S Y N F I G ========================================================= */ /*! \file metaballs.cpp -** \brief Implements metaballs +** \brief Implementation of the "Metaballs" layer ** ** $Id$ ** @@ -54,7 +54,7 @@ using namespace synfig; SYNFIG_LAYER_INIT(Metaballs); SYNFIG_LAYER_SET_NAME(Metaballs,"metaballs"); SYNFIG_LAYER_SET_LOCAL_NAME(Metaballs,N_("Metaballs")); -SYNFIG_LAYER_SET_CATEGORY(Metaballs,N_("Default")); +SYNFIG_LAYER_SET_CATEGORY(Metaballs,N_("Example")); SYNFIG_LAYER_SET_VERSION(Metaballs,"0.1"); SYNFIG_LAYER_SET_CVS_ID(Metaballs,"$Id$"); @@ -66,8 +66,11 @@ SYNFIG_LAYER_SET_CVS_ID(Metaballs,"$Id$"); Metaballs::Metaballs(): Layer_Composite(1.0,Color::BLEND_STRAIGHT), - color(Color::black()) + gradient(Color::black(), Color::white()) { + centers.push_back(Point( 0, -1.5)); radii.push_back(2.5); weights.push_back(1); + centers.push_back(Point(-2, 1)); radii.push_back(2.5); weights.push_back(1); + centers.push_back(Point( 2, 1)); radii.push_back(2.5); weights.push_back(1); } bool @@ -91,7 +94,7 @@ Metaballs::set_param(const String & param, const ValueBase &value) return true; } - IMPORT(color); + IMPORT(gradient); IMPORT(threshold); return Layer_Composite::set_param(param,value); @@ -100,7 +103,7 @@ Metaballs::set_param(const String & param, const ValueBase &value) ValueBase Metaballs::get_param(const String ¶m)const { - EXPORT(color); + EXPORT(gradient); EXPORT(radii); EXPORT(weights); @@ -118,8 +121,8 @@ Metaballs::get_param_vocab()const { Layer::Vocab ret(Layer_Composite::get_param_vocab()); - ret.push_back(ParamDesc("color") - .set_local_name(_("Color")) + ret.push_back(ParamDesc("gradient") + .set_local_name(_("Gradient")) ); ret.push_back(ParamDesc("centers") @@ -166,9 +169,7 @@ Metaballs::totaldensity(const Point &pos) const //sum up weighted functions for(unsigned int i=0;i= threshold) - return color; + if(get_amount()==1.0 && get_blend_method()==Color::BLEND_STRAIGHT) + return gradient(totaldensity(pos)); else - return context.get_color(pos); + return Color::blend(gradient(totaldensity(pos)),context.get_color(pos),get_amount(),get_blend_method()); } bool Metaballs::accelerated_render(Context context,Surface *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const { // Width and Height of a pixel - const Point br(renddesc.get_br()), - tl(renddesc.get_tl()); - - const int w = renddesc.get_w(), - h = renddesc.get_h(); - - Real pw = renddesc.get_pw(); - Real ph = renddesc.get_ph(); + const Point br(renddesc.get_br()), tl(renddesc.get_tl()); + const int w(renddesc.get_w()), h(renddesc.get_h()); + const Real pw(renddesc.get_pw()), ph(renddesc.get_ph()); SuperCallback supercb(cb,0,9000,10000); - if(!context.accelerated_render(surface,quality,renddesc,&supercb)) - { - if(cb)cb->error(strprintf(__FILE__"%d: Accelerated Renderer Failure",__LINE__)); - return false; - } - Point pos(tl[0],tl[1]); - Real dens; - if(!context.accelerated_render(surface,quality,renddesc,&supercb)) { if(cb)cb->error(strprintf(__FILE__"%d: Accelerated Renderer Failure",__LINE__)); @@ -219,14 +205,7 @@ Metaballs::accelerated_render(Context context,Surface *surface,int quality, cons { pos[0] = tl[0]; for(int x = 0; x < w; x++, pos[0] += pw) - { - dens = totaldensity(pos); - - if(dens >= threshold) - { - (*surface)[y][x] = Color::blend(color,(*surface)[y][x],get_amount(),get_blend_method()); - } - } + (*surface)[y][x] = Color::blend(gradient(totaldensity(pos)),(*surface)[y][x],get_amount(),get_blend_method()); } // Mark our progress as finished