// ActiveVRML 1.0 ASCII /*****************************************************************************\ * * Library code * \*****************************************************************************/ model = let createBitmap(image, xSize, ySize) = (image, point2Xy(xSize, ySize)); imageOf(image, size : point2) = image; sizeOf(image, size : point2) = size; xsizeOf(image, size : point2) = xComponent(size); ysizeOf(image, size : point2) = yComponent(size); accumulate(func, value, lst) = if empty(lst) then value else accumulate(func, func(head(lst), value), tail(lst)); after(endTime) = predicate(time > endTime); interpolate(from : number, to : number, num : number) = from + (to - from) * num; interpolateVector2(from : vector2, to : vector2, num) = vector2Xy ( interpolate(xComponent(from), xComponent(to), num), interpolate(yComponent(from), yComponent(to), num) ); smooth0to1 = (0.5 - cos (time * pi) / 2) until after(1) => end; in let /*****************************************************************************\ * * The background * \*****************************************************************************/ backBitmap = import("back.gif"); backImage = imageOf(backBitmap); backXSize = xsizeOf(backBitmap); backYSize = ysizeOf(backBitmap); /*****************************************************************************\ * * Blinking stars on the background * \*****************************************************************************/ brightBitmap = import("bright.bmp"); dimBitmap = import("dim.bmp"); starImage = let s0 = imageOf(dimBitmap) until after(1) => function x. s1; s1 = imageOf(brightBitmap) until after(0.25) => function x. s0; in s0; /*****************************************************************************\ * * The title letters * \*****************************************************************************/ titleImage = let titlePos = vector2Xy(-0.60 * backXSize, 0.9 * backYSize); images = [ first(import("title0.gif")), first(import("title1.gif")), first(import("title2.gif")), first(import("title3.gif")), first(import("title4.gif")), first(import("title5.gif")), first(import("title6.gif")), first(import("title7.gif")), first(import("title8.gif")), first(import("title9.gif")) ]; zoomImage = let number = smooth0to1; in transformImage( translate(titlePos * number) o scale2(number), nth(images, 0) ); glowImage = let index = sin(time * 2 - pi / 2) * 4.99 + 5; in nth(images, index); image = emptyImage until after(1) => function(x) . zoomImage until done => function(x) . transformImage( translate(titlePos), glowImage ); in image; /* zoomInTransform */ /*****************************************************************************\ * * Button swoosh animation * \*****************************************************************************/ swooshImage(motionImage, staticImage, xsize, xend, yend, delay) = let number = time * 4; maxSize = (backXSize + xend + xsize) / 2; midPoint = (-backXSize + xend + xsize) / 2; stretchIn(number) = transformImage( translate( interpolate(-backXSize, midPoint, number), yend ) o scale(number * maxSize / xsize, 1), motionImage ); shrinkIn(number) = transformImage( translate( interpolate(midPoint, xend, number), yend ) o scale( interpolate(maxSize / xsize, 1, number), 1 ), motionImage ); static = transformImage( translate(xend, yend), staticImage ); image = if (number < 1) then stretchIn(number) else if (number < 2) then shrinkIn(number - 1) else static; sound = first(import("schwoop.wav")); in (emptyImage, silence) until after(delay) => function(x) . (image, sound); /*****************************************************************************\ * * The buttons * \*****************************************************************************/ tutorialBitmap = import("tbutton.bmp"); (tutorialImage, tutorialSound) = swooshImage( first(import("tutor.gif")), first(import("tutor.gif")), xComponent(second(import("tutor.gif"))), 0, 0, 3 ); modelSound = tutorialSound; // // put it all together // modelImage = titleImage over tutorialImage over backImage; model = (modelImage, modelSound, modelSound) until leftButtonDown => function(x) . model; in model;