Advertisement
Guest User

Koch Snowflake

a guest
Dec 8th, 2016
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1.  
  2. // Shadron - Koch Snowflake
  3. // by Viktor Chlumsky
  4.  
  5. #include <math_constants>
  6.  
  7. parameter float LEVEL = 5.9999 : range(0, 8);
  8. parameter float tip;
  9.  
  10. #define TIME (mod(shadron_Time, 6.0))
  11. #define LEVEL (clamp(1.5*TIME, 0.0, 4.99999))
  12. #define tip (smoothstep(0.0, 1.0, clamp(0.5*(5.5-TIME), 0.0, 1.0)))
  13.  
  14. glsl vec4 kochPoint(int index) {
  15. vec2[5] points = vec2[5](
  16. vec2(0.0, 0.0),
  17. vec2(1.0/3.0*tip, 0.0),
  18. vec2(0.5, 0.5/3.0*ROOT3*tip),
  19. vec2(1.0-1.0/3.0*tip, 0.0),
  20. vec2(1.0, 0.0)
  21. );
  22.  
  23. int ILEVEL = int(LEVEL)+1;
  24. float pLevel = LEVEL-float(ILEVEL-1);
  25. pLevel = smoothstep(0.0, 1.0, pLevel);
  26.  
  27. int shift = 2*ILEVEL;
  28. int k = index>>shift;
  29. float a = TAU/3.0*float(k);
  30. vec2 coord = vec2(sin(a), cos(a));
  31. a = TAU/3.0*float(k+1);
  32. vec2 dir = vec2(sin(a), cos(a))-coord;
  33. mat2 space = mat2(dir.x, dir.y, -dir.y, dir.x);
  34.  
  35. for (int i = 0; i < ILEVEL-1; ++i) {
  36. shift -= 2;
  37. k = index>>shift&3;
  38. coord += space*points[k];
  39. dir = space*(points[k+1]-points[k]);
  40. space = mat2(dir.x, dir.y, -dir.y, dir.x);
  41. }
  42.  
  43. points[1].x = mix(0.0, 1.0/3.0*tip, pLevel);
  44. points[2].y = mix(0.0, 0.5/3.0*ROOT3*tip, pLevel);
  45. points[3].x = mix(0.5, 1.0-1.0/3.0*tip, pLevel);
  46.  
  47. shift -= 2;
  48. k = index>>shift&3;
  49. coord += space*points[k];
  50. dir = space*(points[k+1]-points[k]);
  51. space = mat2(dir.x, dir.y, -dir.y, dir.x);
  52.  
  53. return vec4(0.9375*coord, 0.0, 1.0);
  54. }
  55.  
  56. #define LEVEL 5
  57.  
  58. model animation Koch :
  59. dimensions(256),
  60. vertex_animated(kochPoint, line_loop, 3*(1<<(2*(int(LEVEL)+1)))),
  61. background(vec4(vec3(0.0), 1.0)),
  62. multisample(16);
  63.  
  64. export png_sequence(Koch, "koch/img?.png", 30, 6.0);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement