[project @ 1999-11-26 10:29:53 by simonpj]
[nofib.git] / real / bspt / Render.lhs
1 > {-# OPTIONS -syslib exts #-}
2 > module Render 
3
4         Render controls the displaying of BSP images and
5         BSP trees.
6
7 >       (       render, 
8 >               drawBSPT, drawFaces,
9 >               partitionedDraw,prettyPrintBSPT)
10   
11 > where
12  
13 > import BSPT (BSPT(..),Status(..),countLeaves,scanLine,foldBSPT)
14 > import EuclidGMS (Point(..),Line,Face(..),Region,getRegion,
15 >                   Faces,mkFace,section,drawSegment,Segment,Partition)
16 > import Stdlib (mapcat,middle,const3)
17 > import Params (renderTop,renderHeight,renderLeft,windowWidth)
18 > import GeomNum
19 > import MGRlib (line,func,movePrintTo,writeVert)
20 > import Int( Num(fromInt) )
21
22         render - fills in the image with a hashed pattern
23                 Algorithm creates scan_line segments from
24                 the list of rules accross the screen
25  
26 > render :: BSPT -> String
27 > render btree = drawFaces (mapcat (scanLine btree) scanLines)
28 >       where scanLines = rules (fromIntegral renderLeft) (fromIntegral windowWidth) (fromIntegral (renderTop+1))
29   
30         rules - create the list of lines across the screen
31                 between current and max lines skipping every
32                 skip lines
33   
34 > rules :: Numb -> Numb -> Numb -> Faces
35 > rules left right = rules'
36 >                       where rules' current | current > (fromIntegral renderHeight) = []
37 >                             rules' current = mkFace ((Pt left current),(Pt right current)):rules' (current+15) 
38   
39   
40         drawBSPT - draws the edges of the image by drawing the lines
41                 stored in the sub-hyperplanes
42   
43 > drawBSPT :: BSPT -> String 
44 > drawBSPT = foldBSPT (const3 []) drawEmbedded
45 >               where 
46 >               drawEmbedded _ (faces,_) x y = drawFaces faces ++ x ++ y
47
48         drawFaces - draws a list of faces
49  
50 > drawFaces :: Faces -> String
51 > drawFaces = mapcat drawSegment.map faceToSection
52 >               where 
53 >               faceToSection (Fc section _) = section
54   
55
56         partitionedDraw - draws a BSPT image along with its partitions
57
58 > partitionedDraw :: BSPT -> String                
59 > partitionedDraw = foldBSPT temp3 temp 
60 >               where 
61 >               temp3 _ r _ = drawFaces (getRegion r)
62 >               temp _ _ = (++)
63
64                 const3 []
65                drawPartitions (Fc part _) (faces,region) x y 
66                                         = drawFaces faces ++
67                                             x ++ y
68
69         prettyPrintBSPT - pretty print the tree form of a BSP tree
70
71 > prettyPrintBSPT :: BSPT -> String
72 > prettyPrintBSPT tree = func 4 ++ 
73 >                        printBSPT  renderLeft windowWidth (renderHeight+40) tree ++  
74 >                        func 15
75
76
77         printBSPT - does the work for prettyPrintBSPT
78
79 > printBSPT :: Int -> Int -> Int -> BSPT -> String
80 > printBSPT le re d (Cell x _ _) | re-le<=20  =  writeVert ((middle le re),d) (map (\x->x:[]) (show x))
81 > printBSPT le re d (Cell x _ _) =  movePrintTo (middle le re) d (show x)
82 > printBSPT le re d tree | re-le<=20 = writeVert (mid,d) (map (\x->x:[]) (show (countLeaves tree)))
83 >                                                 where mid = middle le re
84 > printBSPT le re d (BSP part nodeinfo left right) = movePrintTo mid d "@" ++ 
85 >                                                (printBSPT le mid (d+14) left) ++
86 >                                                (printBSPT mid re (d+14) right)
87 >                                                 where mid = middle le re