// Standalone research probe. Synthetic operator composition inspired by VoxelForge; // NOT extracted production code. Compile with MSVC /O2 /arch:AVX2 /std:c++20. #include #include #include #include #include #include #include #include constexpr int N=256, B=8, W=6; using V=__m256i; static std::vector scalarField(size_t(N)*N*N), vectorField(size_t(N)*N*N); alignas(32) static int32_t fadeTable[256]; static inline uint32_t hashS(uint32_t x,uint32_t y,uint32_t z,uint32_t seed){ uint32_t h=seed^(x*0x9e3779b1u)^(y*0x85ebca77u)^(z*0xc2b2ae3du); h^=h>>16; h*=0x7feb352du; h^=h>>15; h*=0x846ca68bu; return h^(h>>16); } static inline V hashV(V x,V y,V z,V seed){ V h=_mm256_xor_si256(seed,_mm256_xor_si256(_mm256_mullo_epi32(x,_mm256_set1_epi32(0x9e3779b1u)), _mm256_xor_si256(_mm256_mullo_epi32(y,_mm256_set1_epi32(0x85ebca77u)),_mm256_mullo_epi32(z,_mm256_set1_epi32(0xc2b2ae3du))))); h=_mm256_xor_si256(h,_mm256_srli_epi32(h,16)); h=_mm256_mullo_epi32(h,_mm256_set1_epi32(0x7feb352du)); h=_mm256_xor_si256(h,_mm256_srli_epi32(h,15)); h=_mm256_mullo_epi32(h,_mm256_set1_epi32(0x846ca68bu)); return _mm256_xor_si256(h,_mm256_srli_epi32(h,16)); } static inline int lerpS(int a,int b,int t){return a+((b-a)*t>>8);} static inline V lerpV(V a,V b,V t){return _mm256_add_epi32(a,_mm256_srai_epi32(_mm256_mullo_epi32(_mm256_sub_epi32(b,a),t),8));} static inline int gradS(uint32_t h,int x,int y,int z){ h&=15;int u=(h&8)?y:x;int v=(h&12)==0?y:((h&13)==12?x:z); return ((h&1)?-u:u)+((h&2)?-v:v); } static inline V selectV(V mask,V a,V b){return _mm256_blendv_epi8(b,a,mask);} static inline V gradV(V h,V x,V y,V z){ V zero=_mm256_setzero_si256(); h=_mm256_and_si256(h,_mm256_set1_epi32(15)); V u=selectV(_mm256_cmpeq_epi32(_mm256_and_si256(h,_mm256_set1_epi32(8)),zero),x,y); V isY=_mm256_cmpeq_epi32(_mm256_and_si256(h,_mm256_set1_epi32(12)),zero); V isX=_mm256_cmpeq_epi32(_mm256_and_si256(h,_mm256_set1_epi32(13)),_mm256_set1_epi32(12)); V v=selectV(isY,y,selectV(isX,x,z)); V negU=_mm256_cmpeq_epi32(_mm256_and_si256(h,_mm256_set1_epi32(1)),_mm256_set1_epi32(1)); V negV=_mm256_cmpeq_epi32(_mm256_and_si256(h,_mm256_set1_epi32(2)),_mm256_set1_epi32(2)); return _mm256_add_epi32(_mm256_sub_epi32(_mm256_xor_si256(u,negU),negU),_mm256_sub_epi32(_mm256_xor_si256(v,negV),negV)); } static inline int noiseS(int x,int y,int z,int shift,int seed){ int ix=x>>shift,iy=y>>shift,iz=z>>shift,fx=(x&((1<>8);} static inline V smoothMaxV(V a,V b){V d=_mm256_sub_epi32(a,b);V h=_mm256_max_epi32(_mm256_setzero_si256(),_mm256_sub_epi32(_mm256_set1_epi32(64),_mm256_abs_epi32(d))); return _mm256_add_epi32(_mm256_max_epi32(a,b),_mm256_srai_epi32(_mm256_mullo_epi32(h,h),8));} static inline V evalV(V x,V y,V z){ V c=_mm256_set1_epi32(1024), warp=_mm256_srai_epi32(noiseV(_mm256_add_epi32(x,c),_mm256_add_epi32(y,c),_mm256_add_epi32(z,c),4,17),4); V nx=_mm256_add_epi32(_mm256_add_epi32(x,c),warp),ny=_mm256_sub_epi32(_mm256_add_epi32(y,c),warp),nz=_mm256_add_epi32(z,c); V fb=_mm256_add_epi32(noiseV(nx,ny,nz,4,100),_mm256_add_epi32(_mm256_srai_epi32(noiseV(nx,ny,nz,3,101),1),_mm256_srai_epi32(noiseV(nx,ny,nz,2,102),2))); V ridge=_mm256_sub_epi32(_mm256_set1_epi32(128),_mm256_abs_epi32(noiseV(nx,ny,nz,3,202))); // Scalar signed division truncates toward zero; AVX2 shift rounds negative down. // Correct sign before shift to make the two exact. auto divPow2=[](V a,int shift){V bias=_mm256_and_si256(_mm256_srai_epi32(a,31),_mm256_set1_epi32((1<>4; int nx=x+1024+warp,ny=y+1024-warp,nz=z+1024; int fb=noiseS(nx,ny,nz,4,100)+(noiseS(nx,ny,nz,3,101)>>1)+(noiseS(nx,ny,nz,2,102)>>2); int ridge=128-std::abs(noiseS(nx,ny,nz,3,202)); int stratum=std::min(z-84+fb/4,170-z+ridge/4); int dy=y-128,dz=z-128,dx=x-128; int passage=(18*18-dy*dy-dz*dz)/8,room=(35*35-dx*dx-dy*dy-dz*dz)/16; return smoothMaxS(stratum,smoothMaxS(passage,room)); } static inline size_t idx(int x,int y,int z){return(size_t(z)*N+y)*N+x;} template static double ms(F&& f){auto t=std::chrono::steady_clock::now();f();return std::chrono::duration(std::chrono::steady_clock::now()-t).count();} template static void parallel(F fn){std::array threads;for(int k=0;k points(200000);uint32_t rng=0x12345678; for(auto& p:points){rng^=rng<<13;rng^=rng>>17;rng^=rng<<5;p.x=int(rng&255); rng^=rng<<13;rng^=rng>>17;rng^=rng<<5;p.y=int(rng&255); rng^=rng<<13;rng^=rng>>17;rng^=rng<<5;p.z=int(rng&255);} for(int t=0;t<3;++t){int64_t checksum=0;double q=ms([&]{for(const auto& p:points)checksum+=evalS(p.x,p.y,p.z);}); std::printf("random_query trial=%d count=%zu ms=%.3f ns_per_query=%.1f checksum=%lld\n",t,points.size(),q,q*1e6/points.size(),(long long)checksum);} // Radius 10m at 25cm grid, center on tile boundary. Count exact AABB touched bricks. const int cx=128,cy=128,cz=128,r=40;int touched=0;for(int bz=0;bz next(vectorField.size());double copy=ms([&]{next=vectorField;});size_t changed=0;double edit=ms([&]{parallel([&](int za,int zb){for(int z=std::max(za,cz-r);z=0){int d=std::max(vectorField[idx(x,y,z)],q/16);next[idx(x,y,z)]=(int16_t)d;}}});}); for(int z=cz-r;z<=cz+r;++z)for(int y=cy-r;y<=cy+r;++y)for(int x=cx-r;x<=cx+r;++x)changed+=next[idx(x,y,z)]!=vectorField[idx(x,y,z)]; std::printf("crater copy_ms=%.3f edit_ms=%.3f changed_lattice=%zu copy_bytes=%zu\n",copy,edit,changed,vectorField.size()*sizeof(int16_t)); }