From: dooglus Date: Sat, 22 Nov 2008 15:40:51 +0000 (+0000) Subject: Add Metaballs::hit_check() so metaballs can be selected by clicking on them. X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=a5e308972adf0ac7c5953152527da961707bd6b5;p=synfig.git Add Metaballs::hit_check() so metaballs can be selected by clicking on them. git-svn-id: https://synfig.svn.sourceforge.net/svnroot/synfig@2252 1f10aa63-cdf2-0310-b900-c93c546f37ac --- diff --git a/synfig-core/trunk/src/modules/example/metaballs.cpp b/synfig-core/trunk/src/modules/example/metaballs.cpp index 874d7f9..0cfa6c3 100644 --- a/synfig-core/trunk/src/modules/example/metaballs.cpp +++ b/synfig-core/trunk/src/modules/example/metaballs.cpp @@ -159,7 +159,27 @@ Metaballs::get_param_vocab()const 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]; @@ -179,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; diff --git a/synfig-core/trunk/src/modules/example/metaballs.h b/synfig-core/trunk/src/modules/example/metaballs.h index ee3bda5..d9ae649 100644 --- a/synfig-core/trunk/src/modules/example/metaballs.h +++ b/synfig-core/trunk/src/modules/example/metaballs.h @@ -55,6 +55,8 @@ private: bool positive; + synfig::Real densityfunc(const synfig::Point &p, const synfig::Point &c, synfig::Real R)const; + synfig::Real totaldensity(const synfig::Point &pos)const; public: @@ -70,6 +72,8 @@ public: virtual bool accelerated_render(synfig::Context context,synfig::Surface *surface,int quality, const synfig::RendDesc &renddesc, synfig::ProgressCallback *cb)const; virtual Vocab get_param_vocab()const; + + virtual synfig::Layer::Handle hit_check(synfig::Context context, const synfig::Point &point)const; }; // END of class Metaballs /* === E N D =============================================================== */