X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fexample%2Fmetaballs.cpp;h=0cfa6c3cc27543c4b419c8a3d34bb2ea90c7ee57;hb=a5e308972adf0ac7c5953152527da961707bd6b5;hp=a582dc1a4d0980ba8f2bfe2fa9ca0294cc7e0d21;hpb=d37fc67e165c21da6ca731cf11af554168150d8e;p=synfig.git diff --git a/synfig-core/trunk/src/modules/example/metaballs.cpp b/synfig-core/trunk/src/modules/example/metaballs.cpp index a582dc1..0cfa6c3 100644 --- a/synfig-core/trunk/src/modules/example/metaballs.cpp +++ b/synfig-core/trunk/src/modules/example/metaballs.cpp @@ -66,7 +66,10 @@ SYNFIG_LAYER_SET_CVS_ID(Metaballs,"$Id$"); Metaballs::Metaballs(): Layer_Composite(1.0,Color::BLEND_STRAIGHT), - color(Color::black()) + gradient(Color::black(), Color::white()), + threshold(0), + threshold2(1), + positive(false) { 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); @@ -94,8 +97,10 @@ Metaballs::set_param(const String & param, const ValueBase &value) return true; } - IMPORT(color); + IMPORT(gradient); IMPORT(threshold); + IMPORT(threshold2); + IMPORT(positive); return Layer_Composite::set_param(param,value); } @@ -103,12 +108,14 @@ 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); EXPORT(centers); EXPORT(threshold); + EXPORT(threshold2); + EXPORT(positive); EXPORT_NAME(); EXPORT_VERSION(); @@ -121,8 +128,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") @@ -138,18 +145,47 @@ Metaballs::get_param_vocab()const ); ret.push_back(ParamDesc("threshold") - .set_local_name(_("Threshold")) + .set_local_name(_("Gradient Left")) + ); + + ret.push_back(ParamDesc("threshold2") + .set_local_name(_("Gradient Right")) + ); + + ret.push_back(ParamDesc("positive") + .set_local_name(_("Positive Only")) ); return ret; } -static inline Real densityfunc(const synfig::Point &p, const synfig::Point &c, Real R) +synfig::Layer::Handle +Metaballs::hit_check(synfig::Context context, const synfig::Point &point)const +{ + Real density(totaldensity(point)); + + if (density <= 0 || density > 1 || get_amount() == 0) + return context.hit_check(point); + + synfig::Layer::Handle tmp; + + if (get_blend_method()==Color::BLEND_BEHIND && (tmp=context.hit_check(point))) + return tmp; + + if (Color::is_onto(get_blend_method()) && !(context.hit_check(point))) + return 0; + + return const_cast(this); +} + +Real +Metaballs::densityfunc(const synfig::Point &p, const synfig::Point &c, Real R)const { const Real dx = p[0] - c[0]; const Real dy = p[1] - c[1]; const Real n = (1 - (dx*dx + dy*dy)/(R*R)); + if (positive && n < 0) return 0; return (n*n*n); /* @@ -163,7 +199,7 @@ static inline Real densityfunc(const synfig::Point &p, const synfig::Point &c, R } Real -Metaballs::totaldensity(const Point &pos) const +Metaballs::totaldensity(const Point &pos)const { Real density = 0; @@ -171,16 +207,16 @@ Metaballs::totaldensity(const Point &pos) const for(unsigned int i=0;i= threshold) - return Color::blend(color,context.get_color(pos),get_amount(),get_blend_method()); + 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 @@ -205,8 +241,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) - if (totaldensity(pos) >= 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