Reptillian Posted October 26, 2020 Share Posted October 26, 2020 (edited) This filter will generate a Popcorn Fractal on your canvas. It is computationally-intensive (Special note for that below). Preview: How to use: 1. Download Plugin -Popcorn Fractal.zip 2. Install into Paint.NET 3. Load Paint.NET and go into Effect->Render. 4. See how parameters work and change them until your desired result comes. - Parameters - Points - Amount of times a point will be calculated per subpixels Density - The size of subpixel. H - Main Internal Function Multiplier K - Trigonometric Function Multiplier Zoom - Scale of Fractal Angle - Angle of Fractal Origin - Location of coordinate 0,0 in respect to canvas center Trig Mode - Defines whether to use Trig-4 or Trig-6 X-S - First Trigonometric Function for X-Axis X-T - Second Trigonometric Function for X-Axis X-U -Third Trigonometric Function for X-Axis (Unavailable for Trig-4) Y-S - First Trigonometric Function for Y-Axis Y-T - Second Trigonometric Function for Y-Axis Y-U -Third Trigonometric Function for Y-Axis (Unavailable for Trig-4) Midpoint Shift - Shift Value toward 0 or 1 depending of whether this value is negative or positive Multiplier - Multiply the value of Fractal. Only Applicable if norm is false. Normalize - Just as name said. It results in 0-255. - Special note - For larger images, you may note that this plugin takes a lot of time rendering Popcorn Fractal. That is because the plugin use serial processing rather than parallel processing. I just had updated the G'MIC-QT version of this plugin which actually utilize parallel processing to address that issue. Until there is a solution for adding parallel processing to this plugin version, you may need to resort to g'mic-qt version of Popcorn Fractal though it's only 150%+ faster with larger images on 4 CPU computers. - Source Codes - License: CeCILL v2.0 - http://cecill.info/licences/Licence_CeCILL_V2-en.html C# Codelab Spoiler // Name: Popcorn Fractal // Submenu: Render // Author: Reptorian, otuncelli // Title: Popcorn Fractal // Version: 2 // Desc: Render Popcorn Fractal into canvas. // Keywords: fractal // URL: https://forums.getpaint.net/profile/85868-reptillian/ // Help: #region UICode IntSliderControl pts = 50; // [1,100] Points DoubleSliderControl var_density = 1; // [0.01,2] Density DoubleSliderControl H = 0.05; // [-5,5] H DoubleSliderControl K = 3; // [-75,75] K DoubleSliderControl var_zoom = 1; // [0.1,4] Zoom AngleControl var_ang = 0; // [-180,180] Angle PanSliderControl Origin = Pair.Create(0.000, 0.000); // Origin ListBoxControl TrigMode = 0; // Trig Mode|Trig-4|Trig-6 ListBoxControl func_x1 = 0; // X-S|Sinusoidal|Cosinusoidal|Tangent|Arc-Tangent ListBoxControl func_x2 = 2; // X-T|Sinusoidal|Cosinusoidal|Tangent|Arc-Tangent ListBoxControl func_x3 = 1; // {!TrigMode} X-U|Sinusoidal|Cosinusoidal|Tangent|Arc-Tangent ListBoxControl func_y1 = 0; // Y-S|Sinusoidal|Cosinusoidal|Tangent|Arc-Tangent ListBoxControl func_y2 = 2; // Y-T|Sinusoidal|Cosinusoidal|Tangent|Arc-Tangent ListBoxControl func_y3 = 1; // {!TrigMode} Y-U|Sinusoidal|Cosinusoidal|Tangent|Arc-Tangent DoubleSliderControl var_midpoint_shift = 0; // [-1,1] Midpoint Shift DoubleSliderControl multiplier = 1; // [0.01,10] {!norm} Multiplier CheckboxControl norm = false; // Normalize #endregion double rot_x(double a, double b, double cos_ang,double sin_ang){ return a * cos_ang - b * sin_ang; } double rot_y(double a, double b, double cos_ang,double sin_ang){ return a * sin_ang + b * cos_ang; } double func_v(double v,int c){ switch(c){ case 0: return Math.Sin(v); case 1: return Math.Cos(v); case 2: return Math.Tan(v); case 3: return Math.Atan(v); } return Math.Atan(v); } int maxnum; int [,] Popcorn_Array; IEnumerable<double> iter(double fromInclusive, double toExclusive, double step) { for (double v = fromInclusive; v < toExclusive; v += step) { yield return v; } } void PreRender(Surface dst, Surface src) { int w = src.Width; int h = src.Height; bool sd_cond = w>h; double dw = (double)(w); double dh = (double)(h); if (Popcorn_Array == null){Popcorn_Array = new int [w,h];} else {Array.Clear(Popcorn_Array, 0, w*h);} bool use_trig6 = TrigMode == 1; double density = 1 / var_density; double zoom = 1 / var_zoom; double ang = (var_ang/180) * Math.PI; double origin_x = Origin.First * -1 * zoom; double origin_y = Origin.Second * zoom; double sd = Math.Max(dw,dh) / Math.Min(dw,dh); double sx = sd_cond ? sd : 1 ; double sy = sd_cond ? 1 : sd ; double cx = dw / 2; double cy = dh / 2; double osx = origin_x * sx ; double osy = origin_y * sy ; double cx_zoom = cx / zoom; double cy_zoom = cy / zoom; double cxsx = cx * sx; double cysy = cy * sy; double cos_ang = Math.Cos(ang); double sin_ang = Math.Sin(ang); bool angcondition = (var_ang - 360*Math.Floor(var_ang/360))>0; System.Threading.Tasks.Parallel.ForEach(iter(0, dw, density), (ix, loopState) => { if (IsCancelRequested) { loopState.Stop(); return; } for (double iy = 0; iy < dh; iy += density) { double xx = zoom * (ix - cx) / cx; double yy = zoom * (iy - cy) / cy; double xval, yval, xnew, ynew; xx *= sx; yy *= sy; xx += origin_x; yy += origin_y; for (int ptn = 0; ptn < pts; ptn++) { if (use_trig6) { xnew = xx - H * func_v(yy + func_v(K * yy + func_v(K * yy, func_x3), func_x2), func_x1); ynew = yy - H * func_v(xx + func_v(K * xx + func_v(K * xx, func_y3), func_y2), func_y1); } else { xnew = xx - H * func_v(yy + func_v(K * yy, func_x2), func_x1); ynew = yy - H * func_v(xx + func_v(K * xx, func_y2), func_y1); } if (angcondition) { xval = ((rot_x(xnew, ynew, cos_ang, sin_ang) - osx) * cx_zoom + cxsx) / sx; yval = ((rot_y(xnew, ynew, cos_ang, sin_ang) - osy) * cy_zoom + cysy) / sy; } else { xval = ((xnew - osx) * cx_zoom + cxsx) / sx; yval = ((ynew - osy) * cy_zoom + cysy) / sy; } int xpos = (int)(Math.Round(xval)); int ypos = (int)(Math.Round(yval)); if ((xpos >= 0 && ypos >= 0) && (xpos < w && ypos < h)) { int val = Interlocked.Increment(ref Popcorn_Array[xpos, ypos]); if (val > maxnum) { Interlocked.Exchange(ref maxnum, val); } } xx = xnew; yy = ynew; } } }); } void Render(Surface dst, Surface src, Rectangle rect) { double midpoint = 1 - Math.Abs(var_midpoint_shift); bool cond_midpoint = var_midpoint_shift>=0; double pval; int val; for (int y = rect.Top; y < rect.Bottom; y++) { for (int x = rect.Left; x < rect.Right; x++) { pval = (double)(Popcorn_Array[x,y])/(double)(maxnum); if (cond_midpoint){pval=Math.Pow(pval,midpoint);} else {pval=1-(Math.Pow(1-pval,midpoint));} if(norm){pval*=255;} else {pval*=(double)(maxnum)*multiplier;} val=(int)(pval); dst[x,y]=ColorBgra.FromBgraClamped(val,val,val,255); } } } G'MIC-QT Spoiler #@cli rep_pfrac : eq. to 'rep_popcorn_fractal' : (+) rep_pfrac: rep_popcorn_fractal $* #@cli rep_popcorn_fractal: _points>0,_density>0,_H,_K,_zoom,_rotation_angle,_origin_x,_origin_y,_mode,_f1={ 0=sin | 1=cos | 2=tan | 3=atan},... #@cli : Generates Pickover Popcorn Fractal. Code was adapted from Paul Bourke's c code, and extended for more possibilities. Fractal is attributed to Clifford Pickover.\n #@cli : _points defines the maximum number of points to be added on image based on pixel location. #@cli : _density defines the frequency of points to be added along row and height of image. A value of one implies n points to be added per pixel. #@cli : _H is the function multiplier used to subtract from the new found values from each iteration. #@cli : _K is the inner multiplier for the inside function. See popcorn_x(a,b), and popcorn_y(a,b) embedded within the code of rep_popcorn_fractal for more information. #@cli : _zoom defines the magnification of image. A negative value will "shrink" the structure of generated fractal. #@cli : _rotation_angle defines the function angle of fractal. #@cli : _origin_x defines the position of fractal. Center of image row will be treated as zero, and the ranges for image row are treated as -1,1. #@cli : _origin_y defines the position of fractal. Center of image column will be treated as zero, and the ranges for image column are treated as -1,1. #@cli : _mode defines whether to use 4 trigonometric functions or 6 trigonometric functions. Each halves of functions are used on 2 functions used by different axis. #@cli : _fn defines individual function used for the popcorn fractal.\n #@cli : Author: Reptorian. #@cli : Default values: '_points=50','density=1','H=.05','_K=3','zoom=1','_rotation_angle=0','_origin_x=0','_origin_y=0','_mode=0',...\n #@cli : \ \ \ \ If _mode=0: ... = '_f1=_f3=0','_f2=_f4=2' #@cli : \ \ \ \ If _mode=1: ... = '_f1=_f4=0','_f2=_f5=1','_f3=_f6=2'\n rep_popcorn_fractal: skip ${1=50},${2=1},${3=.05},${4=3},${5=1},${6=0},${7=0},${8=0},${9=0},${10=},${11=},${12=},${13=},${14=},${15=} if ($6-360*floor($6/360))?1 fvx=((rot_x(xnew,ynew)-osx)*icx_zoom+cxsx)/sx fvy=((rot_y(xnew,ynew)-osy)*icy_zoom+cysy)/sy else fvx=((xnew-osx)*icx_zoom+cxsx)/sx fvy=((ynew-osy)*icy_zoom+cysy)/sy fi iw={w-1} ih={h-1} channels. 0 f. 0 {int(w*abs($2))},{int(h*abs($2))},1,1,":begin_t( const nw=w-1; const nh=h-1; const ww=$iw; const hh=$ih; const icx=ww/2; const icy=hh/2; const pts=$1; const H=$3; const K=$4; const zoom=1/$5; const ang=($6/180)*pi; const origin_x=$7*-1*zoom; const origin_y=$8*zoom; const sd=max(w,h)/min(w,h); const sx=w>h?sd:1; const sy=w>h?1:sd; const sx_zoom=sx*zoom; const sy_zoom=sy*zoom; const cx=(nw-1)/2; const cy=(nh-1)/2; const osx=origin_x*sx; const osy=origin_y*sy; const icx_zoom=icx/zoom; const icy_zoom=icy/zoom; const cxsx=icx*sx; const cysy=icy*sy; const cos_ang=cos(ang); const sin_ang=sin(ang); rot_x(a,b)=a*cos_ang-b*sin_ang; rot_y(a,b)=a*sin_ang+b*cos_ang; $9?( if(narg($10), const argpos10=$10%4; argpos10==0?func_a(a)=sin(a): argpos10==1?func_a(a)=cos(a): argpos10==2?func_a(a)=tan(a): argpos10==3?func_a(a)=atan(a); ,func_a(a)=sin(a); ); if(narg($11), const argpos11=$11%4; argpos11==0?func_b(a)=sin(a): argpos11==1?func_b(a)=cos(a): argpos11==2?func_b(a)=tan(a): argpos11==3?func_b(a)=atan(a); ,func_b(a)=cos(a); ); if(narg($12), const argpos12=$12%4; argpos12==0?func_c(a)=sin(a): argpos12==1?func_c(a)=cos(a): argpos12==2?func_c(a)=tan(a): argpos12==3?func_c(a)=atan(a); ,func_c(a)=tan(a); ); if(!narg($13), if(narg($10), argpos10==0?func_d(a)=sin(a): argpos10==1?func_d(a)=cos(a): argpos10==2?func_d(a)=tan(a): argpos10==3?func_d(a)=atan(a); ,func_d(a)=sin(a); );, const argpos13=$13%4; argpos13==0?func_d(a)=sin(a): argpos13==1?func_d(a)=cos(a): argpos13==2?func_d(a)=tan(a): argpos13==3?func_d(a)=atan(a); ); if(!narg($14), if(narg($11), argpos11==0?func_e(a)=sin(a): argpos11==1?func_e(a)=cos(a): argpos11==2?func_e(a)=tan(a): argpos11==3?func_e(a)=atan(a); ,func_e(a)=cos(a); );, const argpos14=$14%4; argpos14==0?func_e(a)=sin(a): argpos14==1?func_e(a)=cos(a): argpos14==2?func_e(a)=tan(a): argpos14==3?func_e(a)=atan(a); ); if(!narg($15), if(narg($12), argpos12==0?func_f(a)=sin(a): argpos12==1?func_f(a)=cos(a): argpos12==2?func_f(a)=tan(a): argpos12==3?func_f(a)=atan(a); ,func_f(a)=tan(a); );, const argpos15=$15%4; argpos15==0?func_f(a)=sin(a): argpos15==1?func_f(a)=cos(a): argpos15==2?func_f(a)=tan(a): argpos15==3?func_f(a)=atan(a); ); popcorn_x(a,b)=(Kb=K*b;a-H*func_a(b+func_b(Kb+func_c(Kb)))); popcorn_y(a,b)=(Ka=K*a;b-H*func_d(a+func_e(Ka+func_f(Ka)))); ):( if(narg($10), const argpos10=$10%4; argpos10==0?func_a(a)=sin(a): argpos10==1?func_a(a)=cos(a): argpos10==2?func_a(a)=tan(a): argpos10==3?func_a(a)=atan(a); ,func_a(a)=sin(a); ); if(narg($11), const argpos11=$11%4; argpos11==0?func_b(a)=sin(a): argpos11==1?func_b(a)=cos(a): argpos11==2?func_b(a)=tan(a): argpos11==3?func_b(a)=atan(a); ,func_b(a)=tan(a); ); if(!narg($12), if(narg($10), argpos10==0?func_c(a)=sin(a): argpos10==1?func_c(a)=cos(a): argpos10==2?func_c(a)=tan(a): argpos10==3?func_c(a)=atan(a); ,func_c(a)=sin(a); );, const argpos12=$12%4; argpos12==0?func_c(a)=sin(a): argpos12==1?func_c(a)=cos(a): argpos12==2?func_c(a)=tan(a): argpos12==3?func_c(a)=atan(a); ); if(!narg($13), if(narg($11), argpos11==0?func_d(a)=sin(a): argpos11==1?func_d(a)=cos(a): argpos11==2?func_d(a)=tan(a): argpos11==3?func_d(a)=atan(a); ,func_d(a)=tan(a); );, const argpos13=$13%4; argpos13==0?func_d(a)=sin(a): argpos13==1?func_d(a)=cos(a): argpos13==2?func_d(a)=tan(a): argpos13==3?func_d(a)=atan(a); ); popcorn_x(a,b)=a-H*func_a(b+func_b(K*b)); popcorn_y(a,b)=b-H*func_c(a+func_d(K*a)); ); ); xx=sx_zoom*(x-cx)/cx; yy=sy_zoom*(y-cy)/cy; xx+=origin_x; yy+=origin_y; repeat(pts, xnew=popcorn_x(xx,yy); ynew=popcorn_y(xx,yy); xval="$fvx"; yval="$fvy"; xpos=round(xval); ypos=round(yval); i(#-1,xpos,ypos)++; xx=xnew; yy=ynew; );" rm. #@gui Popcorn Fractal: fx_rep_pfrac,fx_rep_pfrac_preview #@gui :_=note("Fractal attributed to Clifford Pickover. Code adapted from Paul Bourke's C code."),_=separator() #@gui :_=note("<b>Main</b>") #@gui :Points=int(50,1,200) #@gui :Density=float(1,.01,2) #@gui :H Variable=float(.05,-5,5) #@gui :K Variable=float(3,-75,75) #@gui :Zoom=float(1,.1,10) #@gui :Angle=float(0,-180,180) #@gui :Origin=point(50,50,0,1,255,255,255,255) #@gui :_=separator(),_=note("<b>Trigonometric</b>") #@gui :Mode=choice(0,"Trig-4","Trig-6") #@gui :XY-Axis Mode?=bool(1) #@gui :X-Axis Formula S=choice(0,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :X-Axis Formula T=choice(1,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :X-Axis Formula U=choice(2,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :Y-Axis Formula S=choice(0,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :Y-Axis Formula T=choice(1,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :Y-Axis Formula U=choice(2,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :XY-Axis Formula S=choice(0,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :XY-Axis Formula T=choice(1,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :XY-Axis Formula U=choice(2,"Sinusoidal","Cosinusoidal","Tangent","Arc-Tangent") #@gui :_=separator(),_=note("<b>Output</b>") #@gui :Midpoint Shift=float(0,-1,1) #@gui :Multiplier=float(1,.1,10) #@gui :Normalize=bool(0) #@gui :_=separator(),_=note("<b>Preview</b>") #@gui :Show Fill Ratio?=bool(0) #@gui :_=note("<small>Fill Ratio provides information on whether there is sufficient filled pixels on canvas. The closer to 100%, the more the canvas is filled.</small>") #@gui :_=separator(),_=note("<small>Author: Reptorian. Latest Update: <i>2020/11/1</i>.</small>") fx_rep_pfrac: ox={(($7-50)/100)*2} oy={(($8-50)/100)*-2} setarg=${1-6},$ox,$oy midpoint_shift={1-abs($20)} if $10 if $9 setarg2=${17-19} else setarg2=$17,$19 fi else if $9 setarg2=${11-16} else setarg2=$11,$13,$14,$16 fi fi l[0] rep_pfrac $setarg,$9,$setarg2 val_max={iM} n 0,1 if $20>=0 f i^$midpoint_shift else f 1-((1-i)^$midpoint_shift) fi if $22 n 0,255 else * {$21*$val_max} fi done fx_rep_pfrac_preview: fx_rep_pfrac ${1-22} if $23 +f[0] i>0?1 fillperc={ia*100} rm. fillperc_l={int($fillperc)} fillperc_r={int(($fillperc-$fillperc_l)*100)} fillratio=$fillperc_l fillratio.=. fillratio.=$fillperc_r fillratio.=% to[0] $fillratio,.5~,.5~,18% fi k[0] a={!$10?2:0} b={$10?2:0} c={!$10?($9?2:0):0} d={$10?($9?2:0):0} u "{$1}"\ "{$2}"\ "{$3}"\ "{$4}"\ "{$5}"\ "{$6}"\ "{$7,$8}"\ "{$9}"\ "{$10}"\ "{$11}_"$a\ "{$12}_"$c\ "{$13}_"$a\ "{$14}_"$a\ "{$15}_"$c\ "{$16}_"$a\ "{$17}_"$b\ "{$18}_"$d\ "{$19}_"$b\ "{$20}"\ "{$21}_"{$22?1:2}\ "{$22}"\ "{$23}" EDIT in 10/27/2020 : Bug fix. Now, you can have different functions for different axis in Trig-6 mode. EDIT in 11/1/2020: Added special note which is to point out to workaround for now. Edited March 28, 2022 by Reptillian 1 3 1 Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
MJW Posted October 27, 2020 Share Posted October 27, 2020 I suggest you change Popcorn_Array = new int [w,h]; to if (Popcorn_Array == null) Popcorn_Array = new int [w,h]; I don't see any reason for reallocating the array each time a control is changed. Though it probably wont have major consequences performance-wise, it does force more garbage collection. Quote Link to comment Share on other sites More sharing options...
Reptillian Posted October 27, 2020 Author Share Posted October 27, 2020 4 minutes ago, MJW said: I suggest you change Popcorn_Array = new int [w,h]; to if (Popcorn_Array == null) Popcorn_Array = new int [w,h]; I don't see any reason for reallocating the array each time a control is changed. Though it probably wont have major consequences performance-wise, it does force more garbage collection. I'll do that in the morning. You're welcome to post your own modification here as I will push it immediately as it is open-source. Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
MJW Posted October 27, 2020 Share Posted October 27, 2020 1 minute ago, Reptillian said: You're welcome to post your own modification here as I will push it immediately as it is open-source. I'd prefer to leave any changes to you. Quote Link to comment Share on other sites More sharing options...
Reptillian Posted October 27, 2020 Author Share Posted October 27, 2020 (edited) 11 minutes ago, MJW said: I'd prefer to leave any changes to you. Got it. I actually inserted changes just as now when I realized I didn't publish the correct build. EDIT: Actually, the changes you suggested @MJW created a phantom image bug. I will not use it. new will guarantee everything resets to 0. Edited October 27, 2020 by Reptillian Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
MJW Posted October 27, 2020 Share Posted October 27, 2020 30 minutes ago, Reptillian said: Actually, the changes you suggested @MJW created a phantom image bug. I should have said that you need to clear the array when you don't allocate it. Otherwise it will have the left-over image from the previous time. if (Popcorn_Array == null) Popcorn_Array = new int [w,h]; else Array.Clear(Popcorn_Array, 0, w*h); Quote Link to comment Share on other sites More sharing options...
Reptillian Posted October 27, 2020 Author Share Posted October 27, 2020 21 minutes ago, MJW said: I should have said that you need to clear the array when you don't allocate it. Otherwise it will have the left-over image from the previous time. if (Popcorn_Array == null) Popcorn_Array = new int [w,h]; else Array.Clear(Popcorn_Array, 0, w*h); That works. Thanks. Now, I think the plugin can be said to be finished. Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
Reptillian Posted October 27, 2020 Author Share Posted October 27, 2020 Bug fix release. I forgotten to use func_yn in trig6 code. So, I addressed that. Download in first post. Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
Ego Eram Reputo Posted October 28, 2020 Share Posted October 28, 2020 I had some fun playing with this! Thanks @Reptillian After many iterations - I ran into a problem resetting the dropdown controls. Would it be possible to add a Reset button which covers all the controls? Quote ebook: Mastering Paint.NET | resources: Plugin Index | Stereogram Tut | proud supporter of Codelab plugins: EER's Plugin Pack | Planetoid | StickMan | WhichSymbol+ | Dr Scott's Markup Renderer | CSV Filetype | dwarf horde plugins: Plugin Browser | ShapeMaker Link to comment Share on other sites More sharing options...
Reptillian Posted October 28, 2020 Author Share Posted October 28, 2020 (edited) 14 minutes ago, Ego Eram Reputo said: After many iterations - I ran into a problem resetting the controls. Would it be possible to add a Reset button? I don't really have that much knowledge to do so, and c# isn't exactly what I'll be focused on. So, no unless you can give a example on making that, I will try to add a reset button. Edited October 28, 2020 by Reptillian Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
lynxster4 Posted October 31, 2020 Share Posted October 31, 2020 @Reptillian I had some fun playing with this plugin. The results yield a lot of glassy-looking threads. Different blend modes and some coloring, voila! Thanks for making this! 😊 2 Quote My Art Gallery | My Shape Packs | ShapeMaker Mini Tut | Air Bubble Stained Glass Chrome Text with Reflections | Porcelain Text w/ Variegated Coloring | Realistic Knit PatternOpalescent Stained Glass | Frosted Snowman Cookie | Leather Texture | Plastic Text | Silk Embroidery Visit my Personal Website "Never, ever lose your sense of humor - you'll live longer" Link to comment Share on other sites More sharing options...
sashwilko Posted November 25, 2020 Share Posted November 25, 2020 Thanks for the plugin. Much fun to be had. 2 Quote Link to comment Share on other sites More sharing options...
Reptillian Posted March 21, 2022 Author Share Posted March 21, 2022 (edited) I will be updating the Popcorn Fractal soon. I think I have a idea of what to do with Lambda delegate, but don't know how to return expression from a Func Function yet. Found my solution. Edited March 22, 2022 by Reptillian 1 Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
Reptillian Posted March 28, 2022 Author Share Posted March 28, 2022 Popcorn Fractal has been updated! It is now multi-threaded all thanks to the help of @otuncelli. I will be applying the system.threading changes to my Thorn Fractal and also, I will be converting a few G'MIC-C# project to C#. 3 1 Quote G'MIC Filter Developer I am away from this forum for undetermined amount of time: If you really need anything related to my PDN plugin or my G'MIC filter within G'MIC plugin, then you can contact me via Paint.NET discord, and mention me. Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.