|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /**
- * @license
- * Cellular noise ("Worley noise") in 2D in GLSL.
- * Copyright (c) Stefan Gustavson 2011-04-19. All rights reserved.
- * This code is released under the conditions of the MIT license.
- * See LICENSE file for details.
- */
-
- //#ifdef GL_OES_standard_derivatives
- // #extension GL_OES_standard_derivatives : enable
- //#endif
- //
- //float aastep (float threshold , float value)
- //{
- // float afwidth = 0.7 * length ( vec2 ( dFdx ( value ), dFdy ( value )));
- // return smoothstep ( threshold - afwidth , threshold + afwidth , value );
- //}
-
- // Permutation polynomial: (34x^2 + x) mod 289
- vec3 _czm_permute289(vec3 x)
- {
- return mod((34.0 * x + 1.0) * x, 289.0);
- }
-
- /**
- * DOC_TBA
- *
- * Implemented by Stefan Gustavson, and distributed under the MIT License. {@link http://openglinsights.git.sourceforge.net/git/gitweb.cgi?p=openglinsights/openglinsights;a=tree;f=proceduraltextures}
- *
- * @name czm_cellular
- * @glslFunction
- *
- * @see Stefan Gustavson's chapter, <i>Procedural Textures in GLSL</i>, in <a href="http://www.openglinsights.com/">OpenGL Insights</a>.
- */
- vec2 czm_cellular(vec2 P)
- // Cellular noise, returning F1 and F2 in a vec2.
- // Standard 3x3 search window for good F1 and F2 values
- {
- #define K 0.142857142857 // 1/7
- #define Ko 0.428571428571 // 3/7
- #define jitter 1.0 // Less gives more regular pattern
- vec2 Pi = mod(floor(P), 289.0);
- vec2 Pf = fract(P);
- vec3 oi = vec3(-1.0, 0.0, 1.0);
- vec3 of = vec3(-0.5, 0.5, 1.5);
- vec3 px = _czm_permute289(Pi.x + oi);
- vec3 p = _czm_permute289(px.x + Pi.y + oi); // p11, p12, p13
- vec3 ox = fract(p*K) - Ko;
- vec3 oy = mod(floor(p*K),7.0)*K - Ko;
- vec3 dx = Pf.x + 0.5 + jitter*ox;
- vec3 dy = Pf.y - of + jitter*oy;
- vec3 d1 = dx * dx + dy * dy; // d11, d12 and d13, squared
- p = _czm_permute289(px.y + Pi.y + oi); // p21, p22, p23
- ox = fract(p*K) - Ko;
- oy = mod(floor(p*K),7.0)*K - Ko;
- dx = Pf.x - 0.5 + jitter*ox;
- dy = Pf.y - of + jitter*oy;
- vec3 d2 = dx * dx + dy * dy; // d21, d22 and d23, squared
- p = _czm_permute289(px.z + Pi.y + oi); // p31, p32, p33
- ox = fract(p*K) - Ko;
- oy = mod(floor(p*K),7.0)*K - Ko;
- dx = Pf.x - 1.5 + jitter*ox;
- dy = Pf.y - of + jitter*oy;
- vec3 d3 = dx * dx + dy * dy; // d31, d32 and d33, squared
- // Sort out the two smallest distances (F1, F2)
- vec3 d1a = min(d1, d2);
- d2 = max(d1, d2); // Swap to keep candidates for F2
- d2 = min(d2, d3); // neither F1 nor F2 are now in d3
- d1 = min(d1a, d2); // F1 is now in d1
- d2 = max(d1a, d2); // Swap to keep candidates for F2
- d1.xy = (d1.x < d1.y) ? d1.xy : d1.yx; // Swap if smaller
- d1.xz = (d1.x < d1.z) ? d1.xz : d1.zx; // F1 is in d1.x
- d1.yz = min(d1.yz, d2.yz); // F2 is now not in d2.yz
- d1.y = min(d1.y, d1.z); // nor in d1.z
- d1.y = min(d1.y, d2.x); // F2 is in d1.y, we're done.
- return sqrt(d1.xy);
- }
|