diff --git a/.gitignore b/.gitignore index db4c6d9..b186605 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dist -node_modules \ No newline at end of file +node_modules +.DS_Store diff --git a/package.json b/package.json index 5cc5ec5..a76a239 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cobe", - "version": "0.4.1", + "version": "0.4.2", "type": "module", "main": "./dist/index.esm.js", "files": [ diff --git a/src/shader.frag b/src/shader.frag index 3e8f7cd..9a165e7 100644 --- a/src/shader.frag +++ b/src/shader.frag @@ -77,9 +77,39 @@ vec3 nearestFibonacciLattice(vec3 p, out float m) { // float v = idx / kPhi; // float theta = fract(v) * kTau; - int iFracV = int(idx) * 2654435769; // signed be like nearest-to-zero fmod; 2^32/phi - float fracV = float(iFracV) * by2P32; - float theta = fracV * kTau; + // int iFracV = int(idx) * 2654435769; // signed be like nearest-to-zero fmod; 2^32/phi + // float fracV = float(iFracV) * by2P32; + // float theta = fracV * kTau; + + // https://github.com/shuding/cobe/issues/16 + + float tidx = idx; + float fracV = 0.; + + // see codegen + + if(tidx >= 524288.) { tidx-=524288.; fracV += 0.8038937048986554; } + if(tidx >= 262144.) { tidx-=262144.; fracV += 0.9019468524493277; } + if(tidx >= 131072.) { tidx-=131072.; fracV += 0.9509734262246639; } + if(tidx >= 65536.) { tidx-=65536.; fracV += 0.4754867131123319; } + if(tidx >= 32768.) { tidx-=32768.; fracV += 0.737743356556166; } + if(tidx >= 16384.) { tidx-=16384.; fracV += 0.868871678278083; } + if(tidx >= 8192.) { tidx-=8192.; fracV += 0.9344358391390415; } + if(tidx >= 4096.) { tidx-=4096.; fracV += 0.46721791956952075; } + if(tidx >= 2048.) { tidx-=2048.; fracV += 0.7336089597847604; } + if(tidx >= 1024.) { tidx-=1024.; fracV += 0.8668044798923802; } + if(tidx >= 512.) { tidx-=512.; fracV += 0.4334022399461901; } + if(tidx >= 256.) { tidx-=256.; fracV += 0.21670111997309505; } + if(tidx >= 128.) { tidx-=128.; fracV += 0.10835055998654752; } + if(tidx >= 64.) { tidx-=64.; fracV += 0.5541752799932738; } + if(tidx >= 32.) { tidx-=32.; fracV += 0.7770876399966369; } + if(tidx >= 16.) { tidx-=16.; fracV += 0.8885438199983184; } + if(tidx >= 8.) { tidx-=8.; fracV += 0.9442719099991592; } + if(tidx >= 4.) { tidx-=4.; fracV += 0.4721359549995796; } + if(tidx >= 2.) { tidx-=2.; fracV += 0.2360679774997898; } + if(tidx >= 1.) { tidx-=1.; fracV += 0.6180339887498949; } + + float theta = fract(fracV) * kTau; float cosphi = 1. - 2. * idx * byDots; float sinphi = sqrt(1. - cosphi * cosphi); diff --git a/src/shader.min.js b/src/shader.min.js index f2707e5..45978b6 100644 --- a/src/shader.min.js +++ b/src/shader.min.js @@ -1,7 +1,7 @@ export const GLSLX_SOURCE_MAIN = - 'precision highp float;uniform vec2 u;uniform vec3 J,K,x;uniform vec4 y[64];uniform float z,A,j,B,C,D,E;uniform sampler2D F;float G=1./j;mat3 H(float a,float b){float c=cos(a),d=cos(b),e=sin(a),f=sin(b);return mat3(d,f*e,-f*c,0.,c,e,f,d*-e,d*c);}vec3 v(vec3 a,out float w){a=a.xzy;float n=max(2.,floor(log2(2.236068*j*3.141593*(1.-a.z*a.z))*.72021));vec2 e=floor(pow(1.618034,n)/2.236068*vec2(1.,1.618034)+.5),b=fract((e+1.)*.618034)*6.283185-3.883222,c=-2.*e,d=vec2(atan(a.y,a.x),a.z-1.),o=floor(vec2(c.y*d.x-b.y*(d.y*j+1.),-c.x*d.x+b.x*(d.y*j+1.))/(b.x*c.y-c.x*b.y));float l=3.141593;vec3 p;for(float f=0.;f<4.;f+=1.){vec2 q=vec2(mod(f,2.),floor(f*.5));float h=dot(e,o+q);if(h>j)continue;int r=int(h)*-1640531527;float s=float(r)*2.328306e-10,i=s*6.283185,g=1.-2.*h*G,k=sqrt(1.-g*g);vec3 m=vec3(cos(i)*k,sin(i)*k,g);float t=length(a-m);if(t=M)break;vec4 o=y[i];vec3 p=o.xyz,w=p-f;float q=o.w;if(dot(w,w)>q*q*4.)continue;vec3 N=v(p,b);b=length(N-f),bk)continue;float a=j,b=0.;if(a>=524288.)a-=524288.,b+=.803894;if(a>=262144.)a-=262144.,b+=.901947;if(a>=131072.)a-=131072.,b+=.950973;if(a>=65536.)a-=65536.,b+=.475487;if(a>=32768.)a-=32768.,b+=.737743;if(a>=16384.)a-=16384.,b+=.868872;if(a>=8192.)a-=8192.,b+=.934436;if(a>=4096.)a-=4096.,b+=.467218;if(a>=2048.)a-=2048.,b+=.733609;if(a>=1024.)a-=1024.,b+=.866804;if(a>=512.)a-=512.,b+=.433402;if(a>=256.)a-=256.,b+=.216701;if(a>=128.)a-=128.,b+=.108351;if(a>=64.)a-=64.,b+=.554175;if(a>=32.)a-=32.,b+=.777088;if(a>=16.)a-=16.,b+=.888544;if(a>=8.)a-=8.,b+=.944272;if(a>=4.)a-=4.,b+=.472136;if(a>=2.)a-=2.,b+=.236068;if(a>=1.)a-=1.,b+=.618034;float l=fract(b)*6.283185,i=1.-2.*j*G,m=sqrt(1.-i*i);vec3 o=vec3(cos(l)*m,sin(l)*m,i);float t=length(c-o);if(t=M)break;vec4 o=y[i];vec3 p=o.xyz,w=p-f;float q=o.w;if(dot(w,w)>q*q*4.)continue;vec3 N=v(p,b);b=length(N-f),b