{-
- Fulsom (The Solid Modeller, written in Haskell)
-
- Copyright 1990,1991,1992,1993 Duncan Sinclair
-
- Permissiom to use, copy, modify, and distribute this software for any
- purpose and without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies, and
- that my name not be used in advertising or publicity pertaining to this
- software without specific, written prior permission. I makes no
- representations about the suitability of this software for any purpose.
- It is provided ``as is'' without express or implied warranty.
-
- Duncan Sinclair 1993.
-
- Csg to Oct-tree processing.
-
-}
module Oct (octcsg) where
import Csg
import Interval
import Types
import Kolor
import Vector
startx = -2
endx = 2
starty = -2
endy = 2
startz = -2
endz = 2
makeoct :: Csg -> Oct
makeoct csg = octer 1 csg xyz
where
xyz = (x,y,z)
x = startx # endx
y = starty # endy
z = startz # endz
-- octer :: Int -> Csg -> (R3 BI) -> Oct
octer nn csg xyz
= case (calc csg white xyz) of
(res,newc',rgb,new) ->
let
newc = if new then newc' else csg
c = light rgb (calcn newc xyz)
(x,y,z) = xyz
bhx = bothalf x ; thx = tophalf x
bhy = bothalf y ; thy = tophalf y
tbz = topbit z ; bhz = bothalf z
os = if nn == 1 then osb else osa
n1 = nn + 1
osa = map (octer n1 newc)
[ (bhx,bhy,tbz) , (bhx,bhy,bhz) ,
(thx,bhy,tbz) , (thx,bhy,bhz) ,
(bhx,thy,tbz) , (bhx,thy,bhz) ,
(thx,thy,tbz) , (thx,thy,bhz) ]
osb = [(octer n1 newc (bhx,bhy,tbz)) ,
(octer n1 newc (bhx,bhy,bhz)) ,
(octer n1 newc (thx,bhy,tbz)) ,
(octer n1 newc (thx,bhy,bhz)) ,
(octer n1 newc (bhx,thy,tbz)) ,
(octer n1 newc (bhx,thy,bhz)) ,
(octer n1 newc (thx,thy,tbz)) ,
(octer n1 newc (thx,thy,bhz)) ]
in
if res < (pt 0) then
O_Full c
else if res > (pt 0) then
O_Empty
else
O_Sub c os
{-
os = map (octer newc)
[ (bhx,bhy,tbz) , (bhx,bhy,bhz) ,
(thx,bhy,tbz) , (thx,bhy,bhz) ,
(bhx,thy,tbz) , (bhx,thy,bhz) ,
(thx,thy,tbz) , (thx,thy,bhz) ]
-}
calcn csg xyz = normalise (makevector f0 f1 f2 f3)
where
(f0,_,_,_) = calc csg black (mid1 x,mid1 y,mid2 z)
(f1,_,_,_) = calc csg black (mid2 x,mid1 y,mid2 z)
(f2,_,_,_) = calc csg black (mid1 x,mid2 y,mid2 z)
(f3,_,_,_) = calc csg black (mid1 x,mid1 y, up z)
(x,y,z) = xyz
pruneoct :: Int -> Oct -> Oct
pruneoct 0 (O_Sub c os) = O_Full c
pruneoct n (O_Sub c os) = O_Sub c (map (pruneoct (n-1)) os)
pruneoct n o = o
octcsg :: Int -> Csg -> Oct
octcsg depth = (pruneoct depth) . makeoct