home *** CD-ROM | disk | FTP | other *** search
/ The Net: Ultimate Internet Guide / WWLCD1.ISO / pc / workshop / author / newfeat / samples / lib.avr < prev    next >
Encoding:
Text File  |  1996-05-06  |  6.7 KB  |  247 lines

  1. // ActiveXAnimation 0.6 ascii
  2.  
  3. /*****************************************************************************\
  4. *
  5. * Export a number behavior through OLE
  6. *
  7. \*****************************************************************************/
  8.  
  9. exportNumber(numberIn, id) =
  10.     let
  11.         start number = numberIn;
  12.  
  13.         rec state(num0) =
  14.             let
  15.                 event =
  16.                     exportEvent(
  17.                         snapshot(
  18.                             predicate(num0 <> number),
  19.                             number
  20.                         ),
  21.                         id
  22.                     );
  23.             in
  24.                 num0 until event thenApply state;
  25.     in
  26.         state(0);
  27.  
  28. /*****************************************************************************\
  29. *
  30. * Standard library definitions
  31. *
  32. \*****************************************************************************/
  33.  
  34. normalMouse =
  35.     point2Xy(
  36.         xOf(mousePosition) / xOf(viewerUpperRight),
  37.         yOf(mousePosition) / yOf(viewerUpperRight)
  38.     );
  39.  
  40. /*****************************************************************************\
  41. *
  42. * Some additional colors
  43. *
  44. \*****************************************************************************/
  45.  
  46. darkGray = colorRgb(0.5, 0.5, 0.5);
  47. lightGray = colorRgb(0.75, 0.75, 0.75);
  48.  
  49. grayLevel(number) = colorRgb(number, number, number);
  50.  
  51. /*****************************************************************************\
  52. *
  53. * List functions
  54. *
  55. \*****************************************************************************/
  56.  
  57. fold(folder, value, lst) =
  58.     let
  59.         rec func(value, lst) =
  60.             if empty(lst) then
  61.                 value
  62.             else
  63.                 func(folder(head(lst), value), tail(lst));
  64.     in
  65.         func(value, lst);
  66.  
  67. foldIndex(folder, value, lst) =
  68.     let
  69.         rec func(value, lst, index) =
  70.             if empty(lst) then
  71.                 value
  72.             else
  73.                 func(
  74.                     folder(head(lst), value, index),
  75.                     tail(lst),
  76.                     index + 1
  77.                 );
  78.     in
  79.         func(value, lst, 1);
  80.  
  81. /*****************************************************************************\
  82. *
  83. * Reactivity
  84. *
  85. \*****************************************************************************/
  86.  
  87. accumState(accumFunc, startEvent, endEvent, state0, behavior) =
  88.     let rec
  89.         func(state0) =
  90.             let
  91.                 rec picked = accumFunc(state0, behavior) until
  92.                     snapshot(endEvent, picked) thenApply func;
  93.                 state = state0 until startEvent => picked;
  94.             in
  95.                 state;
  96.     in
  97.         func(state0);
  98.  
  99. /*****************************************************************************\
  100. *
  101. * Random
  102. *
  103. \*****************************************************************************/
  104.  
  105. snapRandom(min : number, max : number, seed) =
  106.     let
  107.         number = min + (max - min) * seededRandom(seed);
  108.     in
  109.         0 until snapshot(always, number) thenApply function(x) -> x;
  110.  
  111. randomBoolean(seed) =
  112.     if snapRandom(-1, 1, seed) < 0 then
  113.         true
  114.     else
  115.         false;
  116.  
  117. randomSign(seed) =
  118.     if randomBoolean(seed) then
  119.         -1
  120.     else
  121.         1;
  122.  
  123. /*****************************************************************************\
  124. *
  125. * Wrap functions
  126. *
  127. \*****************************************************************************/
  128.  
  129. wrapNumber(
  130.     min : number,
  131.     size : number,
  132.     number : number
  133. ) =
  134.     let
  135.         value = number - min;
  136.         wrap =
  137.             if value < 0 then
  138.                 size + mod(value, size)
  139.             else
  140.                 mod(value, size);
  141.     in
  142.         min + wrap;
  143.  
  144. wrapPoint3(
  145.     min : point3,
  146.     size : vector3,
  147.     point : point3
  148. ) =
  149.     point3Xyz(
  150.         wrapNumber(xOf(min), xOf(size), xOf(point)),
  151.         wrapNumber(yOf(min), yOf(size), yOf(point)),
  152.         wrapNumber(zOf(min), zOf(size), zOf(point))
  153.     );
  154.  
  155. /*****************************************************************************\
  156. *
  157. * prefix operators
  158. *
  159. \*****************************************************************************/
  160.  
  161. unionGeometry(x : geometry, y : geometry) = x union y;
  162.  
  163. preOr(x, y) = x or y;
  164. preAnd(x, y) = x and y;
  165.  
  166.      add(x : number, y : number) = x + y;
  167. subtract(x : number, y : number) = x - y;
  168. multiply(x : number, y : number) = x * y;
  169.   divide(x : number, y : number) = x / y;
  170.      max(x : number, y : number) = if (x >= y) then x else y;
  171.      min(x : number, y : number) = if (x <= y) then x else y;
  172.  
  173. composeTransform3(f : transform3, g : transform3) = f o g;
  174. composeTransform2(f : transform2, g : transform2) = f o g;
  175.  
  176. /*****************************************************************************\
  177. *
  178. * Behaviors useful for animation
  179. *
  180. \*****************************************************************************/
  181.  
  182. smooth0to1 = (0.5 - cos (time * pi) / 2);
  183.  
  184. /*****************************************************************************\
  185. *
  186. * Default mappings to images
  187. *
  188. \*****************************************************************************/
  189.  
  190. textImage(text : text)     = render(text);
  191. stringImage(string) = render(simpleText(string));
  192. numberImage(number) = stringImage(numberToString(number, 4));
  193. booleanImage(bool)  = stringImage(if bool then "true" else "false");
  194. soundImage(sound)   = stringImage("A sound");
  195. colorImage(color)   = solidColorImage(color);
  196.  
  197. orthogonalImage(geo, size : vector2) =
  198.     let
  199.         camera =
  200.             transform(
  201.                   translate(0, 0, 2)
  202.                 o scale(1, 1, 1e8),
  203.                 defaultCamera
  204.             );
  205.  
  206.         scaleFactor = min(xOf(size), yOf(size));
  207.     in
  208.         transform(
  209.             scale2(scaleFactor),
  210.             render(geo, camera)
  211.         );
  212.  
  213. geometryImage(geo, size : vector2) =
  214.     let
  215.         camera =
  216.             transform(
  217.                 translate(0, 0, 2),
  218.                 defaultCamera
  219.             );
  220.  
  221.         scaleFactor = min(xOf(size), yOf(size));
  222.     in
  223.         transform(
  224.             scale2(2.8 * scaleFactor),
  225.             render(geo, camera)
  226.         );
  227.  
  228. /*****************************************************************************\
  229. *
  230. * Fit an imported geometry into the unit sphere
  231. *
  232. \*****************************************************************************/
  233.  
  234. normalizeGeometry(geo : geometry) =
  235.     let
  236.         minPoint = first(boundingBox(geo));
  237.         maxPoint = second(boundingBox(geo));
  238.  
  239.         diag = length(maxPoint - minPoint);
  240.         center : vector3 = (origin3 - (minPoint + (maxPoint - origin3))) / 2;
  241.     in
  242.         transform(
  243.               scale3(2 / diag)
  244.             o translate(center),
  245.             geo
  246.         );
  247.