X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fexample%2Fmetaballs.cpp;h=c0a9a50dd1d8fca428041e67b74b688eec491b8b;hb=36d01e1527fda602a9aed07d209eb34e6770bca8;hp=ee4e26a604fe940ad91636e0b0321512738b19fd;hpb=28f28705612902c15cd0702cc891fba35bf2d2df;p=synfig.git diff --git a/synfig-core/trunk/src/modules/example/metaballs.cpp b/synfig-core/trunk/src/modules/example/metaballs.cpp index ee4e26a..c0a9a50 100644 --- a/synfig-core/trunk/src/modules/example/metaballs.cpp +++ b/synfig-core/trunk/src/modules/example/metaballs.cpp @@ -5,16 +5,17 @@ ** $Id: metaballs.cpp,v 1.1.1.1 2005/01/04 01:23:09 darco Exp $ ** ** \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 */ /* ========================================================================= */ @@ -68,7 +69,7 @@ Metaballs::Metaballs(): color(Color::black()) { } - + bool Metaballs::set_param(const String & param, const ValueBase &value) { @@ -77,22 +78,22 @@ Metaballs::set_param(const String & param, const ValueBase &value) centers = value; return true; } - + if( param=="weights" && value.same_as(weights)) { weights = value; return true; } - + if( param=="radii" && value.same_as(radii)) { radii = value; return true; } - + IMPORT(color); IMPORT(threshold); - + return Layer_Composite::set_param(param,value); } @@ -100,23 +101,23 @@ ValueBase Metaballs::get_param(const String ¶m)const { EXPORT(color); - + EXPORT(radii); - EXPORT(weights); + EXPORT(weights); EXPORT(centers); EXPORT(threshold); EXPORT_NAME(); EXPORT_VERSION(); - - return Layer_Composite::get_param(param); + + return Layer_Composite::get_param(param); } Layer::Vocab Metaballs::get_param_vocab()const { Layer::Vocab ret(Layer_Composite::get_param_vocab()); - + ret.push_back(ParamDesc("color") .set_local_name(_("Color")) ); @@ -124,19 +125,19 @@ Metaballs::get_param_vocab()const ret.push_back(ParamDesc("centers") .set_local_name(_("Points")) ); - + ret.push_back(ParamDesc("radii") .set_local_name(_("Radii")) ); - + ret.push_back(ParamDesc("weights") .set_local_name(_("Weights")) ); - + ret.push_back(ParamDesc("threshold") .set_local_name(_("Threshold")) ); - + return ret; } @@ -144,14 +145,14 @@ static inline Real densityfunc(const synfig::Point &p, const synfig::Point &c, R { const Real dx = p[0] - c[0]; const Real dy = p[1] - c[1]; - + const Real n = (1 - (dx*dx + dy*dy)/(R*R)); return (n*n*n); /* f(d) = (1 - d^2)^3 f'(d) = -6d * (1 - d^2)^2 - + could use this too... f(d) = (1 - d^2)^2 f'(d) = -6d * (1 - d^2) @@ -162,13 +163,13 @@ Real Metaballs::totaldensity(const Point &pos) const { Real density = 0; - + //sum up weighted functions for(unsigned int i=0;i= threshold) + + if(dens >= threshold) return color; else return context.get_color(pos); @@ -185,47 +186,47 @@ Metaballs::get_color(Context context, const Point &pos)const 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()), + const Point br(renddesc.get_br()), tl(renddesc.get_tl()); - - const int w = renddesc.get_w(), + + const int w = renddesc.get_w(), h = renddesc.get_h(); - + Real pw = renddesc.get_pw(); Real 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__)); return false; } - + for(int y = 0; y < h; y++, pos[1] += ph) { 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()); } - } + } } // Mark our progress as finished