;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; simple random range function (define (randR l h) (+ l (* (rand) (- h l)))) ; distance from one work's center to another as go down hall (define *work-separation* 20) (define *ceiling-height* 25) ; pillar distance from hall center (define *pillar-dist* 20) (define *hall-radius* 15) ; viewer's perspective information (define *height* 5.5) (define *lookat-height* 5.55) (define *fov* 57.5) ; set true to generate the "walkthrough" (define *anim* #f) ; don't generate scenegraph for icam (set! *rmode* ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; generates a flat sqare patch to specs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (square x z) (separator (scale x 1 z) (rotate 90 y-axis) (patch "bilinear" 'P '((0.5 0 0.5) (0.5 0 -0.5) (-0.5 0 0.5) (-0.5 0 -0.5))) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (pillar) (separator (surface "matte") (color '(.19 .18 .2)) ; (displacement "cloth" 'depth .5 'freq 2000) (scale .5 *ceiling-height* .5) (rotate -90 x-axis) (cylinder) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; defines the gallery environment: ceiling, floor, pillars ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (place) (separator (define size '(100 1 750)) ; ceiling (separator (surface "matte") (displacement "cloth" 'depth 1) (color '(.53 .48 .6)) (translate 0 *ceiling-height* 0) (scale size) (square 1 1) ) ;floor (separator (surface "parquet_plank" 'txtscale 16) ; thanks Larry! (color '(.4 .3 .2)) (scale size) (square 1 1) ) ; pillars (separator (translate 0 0 (* *work-separation* 1.5)) (for i 1 13 1 (translate 0 0 *work-separation*) (separator (translate *pillar-dist* 0 0) (pillar)) (separator (translate (- *pillar-dist*) 0 0) (pillar)) )) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; generate one side of a picture frame ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (frame-side x y z) (separator (scale x y z) (uscale .5) (box) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; generate a picture frame ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (frame x y z thick) ; top (separator (translate 0 (/ (+ y thick) 2.0) 0) (frame-side (+ x (* thick 2)) thick z) ) ; bottom (separator (translate 0 (/ (+ y (* 1.2 thick)) -2.0) 0) (frame-side (+ x (* thick 2)) (* 1.2 thick) z) ) ; left (separator (translate (/ (+ x thick) 2.0) 0 0) (frame-side thick (+ y (* thick 2)) z) ) ; right (separator (translate (/ (+ x thick) -2.0) 0 0) (frame-side thick (+ y (* thick 2)) z) ) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; create one framed painting ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (base-work) (separator (uscale 2) (separator (color '(.1 .1 .1)) (frame 6.40 4.84 .5 .75) ) (separator (scale 6.40 4.84 1) (rotate 90 x-axis) (square 1 1) ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; create all of the framed paintings ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (works) (separator (translate 0 0 (* 2 *work-separation*)) (for i 1 28 1 (translate 0 0 (cond ((<= i 14) *work-separation*) ((> i 14) (- *work-separation*)))) (separator (translate (cond ((> i 14) (- *hall-radius*)) ((= i 14) 0) ((< i 14) *hall-radius*)) 6.64 0) (cond ((< i 14) (rotate 90 y-axis)) ((= i 14) (rotate 0 y-axis)) ((> i 14) (rotate -90 y-axis))) (define txname (string-append "Textures/f" (number->string i) ".tx")) (surface "paintedplastic" 'texturename txname 'Ks .1) (base-work)) ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; create all lights: each work has a spotlight ; plus there are lights running up the center pointed at the ceiling ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (lights) (xfm-separator (for i 1 15 1 (translate 0 0 *work-separation*) (light-shadows "on") (spotlight 'intensity 1000 'from '(0 15 0) 'to (list (- *hall-radius*) 4.75 0) 'coneangle .8 'conedeltaangle .4 'shadow-map-res 256) (spotlight 'intensity 1000 'from '(0 15 0) 'to (list *hall-radius* 4.75 0) 'coneangle .8 'conedeltaangle .4 'shadow-map-res 256) (light "spotlight" 'intensity 300 'from '(0 10 0) 'to '(0 100 0) 'coneangle 1.4 'conedeltaangle 1) (if (= i 15) (spotlight 'intensity 1000 'from '(0 15 0) 'to (list 0 4.75 *work-separation*) 'coneangle .8 'conedeltaangle .4 'shadow-map-res 256) ) (if (= i 1) (spotlight 'intensity 1000 'from '(0 15 0) 'to (list 0 4.75 (- *work-separation*)) 'coneangle .8 'conedeltaangle .4 'shadow-map-res 256) ) ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; create the floating title ; can either use the polygonal object (which I did, for the shadow) ; or use a transparent textured single rectangle (but then shadow is wrong) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (title obj) (separator (translate *hall-radius* 6 (* 1.8 *work-separation*)) (rotate -90 y-axis) (uscale 1.45) (if obj (begin (surface "matte") (uscale (/ 17.54 2.0)) (accad-object "title.obj")) (begin (surface "tmap" 'texturename "title.tx" 'Ks .1) (square 17.54 3.5)) ) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; create the entrance/exit from a frame ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (door) (separator (translate 0 4.75 0) (color '(.1 .1 .1)) (surface "matte") (frame 12.80 9.68 10 .75) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; camera positions for single frame rendering ; there are 15 positions, and four cardinal directions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define *cam-from* ()) (define *cam-to* ()) (define (place-cam position-num direction) (begin (set! *cam-from* (list 0 *height* (* position-num *work-separation*))) (set! *cam-to* (cond ((eq? direction 'n) (list (* (- (* (mod position-num 2) 2) 1) .05) *lookat-height* (+ 1 (* position-num *work-separation*)))) ((eq? direction 's) (list (* (- (* (mod position-num 2) 2) 1) .05) *lookat-height* (- (* position-num *work-separation*) 1))) ((eq? direction 'w) (list 1 *lookat-height* (+ (* *work-separation* position-num) (* (- (* (mod position-num 2) 2) 1) .05)))) ((eq? direction 'e) (list -1 *lookat-height* (+ (* *work-separation* position-num) (* (- (* (mod position-num 2) 2) 1) .05)))) )))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; create the entire environment ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (make-world) (world (if *anim* (model "camera" (cam.tz cam.ry) (translate 0 *height* (cam.tz)) (rotate (cam.ry) y-axis) (camera "main" "perspective" 'from '(0 0 0) 'to '(0 0 1) 'fov *fov*) ) (camera "main" "perspective" 'from *cam-from* 'to *cam-to* 'fov *fov*) ) (atmosphere "fog" 'distance 75 'background '(0 0 0)) (lights) (place) (works) (title #f) (door) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ((render 'reset)) (set! *rmode* ()) ; should shadow maps be regenerated? ((render 'make-shadow-maps) ()) ; render wireframe ;((render 'set-renderer!) "render -vector") ; render on other machines ;((render 'set-renderer!) "time netrender -h thinice") ; set rendered frame size ;((render 'set-option!) '(ri-format 160 80 1)) ;((render 'set-option!) '(ri-format 320 160 1)) ((render 'set-option!) '(ri-format 640 320 1)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; render the single frames from 15 positions, in all four directions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;north (for i 1 15 1 (begin (place-cam i 'n) (make-world) ((render 'to-file) (string-append "HomeFrames/north.rle." (number->string i))) (render "main") (gc) )) ;east (print 'east) (for i 1 15 1 (begin (print i) (place-cam i 'e) (make-world) ((render 'to-file) (string-append "HomeFrames/east.rle." (number->string i))) (render "main") (gc) )) ;south (print 'south) (for i 1 15 1 (begin (print i) (place-cam i 's) (make-world) ((render 'to-file) (string-append "HomeFrames/south.rle." (number->string i))) (render "main") (gc) )) ;west (print 'west) (for i 1 15 1 (begin (print i) (place-cam i 'w) (make-world) ((render 'to-file) (string-append "HomeFrames/west.rle." (number->string i))) (render "main") (gc) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; render animation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (set! *anim* #t) ((render 'set-option!) '(ri-format 320 160 1)) ; camera avars (load-avars "camera.adb") (if *anim* (begin (make-world) (print 'animation) (define *num-frames* 450) (for i 99 *num-frames* 1 (begin (set-time! i) ((render 'to-file) (string-append "HomeFrames/Anim/frame." (number->string i))) (render "main") (gc) )) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;