|
@@ -81,6 +81,7 @@ extern float stb_perlin_noise3(float x, float y, float z, int x_wrap, int y_wrap
|
|
|
extern float stb_perlin_ridge_noise3(float x, float y, float z, float lacunarity, float gain, float offset, int octaves);
|
|
|
extern float stb_perlin_fbm_noise3(float x, float y, float z, float lacunarity, float gain, int octaves);
|
|
|
extern float stb_perlin_turbulence_noise3(float x, float y, float z, float lacunarity, float gain, int octaves);
|
|
|
+extern float stb_perlin_noise3_wrap_nonpow2(float x, float y, float z, int x_wrap, int y_wrap, int z_wrap, unsigned char seed);
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
|
#endif
|
|
@@ -321,6 +322,66 @@ float stb_perlin_turbulence_noise3(float x, float y, float z, float lacunarity,
|
|
|
return sum;
|
|
|
}
|
|
|
|
|
|
+float stb_perlin_noise3_wrap_nonpow2(float x, float y, float z, int x_wrap, int y_wrap, int z_wrap, unsigned char seed)
|
|
|
+{
|
|
|
+ float u,v,w;
|
|
|
+ float n000,n001,n010,n011,n100,n101,n110,n111;
|
|
|
+ float n00,n01,n10,n11;
|
|
|
+ float n0,n1;
|
|
|
+
|
|
|
+ int px = stb__perlin_fastfloor(x);
|
|
|
+ int py = stb__perlin_fastfloor(y);
|
|
|
+ int pz = stb__perlin_fastfloor(z);
|
|
|
+ int x_wrap2 = (x_wrap ? x_wrap : 256);
|
|
|
+ int y_wrap2 = (y_wrap ? y_wrap : 256);
|
|
|
+ int z_wrap2 = (z_wrap ? z_wrap : 256);
|
|
|
+ int x0 = px % x_wrap2, x1;
|
|
|
+ int y0 = py % y_wrap2, y1;
|
|
|
+ int z0 = pz % z_wrap2, z1;
|
|
|
+ int r0,r1, r00,r01,r10,r11;
|
|
|
+
|
|
|
+ if (x0 < 0) x0 += x_wrap2;
|
|
|
+ if (y0 < 0) y0 += y_wrap2;
|
|
|
+ if (z0 < 0) z0 += z_wrap2;
|
|
|
+ x1 = (x0+1) % x_wrap2;
|
|
|
+ y1 = (y0+1) % y_wrap2;
|
|
|
+ z1 = (z0+1) % z_wrap2;
|
|
|
+
|
|
|
+ #define stb__perlin_ease(a) (((a*6-15)*a + 10) * a * a * a)
|
|
|
+
|
|
|
+ x -= px; u = stb__perlin_ease(x);
|
|
|
+ y -= py; v = stb__perlin_ease(y);
|
|
|
+ z -= pz; w = stb__perlin_ease(z);
|
|
|
+
|
|
|
+ r0 = stb__perlin_randtab[x0];
|
|
|
+ r0 = stb__perlin_randtab[r0+seed];
|
|
|
+ r1 = stb__perlin_randtab[x1];
|
|
|
+ r1 = stb__perlin_randtab[r1+seed];
|
|
|
+
|
|
|
+ r00 = stb__perlin_randtab[r0+y0];
|
|
|
+ r01 = stb__perlin_randtab[r0+y1];
|
|
|
+ r10 = stb__perlin_randtab[r1+y0];
|
|
|
+ r11 = stb__perlin_randtab[r1+y1];
|
|
|
+
|
|
|
+ n000 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r00+z0], x , y , z );
|
|
|
+ n001 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r00+z1], x , y , z-1 );
|
|
|
+ n010 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r01+z0], x , y-1, z );
|
|
|
+ n011 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r01+z1], x , y-1, z-1 );
|
|
|
+ n100 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r10+z0], x-1, y , z );
|
|
|
+ n101 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r10+z1], x-1, y , z-1 );
|
|
|
+ n110 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r11+z0], x-1, y-1, z );
|
|
|
+ n111 = stb__perlin_grad(stb__perlin_randtab_grad_idx[r11+z1], x-1, y-1, z-1 );
|
|
|
+
|
|
|
+ n00 = stb__perlin_lerp(n000,n001,w);
|
|
|
+ n01 = stb__perlin_lerp(n010,n011,w);
|
|
|
+ n10 = stb__perlin_lerp(n100,n101,w);
|
|
|
+ n11 = stb__perlin_lerp(n110,n111,w);
|
|
|
+
|
|
|
+ n0 = stb__perlin_lerp(n00,n01,v);
|
|
|
+ n1 = stb__perlin_lerp(n10,n11,v);
|
|
|
+
|
|
|
+ return stb__perlin_lerp(n0,n1,u);
|
|
|
+}
|
|
|
#endif // STB_PERLIN_IMPLEMENTATION
|
|
|
|
|
|
/*
|