;; ;; particles2.al: create and kill particles on the fly ;; (define *particles* '()) (define *ppf* 1) ; particles per frame created (define (randR low high) (+ low (* (rand) (- high low)))) (define (make-one-particle) (list (list 'pp (vec3 0 0 0)) (list 'pv (vec3 0 0 0)) (list 'pa (vec3 0 0 0)) (list 'age 0) (list 'lifespan 100) )) (define (add-particle p) (set! *particles* (cons p *particles*))) (define (get-value p key) (list-ref (assq key p) 1)) (define (set-value p key val) (set-cdr! (assq key p) (list val))) (define (update-particle p) (let ((pos (get-value p 'pp)) (vel (get-value p 'pv)) (acc (get-value p 'pa)) (age (get-value p 'age)) ) (set-value p 'pp (+ pos vel)) (set-value p 'pv (+ vel acc)) (set-value p 'age (+ age 1)) )) (define (update-particles) (map update-particle *particles*)) (define (draw-particle p) (separator (translate (get-value p 'pp)) (uscale .1) (sphere))) (define (draw-particles) (map draw-particle *particles*)) (define (create-particle) (let ( (p (make-one-particle)) ) (set-value p 'pp (vec3 0 -1 0)) (set-value p 'pv (vec3 (randR -.03 .03) (randR .08 .12) 0)) (set-value p 'pa (vec3 0 -.005 0)) (set-value p 'lifespan (randR 10 50)) (add-particle p) )) (define (create-particles n) (for i 1 n 1 (create-particle))) (define (kill-particle? p) (if (> (get-value p 'age) (get-value p 'lifespan)) '() (list p) )) (define (kill-em p-list) (if (null? p-list) '() (append (kill-particle? (car p-list)) (kill-em (cdr p-list))))) (define (kill-particles) (set! *particles* (kill-em *particles*))) (define (sim) (begin (for i 1 60 1 (begin (create-particles *ppf*) (world (draw-particles) ) (update-particles) (kill-particles) )))) (sim)