(define (elastic) (define (update-mass n) (let ((v (vmul (vsub (pdata-get "pref" n) (pdata-get "p" n)) 0.01))) (pdata-set "vel" n (vmul (vadd (pdata-get "vel" n) v) 0.95))) (if (zero? n) 0 (update-mass (- n 1)))) (update-mass (pdata-size)) (pdata-op "+" "p" "vel")) (define (perturb strength) (define (loop n) (pdata-set "vel" n (vadd (pdata-get "vel" n) (vmul (vadd (vector (flxrnd) (flxrnd) (flxrnd)) (vector -0.5 -0.5 -0.5)) (gh n)))) (if (zero? n) 0 (loop (- n 1)))) (loop (pdata-size))) (clear) (blur 0.1) (backfacecull 0) ;(hint-none) (point-width 5) (wire-colour (vector 0 0 1)) (line-width 2) ;(hint-normal) (hint-points) ;(hint-wire) ;(opacity 0.5) (texture (load-texture "mud.png")) (define o (build-nurbs-sphere 8 12)) (grab o) (pdata-copy "p" "pref") (pdata-add "vel" "v") (perturb 1) (ungrab) (gain 1) (define (render) (grab o) (perturb 1) (elastic) (recalc-normals 0) (ungrab)) (every-frame (render))