#| -*- Mode:LISP; Base:10;
       Package: (VISTA-DEMO :use (VISTA-LIBRARY LISP));
       Syntax: Common-lisp; Readtable: CL -*-
|#

;;; Copyright (C) Lisp Machine, Inc. 1984, 1985, 1986
;;;   See filename "Copyright" for
;;; licensing and release information.


(in-package 'vista-demo :use '(vista-library lisp))

(defdemo "Tetra" 'tetra
  "Draws a fractal tetrahedron"
  "vista:demo;tetra")

(export '(TETRA					;Draws a fractal tetrahedron
         ))


; Fractal tetrahedron

(defconstant sqrt3 (sqrt 3))
(defconstant sqrt2/3 (sqrt 2/3))

;;; shade sa,sb,sc
(defconstant face-1
	     (make-polygon :3d-absolute
			   0 0 0
  			   1 0 0
  			   .5 (/ sqrt3 2) 0))
;;; shade sa,sb,sd
(defconstant face-2
	     (make-polygon :3d-absolute
  			   0 0 0
  			   1 0 0
  			   .5 (/ .5 sqrt3) sqrt2/3))

;;; sb,sc,sd
(defconstant face-3
	     (make-polygon :3d-absolute
			   1 0 0
			   .5 (/ sqrt3 2) 0
  			   .5 (/ .5 sqrt3) sqrt2/3))

;;;shade sc,sa,sd
(defconstant face-4
	     (make-polygon :3d-absolute
			   .5 (/ sqrt3 2) 0
 			   0 0 0
			   .5 (/ 0.5 sqrt3) sqrt2/3))


(defun draw-tetrahedron (sa sb sc sd)
  (set-color sd)
  (fill-polygon face-4)
  (set-color sc)
  (fill-polygon face-3)
  (set-color sb)
  (fill-polygon face-2)
  (set-color sa)
  (fill-polygon face-1))


;(defun draw-tetrahedron (sa sb sc sd)
;  (setshade sa)
;  (pmv 0.0 0.0 0.0)			 ;face 1
;  (setshade sb)
;  (pdr 1.0 0.0 0.0)
;  (setshade sc)
;  (pdr .5 (/ sqrt3 2) 0.0)
;  (spclose)
;
;  (setshade sa)
;  (pmv 0.0 0.0 0.0)			 ;face 2
;  (setshade sb)
;  (pdr 1.0 0.0 0.0)
;  (setshade sd)
;  (pdr 0.5 (/ 0.5 sqrt3) sqrt2/3)
;  (spclose)
;
;  (setshade sb)
;  (pmv 1.0 0.0 0.0)			 ;face 3
;  (setshade sc)
;  (pdr .5 (/ sqrt3 2) 0.0)
;  (setshade sd)
;  (pdr 0.5 (/ 0.5 sqrt3) sqrt2/3)
;  (spclose)
;
;  (setshade sc)
;  (pmv .5 (/ sqrt3 2) 0.0)		 ;face 4
;  (setshade sa)
;  (pdr 0.0 0.0 0.0)
;  (setshade sd)
;  (pdr 0.5 (/ 0.5 sqrt3) sqrt2/3)
;  (spclose))

(defun tetra (&key (levels 4))
  (initialize-device)
  (set-color 0)
  (set-map-color 0 .72 .72 .75)
  (set-map-color 1 1 1 1)
  (fill-viewport) 
  (shade-colors 2 (random 1.0s0) (random 1.0s0) (random 1.0s0)
		4 (random 1.0s0) (random 1.0s0) (random 1.0s0))
; Turn on zbuffering only if enough planes
;  (when (> (getplanes) 12)
;    (zbuffer t) (zclear))
  
  (perspective 40 1 0 10000)
  (set-color 1)
;  (fill-polygon
;    (make-polygon :3d-absolute
;	508 350 -1400
;	-512 -100 -1400
;	400  -150 -1400))
  (translate -25 50 -50)
  (polar-view 500 -130 -110 0)
  (with-transform
    (scale 300.0 300.0 300.0)
    (translate -.5 -.5 0)
    (tetra-1 levels
	     (make-segment (:colorablep nil :scalablep nil :translatablep nil
					:x-rotatablep nil :y-rotatablep nil :z-rotatablep nil)
	       (draw-tetrahedron 1 2 3 4))))   ;1 64 128 196
;  (zbuffer nil)
  (frob-colors 4))  ;196
    
(defun tetra-1 (level seg)
  (if (zerop level)
      (call-segment seg)
    (with-transform
      (scale .5 .5 .5)
      (tetra-1 (1- level) seg)
      (with-transform
	(translate 0.5 (/ 0.5 sqrt3) sqrt2/3)
  	(tetra-1 (1- level) seg))
      (with-transform
	(translate 0.5 (/ sqrt3 2) 0)
  	(tetra-1 (1- level) seg))
      (with-transform
	(translate 1 0 0)
  	(tetra-1 (1- level) seg)))))

