> module Render Render controls the displaying of BSP images and BSP trees. > ( render, > drawBSPT, drawFaces, > partitionedDraw,prettyPrintBSPT) > where > import BSPT (BSPT(..),Status(..),countLeaves,scanLine,foldBSPT) > import EuclidGMS (Point(..),Line,Face(..),Region,getRegion, > Faces,mkFace,section,drawSegment,Segment,Partition) > import Stdlib (mapcat,middle,const3) > import Params (renderTop,renderHeight,renderLeft,windowWidth) > import GeomNum > import MGRlib (line,func,movePrintTo,writeVert) render - fills in the image with a hashed pattern Algorithm creates scan_line segments from the list of rules accross the screen > render :: BSPT -> String > render btree = drawFaces (mapcat (scanLine btree) scanLines) > where scanLines = rules (fromIntegral renderLeft) (fromIntegral windowWidth) (fromIntegral (renderTop+1)) rules - create the list of lines across the screen between current and max lines skipping every skip lines > rules :: Numb -> Numb -> Numb -> Faces > rules left right = rules' > where rules' current | current > (fromIntegral renderHeight) = [] > rules' current = mkFace ((Pt left current),(Pt right current)):rules' (current+15) drawBSPT - draws the edges of the image by drawing the lines stored in the sub-hyperplanes > drawBSPT :: BSPT -> String > drawBSPT = foldBSPT (const3 []) drawEmbedded > where > drawEmbedded _ (faces,_) x y = drawFaces faces ++ x ++ y drawFaces - draws a list of faces > drawFaces :: Faces -> String > drawFaces = mapcat drawSegment.map faceToSection > where > faceToSection (Fc section _) = section partitionedDraw - draws a BSPT image along with its partitions > partitionedDraw :: BSPT -> String > partitionedDraw = foldBSPT temp3 temp > where > temp3 _ r _ = drawFaces (getRegion r) > temp _ _ = (++) const3 [] drawPartitions (Fc part _) (faces,region) x y = drawFaces faces ++ x ++ y prettyPrintBSPT - pretty print the tree form of a BSP tree > prettyPrintBSPT :: BSPT -> String > prettyPrintBSPT tree = func 4 ++ > printBSPT renderLeft windowWidth (renderHeight+40) tree ++ > func 15 printBSPT - does the work for prettyPrintBSPT > printBSPT :: Int -> Int -> Int -> BSPT -> String > printBSPT le re d (Cell x _ _) | re-le<=20 = writeVert ((middle le re),d) (map (\x->x:[]) (show x)) > printBSPT le re d (Cell x _ _) = movePrintTo (middle le re) d (show x) > printBSPT le re d tree | re-le<=20 = writeVert (mid,d) (map (\x->x:[]) (show (countLeaves tree))) > where mid = middle le re > printBSPT le re d (BSP part nodeinfo left right) = movePrintTo mid d "@" ++ > (printBSPT le mid (d+14) left) ++ > (printBSPT mid re (d+14) right) > where mid = middle le re