home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / graphics / mand2000.lha / Mand2000Demo / ARexx / IterMovie.mnd2 < prev    next >
Text File  |  1994-10-08  |  9KB  |  292 lines

  1. /* This script is supplied with the Mand2000 demo and release */
  2. /* versions and may be freely distributed. */
  3. /* Copyright 1993 Cygnus Software. */
  4.  
  5. /* An ARexx script for creating iteration movies. */
  6.  
  7. /* This script has been updated for Mand2000 version 2.0, and now creates */
  8. /* animation files directly. */
  9.  
  10. /*
  11.     When Mand2000 calculates a picture, it stores the iteration counts
  12. for each pixel, memory permitting.  This means that if you calculate a
  13. movie at an iteration count of, say, 1000, Mand2000 can redisplay that
  14. picture the way it would look with an iteration count of any number under
  15. 1000, without doing any recalculating.  This script makes use of that
  16. features to allow fast and easy creation of iteration movies.  These
  17. animations can look quite impressive, as fractal fingers gradually take
  18. over the black screen.
  19.  
  20.     This script asks the user for some input to help it create a
  21. reasonable movie.  The first thing it asks for is the final iteration
  22. count.  After that it asks the user for the starting iteration count.  For
  23. best results let the picture completely calculate at the final iteration
  24. count before you set it to the starting iteration count.  Typically you
  25. want the final iteration count to have pretty much all of the colour that
  26. is going to appear be there.  Typically you want the start iteration count
  27. to make the picture black.
  28.  
  29.     When you've set these values the script tells Mand2000 to ask
  30. you for the name of an animation file to save the images to.  This is
  31. a substantial improvement over Mand2000 1.0, where the frames were
  32. written out to separate files.  If the iterations are changing too
  33. quickly, or too slowly, you can adjust the IterInc, SpeedUpPoint and
  34. IncDivisor values to tune your movie.
  35.     IterInc is the initial amount by which the iterations are
  36. incremented after each frame.
  37.     SpeedUpPoint is the iteration count at which the iteration level
  38. starts changing faster.
  39.     IncDivisor adjusts how quickly the increase speeds up.  Smaller
  40. numbers make it increase faster.
  41.  
  42.     Because Mand2000 is live the whole time this movie is being
  43. generated, you can also adjust things on the fly.  If the final stages are
  44. obviously taking too long you can use the max iterations requester to
  45. manually increase the iterations, thus cutting out some of the unecessary
  46. frames.
  47.  
  48.     The resulting animation can be easily loaded into DPaint or any
  49. animation player.
  50.     */
  51.  
  52. portname = address()    /* Retrieve the current port name. */
  53. /* If the portname does not start with MAND2000 then this script must */
  54. /* have been run with rx, rather than from Mand2000.  Therefore we */
  55. /* need to set the port name.  We do not always set the port name */
  56. /* because it is better to let Mand2000 set it for us, so that */
  57. /* this script can be used with windows other than the one with */
  58. /* port name MAND2000.1. */
  59. if (left(portname, 8) ~= "MAND2000") THEN
  60.     address 'MAND2000.1'
  61.  
  62. options results
  63.  
  64. /* Settings for Axis Mand. */
  65.  
  66. /*IterInc = 1*/
  67. /*SpeedUpPoint = 12*/
  68. /*IncDivisor = 15*/
  69. /*SpeedUpPoint2 = 300*/
  70. /*IncDivisor = 9*/
  71.  
  72. /* Settings for I like this one. */
  73. /*IterInc = 2*/
  74. /*SpeedUpPoint = 115*/
  75. /*IncDivisor = 6*/
  76. /*SpeedUpPoint2 = 115*/
  77. /*IncDivisor2 = 6*/
  78.  
  79. /* Settings for Nautilus. */
  80. IterInc = 2
  81. SpeedUpPoint = 235
  82. IncDivisor = 40        /* was 17 */
  83. SpeedUpPoint2 = 700
  84. IncDivisor2 = 5
  85.  
  86. /* Settings for Generic 1. */
  87. /*IterInc = 1*/
  88. /*SpeedUpPoint = 15*/
  89. /*IncDivisor = 10        /* was 17 */*/
  90. /*SpeedUpPoint2 = 700*/
  91. /*IncDivisor2 = 5*/
  92.  
  93. /* Settings for Needle. */
  94. /*IterInc = 2*/
  95. /*SpeedUpPoint = 315*/
  96. /*IncDivisor = 10*/
  97. /*SpeedUpPoint2 = 475*/
  98. /*IncDivisor2 = 6*/
  99.  
  100. /* Settings for all the way out. */
  101. /*IterInc = 2*/
  102. /*SpeedUpPoint = 75*/
  103. /*IncDivisor = 9*/
  104. /*SpeedUpPoint2 = 128*/
  105. /*IncDivisor2 = 4*/
  106.  
  107. /* Settings for spiral galaxy. */
  108. /*IterInc = 2*/
  109. /*SpeedUpPoint = 90*/
  110. /*IncDivisor = 9*/
  111. /*SpeedUpPoint2 = 90*/
  112. /*IncDivisor2 = 9*/
  113.  
  114. /* Settings for double spiral. */
  115. /*IterInc = 25*/
  116. /*SpeedUpPoint = 3500*/
  117. /*IncDivisor = 6*/
  118. /*SpeedUpPoint2 = 3500*/
  119. /*IncDivisor2 = 6*/
  120.  
  121.  
  122. /* Parse out the command option.  This script is called when the */
  123. /* user wants a movie started, when the user wants a movie */
  124. /* aborted and whenever one of the pictures in the sequence is done.  */
  125.  
  126. parse arg command
  127.  
  128. command = upper(command)    /* Make sure the command is in upper case. */
  129.  
  130. if (command = START) then
  131.     CALL StartIterMovie()
  132. else if (command = STOP) then
  133.     CALL StopIterMovie()
  134. else
  135.     CALL ContinueIterMovie()
  136.  
  137. Exit
  138.  
  139.  
  140.  
  141. CleanupStartup:
  142.     /* Turn the maxiters requester off, if that's how it started. */
  143.     if (maxitersstate = 0) THEN
  144.         REQUESTER MAXITERS OFF
  145.     /* Reset the MinimizeHammies flag. */
  146.     MINIMIZEHAMMIES minhammiesflag
  147.     RETURN 0
  148.  
  149.  
  150.  
  151. StartIterMovie:
  152.     DECPAUSE        /* Allow Mand2000 to resume calculating while this script executes. */
  153.     REQUESTER MAXITERS    /* See whether the maxiters requester is up already. */
  154.     maxitersstate = RESULT
  155.     REQUESTER MAXITERS ON    /* Force it to be up regardless. */
  156.     MINIMIZEHAMMIES
  157.     minhammiesstate = RESULT;
  158.     if (minhammiesstate == 1) THEN
  159.         minhammiesflag = "ON"
  160.     else
  161.         minhammiesflag = "OFF"
  162.     MINIMIZEHAMMIES OFF    /* Force this flag off - having it on makes for really badly compressed animations. */
  163.     REQUESTRESPONSE "This ARexx script makes an|animation by having the maximum|iterations of a fractal picture|increase from frame to frame.|Select `Continue' on this|requester when you have set max|iters to the desired finish value.|You should set it to the smallest|value that causes all, or almost|all, coloured pixels to be filled|in, then wait for the picture to|finish calculating before|selecting `OK'."
  164.     if (RC == 3) THEN DO
  165.         CALL CleanupStartup
  166.         RETURN 0
  167.         END
  168.     GETATTR stem PROJ
  169.     CALL SETCLIP("Mand2000IterEnd", PROJ.MAXITERS)
  170.  
  171.     /* Try to make sure that the high iteration picture is finished before continuing. */
  172.     /* This allows Mand2000 to create the animation MUCH faster.  If you wanted to you */
  173.     /* could change the script so that it loops until the picture is done. */
  174.     if (PROJ.DONE ~= 1) THEN DO
  175.         REQUESTRESPONSE "Click `OK' when this|picture finishes calculating."
  176.         if (RC == 3) THEN DO
  177.             CALL CleanupStartup
  178.             RETURN 0
  179.             END
  180.         END
  181.  
  182.     REQUESTER MAXITERS ON    /* Force it to be up regardless. */
  183.     REQUESTRESPONSE "Now click `OK' when you have|set max iters to the desired start|value for the animation.|Typically you will want to set it|to the highest value where the|screen is all black."
  184.     if (RC == 3) THEN DO
  185.         CALL CleanupStartup
  186.         RETURN 0
  187.         END
  188.  
  189.     /* Turn the maxiters requester off, if that's how it started. */
  190.     if (maxitersstate = 0) THEN
  191.         REQUESTER MAXITERS OFF
  192.  
  193.     REQUESTSAVEFILE 'title="Iter anim file name."' 'path="RAM:"' 'file="Iter.Anim"'
  194.     if (RC ~= 0) THEN DO
  195.         REQUESTNOTIFY "No filename given."
  196.         MINIMIZEHAMMIES minhammiesflag
  197.         RETURN 0
  198.         END
  199.  
  200.     OpenAnim result
  201.     if (RC ~= 0) THEN DO
  202.         REQUESTNOTIFY "Couldn't open requested file."
  203.         MINIMIZEHAMMIES minhammiesflag
  204.         RETURN 0
  205.         END
  206.  
  207.     /* Put a command in the user menu for stopping the movie creation. */
  208.     menu '"------------------------"'
  209.     menu '"Stop Iter Movie"' itermovie stop
  210.  
  211.     INCPAUSE        /* Stop calculations again. */
  212.     CALL SETCLIP("Mand2000FrameNum", 1)
  213.     /* Tell Mand2000 to call this script whenever a pictures finishes calculating. */
  214.     EVENTACTION PICTUREDONE IterMovie
  215.  
  216.     CALL SETCLIP("MINIMIZEHAMMIESSETTING", minhammiesflag)
  217.  
  218.     GETATTR stem PROJ
  219.     if (PROJ.DONE = 1) THEN
  220.         CALL ContinueIterMovie()    /* If the current frame is already finished, save it and go to  */
  221.                     /* the next one.  Otherwise wait for this routine to be called   */
  222.                     /* again when the picture does finish calculating. */
  223.     RETURN 0
  224.  
  225.  
  226.  
  227. StopIterMovie:
  228.     /* Tell Mand2000 not to call this script any more. */
  229.     EVENTACTION PICTUREDONE
  230.     /* Remove the `stop iter movie' menu. */
  231.     CLEARNMENUS 2
  232.     CALL SETCLIP("Mand2000Iters")
  233.     CloseAnim
  234.     minhammiesflag = GETCLIP("MINIMIZEHAMMIESSETTING")
  235.     MINIMIZEHAMMIES minhammiesflag
  236.     FRAMENUM = GETCLIP("Mand2000FrameNum")
  237.     if (FRAMENUM = "") THEN
  238.         EXIT
  239.     CALL SETCLIP("Mand2000FrameNum")
  240.     if (FRAMENUM = 1) THEN
  241.         REQUESTNOTIFY "Zero frames created."
  242.     else if (FRAMENUM = 2) THEN
  243.         REQUESTNOTIFY "One frame created."
  244.     else
  245.         REQUESTNOTIFY "Just created a "FRAMENUM - 1" frame anim.|Use BigAnim or MainView to play it."
  246.     RETURN 0
  247.  
  248.  
  249.  
  250. ContinueIterMovie:
  251.     FRAMENUM = GETCLIP("Mand2000FrameNum")
  252.     WriteAnimFrame
  253.     if (RC ~= 0) THEN DO
  254.         REQUESTNOTIFY "Error in saving frame "FRAMENUM".|Aborting animation.|Animation file may be corrupt."
  255.         CALL StopIterMovie()
  256.         EXIT
  257.         END
  258.     FRAMENUM = FRAMENUM + 1
  259.     CALL SETCLIP("Mand2000FrameNum", FRAMENUM)
  260.  
  261.     GETATTR stem PROJ
  262.     ITERNUM = PROJ.MAXITERS
  263.     ENDITERNUM = GETCLIP("Mand2000IterEnd")
  264.     if (ITERNUM >= ENDITERNUM) THEN DO
  265.         CALL StopIterMovie()
  266.         EXIT
  267.         END
  268.  
  269. /* Custom code for a particular picture. */
  270. /*    ITERNUM = ITERNUM + 1*/
  271. /**/
  272. /*    if (ITERNUM > 25) THEN*/
  273. /*        ITERNUM = ITERNUM + 1*/
  274. /**/
  275. /*    if (ITERNUM > 32) THEN*/
  276. /*        ITERNUM = ITERNUM + (ITERNUM - 26) % 4*/
  277. /**/
  278. /*    if (ITERNUM > 100) THEN*/
  279. /*        ITERNUM = ITERNUM + (ITERNUM - 26) % 6*/
  280.  
  281.     ITERNUM = ITERNUM + IterInc
  282.     if (ITERNUM > SpeedUpPoint2) THEN
  283.         ITERNUM = ITERNUM + 2 + (ITERNUM - SpeedUpPoint) % IncDivisor2
  284.     else if (ITERNUM > SpeedUpPoint) THEN
  285.         ITERNUM = ITERNUM + (ITERNUM - SpeedUpPoint) % IncDivisor
  286.  
  287.     if (ITERNUM >= ENDITERNUM) THEN
  288.         ITERNUM = ENDITERNUM
  289.  
  290.     MAXITERS ITERNUM
  291.     RETURN 0
  292.