0x21f9…45e2

All memos sent from and to 0x21f9…45e2.

Field Recordings is a collection of observations. Each observation depicts an intangible entity and hints at the greater environment which spawned it. Each token is accompanied by a signed physical plot which can be claimed for the price of shipping. Details can be found on the project website.
How can intent be communicated when ideas are filtered through a pseudorandom number generator? Simply looking at the output does not make it clear whether a stroke is placed on the canvas because of a decision by the artist or by a roll of the dice. The artist’s hand is more present in the process than the result; they choose the algorithms, tune the parameters, and prune the features. As I experimented with my code, I held a particular idea in mind, but I was uncertain how it would finally manifest. I pursued a visual composition that made me feel a certain way, and the visuals I landed on communicate my feeling better than anything I can put into words. Through Curved Air is about the challenge of communication. Regardless of the medium, I can never be certain that the message I intend to send is the message that is received. Through Curved Air takes inspiration from musical minimalism, where repetition is used to highlight changes in rhythm and harmony. Every output is created by repeatedly copying a single shape. Each copy only has meaning in relation to the other shapes nearby, and that meaning changes with the context around it. Delicate structures form and are subsequently obscured by further layers, and though they may be hidden, they still affect the perception of the final image. Clicking on the canvas will start or stop the looping mode, where the image is recreated in a slightly different way. New facets are exposed as the composition changes yet remains the same. Just as I spend my days trying to share my inner experience through my art, Through Curved Air uses each shape and each loop and each token hash to attempt to create a common feeling between myself and the viewer. Through Curved Air also takes inspiration from the paintings of Joan Mitchell. I was drawn to her expressive strokes, vibrant colors, and use of negative space, all of which come together to give a more intense feeling of looking at a landscape than just looking at a painting of a landscape. Her energetic marks clearly communicate that there is a human being behind the art. The marks of generative works are often similarly representative of the underlying process, but instead of drawing focus to the artist behind the piece, they draw attention to the algorithm. To convey human emotion in the way I intended, I had to use a subtler algorithm. The technical tools to convey this emotion are tools I have been consistently developing in my practice. I love making generative art because I can design a system where I understand how all the components work, but they can still come together to produce a result that surprises me. The algorithm behind the compositional variation in my earlier works Coquina and Primordial is one I continued to evolve, and it rests at the heart of Through Curved Air. In fact, I pushed it further than ever, using it to create the individual shapes that form the building block of each output. This emergent variation permeates the work and results in surprising images that more closely resemble paintings than anything I made previously. I believe the potential for surprise is key to conveying emotion through code. When the possibility space of the algorithm grows too large to understand, the mind wanders to the person behind the algorithm. Perhaps the human element is the struggle to understand, or the struggle to be understood.
function genExpression(){let e="$";for(p_var=0;e.includes("$");)R.rd()<p_var?(v=vars[floor(vars.length*R.rd())],e=e.replace("$",v)):(f=funcs[floor(funcs.length*R.rd())],e=e.replace("$",f)),p_var+=p_var_inc;return e}function updateExpressions(e){"x"==e?f_string=genExpression():"y"==e?f_string2=genExpression():"z"==e?f_string3=genExpression():"theta"==e?f_string4=genExpression:(f_string=genExpression(),f_string2=genExpression(),f_string3=genExpression(),f_string4=genExpression())}function mapPts(){let out_pts=[];for(let i=0;i<init_pts.length;i++){x=init_pts[i][0],y=init_pts[i][1],z=init_pts[i][2],theta=theta_modulo>1?map(i%theta_modulo,0,theta_modulo-1,-1,1):0;for(let j=0;j<trail_length;j++)nx=eval(f_string),ny=eval(f_string2),nz=eval(f_string3),ntheta=eval(f_string4),x=nx,y=ny,z=nz,theta=ntheta,out_pts.push([x,y,z,theta])}x_min=out_pts[0][0],x_max=out_pts[0][0],y_min=out_pts[0][1],y_max=out_pts[0][1],z_min=out_pts[0][2],z_max=out_pts[0][2],theta_min=out_pts[0][3],theta_max=out_pts[0][3];for(let i=1;i<out_pts.length;i++)out_pts[i][0]<x_min&&(x_min=out_pts[i][0]),out_pts[i][0]>x_max&&(x_max=out_pts[i][0]),out_pts[i][1]<y_min&&(y_min=out_pts[i][1]),out_pts[i][1]>y_max&&(y_max=out_pts[i][1]),out_pts[i][2]<z_min&&(z_min=out_pts[i][2]),out_pts[i][2]>z_max&&(z_max=out_pts[i][2]),out_pts[i][3]<theta_min&&(theta_min=out_pts[i][3]),out_pts[i][3]>theta_max&&(theta_max=out_pts[i][3]);redo=!1,x_min==x_max&&(x_min-=1,x_max+=1,redo=!0),y_min==y_max&&(y_min-=1,y_max+=1,redo=!0),z_min==z_max&&(z_min-=1,z_max+=1,redo=!0),theta_min==theta_max&&(theta_min-=1,theta_max+=1,redo=!0),theta_min==theta_max&&(theta_min-=1,theta_max+=1,redo=!0);for(let i=0;i<out_pts.length;i++)nz=map(z=out_pts[i][2],z_min,z_max,0,1),out_pts[i][2]=nz,theta=map(theta=out_pts[i][3],theta_min,theta_max,0,3*TWO_PI),out_pts[i][3]=theta;return redo?(updateExpressions(),mapPts()):out_pts}function fitPts(e,$=!1){x_min=e[0][0],x_max=e[0][0],y_min=e[0][1],y_max=e[0][1],z_min=e[0][2],z_max=e[0][2];for(let t=1;t<e.length;t++)e[t][0]<x_min&&(x_min=e[t][0]),e[t][0]>x_max&&(x_max=e[t][0]),e[t][1]<y_min&&(y_min=e[t][1]),e[t][1]>y_max&&(y_max=e[t][1]),e[t][2]<z_min&&(z_min=e[t][2]),e[t][2]>z_max&&(z_max=e[t][2]);redo=!1,x_min==x_max&&(x_min-=1,x_max+=1,redo=!0),y_min==y_max&&(y_min-=1,y_max+=1,redo=!0),z_min==z_max&&(z_min-=1,z_max+=1,redo=!0);for(let r=0;r<e.length;r++)x=e[r][0],y=e[r][1],z=e[r][2],theta=e[r][3],layer_num=e[r][4],nx=map(x,x_min,x_max,margin,aspect_ratio-margin),ny=map(y,y_min,y_max,margin,1-margin),e[r]=[nx,ny,z,theta,layer_num];return e.sort((e,$)=>e[2]-$[2]),e}function bufferPts(e,$=1){let t=[];ceil(1/buffer),pt_dict={},pt_index=0;for(let r=0;r<e.length;r++){for(is_valid=!1,skip_pt=!1,x=e[r][0],y=e[r][1],z=e[r][2],theta=e[r][3],layer_num=e[r][4];!is_valid;){local_pts=[],is_valid=!0,grid_x=floor(x/buffer),grid_y=floor(y/buffer);for(let s=grid_x-1;s<grid_x+2;s++)for(let _=grid_y-1;_<grid_y+2;_++)if([s,_]in pt_dict)for(let n=0;n<pt_dict[[s,_]].length;n++)local_pts.push(pt_dict[[s,_]][n]);for(let o=0;o<local_pts.length;o++)len(x,y,x2=local_pts[o][0],y2=local_pts[o][1])<buffer&&($||t[local_pts[o][2]][5]>=max_growth?(dx=x-.5,dy=y-.5,is_valid=!1,x+=buffer*cos(theta),y+=buffer*sin(theta)):(skip_pt=!0,t[local_pts[o][2]][5]++))}t.push([x,y,z,theta,layer_num,1]),!skip_pt&&([grid_x=floor(x/buffer),grid_y=floor(y/buffer)]in pt_dict?pt_dict[[grid_x,grid_y]].push([x,y,pt_index]):pt_dict[[grid_x,grid_y]]=[[x,y,pt_index]],pt_index++)}min_x=margin,max_x=aspect_ratio-margin,min_y=margin,max_y=1-margin;for(let l=0;l<t.length;l++)t[l][0]<min_x&&(min_x=t[l][0]),t[l][0]>max_x&&(max_x=t[l][0]),t[l][1]<min_y&&(min_y=t[l][1]),t[l][1]>max_y&&(max_y=t[l][1]);for(let h=0;h<t.length;h++)t[h][0]=map(t[h][0],min_x,max_x,margin,aspect_ratio-margin),t[h][1]=map(t[h][1],min_y,max_y,margin,1-margin);return t.sort((e,$)=>0*e[0]+$[2]-0*$[0]-e[2]),t}function spreadPts(e,$=!1){col_count=[],row_count=[],layer_count=[];for(let t=0;t<grid_size+1;t++)col_count[t]=0,row_count[t]=0,layer_count[t]=0;for(let r=0;r<e.length;r++)x=e[r][0]/aspect_ratio,y=e[r][1],z=e[r][2],xg=floor(x*grid_size),yg=floor(y*grid_size),zg=floor(z*grid_size),col_count[xg]++,row_count[yg]++,layer_count[zg]++;col_ends=[margin];for(let s=0;s<col_count.length;s++)col_ends[s+1]=col_count[s]/e.length*(aspect_ratio-2*margin)+col_ends[s];row_ends=[margin];for(let _=0;_<row_count.length;_++)row_ends[_+1]=row_count[_]/e.length*(1-2*margin)+row_ends[_];layer_ends=[0];for(let n=0;n<layer_count.length;n++)layer_ends[n+1]=layer_count[n]/e.length+layer_ends[n];let o=[];for(let l=0;l<e.length;l++)x=e[l][0]/aspect_ratio,y=e[l][1],z=e[l][2],xg=floor(x*grid_size),yg=floor(y*grid_size),zg=floor(z*grid_size),nx=map(x,xg/grid_size,(xg+1)/grid_size,col_ends[xg],col_ends[xg+1]),ny=map(y,yg/grid_size,(yg+1)/grid_size,row_ends[yg],row_ends[yg+1]),nz=map(z,zg/grid_size,(zg+1)/grid_size,layer_ends[zg],layer_ends[zg+1]),$?o.push([nx,ny,nz,e[l][3],e[l][4],e[l][5]]):o.push([nx,ny,e[l][2],e[l][3],e[l][4],e[l][5]]);return o}function spreadPtsSimple(e,$=!1){col_count=[],row_count=[],layer_count=[];for(let t=0;t<grid_size+1;t++)col_count[t]=0,row_count[t]=0,layer_count[t]=0;for(let r=0;r<e.length;r++)x=e[r][0]/aspect_ratio,y=e[r][1],z=e[r][2],xg=floor(x*grid_size),yg=floor(y*grid_size),zg=floor(z*grid_size),col_count[xg]++,row_count[yg]++,layer_count[zg]++;col_ends=[0],non_zero_cols=0;for(let s=0;s<col_count.length;s++)col_count[s]>0?(col_ends[s+1]=col_ends[s]+1,non_zero_cols++):col_ends[s+1]=col_ends[s];row_ends=[0],non_zero_rows=0;for(let _=0;_<row_count.length;_++)row_count[_]>0?(row_ends[_+1]=row_ends[_]+1,non_zero_rows++):row_ends[_+1]=row_ends[_];layer_ends=[0];for(let n=0;n<layer_count.length;n++);let o=[];for(let l=0;l<e.length;l++)x=e[l][0]/aspect_ratio,y=e[l][1],z=e[l][2],xg=floor(x*grid_size),yg=floor(y*grid_size),zg=floor(z*grid_size),col1=map(col_ends[xg],0,non_zero_cols,margin,aspect_ratio-margin),col2=map(col_ends[xg+1],0,non_zero_cols,margin,aspect_ratio-margin),nx=map(x,xg/grid_size,(xg+1)/grid_size,col1,col2),row1=map(row_ends[yg],0,non_zero_rows,margin,1-margin),row2=map(row_ends[yg+1],0,non_zero_rows,margin,1-margin),o.push([nx,ny=map(y,yg/grid_size,(yg+1)/grid_size,row1,row2),e[l][2],e[l][3],e[l][4],e[l][5]]);return o}function on_segment(e,$,t,r,s,_){return!!(t<=max(e,s)&&t>=min(e,s)&&r<=max($,_)&&r>=min($,_))}function orient(e,$,t,r,s,_){let n=(r-$)*(s-t)-(t-e)*(_-r);return n>0?1:n<0?2:0}function intersect(e,$,t,r,s,_,n,o){return(e!=s||$!=_)&&(e!=n||$!=o)&&(t!=s||r!=_)&&(t!=n||r!=o)&&(o1=orient(e,$,t,r,s,_),o2=orient(e,$,t,r,n,o),o3=orient(s,_,n,o,e,$),o4=orient(s,_,n,o,t,r),!!(o1!=o2&&o3!=o4||0==o1&&on_segment(e,$,s,_,t,r)||0==o2&&on_segment(e,$,n,o,t,r)||0==o3&&on_segment(s,_,e,$,n,o)||0==o4&&on_segment(s,_,t,r,n,o)))}function intersect_pt(e,$,t,r,s,_,n,o){let l=t-e,h=r-$,u=n-s,g=o-_,d;return[(d=0==u?(s-e)/(t-e):(_-$+(e-s)*g/u)/(h-l*g/u))*l+e,d*h+$]}function polyArea(e){area=0,multiplier=1;for(let $=0;$<e.length;$++){x1=e[$][0],y1=e[$][1],x2=e[($+1)%e.length][0],y2=e[($+1)%e.length][1],intersect_pt_list=[];for(let t=0;t<e.length;t++)t!=$&&(x3=e[t][0],y3=e[t][1],intersect(x1,y1,x2,y2,x3,y3,x4=e[(t+1)%e.length][0],y4=e[(t+1)%e.length][1])&&intersect_pt_list.push(intersect_pt(x1,y1,x2,y2,x3,y3,x4,y4)));if(intersect_pt_list.length>0){intersect_pt_list.push([x1,y1]),intersect_pt_list.push([x2,y2]);for(let r=0;r<intersect_pt_list.length;r++)intersect_pt_list[r].push(len(x1,y1,intersect_pt_list[r][0],intersect_pt_list[r][1]));intersect_pt_list.sort((e,$)=>e[2]-$[2]);for(let s=0;s<intersect_pt_list.length-1;s++)area+=(intersect_pt_list[s][0]*intersect_pt_list[s+1][1]-intersect_pt_list[s+1][0]*intersect_pt_list[s][1])/2*multiplier,multiplier*=-1;multiplier*=-1}else area+=(x1*y2-x2*y1)/2*multiplier}return abs(area)}function sqabs(e){return Math.sign(e)*sqrt(abs(e))}function ease(e){return 2/(1+exp(-e))-1}function bulge(e){return 3*exp(-2*e*e)*e}function ratio(e,$){return atan(e/(0==$?1e-6:$))}function nabs(e){return-abs(e)}function len(e,$,t,r){return sqrt(sq(t-e)+sq(r-$))}function mousePressed(){looping=!looping}function draw(){for(this_iter=0;draw_iter<draw_times.length&&time>draw_times[draw_iter][10]&&this_iter<1e4;){x1=draw_times[draw_iter][0],y1=draw_times[draw_iter][1],z=draw_times[draw_iter][2],theta=draw_times[draw_iter][3],x=draw_times[draw_iter][4],y=draw_times[draw_iter][5],z2=draw_times[draw_iter][6],theta2=draw_times[draw_iter][7],size_scale=draw_times[draw_iter][8],c_rand=draw_times[draw_iter][9],layer_num=draw_times[draw_iter][11],tri_brush?(x2=x1+1/sqrt(2)*rescale*map(z,1,0,2*min_size,2*max_size)*(cos(theta)+.5*cos(theta+PI/2)),y2=y1+1/sqrt(2)*rescale*map(z,1,0,2*min_size,2*max_size)*(sin(theta)+.5*sin(theta+PI/2)),x3=x1+1/sqrt(2)*rescale*map(z,1,0,2*min_size,2*max_size)*(cos(theta)+.5*cos(theta-PI/2)),y3=y1+1/sqrt(2)*rescale*map(z,1,0,2*min_size,2*max_size)*(sin(theta)+.5*sin(theta-PI/2))):(x2=x1+rescale*map(z,1,0,min_size,max_size)*cos(theta),y2=y1+rescale*map(z,1,0,min_size,max_size)*sin(theta),x3=x1+rescale*map(z,1,0,min_size,max_size)*cos(theta+PI),y3=y1+rescale*map(z,1,0,min_size,max_size)*sin(theta+PI),x4=x1+rescale*map(z,1,0,min_size,max_size)*.5*cos(theta+PI/2),y4=y1+rescale*map(z,1,0,min_size,max_size)*.5*sin(theta+PI/2),x5=x1+rescale*map(z,1,0,min_size,max_size)*.5*cos(theta-PI/2),y5=y1+rescale*map(z,1,0,min_size,max_size)*.5*sin(theta-PI/2)),tri_brush?(cx1=lerp(x1,x2,x),cy1=lerp(y1,y2,x),cx2=lerp(x1,x3,x),cy2=lerp(y1,y3,x),cx3=lerp(cx1,cx2,y),cy3=lerp(cy1,cy2,y)):(cx1=lerp(x2,x4,x),cy1=lerp(y2,y4,x),cx2=lerp(x5,x3,x),cy2=lerp(y5,y3,x),cx3=lerp(cx1,cx2,y),cy3=lerp(cy1,cy2,y)),dx1=x1-aspect_ratio/2,dy1=y1-.5,dx=x-.5,dy=y-.5,fill(p[c_rand]),beginShape();for(let e=0;e<poly_pts.length;e++)vertex((px=cx3+poly_pts[e][2]*cos(poly_pts[e][3]+theta2)*.02*poly_scale*sqrt(size_scale))*unit,(py=cy3+poly_pts[e][2]*sin(poly_pts[e][3]+theta2)*.02*poly_scale*sqrt(size_scale))*unit);endShape(),draw_iter++,this_iter++}if(time+=8e-4,draw_iter>=draw_times.length&&looping){msecs=new Date().getTime()%1e4;for(let $=0;$<msecs;$++)R.rd();draw_iter=0,time=0;for(let t=0;t<draw_offsets.length;t++)draw_offsets[t]+=.2*R.rd()-.2*R.rd(),draw_offsets[t]*=.9;for(let r=0;r<color_offsets.length;r++)color_offsets[r]+=(.2*R.rd()-.2*R.rd()+1)%1;draw_times=[];for(let s=0;s<brush_pts.length;s++){x1=brush_pts[s][0],y1=brush_pts[s][1],z=brush_pts[s][2],theta=brush_pts[s][3],layer_num=brush_pts[s][4],c_rand2=brush_pts[s][6];for(let _=0;_<stroke_pts[layer_num].length;_++)x=stroke_pts[layer_num][_][0],y=stroke_pts[layer_num][_][1],z2=stroke_pts[layer_num][_][2],theta2=stroke_pts[layer_num][_][3],size_scale=stroke_pts[layer_num][_][5],c_rand=(color_rand=R.rd())<.5?floor(p.length*((c1_mult*(z+z2)+9+c1_offset+map(layer_num,0,num_layers,0,1)+.2*R.rd()-.2*R.rd()+color_offsets[layer_num])%1)):floor(p.length*((c2_mult*c_rand2+9+c2_offset+.1*R.rd()-.1*R.rd())%1)),draw_time=(3*z+map(tan(map(z2,0,1,-PI/4,PI/4)),-1,1,0,1))/4+1e-4*_+draw_offsets[layer_num]-min(draw_offsets),draw_times.push([x1,y1,z,theta,x,y,z2,theta2,size_scale,c_rand,draw_time,layer_num])}draw_times.sort((e,$)=>e[10]-$[10])}}
p5.disableFriendlyErrors=!0;class Random{constructor(){this.useA=!1;let e=function(e){let $=parseInt(e.substr(0,8),16),t=parseInt(e.substr(8,8),16),r=parseInt(e.substr(16,8),16),s=parseInt(e.substr(24,8),16);return function(){r|=0;let e=(($|=0)+(t|=0)|0)+(s|=0)|0;return s=s+1|0,$=t^t>>>9,t=r+(r<<3)|0,r=(r=r<<21|r>>>11)+e|0,(e>>>0)/4294967296}};this.prngA=new e(tokenData.hash.substr(2,32)),this.prngB=new e(tokenData.hash.substr(34,32));for(let $=0;$<1e6;$+=2)this.prngA(),this.prngB()}rd(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}}function gaussRand(){return r1=R.rd(),r2=R.rd(),Math.sqrt(-2*Math.log(r1))*Math.cos(2*Math.PI*r2)}R=new Random;var gen_size,grid_size=5,p_var_inc=.1,trail_length=4,buffer=.03,vars=["x","y","z","theta"],funcs=["($+$)","($-$)","(-1*$)","sin($)","sqabs($)","($*$)","cos($)","(1.5*$)","ease($)","bulge($)","ratio($,$)","abs($)","nabs($)"],p=[],init_pts=[],aspect_ratio=16/9,shape_sides=Math.floor(5*R.rd())+Math.floor(5*R.rd())+4;shape_size=.02*Math.exp(gaussRand()/1.5);var theta_modulo=1+Math.floor(3*R.rd())+Math.floor(3*R.rd());growth_rand=R.rd(),buffer_strokes=.9>R.rd(),max_growth=growth_rand<.8?5:1,tri_brush=.2>R.rd(),margin=.8>R.rd()?.12:.03,layer_rand=R.rd();var min_size=.05,max_size=.35;brush_gen_size=4,layer_rand<.1?(num_layers=1,brush_gen_size=6,max_size=.5):num_layers=layer_rand<.7?3:5,num_layers>2&&((stroke_size_rand=R.rd())<.1?max_size=.15:stroke_size_rand<.15&&(max_size=.7));var high_stroke_color=.1>R.rd();p_num=Math.floor(7*R.rd()),rescale=1,c1_offset=R.rd(),c2_offset=R.rd(),c1_mult=.5>R.rd()?1:-1,c2_mult=.5>R.rd()?1:-1;var looping=!1,time=0,draw_iter=0,poly_pt_list=[],gen_shape="",brush_pts=[],stroke_pts=[],draw_offsets=[];for(let i=0;i<num_layers;i++)draw_offsets[i]=0;var color_offsets=[];for(let i=0;i<num_layers;i++)color_offsets[i]=0;function setup(){unit=floor(min(windowWidth/(16/9),windowHeight)),2>pixelDensity()&&pixelDensity(2),createCanvas(floor(16*unit/9),unit),frameRate(60),0==p_num?(background("#E9F3ED"),pb=color("#E9F3ED"),p[0]=color("#000000"),p[1]=color("#0B1628"),p[2]=color("#113382"),p[3]=color("#3F98B5"),p[4]=color("#99C6D5"),p[5]=color("#D4DFCE"),p[6]=color("#682D16"),p[7]=color("#BA5B0C"),p[8]=color("#ECB22D")):1==p_num?(background("#E9E3D8"),p[0]=color("#180E1B"),p[1]=color("#05246C"),p[2]=color("#0053A9"),p[3]=color("#00ACC7"),p[4]=color("#CFEDF0"),p[5]=color("#6C081C"),p[6]=color("#ED3414"),p[7]=color("#FFAF5E"),p[8]=color("#FFF386"),pb=color("#E9E3D8")):2==p_num?(background("#E0E0E0"),pb=color("#E0E0E0"),p[0]=color("#135331"),p[1]=color("#48AD85"),p[2]=color("#F1F1F1"),p[3]=color("#88C8CF"),p[4]=color("#154EB7"),p[5]=color("#123F39"),p[6]=color("#CA4F02"),p[7]=color("#E9D113"),p[8]=color("#73A034")):3==p_num?(background(color("#F7ECFE")),pb=color("#F7ECFE"),p[0]=color("#F3F3ED"),p[1]=color("#F0E594"),p[2]=color("#F0BD3D"),p[3]=color("#C32227"),p[4]=color("#D0679A"),p[5]=color("#7D4073"),p[6]=color("#403357"),p[7]=color("#171E3A"),p[8]=color("#51558F")):4==p_num?(background("#F1E4DD"),pb=color("#F1E4DD"),p[0]=color("#080300"),p[1]=color("#4A1807"),p[2]=color("#891C06"),p[3]=color("#B83412"),p[4]=color("#E06929"),p[5]=color("#F3B353"),p[6]=color("#BCA638"),p[7]=color("#6C6C0E"),p[8]=color("#31270D")):5==p_num?(background("#F0F4EB"),pb=color("#F0F4EB"),p[0]=color("#AC5435"),p[1]=color("#D77F56"),p[2]=color("#EBAE9B"),p[3]=color("#E3DFDE"),p[4]=color("#92D6ED"),p[5]=color("#027FB5"),p[6]=color("#044772"),p[7]=color("#041830"),p[8]=color("#4D4246")):6==p_num&&(background("#F3E0CC"),pb=color("#F3E0CC"),p[0]=color("#090908"),p[1]=color("#0B2247"),p[2]=color("#205B33"),p[3]=color("#607600"),p[4]=color("#FFA314"),p[5]=color("#F32F1D"),p[6]=color("#AC0048"),p[7]=color("#7A0062"),p[8]=color("#37007A")),draw_times=[];for(let e=0;e<num_layers;e++){o=(shape_rand=R.rd())<.2?"cloud":shape_rand<.4?"cylinder":shape_rand<.6?"sphere":shape_rand<.7?"cube":shape_rand<.8?"urchin":shape_rand<.9?"rings":"spiral",init_pts=[],final_pts=[],gen_size=brush_gen_size,buffer=.003,genInitPoints(o),updateExpressions("blah"),unbuffered_pts=mapPts();for(let $=0;$<unbuffered_pts.length;$++)unbuffered_pts[$].push(e);brush_pts=brush_pts.concat(unbuffered_pts)}grid_size=200,buffered_pts=bufferPts(spreaded_pts=spreadPts(fitted_pts=fitPts(brush_pts))),grid_size=200,brush_pts=final_pts=spreadPts(buffered_pts,!1),z_list=[];for(let t=0;t<brush_pts.length;t++)z_list.push(brush_pts[t][2]);for(let r=0;r<brush_pts.length;r++)rand=((rand=R.rd())+.1*sin(TWO_PI*(z-rand))+1)%1,brush_pts[r][6]=rand;brush_pts.sort((e,$)=>e[6]-$[6]);for(let s=0;s<brush_pts.length;s++)brush_pts[s][6]=s/brush_pts.length;brush_pts.sort((e,$)=>e[2]-$[2]);for(let _=0;_<brush_pts.length;_++)brush_pts[_][2]=1-_/brush_pts.length;for(let n=0;n<num_layers;n++){var o;if(aspect_ratio=1,margin=0,o=(shape_rand=R.rd())<.2?"cloud":shape_rand<.4?"cylinder":shape_rand<.6?"sphere":shape_rand<.7?"cube":shape_rand<.8?"urchin":shape_rand<.9?"rings":"spiral",gen_size=5,init_pts=[],final_pts2=[],genInitPoints(o),updateExpressions("blah"),unbuffered_pts=fitPts(unfitted_pts=mapPts()),buffer_strokes)buffered_pts=bufferPts(unbuffered_pts,0);else{buffered_pts=unbuffered_pts;for(let l=0;l<buffered_pts.length;l++)buffered_pts[l][5]=1}grid_size=200,final_pts2=spreadPts(buffered_pts),stroke_pts.push(final_pts2)}updateExpressions("blah"),trail_length=1,buffer=.1,init_pts=[],theta_off=R.rd()*TWO_PI;for(let h=0;h<shape_sides;h++)theta=map(h,0,shape_sides,0,TWO_PI)+theta_off,init_pts.push([.5*cos(theta),.5*sin(theta),-.5,0]);for(poly_pts=buffered_pts=bufferPts(unbuffered_pts=fitPts(mapPts(),!0));isNaN(polyArea(poly_pts))||1e-8>polyArea(poly_pts);)updateExpressions("blah"),poly_pts=buffered_pts=bufferPts(unbuffered_pts=fitPts(mapPts(),!0));poly_scale=sqrt(shape_size)/sqrt(polyArea(poly_pts));for(let u=0;u<poly_pts.length;u++)rad=len(poly_pts[u][0],poly_pts[u][1],.5,.5),.5!=poly_pts[u][0]?(theta=atan((poly_pts[u][1]-.5)/(poly_pts[u][0]-.5)),poly_pts[u][0]<.5&&(theta+=PI)):theta=poly_pts[u][1]>.5?PI/2:1.5*PI,poly_pts[u][2]=rad,poly_pts[u][3]=theta;poly_pt_list.push(poly_pts),noStroke(),strokeWeight(.001*unit),aspect_ratio=16/9;for(let g=0;g<1e4;g++){x=map(R.rd(),0,1,-.1,aspect_ratio+.1),y=map(R.rd(),0,1,-.1,1.1),fill(lerpColor(pb,fill_color=p[floor(p.length*R.rd())],.04)),theta=final_pts2[floor(R.rd()*final_pts2.length)][3],beginShape();for(let d=0;d<poly_pts.length;d++)vertex((px=x+poly_pts[d][2]*cos(poly_pts[d][3]+theta)*.2*poly_scale)*unit,(py=y+poly_pts[d][2]*sin(poly_pts[d][3]+theta)*.2*poly_scale)*unit);endShape()}for(let a=0;a<p.length;a++)p[a].setAlpha(229.5);for(let c=0;c<brush_pts.length;c++){x1=brush_pts[c][0],y1=brush_pts[c][1],z=brush_pts[c][2],theta=brush_pts[c][3],layer_num=brush_pts[c][4],c_rand2=brush_pts[c][6];for(let b=0;b<stroke_pts[layer_num].length;b++)x=stroke_pts[layer_num][b][0],y=stroke_pts[layer_num][b][1],z2=stroke_pts[layer_num][b][2],theta2=stroke_pts[layer_num][b][3],size_scale=stroke_pts[layer_num][b][5],c_rand=(color_rand=R.rd())<(small_color_prob=high_stroke_color?.2:num_layers>1?map(layer_num,0,num_layers-1,.4,.8):.5)?floor(p.length*((c1_mult*(z+z2)*2/max(num_layers,2)+9+c1_offset+map(layer_num,0,num_layers,0,1)+.2*R.rd()-.2*R.rd())%1)):floor(p.length*((c2_mult*c_rand2+9+c2_offset+.1*R.rd()-.1*R.rd())%1)),draw_time=(3*z+map(tan(map(z2,0,1,-PI/4,PI/4)),-1,1,0,1))/4+1e-4*b,draw_times.push([x1,y1,z,theta,x,y,z2,theta2,size_scale,c_rand,draw_time,layer_num])}draw_times.sort((e,$)=>e[10]-$[10]),min_draw_time=draw_times[0][10];for(let E=0;E<draw_times.length;E++)draw_times[E][10]+=.02-min_draw_time}function genInitPoints(e){if("cloud"==e)for(let $=0;$<pow(gen_size,3);$++)x=sqabs(2*(R.rd()-.5)),y=sqabs(2*(R.rd()-.5)),z=sqabs(2*(R.rd()-.5)),init_pts.push([x,y,z]);if("cylinder"==e)for(let t=0;t<pow(gen_size,3);t++)x=(rad=.5)*cos(theta=map(R.rd(),0,1,0,TWO_PI)),y=rad*sin(theta),z=R.rd()-.5,init_pts.push([x,y,z]);if("sphere"==e)for(let r=0;r<pow(gen_size,3);r++)theta=TWO_PI*R.rd(),x=(rad=.5)*sin(phi=acos(1-2*R.rd()))*cos(theta),y=rad*sin(phi)*sin(theta),z=rad*cos(phi),init_pts.push([x,y,z]);if("cube"==e)for(let s=0;s<gen_size;s++)for(let _=0;_<gen_size;_++)for(let n=0;n<gen_size;n++)x=map(s,0,gen_size-1,-1,1)+1/gen_size*(R.rd()-R.rd()),y=map(_,0,gen_size-1,-1,1)+1/gen_size*(R.rd()-R.rd()),z=map(n,0,gen_size-1,-1,1)+1/gen_size*(R.rd()-R.rd()),init_pts.push([x,y,z]);if("urchin"==e)for(let o=0;o<pow(gen_size,1.5);o++){theta=TWO_PI*R.rd(),x=0*sin(phi=acos(1-2*R.rd()))*cos(theta),y=0*sin(phi)*sin(theta),z=0*cos(phi);for(let l=0;l<pow(gen_size,1.5);l++)theta+=.1*cos(twist=TWO_PI*R.rd()),phi+=.1*sin(twist),x+=(v=.01)*sin(phi)*cos(theta),y+=v*sin(phi)*sin(theta),z+=v*cos(phi),init_pts.push([x,y,z])}if("rings"==e){theta=TWO_PI*R.rd(),phi=acos(1-2*R.rd());for(let h=0;h<gen_size;h++){theta+=.1*cos(twist=TWO_PI*R.rd()),phi+=.1*sin(twist),rad=map(h,-1,gen_size-1,0,1);for(let u=0;u<sq(gen_size);u++)psi=map(u,0,sq(gen_size),0,TWO_PI),x=rad*cos(phi)*cos(psi)*cos(theta)+sin(psi)*sin(theta),y=rad*sin(phi)*cos(psi),z=rad*sin(psi)*cos(theta)+cos(phi)*cos(psi)*sin(theta),init_pts.push([x,y,z])}}if("spiral"==e)for(let g=0;g<pow(gen_size,3);g++)x=(rad=(theta=map(R.rd(),0,1,0,10*PI))/(10*PI))*cos(theta+TWO_PI*(z=R.rd()-.5)),y=rad*sin(theta+TWO_PI*z),init_pts.push([x,y,z])}
Primordial presents forms as diverse as those found in the natural world. The emergent system powering Primordial is capable of generating this diversity but is hard to control. After the initial generation there is a curation step; forms must meet certain criteria or the algorithm replaces them. The forms produced by Primordial are presented in a triptych, as comparing multiple outputs is fundamental to understanding a generative algorithm. Primordial attempts to generate triptychs where the individual forms are related, and the results can be surprisingly harmonious or discordant. Once the triptych is finalized, click on one of the forms to redraw a previous image. Press s to save the entire triptych, or 1-3 to save an individual image.
p5.disableFriendlyErrors=!0;class Random{constructor(){this.useA=!1;let t=function(t){let e=parseInt(t.substr(0,8),16),s=parseInt(t.substr(8,8),16),r=parseInt(t.substr(16,8),16),i=parseInt(t.substr(24,8),16);return function(){let t=((e|=0)+(s|=0)|0)+(i|=0)|0;return i=i+1|0,e=s^s>>>9,s=(r|=0)+(r<<3)|0,r=(r=r<<21|r>>>11)+t|0,(t>>>0)/4294967296}};this.prngA=new t(tokenData.hash.substr(2,32)),this.prngB=new t(tokenData.hash.substr(34,32));for(let t=0;t<1e6;t+=2)this.prngA(),this.prngB()}rd(){return this.useA=!this.useA,this.useA?this.prngA():this.prngB()}}R=new Random;var grid_size=200,threshold=.5,sq_size,grid=[],saved_grids=[],saved_grids_yz=[],saved_noise=[],saved_pts=[],mean_grid=[],mean_size=1,diff_threshold=3e4,p_var_inc=.2,trail_length=4,gen_size=20,margin=.05,good_thresh=.22,side_thresh=.08,perspective_thresh=0,num_layers=27,gen_shape,layer_type;shape_rand=R.rd(),gen_shape=shape_rand<.24?"cloud":shape_rand<.48?"cylinder":shape_rand<.72?"sphere":shape_rand<.8?"cube":shape_rand<.84?"urchin":shape_rand<.92?"rings":"spiral","urchin"==gen_shape&&(side_thresh=.05);var layer_rand=R.rd(),change_var;layer_type=layer_rand<.88?"layered":layer_rand<.96?"inscribed":"circumscribed",change_rand=R.rd(),change_var=change_rand<.4?"z":change_rand<.7?"x":"y";var draw_mode=0,vars=["x","y","z"],funcs=["($+$)","($-$)","(-1*$)","sin($)","sqabs($)","($*$)","cos($)","(1.5*$)"],saved_functions=[],p=[],colorHues=[],colorSats=[],colorLights=[],init_pts=[],total_attempts=0,attempt_nums=[],mouse_flags=[!1,!1,!1],trip_iters=[27,27,27];function setup(){unit=min(floor(windowWidth/3),windowHeight),pixelDensity()<2&&pixelDensity(2),sq_size=unit/grid_size,canv=createCanvas(3*unit,unit),noStroke(),strokeWeight(unit/600),frameRate(60),colorMode(HSL),baseHue=360*R.rd(),colorHue=R.rd()+0,colorSat=R.rd(),colorLight=R.rd();for(let t=0;t<num_layers;t++)colorHues.push(colorHue),colorSats.push(colorSat),colorLights.push(colorLight),colorHue=(colorHue+.5*(R.rd()-R.rd())+1)%1,colorSat+=.3*(R.rd()-R.rd()),colorLight+=.3*(R.rd()-R.rd());min_sat=min(colorSats),max_sat=max(colorSats),min_light=min(colorLights),max_light=max(colorLights);for(let t=0;t<colorSats.length;t++)colorSats[t]=map(colorSats[t],min_sat,max_sat,0,1),colorLights[t]=map(colorLights[t],min_light,max_light,0,1),R.rd()<.2&&(R.rd()<.9&&(colorHues[t]=(colorHues[t]+.5)%1),R.rd()<.9&&(colorSats[t]=1-colorSats[t]),R.rd()<.9&&(colorLights[t]=1-colorLights[t]));background(0),genInitPoints(),trip_iter=0;for(let t=0;t<3;t++){saved_noise[t]=[];for(let e=0;e<grid_size+1;e++){saved_noise[t][e]=[];for(let s=0;s<grid_size+1;s++)saved_noise[t][e][s]=.1*R.rd()}}}function genInitPoints(){if("cloud"==gen_shape)for(let t=0;t<pow(gen_size,3);t++)x=sqabs(2*(R.rd()-.5)),y=sqabs(2*(R.rd()-.5)),z=sqabs(2*(R.rd()-.5)),init_pts.push([x,y,z]);if("cylinder"==gen_shape)for(let t=0;t<pow(gen_size,3);t++)theta=map(R.rd(),0,1,0,TWO_PI),rad=.5,x=rad*cos(theta),y=rad*sin(theta),z=R.rd()-.5,init_pts.push([x,y,z]);if("sphere"==gen_shape)for(let t=0;t<pow(gen_size,3);t++)theta=TWO_PI*R.rd(),phi=acos(1-2*R.rd()),rad=.5,x=rad*sin(phi)*cos(theta),y=rad*sin(phi)*sin(theta),z=rad*cos(phi),init_pts.push([x,y,z]);if("cube"==gen_shape)for(let t=0;t<gen_size;t++)for(let e=0;e<gen_size;e++)for(let s=0;s<gen_size;s++)x=map(t,0,gen_size-1,-1,1)+1/gen_size*(R.rd()-R.rd()),y=map(e,0,gen_size-1,-1,1)+1/gen_size*(R.rd()-R.rd()),z=map(s,0,gen_size-1,-1,1)+1/gen_size*(R.rd()-R.rd()),init_pts.push([x,y,z]);if("urchin"==gen_shape)for(let t=0;t<pow(gen_size,1.5);t++){theta=TWO_PI*R.rd(),phi=acos(1-2*R.rd()),x=0*sin(phi)*cos(theta),y=0*sin(phi)*sin(theta),z=0*cos(phi);for(let t=0;t<pow(gen_size,1.5);t++)twist=TWO_PI*R.rd(),theta+=.1*cos(twist),phi+=.1*sin(twist),v=.01,x+=v*sin(phi)*cos(theta),y+=v*sin(phi)*sin(theta),z+=v*cos(phi),init_pts.push([x,y,z])}if("rings"==gen_shape){theta=TWO_PI*R.rd(),phi=acos(1-2*R.rd());for(let t=0;t<gen_size;t++){twist=TWO_PI*R.rd(),theta+=.1*cos(twist),phi+=.1*sin(twist),rad=map(t,-1,gen_size-1,0,1);for(let t=0;t<sq(gen_size);t++)psi=map(t,0,sq(gen_size),0,TWO_PI),x=rad*cos(phi)*cos(psi)*cos(theta)+sin(psi)*sin(theta),y=rad*sin(phi)*cos(psi),z=rad*sin(psi)*cos(theta)+cos(phi)*cos(psi)*sin(theta),init_pts.push([x,y,z])}}if("spiral"==gen_shape)for(let t=0;t<pow(gen_size,3);t++)theta=map(R.rd(),0,1,0,10*PI),rad=theta/(10*PI),z=R.rd()-.5,x=rad*cos(theta+TWO_PI*z),y=rad*sin(theta+TWO_PI*z),init_pts.push([x,y,z])}function genExpression(){let t="$";for(p_var=0;t.includes("$");)R.rd()<p_var?(v=vars[floor(vars.length*R.rd())],t=t.replace("$",v)):(f=funcs[floor(funcs.length*R.rd())],t=t.replace("$",f)),p_var+=p_var_inc;return t}function updateExpressions(t,e){"x"==t?f_string=genExpression():"y"==t?f_string2=genExpression():"z"==t?f_string3=genExpression():(f_string=genExpression(),f_string2=genExpression(),f_string3=genExpression()),saved_functions.push([f_string,f_string2,f_string3]),e||(attempt_nums[trip_iter]=total_attempts),total_attempts++}function mapPts(){let out_pts=[];for(let i=0;i<init_pts.length;i++){x=init_pts[i][0],y=init_pts[i][1],z=init_pts[i][2];for(let j=0;j<trail_length;j++)nx=eval(f_string),ny=eval(f_string2),nz=eval(f_string3),x=nx,y=ny,z=nz,out_pts.push([x,y,z])}x_min=out_pts[0][0],x_max=out_pts[0][0],y_min=out_pts[0][1],y_max=out_pts[0][1],z_min=out_pts[0][2],z_max=out_pts[0][2];for(let t=1;t<out_pts.length;t++)out_pts[t][0]<x_min&&(x_min=out_pts[t][0]),out_pts[t][0]>x_max&&(x_max=out_pts[t][0]),out_pts[t][1]<y_min&&(y_min=out_pts[t][1]),out_pts[t][1]>y_max&&(y_max=out_pts[t][1]),out_pts[t][2]<z_min&&(z_min=out_pts[t][2]),out_pts[t][2]>z_max&&(z_max=out_pts[t][2]);x_min==x_max&&(x_min-=1,x_max+=1),y_min==y_max&&(y_min-=1,y_max+=1),z_min==z_max&&(z_min-=1,z_max+=1);for(let t=0;t<out_pts.length;t++)x=out_pts[t][0],y=out_pts[t][1],z=out_pts[t][2],nx=map(x,x_min,x_max,margin,1-margin),ny=map(y,y_min,y_max,margin,1-margin),nz=map(z,z_min,z_max,margin,1-margin),out_pts[t]=[nx,ny,nz,t];return out_pts.sort((t,e)=>t[2]-e[2]),out_pts}function checkPts(t){let e=[],s=[],r=[];for(let t=0;t<grid_size+1;t++){e[t]=[],s[t]=[],r[t]=[];for(let i=0;i<grid_size+1;i++)e[t][i]=0,s[t][i]=0,r[t][i]=0}count_xy=0,count_yz=0,count_zx=0,left_count=0,right_count=0,top_count=0,bottom_count=0;for(let i=0;i<t.length;i++)x=floor(t[i][0]*(grid_size+1)),y=floor(t[i][1]*(grid_size+1)),z=floor(t[i][2]*(grid_size+1)),0==e[x][y]&&(count_xy++,x<=grid_size/2&&left_count++,x>=grid_size/2&&right_count++,y<=grid_size/2&&top_count++,y>=grid_size/2&&bottom_count++),0==s[y][z]&&count_yz++,0==r[z][x]&&count_zx++,e[x][y]++,s[y][z]++,r[z][x]++;diff_grid=!0;for(let r=0;r<trip_iter;r++){total_diff=0,total_diff_yz=0,hamming_dist=0;for(let t=0;t<grid_size+1;t++)for(let i=0;i<grid_size+1;i++)total_diff+=abs(saved_grids[r][t][i]-e[t][i]),total_diff_yz+=abs(saved_grids_yz[r][t][i]-s[t][i]);for(let e=0;e<t.length;e++)hamming_dist+=abs(saved_pts[r][e][2]-t[e][2]);total_diff<diff_threshold&&hamming_dist<3200&&(diff_grid=!1)}return!!(count_xy>good_thresh*sq(grid_size)&&count_yz>perspective_thresh*sq(grid_size)&&count_zx>perspective_thresh*sq(grid_size)&&left_count>side_thresh*sq(grid_size)&&right_count>side_thresh*sq(grid_size)&&top_count>side_thresh*sq(grid_size)&&bottom_count>side_thresh*sq(grid_size)&&diff_grid&&t[0][2]!=t[t.length-1][2])&&(saved_grids[trip_iter]=e,saved_grids_yz[trip_iter]=s,!0)}function updateGrid(t){grid=[];for(let t=0;t<grid_size+1;t++){grid[t]=[];for(let e=0;e<grid_size+1;e++)grid[t][e]=0}for(let e=0;e<t.length;e++)x=floor(t[e][0]*(grid_size+1)),y=floor(t[e][1]*(grid_size+1)),grid[x][y]++}function sqabs(t){return Math.sign(t)*sqrt(abs(t))}function len(t,e,s,r){return sqrt(sq(s-t)+sq(r-e))}function outlineSquare(t,e,s){tlv=grid[t][e],trv=grid[t+1][e],blv=grid[t][e+1],brv=grid[t+1][e+1],tl=tlv>threshold,tr=trv>threshold,bl=blv>threshold,br=brv>threshold,t_offset=(threshold-tlv)/(trv-tlv),b_offset=(threshold-blv)/(brv-blv),l_offset=(threshold-tlv)/(blv-tlv),r_offset=(threshold-trv)/(brv-trv),march_case=tl+2*tr+4*bl+8*br;let r=-1,i=-1,n=-1,o=-1,_=-1,a=-1,d=-1,l=-1;switch(march_case){case 0:break;case 1:r=t+t_offset,i=e,n=t,o=e+l_offset;break;case 2:r=t+t_offset,i=e,n=t+1,o=e+r_offset;break;case 3:r=t+1,i=e+r_offset,n=t,o=e+l_offset;break;case 4:r=t,i=e+l_offset,n=t+b_offset,o=e+1;break;case 5:r=t+t_offset,i=e,n=t+b_offset,o=e+1;break;case 6:r=t+t_offset,i=e,n=t+1,o=e+r_offset,_=t,a=e+l_offset,d=t+b_offset,l=e+1;break;case 7:r=t+1,i=e+r_offset,n=t+b_offset,o=e+1;break;case 8:r=t+b_offset,i=e+1,n=t+1,o=e+r_offset;break;case 9:r=t+t_offset,i=e,n=t,o=e+l_offset,_=t+b_offset,a=e+1,d=t+1,l=e+r_offset;break;case 10:r=t+t_offset,i=e,n=t+b_offset,o=e+1;break;case 11:r=t+b_offset,i=e+1,n=t,o=e+l_offset;break;case 12:r=t+1,i=e+r_offset,n=t,o=e+l_offset;break;case 13:r=t+t_offset,i=e,n=t+1,o=e+r_offset;break;case 14:r=t+t_offset,i=e,n=t,o=e+l_offset}r>-1&&line(r*sq_size+s*unit,i*sq_size,n*sq_size+s*unit,o*sq_size),_>-1&&line(_*sq_size+s*unit,a*sq_size,d*sq_size+s*unit,l*sq_size)}function drawLayer(t,e){noFill(),h=colorHues[t],s=colorSats[t],l=colorLights[t],stroke(360*h,map(s,0,1,35,95),map(l,0,1,35,65));for(let t=0;t<grid_size+1;t++){grid[t]=[],mean_grid[t]=[];for(let e=0;e<grid_size+1;e++)grid[t][e]=0,mean_grid[t][e]=0}start2=0,end2=0,"layered"==layer_type&&(start=floor(map(t,0,num_layers-1,0,pts.length/2)),end=map(t,0,num_layers-1,pts.length/2,pts.length)),"inscribed"==layer_type&&(start=floor(map(t,0,num_layers-1,0,.46*pts.length)),end=map(t,0,num_layers-1,pts.length,.54*pts.length)),"circumscribed"==layer_type&&(start=floor(map(t,0,num_layers-1,0,pts.length*((num_layers-1)/num_layers))),end=min(start+pts.length/2,pts.length),start+pts.length/2>pts.length?(start2=0,end2=start-pts.length/2):(start2=0,end2=0));for(let t=start;t<end;t++)x=floor(pts[t][0]*(grid_size+1)),y=floor(pts[t][1]*(grid_size+1)),z=floor(pts[t][2]*(grid_size+1)),grid[x][y]+=1;for(let t=start2;t<end2;t++)x=floor(pts[t][0]*(grid_size+1)),y=floor(pts[t][1]*(grid_size+1)),z=floor(pts[t][2]*(grid_size+1)),grid[x][y]+=1;for(let t=0;t<5;t++){for(let t=0;t<grid.length;t++)for(let e=0;e<grid[0].length;e++){count=0;for(let s=-mean_size;s<=mean_size;s++)for(let r=-mean_size;r<=mean_size;r++)t+s>=0&&t+s<grid.length&&e+r>=0&&e+r<grid[0].length&&(mean_grid[t][e]+=grid[t+s][e+r]),count++;mean_grid[t][e]=mean_grid[t][e]/count}for(let t=0;t<grid.length;t++)for(let e=0;e<grid[0].length;e++)grid[t][e]=mean_grid[t][e]}for(let t=0;t<grid.length;t++)for(let s=0;s<grid[0].length;s++)grid[t][s]+=saved_noise[e][t][s];threshold=map(t,0,num_layers-1,.25,.75);for(let t=0;t<grid_size;t++)for(let s=0;s<grid_size;s++)outlineSquare(t,s,e)}function mousePressed(){mouseButton==LEFT&&(mouse_index=floor(mouseX/unit),mouseY/unit<=1&&mouseY/unit>=0&&(mouse_flags[mouse_index]=!0))}function keyPressed(){3==draw_mode&&(83==keyCode&&save("primordial"+tokenData.tokenId.toString()+".png"),49==keyCode&&(img=createGraphics(unit,unit),img.pixelDensity(pixelDensity),img.copy(canv,0,0,unit,unit,0,0,unit,unit),img.save("primordial"+tokenData.tokenId.toString()+"_1.png")),50==keyCode&&(img=createGraphics(unit,unit),img.pixelDensity(pixelDensity),img.copy(canv,unit,0,unit,unit,0,0,unit,unit),img.save("primordial"+tokenData.tokenId.toString()+"_2.png")),51==keyCode&&(img=createGraphics(unit,unit),img.pixelDensity(pixelDensity),img.copy(canv,2*unit,0,unit,unit,0,0,unit,unit),img.save("primordial"+tokenData.tokenId.toString()+"_3.png")))}function draw(){if(noStroke(),fill(color(0,0,0,5)),0==draw_mode&&(0==trip_iter?updateExpressions("b",!1):updateExpressions(change_var,!1),pts=mapPts(),saved_pts[trip_iter]=pts,updateGrid(pts),draw_mode++,t2=0),1==draw_mode&&(drawLayer(t2,trip_iter),t2++,t2==num_layers&&(draw_mode=2,t3=0)),2==draw_mode&&(t3+=1,t3==num_layers))if(checkPts(pts))if(trip_iter++,3==trip_iter){draw_mode=3;for(let t=0;t<10;t++)updateExpressions(change_var,!0)}else draw_mode=0;else fill(0),noStroke(),square(trip_iter*unit,0,unit),draw_mode=0;if(3==draw_mode)for(let t=0;t<3;t++)mouse_flags[t]&&(mouse_flags[t]=!1,trip_iters[t]=0,attempt_nums[t]=(attempt_nums[t]+total_attempts-1)%total_attempts,attempt_functions=saved_functions[attempt_nums[t]],f_string=attempt_functions[0],f_string2=attempt_functions[1],f_string3=attempt_functions[2],saved_pts[t]=mapPts(),fill(0),noStroke(),square(t*unit,0,unit)),trip_iters[t]<num_layers&&(pts=saved_pts[t],drawLayer(trip_iters[t],t),trip_iters[t]++)}
Organic forms gather and intersect to create distinct arrangements. Each one is a captured moment, like a plankton on a microscope slide. Coquina explores the balance between stochasticity and structure in what makes a shape. Price: 0.1Ξ 25% of primary proceeds will be donated to a donor-advised fund on Endaoment.org, with the first intended grant recipient being the National Women's Law Center.
Organic forms gather and intersect to create distinct arrangements. Each one is a captured moment, like a plankton on a microscope slide. Coquina explores the balance between stochasticity and structure in what makes a shape. Pricing: Dutch Auction, starts at 2Ξ, decreases every 5 minutes to rest at 0.2Ξ. 2Ξ > 1.5Ξ > 1.2Ξ > 0.9Ξ > 0.7Ξ > 0.5Ξ > 0.4Ξ > 0.3Ξ > 0.25Ξ > 0.2Ξ 25% of primary proceeds will be donated to a donor-advised fund on Endaoment.org, with the first intended grant recipient being the National Women's Law Center.
Organic forms gather and intersect to create distinct arrangements. Each one is a captured moment, like a plankton on a microscope slide. Coquina explores the balance between stochasticity and structure in what makes a shape. Pricing: Dutch Auction, starts at 2Ξ, decreases every 5 minutes to rest at 0.2Ξ. 2Ξ > 1.5Ξ > 1.2Ξ > 0.9Ξ > 0.7Ξ > 0.5Ξ > 0.4Ξ > 0.3Ξ > 0.25Ξ > 0.2Ξ
Organic forms gather and intersect to create distinct arrangements. Each one is a captured moment, like a plankton on a microscope slide. Coquina explores the balance between stochasticity and structure in what makes a shape.