Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Shadron - Koch Snowflake
- // by Viktor Chlumsky
- #include <math_constants>
- parameter float LEVEL = 5.9999 : range(0, 8);
- parameter float tip;
- #define TIME (mod(shadron_Time, 6.0))
- #define LEVEL (clamp(1.5*TIME, 0.0, 4.99999))
- #define tip (smoothstep(0.0, 1.0, clamp(0.5*(5.5-TIME), 0.0, 1.0)))
- glsl vec4 kochPoint(int index) {
- vec2[5] points = vec2[5](
- vec2(0.0, 0.0),
- vec2(1.0/3.0*tip, 0.0),
- vec2(0.5, 0.5/3.0*ROOT3*tip),
- vec2(1.0-1.0/3.0*tip, 0.0),
- vec2(1.0, 0.0)
- );
- int ILEVEL = int(LEVEL)+1;
- float pLevel = LEVEL-float(ILEVEL-1);
- pLevel = smoothstep(0.0, 1.0, pLevel);
- int shift = 2*ILEVEL;
- int k = index>>shift;
- float a = TAU/3.0*float(k);
- vec2 coord = vec2(sin(a), cos(a));
- a = TAU/3.0*float(k+1);
- vec2 dir = vec2(sin(a), cos(a))-coord;
- mat2 space = mat2(dir.x, dir.y, -dir.y, dir.x);
- for (int i = 0; i < ILEVEL-1; ++i) {
- shift -= 2;
- k = index>>shift&3;
- coord += space*points[k];
- dir = space*(points[k+1]-points[k]);
- space = mat2(dir.x, dir.y, -dir.y, dir.x);
- }
- points[1].x = mix(0.0, 1.0/3.0*tip, pLevel);
- points[2].y = mix(0.0, 0.5/3.0*ROOT3*tip, pLevel);
- points[3].x = mix(0.5, 1.0-1.0/3.0*tip, pLevel);
- shift -= 2;
- k = index>>shift&3;
- coord += space*points[k];
- dir = space*(points[k+1]-points[k]);
- space = mat2(dir.x, dir.y, -dir.y, dir.x);
- return vec4(0.9375*coord, 0.0, 1.0);
- }
- #define LEVEL 5
- model animation Koch :
- dimensions(256),
- vertex_animated(kochPoint, line_loop, 3*(1<<(2*(int(LEVEL)+1)))),
- background(vec4(vec3(0.0), 1.0)),
- multisample(16);
- export png_sequence(Koch, "koch/img?.png", 30, 6.0);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement