home *** CD-ROM | disk | FTP | other *** search
- // ActiveXAnimation 0.6 ascii
-
- /*****************************************************************************\
- *
- * Export a number behavior through OLE
- *
- \*****************************************************************************/
-
- exportNumber(numberIn, id) =
- let
- start number = numberIn;
-
- rec state(num0) =
- let
- event =
- exportEvent(
- snapshot(
- predicate(num0 <> number),
- number
- ),
- id
- );
- in
- num0 until event thenApply state;
- in
- state(0);
-
- /*****************************************************************************\
- *
- * Standard library definitions
- *
- \*****************************************************************************/
-
- normalMouse =
- point2Xy(
- xOf(mousePosition) / xOf(viewerUpperRight),
- yOf(mousePosition) / yOf(viewerUpperRight)
- );
-
- /*****************************************************************************\
- *
- * Some additional colors
- *
- \*****************************************************************************/
-
- darkGray = colorRgb(0.5, 0.5, 0.5);
- lightGray = colorRgb(0.75, 0.75, 0.75);
-
- grayLevel(number) = colorRgb(number, number, number);
-
- /*****************************************************************************\
- *
- * List functions
- *
- \*****************************************************************************/
-
- fold(folder, value, lst) =
- let
- rec func(value, lst) =
- if empty(lst) then
- value
- else
- func(folder(head(lst), value), tail(lst));
- in
- func(value, lst);
-
- foldIndex(folder, value, lst) =
- let
- rec func(value, lst, index) =
- if empty(lst) then
- value
- else
- func(
- folder(head(lst), value, index),
- tail(lst),
- index + 1
- );
- in
- func(value, lst, 1);
-
- /*****************************************************************************\
- *
- * Reactivity
- *
- \*****************************************************************************/
-
- accumState(accumFunc, startEvent, endEvent, state0, behavior) =
- let rec
- func(state0) =
- let
- rec picked = accumFunc(state0, behavior) until
- snapshot(endEvent, picked) thenApply func;
- state = state0 until startEvent => picked;
- in
- state;
- in
- func(state0);
-
- /*****************************************************************************\
- *
- * Random
- *
- \*****************************************************************************/
-
- snapRandom(min : number, max : number, seed) =
- let
- number = min + (max - min) * seededRandom(seed);
- in
- 0 until snapshot(always, number) thenApply function(x) -> x;
-
- randomBoolean(seed) =
- if snapRandom(-1, 1, seed) < 0 then
- true
- else
- false;
-
- randomSign(seed) =
- if randomBoolean(seed) then
- -1
- else
- 1;
-
- /*****************************************************************************\
- *
- * Wrap functions
- *
- \*****************************************************************************/
-
- wrapNumber(
- min : number,
- size : number,
- number : number
- ) =
- let
- value = number - min;
- wrap =
- if value < 0 then
- size + mod(value, size)
- else
- mod(value, size);
- in
- min + wrap;
-
- wrapPoint3(
- min : point3,
- size : vector3,
- point : point3
- ) =
- point3Xyz(
- wrapNumber(xOf(min), xOf(size), xOf(point)),
- wrapNumber(yOf(min), yOf(size), yOf(point)),
- wrapNumber(zOf(min), zOf(size), zOf(point))
- );
-
- /*****************************************************************************\
- *
- * prefix operators
- *
- \*****************************************************************************/
-
- unionGeometry(x : geometry, y : geometry) = x union y;
-
- preOr(x, y) = x or y;
- preAnd(x, y) = x and y;
-
- add(x : number, y : number) = x + y;
- subtract(x : number, y : number) = x - y;
- multiply(x : number, y : number) = x * y;
- divide(x : number, y : number) = x / y;
- max(x : number, y : number) = if (x >= y) then x else y;
- min(x : number, y : number) = if (x <= y) then x else y;
-
- composeTransform3(f : transform3, g : transform3) = f o g;
- composeTransform2(f : transform2, g : transform2) = f o g;
-
- /*****************************************************************************\
- *
- * Behaviors useful for animation
- *
- \*****************************************************************************/
-
- smooth0to1 = (0.5 - cos (time * pi) / 2);
-
- /*****************************************************************************\
- *
- * Default mappings to images
- *
- \*****************************************************************************/
-
- textImage(text : text) = render(text);
- stringImage(string) = render(simpleText(string));
- numberImage(number) = stringImage(numberToString(number, 4));
- booleanImage(bool) = stringImage(if bool then "true" else "false");
- soundImage(sound) = stringImage("A sound");
- colorImage(color) = solidColorImage(color);
-
- orthogonalImage(geo, size : vector2) =
- let
- camera =
- transform(
- translate(0, 0, 2)
- o scale(1, 1, 1e8),
- defaultCamera
- );
-
- scaleFactor = min(xOf(size), yOf(size));
- in
- transform(
- scale2(scaleFactor),
- render(geo, camera)
- );
-
- geometryImage(geo, size : vector2) =
- let
- camera =
- transform(
- translate(0, 0, 2),
- defaultCamera
- );
-
- scaleFactor = min(xOf(size), yOf(size));
- in
- transform(
- scale2(2.8 * scaleFactor),
- render(geo, camera)
- );
-
- /*****************************************************************************\
- *
- * Fit an imported geometry into the unit sphere
- *
- \*****************************************************************************/
-
- normalizeGeometry(geo : geometry) =
- let
- minPoint = first(boundingBox(geo));
- maxPoint = second(boundingBox(geo));
-
- diag = length(maxPoint - minPoint);
- center : vector3 = (origin3 - (minPoint + (maxPoint - origin3))) / 2;
- in
- transform(
- scale3(2 / diag)
- o translate(center),
- geo
- );
-