packages feed

glome-hs 0.51 → 0.60

raw patch · 28 files changed

+58/−4100 lines, 28 filesdep +GlomeTracedep +GlomeVecdep ~basesetup-changednew-component:exe:Glome

Dependencies added: GlomeTrace, GlomeVec

Dependency ranges changed: base

Files

− Bih.hs
@@ -1,332 +0,0 @@-module Bih (bih) where-import Vec-import Solid-import Data.List hiding (group) -- for "partition"--import Control.Concurrent.MVar-import System.IO.Unsafe----- Bounding Interval Heirarchy--- http://en.wikipedia.org/wiki/Bounding_interval_hierarchy--data Bih = Bih {bihbb :: Bbox, bihroot :: BihNode} deriving Show-data BihNode = BihLeaf !SolidItem -             | BihBranch {lmax :: !Flt, rmin :: !Flt, ax :: !Int, -                          l :: BihNode, r :: BihNode} deriving Show---- bih construction-build_leaf :: [(Bbox, SolidItem)] -> BihNode-build_leaf objs =- BihLeaf (group (map snd objs))---- tuning parameter that controls threshold for separating--- large objects from small objects instead of usual left/right--- sorting -max_bih_sa = 0.3 :: Flt--build_rec :: [(Bbox,SolidItem)] -> Bbox -> Bbox -> Int -> BihNode-build_rec objs nodebox splitbox depth = - -- if (null objs) || (null $ tail objs) || - --    (null $ tail $ tail objs)- if length objs < 2- then build_leaf objs- else-  let (Bbox nodeboxp1 nodeboxp2) = nodebox-      (Bbox splitboxp1 splitboxp2) = splitbox-      axis  = vmaxaxis (vsub splitboxp2 splitboxp1)-      bbmin = va splitboxp1 axis-      bbmax = va splitboxp2 axis-      candidate = (bbmin + bbmax) * 0.5-  in-   if candidate > (va nodeboxp2 axis) then-    build_rec objs nodebox -              (Bbox splitboxp1 (vset splitboxp2 axis candidate)) -              depth-   else-    if candidate < (va nodeboxp1 axis) then-     build_rec objs nodebox (-               Bbox (vset splitboxp1 axis candidate) splitboxp2) -               depth-    else-     -- not sure if this is a big win-     let nbsa = bbsa nodebox-         (big,small) = partition (\ (bb,_) -> -                                   (bbsa bb) > (nbsa * max_bih_sa)) objs-     in -      if (not $ null big) && ((length big) < ((length small)*2))-      then (BihBranch (va nodeboxp2 0) (va nodeboxp1 0) 0-                      (build_rec big nodebox splitbox (depth+1))-                      (build_rec small nodebox splitbox (depth+1)) )-      else-       let (l,r) = partition (\((Bbox bbp1 bbp2),_)-> -                               (((va bbp1 axis)+(va bbp2 axis))*0.5) -                                 < candidate ) objs-           lmax = foldl fmax (-infinity) (map (\((Bbox _ p2),_) -> va p2 axis) l)-           rmin = foldl fmin   infinity  (map (\((Bbox p1 _),_) -> va p1 axis) r)-           (lsplit,rsplit) = bbsplit splitbox axis candidate-           lnb  = (Bbox nodeboxp1 (vset nodeboxp2 axis lmax))-           rnb  = (Bbox (vset nodeboxp1 axis rmin) nodeboxp2)-       in-        -- stop if there's no progress being made-        if ((null l) && (rmin <= bbmin)) ||-           ((null r) && (lmax >= bbmax))-        then build_leaf objs-        else-         (BihBranch (lmax+delta) (rmin-delta) axis-                    (build_rec l lnb lsplit (depth+1))-                    (build_rec r rnb rsplit (depth+1)) )--bih :: [SolidItem] -> SolidItem-bih [] = SolidItem Void--- bih (sld:[]) = sld  -- sometimes we'd like to be able to use a-                       -- single object bih just for its aabb-bih slds =- let objs = map (\x -> ((bound x),x)) (flatten_group slds)-     bb   = foldl bbjoin empty_bbox (map (\(b,_)->b) objs)-     root = build_rec objs bb bb 0-     (Bbox (Vec p1x p1y p1z) (Vec p2x p2y p2z)) = bb- in-  if p1x == (-infinity) || p1y == (-infinity) || p1z == (-infinity) ||-     p2x == infinity    || p2y == infinity    || p2z == infinity-  then-   error $ "bih: infinite bounding box " ++ (show objs)-  else-   SolidItem (Bih bb root)--rayint_bih :: Bih -> Ray -> Flt -> Texture -> Rayint -rayint_bih (Bih bb root) r d t =- let Ray orig dir = r-     dir_rcp = vrcp dir-     Interval near far = bbclip r bb-     traverse (BihLeaf s) near far = rayint s r (fmin d far) t-     traverse (BihBranch lsplit rsplit axis l r) near far =-       let dirr = va dir_rcp axis-           o    = va orig axis-           dl   = (lsplit - o) * dirr-           dr   = (rsplit - o) * dirr-       in  -           if near > far -           then RayMiss-           else-            if dirr > 0-            then -             (nearest-              (if near < dl-               then traverse l near (fmin dl far)-               else RayMiss)-              (if dr < far-               then traverse r (fmax dr near) far-               else RayMiss))-            else-             (nearest-              (if near < dr-               then traverse r near (fmin dr far)-               else RayMiss)-              (if dl < far-               then traverse l (fmax dl near) far-               else RayMiss))- in-  traverse root near far--rayint_debug_bih :: Bih -> Ray -> Flt -> Texture -> (Rayint,Int) -rayint_debug_bih (Bih bb root) r d t =- let Ray orig dir = r-     dir_rcp = vrcp dir-     Interval near far = bbclip r bb-     traverse (BihLeaf s) near far = rayint_debug s r (fmin d far) t-     traverse (BihBranch lsplit rsplit axis l r) near far =-       let dirr = va dir_rcp axis-           o    = va orig axis-           dl   = (lsplit - o) * dirr-           dr   = (rsplit - o) * dirr-       in -         debug_wrap -          (if near > far -           then (RayMiss,0)-           else-            if dirr > 0-            then -             (nearest_debug-              (if near < dl-               then traverse l near (fmin dl far)-               else (RayMiss,0))-              (if dr < far-               then traverse r (fmax dr near) far-               else (RayMiss,0)))-            else-             (nearest_debug-              (if near < dr-               then traverse r near (fmin dr far)-               else (RayMiss,0))-              (if dl < far-               then traverse l (fmax dl near) far-               else (RayMiss,0))))-          1  - in-  traverse root near far---- This is unwieldy, but the performance gains--- make it worthwhile.  By testing 4 rays against --- each cell, we (theoretically) do ~1/4 the --- memory accesses. ---- One simplifying assumption we make that adds a --- little bit of overhead:  If one ray hits a cell, --- we act as though they all do.  For that reason,--- this only works well with coherent rays.--packetint_bih :: Bih -> Ray -> Ray -> Ray -> Ray -> Flt -> Texture -> PacketResult-packetint_bih (Bih bb root) !r1 !r2 !r3 !r4 !d t =- let bih = Bih bb root-     Ray orig1 dir1 = r1-     Ray orig2 dir2 = r2-     Ray orig3 dir3 = r3-     Ray orig4 dir4 = r4--     dir_rcp1 = vrcp dir1-     dir_rcp2 = vrcp dir2-     dir_rcp3 = vrcp dir3-     dir_rcp4 = vrcp dir4- in-  -- We want all the ray components to have-  -- at least the same sign.-  if not $ veqsign dir_rcp1 dir_rcp2 &&-           veqsign dir_rcp1 dir_rcp3 &&-           veqsign dir_rcp1 dir_rcp4-  then-   PacketResult (rayint bih r1 d t)-                (rayint bih r2 d t)-                (rayint bih r3 d t)-                (rayint bih r4 d t)-  else -   let Interval near1 far1 = bbclip r1 bb-       Interval near2 far2 = bbclip r2 bb-       Interval near3 far3 = bbclip r3 bb-       Interval near4 far4 = bbclip r4 bb--       near = fmin (fmin near1 near2) (fmin near3 near4)-       far =  fmax (fmax far1  far2)  (fmax far3  far4)--       traverse (BihLeaf s) near far = packetint s r1 r2 r3 r4 (fmin d far) t-       traverse (BihBranch lsplit rsplit axis l r) near far =-        if near > far -        then packetmiss-        else-         let dirr1 = va dir_rcp1 axis-             dirr2 = va dir_rcp2 axis-             dirr3 = va dir_rcp3 axis-             dirr4 = va dir_rcp4 axis-                     -             o1    = va orig1 axis-             o2    = va orig2 axis-             o3    = va orig3 axis-             o4    = va orig4 axis--             dl1   = (lsplit - o1) * dirr1-             dl2   = (lsplit - o2) * dirr2-             dl3   = (lsplit - o3) * dirr3-             dl4   = (lsplit - o4) * dirr4--             dr1   = (rsplit - o1) * dirr1-             dr2   = (rsplit - o2) * dirr2-             dr3   = (rsplit - o3) * dirr3-             dr4   = (rsplit - o4) * dirr4--         in  -          if dirr1 > 0  -- true for all, since signs match-          then -           let dl = fmax4 dl1 dl2 dl3 dl4-               dr = fmin4 dr1 dr2 dr3 dr4-           in-            (nearest_packetresult-             (if near < dl-              then traverse l near (fmin dl far)-              else packetmiss)-             (if dr < far-              then traverse r (fmax dr near) far-              else packetmiss))-          else-           let dl = fmin4 dl1 dl2 dl3 dl4-               dr = fmax4 dr1 dr2 dr3 dr4-           in-            (nearest_packetresult-             (if near < dr-              then traverse r near (fmin dr far)-              else packetmiss)-             (if dl < far-              then traverse l (fmax dl near) far-              else packetmiss))--   in-    traverse root near far--shadow_bih :: Bih -> Ray -> Flt -> Bool-shadow_bih (Bih bb root) r d =- let (Ray orig dir) = r-     dir_rcp = vrcp dir-     Interval near far = bbclip r bb-     traverse (BihLeaf s) near far = shadow s r (fmin d far)-     traverse (BihBranch lsplit rsplit axis l r) near far =-      let dirr = va dir_rcp axis-          o  = va orig axis-          dl = (lsplit - o) * dirr-          dr = (rsplit - o) * dirr-      in  -          if near > far -          then False-          else-           if dirr > 0-           then-            ((if near < dl-              then traverse l near (fmin dl far)-              else False) -             ||-             (if dr < far-              then traverse r (fmax dr near) far-              else False))-           else-            ((if near < dr-              then traverse r near (fmin dr far)-              else False)-             ||-             (if dl < far-              then traverse l (fmax dl near) far-              else False))-- in traverse root near far--inside_bih :: Bih -> Vec -> Bool-inside_bih (Bih (Bbox (Vec x1 y1 z1) (Vec x2 y2 z2)) root) pt =- let (Vec x y z) = pt-     traverse (BihLeaf s) = inside s pt-     traverse (BihBranch lsplit rsplit axis l r) =-       let o = va pt axis-       in (if o < lsplit-           then (traverse l)-           else False) -          ||-          (if o > rsplit -           then (traverse r)-           else False)- in-  (x > x1) && (x < x2) && -  (y > y1) && (y < y2) && -  (z > z1) && (z < z2) && (traverse root)--bound_bih :: Bih -> Bbox-bound_bih (Bih bb root) = bb--primcount_bih :: Bih -> Pcount-primcount_bih (Bih bb root) = pcadd (bihcount root) pcsinglebound- where bihcount (BihLeaf s) = primcount s-       bihcount (BihBranch _ _ _ l r) = pcadd (pcadd (bihcount l) (bihcount r)) pcsinglebound--instance Solid Bih where- rayint = rayint_bih- rayint_debug = rayint_debug_bih- packetint = packetint_bih- shadow = shadow_bih- inside = inside_bih- bound = bound_bih- primcount = primcount_bih
− Bound.hs
@@ -1,73 +0,0 @@-module Bound (bound_object) where-import Vec-import Solid---- Bounding objects: we can use any object as a bounding--- object for any other object; if a ray misses the--- bounding object, we can assume it missed the bounded--- object as well.  Unlike bih, setting up bounds is a manual--- process.  It is important that the bounded object is--- completely inside the bounding object.---- The bounding object should have a cheaper intersection test than--- the bounded object for this to be useful.---- The first SolidItem is the bounding object, the second--- is the bounded object.-data Bound = Bound SolidItem SolidItem deriving Show--bound_object :: SolidItem -> SolidItem -> SolidItem-bound_object a b = SolidItem $ Bound a b--rayint_bound :: Bound -> Ray -> Flt -> Texture -> Rayint-rayint_bound (Bound sa sb) r d t =- let (Ray orig _) = r- in if inside sa orig || shadow sa r d-    then rayint sb r d t-    else RayMiss--rayint_debug_bound :: Bound -> Ray -> Flt -> Texture -> (Rayint,Int)-rayint_debug_bound (Bound sa sb) r d t =- let (Ray orig _) = r- in if inside sa orig || shadow sa r d-    then (debug_wrap (rayint_debug sb r d t) 1)-    else (RayMiss,0)--shadow_bound :: Bound -> Ray -> Flt -> Bool-shadow_bound (Bound sa sb) r d =- let (Ray orig _ ) = r- in if inside sa orig || shadow sa r d-    then shadow sb r d-    else False--inside_bound :: Bound -> Vec -> Bool-inside_bound (Bound sa sb) pt = inside sa pt && inside sb pt---- if this is too slow, we could just take the bounding box for sa-bound_bound :: Bound -> Bbox-bound_bound (Bound sa sb) = bboverlap (bound sa) (bound sb)---- remove bounding objects when we flatten transformations--- (this is so that the accelleration structure can --- build an automatic bounding hierarchy rather than--- a manual one)--transform_leaf_bound :: Bound -> [Xfm] -> SolidItem-transform_leaf_bound (Bound sa sb) xfms =- transform_leaf sb xfms--flatten_transform_bound :: Bound -> [SolidItem]-flatten_transform_bound (Bound sa sb) = flatten_transform sb--primcount_bound :: Bound -> Pcount-primcount_bound (Bound sa sb) = pcadd (asbound (primcount sa)) (primcount sb)--instance Solid Bound where- rayint = rayint_bound- rayint_debug = rayint_debug_bound- shadow = shadow_bound- inside = inside_bound- bound = bound_bound- flatten_transform = flatten_transform_bound- transform_leaf = transform_leaf_bound- primcount = primcount_bound
− Box.hs
@@ -1,68 +0,0 @@-module Box (box) where-import Vec-import Solid---- Simple, axis-aligned bounding box defined with two points at opposing corners.--data Box = Box !Bbox deriving Show--box :: Vec -> Vec -> SolidItem-box (Vec x1 y1 z1) (Vec x2 y2 z2) =- SolidItem (Box (Bbox (Vec (fmin x1 x2) (fmin y1 y2) (fmin z1 z2))-                      (Vec (fmax x1 x2) (fmax y1 y2) (fmax z1 z2))))---- this could be optimized a bit more-rayint_box :: Box -> Ray -> Flt -> Texture -> Rayint-rayint_box (Box (Bbox (Vec p1x p1y p1z) (Vec p2x p2y p2z))) r d t =- let (Ray orig dir) = r-     (Vec ox oy oz) = orig-     (Vec dx dy dz) = dir-     dxrcp = 1/dx-     dyrcp = 1/dy-     dzrcp = 1/dz-     Interval inx outx = if dx > 0 -                         then Interval ((p1x-ox)*dxrcp) ((p2x-ox)*dxrcp)-                         else Interval ((p2x-ox)*dxrcp) ((p1x-ox)*dxrcp)-     Interval iny outy = if dy > 0-                         then Interval ((p1y-oy)*dyrcp) ((p2y-oy)*dyrcp)-                         else Interval ((p2y-oy)*dyrcp) ((p1y-oy)*dyrcp)-     Interval inz outz = if dz > 0-                         then Interval ((p1z-oz)*dzrcp) ((p2z-oz)*dzrcp)-                         else Interval ((p2z-oz)*dzrcp) ((p1z-oz)*dzrcp)-     lastin   = (fmax3 inx iny inz)-     firstout = (fmin3 outx outy outz)- in if lastin > firstout || firstout < 0 || lastin > d-    then RayMiss-    else -     let n = if inx == lastin -             then if dx > 0 then nvx else vx-             else if iny == lastin-                  then if dy > 0 then nvy else vy-                  else if dz > 0 then nvz else vz-         norm = if lastin > 0 then n else vinvert n-         hitdepth = fmax 0 lastin-     in-         RayHit hitdepth (vscaleadd orig dir hitdepth) norm t --shadow_box :: Box -> Ray -> Flt -> Bool-shadow_box (Box box) r d =- let Interval near far = bbclip r box - in-  if (near > far) || far <= 0 || far > d-  then False-  else True--inside_box :: Box -> Vec -> Bool-inside_box (Box (Bbox (Vec x1 y1 z1) (Vec x2 y2 z2))) (Vec x y z) =- x > x1 && x < x2 && - y > y1 && y < y2 && - z > z1 && z < z2--bound_box :: Box -> Bbox-bound_box (Box box) = box--instance Solid Box where- rayint = rayint_box- shadow = shadow_box- inside = inside_box- bound = bound_box
− COPYING
@@ -1,340 +0,0 @@-	    GNU GENERAL PUBLIC LICENSE-		       Version 2, June 1991-- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA- Everyone is permitted to copy and distribute verbatim copies- of this license document, but changing it is not allowed.--			    Preamble--  The licenses for most software are designed to take away your-freedom to share and change it.  By contrast, the GNU General Public-License is intended to guarantee your freedom to share and change free-software--to make sure the software is free for all its users.  This-General Public License applies to most of the Free Software-Foundation's software and to any other program whose authors commit to-using it.  (Some other Free Software Foundation software is covered by-the GNU Lesser General Public License instead.)  You can apply it to-your programs, too.--  When we speak of free software, we are referring to freedom, not-price.  Our General Public Licenses are designed to make sure that you-have the freedom to distribute copies of free software (and charge for-this service if you wish), that you receive source code or can get it-if you want it, that you can change the software or use pieces of it-in new free programs; and that you know you can do these things.--  To protect your rights, we need to make restrictions that forbid-anyone to deny you these rights or to ask you to surrender the rights.-These restrictions translate to certain responsibilities for you if you-distribute copies of the software, or if you modify it.--  For example, if you distribute copies of such a program, whether-gratis or for a fee, you must give the recipients all the rights that-you have.  You must make sure that they, too, receive or can get the-source code.  And you must show them these terms so they know their-rights.--  We protect your rights with two steps: (1) copyright the software, and-(2) offer you this license which gives you legal permission to copy,-distribute and/or modify the software.--  Also, for each author's protection and ours, we want to make certain-that everyone understands that there is no warranty for this free-software.  If the software is modified by someone else and passed on, we-want its recipients to know that what they have is not the original, so-that any problems introduced by others will not reflect on the original-authors' reputations.--  Finally, any free program is threatened constantly by software-patents.  We wish to avoid the danger that redistributors of a free-program will individually obtain patent licenses, in effect making the-program proprietary.  To prevent this, we have made it clear that any-patent must be licensed for everyone's free use or not licensed at all.--  The precise terms and conditions for copying, distribution and-modification follow.--		    GNU GENERAL PUBLIC LICENSE-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION--  0. This License applies to any program or other work which contains-a notice placed by the copyright holder saying it may be distributed-under the terms of this General Public License.  The "Program", below,-refers to any such program or work, and a "work based on the Program"-means either the Program or any derivative work under copyright law:-that is to say, a work containing the Program or a portion of it,-either verbatim or with modifications and/or translated into another-language.  (Hereinafter, translation is included without limitation in-the term "modification".)  Each licensee is addressed as "you".--Activities other than copying, distribution and modification are not-covered by this License; they are outside its scope.  The act of-running the Program is not restricted, and the output from the Program-is covered only if its contents constitute a work based on the-Program (independent of having been made by running the Program).-Whether that is true depends on what the Program does.--  1. You may copy and distribute verbatim copies of the Program's-source code as you receive it, in any medium, provided that you-conspicuously and appropriately publish on each copy an appropriate-copyright notice and disclaimer of warranty; keep intact all the-notices that refer to this License and to the absence of any warranty;-and give any other recipients of the Program a copy of this License-along with the Program.--You may charge a fee for the physical act of transferring a copy, and-you may at your option offer warranty protection in exchange for a fee.--  2. You may modify your copy or copies of the Program or any portion-of it, thus forming a work based on the Program, and copy and-distribute such modifications or work under the terms of Section 1-above, provided that you also meet all of these conditions:--    a) You must cause the modified files to carry prominent notices-    stating that you changed the files and the date of any change.--    b) You must cause any work that you distribute or publish, that in-    whole or in part contains or is derived from the Program or any-    part thereof, to be licensed as a whole at no charge to all third-    parties under the terms of this License.--    c) If the modified program normally reads commands interactively-    when run, you must cause it, when started running for such-    interactive use in the most ordinary way, to print or display an-    announcement including an appropriate copyright notice and a-    notice that there is no warranty (or else, saying that you provide-    a warranty) and that users may redistribute the program under-    these conditions, and telling the user how to view a copy of this-    License.  (Exception: if the Program itself is interactive but-    does not normally print such an announcement, your work based on-    the Program is not required to print an announcement.)--These requirements apply to the modified work as a whole.  If-identifiable sections of that work are not derived from the Program,-and can be reasonably considered independent and separate works in-themselves, then this License, and its terms, do not apply to those-sections when you distribute them as separate works.  But when you-distribute the same sections as part of a whole which is a work based-on the Program, the distribution of the whole must be on the terms of-this License, whose permissions for other licensees extend to the-entire whole, and thus to each and every part regardless of who wrote it.--Thus, it is not the intent of this section to claim rights or contest-your rights to work written entirely by you; rather, the intent is to-exercise the right to control the distribution of derivative or-collective works based on the Program.--In addition, mere aggregation of another work not based on the Program-with the Program (or with a work based on the Program) on a volume of-a storage or distribution medium does not bring the other work under-the scope of this License.--  3. You may copy and distribute the Program (or a work based on it,-under Section 2) in object code or executable form under the terms of-Sections 1 and 2 above provided that you also do one of the following:--    a) Accompany it with the complete corresponding machine-readable-    source code, which must be distributed under the terms of Sections-    1 and 2 above on a medium customarily used for software interchange; or,--    b) Accompany it with a written offer, valid for at least three-    years, to give any third party, for a charge no more than your-    cost of physically performing source distribution, a complete-    machine-readable copy of the corresponding source code, to be-    distributed under the terms of Sections 1 and 2 above on a medium-    customarily used for software interchange; or,--    c) Accompany it with the information you received as to the offer-    to distribute corresponding source code.  (This alternative is-    allowed only for noncommercial distribution and only if you-    received the program in object code or executable form with such-    an offer, in accord with Subsection b above.)--The source code for a work means the preferred form of the work for-making modifications to it.  For an executable work, complete source-code means all the source code for all modules it contains, plus any-associated interface definition files, plus the scripts used to-control compilation and installation of the executable.  However, as a-special exception, the source code distributed need not include-anything that is normally distributed (in either source or binary-form) with the major components (compiler, kernel, and so on) of the-operating system on which the executable runs, unless that component-itself accompanies the executable.--If distribution of executable or object code is made by offering-access to copy from a designated place, then offering equivalent-access to copy the source code from the same place counts as-distribution of the source code, even though third parties are not-compelled to copy the source along with the object code.--  4. You may not copy, modify, sublicense, or distribute the Program-except as expressly provided under this License.  Any attempt-otherwise to copy, modify, sublicense or distribute the Program is-void, and will automatically terminate your rights under this License.-However, parties who have received copies, or rights, from you under-this License will not have their licenses terminated so long as such-parties remain in full compliance.--  5. You are not required to accept this License, since you have not-signed it.  However, nothing else grants you permission to modify or-distribute the Program or its derivative works.  These actions are-prohibited by law if you do not accept this License.  Therefore, by-modifying or distributing the Program (or any work based on the-Program), you indicate your acceptance of this License to do so, and-all its terms and conditions for copying, distributing or modifying-the Program or works based on it.--  6. Each time you redistribute the Program (or any work based on the-Program), the recipient automatically receives a license from the-original licensor to copy, distribute or modify the Program subject to-these terms and conditions.  You may not impose any further-restrictions on the recipients' exercise of the rights granted herein.-You are not responsible for enforcing compliance by third parties to-this License.--  7. If, as a consequence of a court judgment or allegation of patent-infringement or for any other reason (not limited to patent issues),-conditions are imposed on you (whether by court order, agreement or-otherwise) that contradict the conditions of this License, they do not-excuse you from the conditions of this License.  If you cannot-distribute so as to satisfy simultaneously your obligations under this-License and any other pertinent obligations, then as a consequence you-may not distribute the Program at all.  For example, if a patent-license would not permit royalty-free redistribution of the Program by-all those who receive copies directly or indirectly through you, then-the only way you could satisfy both it and this License would be to-refrain entirely from distribution of the Program.--If any portion of this section is held invalid or unenforceable under-any particular circumstance, the balance of the section is intended to-apply and the section as a whole is intended to apply in other-circumstances.--It is not the purpose of this section to induce you to infringe any-patents or other property right claims or to contest validity of any-such claims; this section has the sole purpose of protecting the-integrity of the free software distribution system, which is-implemented by public license practices.  Many people have made-generous contributions to the wide range of software distributed-through that system in reliance on consistent application of that-system; it is up to the author/donor to decide if he or she is willing-to distribute software through any other system and a licensee cannot-impose that choice.--This section is intended to make thoroughly clear what is believed to-be a consequence of the rest of this License.--  8. If the distribution and/or use of the Program is restricted in-certain countries either by patents or by copyrighted interfaces, the-original copyright holder who places the Program under this License-may add an explicit geographical distribution limitation excluding-those countries, so that distribution is permitted only in or among-countries not thus excluded.  In such case, this License incorporates-the limitation as if written in the body of this License.--  9. The Free Software Foundation may publish revised and/or new versions-of the General Public License from time to time.  Such new versions will-be similar in spirit to the present version, but may differ in detail to-address new problems or concerns.--Each version is given a distinguishing version number.  If the Program-specifies a version number of this License which applies to it and "any-later version", you have the option of following the terms and conditions-either of that version or of any later version published by the Free-Software Foundation.  If the Program does not specify a version number of-this License, you may choose any version ever published by the Free Software-Foundation.--  10. If you wish to incorporate parts of the Program into other free-programs whose distribution conditions are different, write to the author-to ask for permission.  For software which is copyrighted by the Free-Software Foundation, write to the Free Software Foundation; we sometimes-make exceptions for this.  Our decision will be guided by the two goals-of preserving the free status of all derivatives of our free software and-of promoting the sharing and reuse of software generally.--			    NO WARRANTY--  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,-REPAIR OR CORRECTION.--  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE-POSSIBILITY OF SUCH DAMAGES.--		     END OF TERMS AND CONDITIONS--	    How to Apply These Terms to Your New Programs--  If you develop a new program, and you want it to be of the greatest-possible use to the public, the best way to achieve this is to make it-free software which everyone can redistribute and change under these terms.--  To do so, attach the following notices to the program.  It is safest-to attach them to the start of each source file to most effectively-convey the exclusion of warranty; and each file should have at least-the "copyright" line and a pointer to where the full notice is found.--    <one line to give the program's name and a brief idea of what it does.>-    Copyright (C) <year>  <name of author>--    This program is free software; you can redistribute it and/or modify-    it under the terms of the GNU General Public License as published by-    the Free Software Foundation; either version 2 of the License, or-    (at your option) any later version.--    This program is distributed in the hope that it will be useful,-    but WITHOUT ANY WARRANTY; without even the implied warranty of-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the-    GNU General Public License for more details.--    You should have received a copy of the GNU General Public License along-    with this program; if not, write to the Free Software Foundation, Inc.,-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.--Also add information on how to contact you by electronic and paper mail.--If the program is interactive, make it output a short notice like this-when it starts in an interactive mode:--    Gnomovision version 69, Copyright (C) year name of author-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.-    This is free software, and you are welcome to redistribute it-    under certain conditions; type `show c' for details.--The hypothetical commands `show w' and `show c' should show the appropriate-parts of the General Public License.  Of course, the commands you use may-be called something other than `show w' and `show c'; they could even be-mouse-clicks or menu items--whatever suits your program.--You should also get your employer (if you work as a programmer) or your-school, if any, to sign a "copyright disclaimer" for the program, if-necessary.  Here is a sample; alter the names:--  Yoyodyne, Inc., hereby disclaims all copyright interest in the program-  `Gnomovision' (which makes passes at compilers) written by James Hacker.--  <signature of Ty Coon>, 1 April 1989-  Ty Coon, President of Vice--This General Public License does not permit incorporating your program into-proprietary programs.  If your program is a subroutine library, you may-consider it more useful to permit linking proprietary applications with the-library.  If this is what you want to do, use the GNU Lesser General-Public License instead of this License.-
− Clr.hs
@@ -1,41 +0,0 @@-module Clr where--type CFlt = Double-data Color = Color {r,g,b :: !CFlt} deriving Show--c_black = Color 0 0 0-c_white = Color 1 1 1-c_red   = Color 1 0 0-c_green = Color 0 1 0-c_blue  = Color 0 0 1--cadd :: Color -> Color -> Color-cadd (Color r1 g1 b1) (Color r2 g2 b2) =- Color (r1+r2) (g1+g2) (b1+b2)--cdiv :: Color -> CFlt -> Color-cdiv c1 div =- cscale c1 (1/div)--cscale :: Color -> CFlt -> Color-cscale (Color r g b) mul =- Color (r * mul)-       (g * mul)-       (b * mul)--cmul :: Color -> Color -> Color-cmul (Color r1 g1 b1) (Color r2 g2 b2) =- Color (r1*r2) (g1*g2) (b1*b2)--cavg :: Color -> Color -> Color-cavg c1 c2 = cscale (cadd c1 c2) 0.5--cscaleadd :: Color -> Color -> CFlt -> Color-cscaleadd (Color r1 g1 b1) (Color r2 g2 b2) mul =- Color (r1+(r2*mul)) (g1+(g2*mul)) (b1+(b2*mul))--cclamp :: Color -> Color-cclamp (Color r g b) = - Color (if r > 0.0 then r else 0.0)-       (if g > 0.0 then g else 0.0)-       (if b > 0.0 then b else 0.0)
− Cone.hs
@@ -1,262 +0,0 @@-module Cone (disc, cone, cylinder) where-import Vec-import Solid-import Sphere -- for disc bounding box---- We define "Cone", "Cylinder", and "Disc" in this module.--- A Cone is really a tapered cylinder with a different radius--- at each end, though the underlying representation is a--- clipped cone.---- We represent Cylinders and Cones as transformations of axis-aligned--- primitives.---- Todo: cylinder shadow test--data Disc = Disc !Vec !Vec !Flt deriving Show -- position, normal, r*r-data Cylinder = Cylinder !Flt !Flt !Flt deriving Show -- radius height1 height2-data Cone = Cone !Flt !Flt !Flt !Flt deriving Show -- r clip1 clip2 height---- CONSTRUCTORS ----disc :: Vec -> Vec -> Flt -> SolidItem-disc pos norm r =- SolidItem $ Disc pos norm (r*r)--cylinder_z :: Flt -> Flt -> Flt -> SolidItem-cylinder_z r h1 h2 = SolidItem (Cylinder r h1 h2)--cone_z :: Flt -> Flt -> Flt -> Flt -> SolidItem-cone_z r h1 h2 height = SolidItem (Cone r h1 h2 height)---- construct a general cylinder from p1 to p2 with radius r-cylinder :: Vec -> Vec -> Flt -> SolidItem-cylinder p1 p2 r =- let axis = vsub p2 p1-     len  = vlen axis-     ax1  = vscale axis (1/len)-     (ax2,ax3) = orth ax1 - in transform (cylinder_z r 0 len)-              [ (xyz_to_uvw ax2 ax3 ax1),-                (translate p1) ]-                        --- similar for cone-cone :: Vec -> Flt -> Vec -> Flt -> SolidItem-cone p1 r1 p2 r2 =- if r1 < r2 - then cone p2 r2 p1 r1- else if r1-r2 < delta-      then cylinder p1 p2 r2-      else-        let axis = vsub p2 p1-            len  = vlen axis-            ax1  = vscale axis (1/len)-            (ax2,ax3) = orth ax1 -            height = (r1*len)/(r1-r2) -- distance to end point-        in-         transform (cone_z r1 0 len height)-                   [ (xyz_to_uvw ax2 ax3 ax1),-                     (translate p1) ]                 --rayint_disc :: Disc -> Ray -> Flt -> Texture -> Rayint-rayint_disc (Disc point norm radius_sqr) r d t =- let (Ray orig dir) = r-     dist = plane_int_dist r point norm - in if dist < 0 || dist > d -    then RayMiss-    else let pos = vscaleadd orig dir dist-             offset = vsub pos point-         in -          if (vdot offset offset) > radius_sqr-          then RayMiss-          else RayHit dist pos norm t--shadow_disc :: Disc -> Ray -> Flt -> Bool-shadow_disc (Disc point norm radius_sqr) r d =- let (Ray orig dir) = r-     dist = plane_int_dist r point norm - in if dist < 0 || dist > d -    then False-    else let pos = vscaleadd orig dir dist-             offset = vsub pos point-         in -          if (vdot offset offset) > radius_sqr-          then False-          else True--bound_disc :: Disc -> Bbox-bound_disc (Disc pos norm rsqr) =- bound (sphere pos (sqrt rsqr))--instance Solid Disc where- rayint = rayint_disc- shadow = shadow_disc- inside (Disc _ _ _) _ = False- bound = bound_disc---rayint_cylinder :: Cylinder -> Ray -> Flt -> Texture -> Rayint-rayint_cylinder (Cylinder r h1 h2) (Ray orig dir) d t =- let Vec ox oy oz = orig-     Vec dx dy dz = dir-     a = dx*dx + dy*dy-     b = 2*(dx*ox + dy*oy)-     c = ox*ox + oy*oy - r*r-     disc = b*b - 4*a*c- in  if disc < 0 -     then RayMiss-     else -      let discsqrt = sqrt disc -          q = if b < 0 -              then (b-discsqrt)*(-0.5)-              else (b+discsqrt)*(-0.5)-          t0' = q/a-          t1' = c/q-          t0  = fmin t0' t1'-          t1  = fmax t0' t1'-      in if t1 < 0 || t0 > d -         then RayMiss-         else let dist = if t0 < 0-                         then t1-                         else t0-              in if dist < 0 || dist > d-                 then RayMiss-                 else let pos = vscaleadd orig dir dist-                          Vec posx posy posz = pos-                      in if posz > h1 && posz < h2-                         then RayHit dist pos (Vec (posx/r) (posy/r) 0) t-                         else if dz > 0 -- ray pointing up from bottom-                              then if oz < h1-                                   then rayint_disc (Disc (Vec 0 0 h1) nvz (r*r)) (Ray orig dir) d t-                                   --then rayint_aadisc h1 r (Ray orig dir) d t-                                   else RayMiss-                              else if oz > h2-                                   then rayint_disc (Disc (Vec 0 0 h2) vz (r*r)) (Ray orig dir) d t-                                   --rayint_aadisc h2 r (Ray orig dir) d t -- todo: fix normal-                                   else RayMiss--inside_cylinder :: Cylinder -> Vec -> Bool-inside_cylinder (Cylinder r h1 h2) (Vec x y z) =- z > h1 && z < h2 && x*x + y*y < r*r-  -bound_cylinder :: Cylinder -> Bbox-bound_cylinder (Cylinder r h1 h2) =- Bbox (Vec (-r) (-r) h1) (Vec r r h2)--instance Solid Cylinder where- rayint = rayint_cylinder- inside = inside_cylinder- bound = bound_cylinder---rayint_cone :: Cone -> Ray -> Flt -> Texture -> Rayint-rayint_cone (Cone r clip1 clip2 height) (Ray orig dir) d t =- let Vec ox oy oz = orig-     Vec dx dy dz = dir-     k' = (r/height)-     k = k'*k'-     a = dx*dx + dy*dy - k*dz*dz-     b = 2*(dx*ox + dy*oy - k*dz*(oz-height))-     c = ox*ox + oy*oy - k*(oz-height)*(oz-height)-     disc = b*b - 4*a*c- in if disc < 0-    then RayMiss-    else-     let discsqrt = sqrt disc-         q = if b < 0-             then (b-discsqrt)*(-0.5)-             else (b+discsqrt)*(-0.5)-         t0' = q/a-         t1' = c/q-         t0  = fmin t0' t1'-         t1  = fmax t0' t1'-     in if t1 < 0 || t0 > d -        then RayMiss-        else let dist = if t0 < 0-                        then t1-                        else t0-             in if dist < 0 || dist > d-                then RayMiss-                else-                 let pos = vscaleadd orig dir dist-                     Vec posx posy posz = pos-                 in if posz > clip1 && posz < clip2-                    then let invhyp = 1 / (sqrt (height*height + r*r))-                             up  = r * invhyp-                             out = height * invhyp-                             r_ = sqrt (posx*posx + posy*posy)-                             correction = (out)/(r_)-                         in RayHit dist pos (Vec (posx*correction) (posy*correction) up) t-                    else -                     if dz > 0 -- ray pointing up from bottom-                     then if oz < clip1-                          then rayint_disc (Disc (Vec 0 0 clip1) nvz (r*r)) (Ray orig dir) d t-                          else RayMiss-                     else if oz > clip2-                          then let r2 = r*(1-((clip2-clip1)/(height)))-                               in rayint_disc (Disc (Vec 0 0 clip2) vz (r2*r2)) (Ray orig dir) d t-                                   --rayint_aadisc clip2 r2 (Ray orig dir) d t-                          else RayMiss-                             -- then rayint_aadisc clip1 r (Ray orig dir) d t-                             -- else RayMiss -- rayint_aadisc clip2 -                                              --   (r*((clip2-clip1)/height)) -                                               --  (Ray orig dir) d t -- todo: fix normal--shadow_cone :: Cone -> Ray -> Flt -> Bool-shadow_cone (Cone r clip1 clip2 height) (Ray orig dir) d =- let Vec ox oy oz = orig-     Vec dx dy dz = dir-     k' = (r/height)-     k = k'*k'-     a = dx*dx + dy*dy - k*dz*dz-     b = 2*(dx*ox + dy*oy - k*dz*(oz-height))-     c = ox*ox + oy*oy - k*(oz-height)*(oz-height)-     disc = b*b - 4*a*c- in if disc < 0-    then False-    else-     let discsqrt = sqrt disc-         q = if b < 0-             then (b-discsqrt)*(-0.5)-             else (b+discsqrt)*(-0.5)-         t0' = q/a-         t1' = c/q-         t0  = fmin t0' t1'-         t1  = fmax t0' t1'-     in if t1 < 0 || t0 > d -        then False-        else let dist = if t0 < 0-                        then t1-                        else t0-             in if dist < 0 || dist > d-                then False-                else-                 let pos = vscaleadd orig dir dist-                     Vec posx posy posz = pos-                 in if posz > clip1 && posz < clip2-                    then True-                    else -                     if dz > 0 -- ray pointing up from bottom-                     then if oz < clip1-                          then shadow (Disc (Vec 0 0 clip1) nvz (r*r)) (Ray orig dir) d-                          else False-                     else if oz > clip2-                          then let r2 = r*(1-((clip2-clip1)/(height)))-                               in shadow (Disc (Vec 0 0 clip2) vz (r2*r2)) (Ray orig dir) d-                          else False---inside_cone :: Cone -> Vec -> Bool-inside_cone (Cone rbase h1 h2 height) (Vec x y z) =- let r = rbase*(1-(((z-h1)/height)))- in z > h1 && z < h2 && x*x + y*y < r*r--bound_cone :: Cone -> Bbox-bound_cone (Cone r h1 h2 height) =- Bbox (Vec (-r) (-r) h1) (Vec r r h2)--instance Solid Cone where- rayint = rayint_cone- shadow = shadow_cone- inside = inside_cone- bound  = bound_cone
− Csg.hs
@@ -1,111 +0,0 @@-module Csg (difference, intersection) where-import Vec-import Solid-import Data.List---- Constructive Solid Geometry--- (boolean operations for solids)---- todo: implement shadow tests--data Difference = Difference SolidItem SolidItem deriving Show-data Intersection = Intersection [SolidItem] deriving Show----Difference----- csg of object b subtracted from object a ---difference :: SolidItem -> SolidItem -> SolidItem-difference a b = SolidItem $ Difference a b--rayint_difference :: Difference -> Ray -> Flt -> Texture -> Rayint-rayint_difference dif r d t =- let Difference sa sb = dif-     Ray orig dir = r-     ria = rayint sa r d t- in-  case ria of-   RayMiss -> RayMiss-   RayHit ad ap an at ->-    if inside sb orig -    then-     case rayint sb r d t of-      RayMiss -> RayMiss -      RayHit bd bp bn bt ->-       if bd < ad -       then if inside sa bp -            then RayHit bd bp (vinvert bn) bt-            else rayint_advance (SolidItem dif) r d t bd-       else rayint_advance (SolidItem dif) r d t bd-    else -     if inside sb ap-     then rayint_advance (SolidItem dif) r d t ad-     else RayHit ad ap an at-----Intersection---intersection :: [SolidItem] -> SolidItem-intersection slds = SolidItem $ Intersection slds---- fixme: there's some numerical instability near edges-rayint_intersection :: Intersection -> Ray -> Flt -> Texture -> Rayint-rayint_intersection (Intersection slds) r d t =- let (Ray orig dir) = r - in-  if null slds || d < 0-  then RayMiss-  else -   let s = head slds -   in case tail slds of-       [] -> rayint s r d t-       ss -> if inside s orig-             then case rayint s r d t of -                   RayMiss -> rayint (Intersection ss) r d t-                   RayHit sd sp sn st -> -                    case rayint (Intersection ss) r sd t of-                     RayMiss -> rayint_advance (SolidItem (Intersection slds)) -                                               r d t sd -                     hit -> hit-             else case rayint s r d t of-                   RayMiss -> RayMiss-                   RayHit sd sp sn st ->-                    if inside (Intersection ss) sp-                    then RayHit sd sp sn st-                    else rayint_advance (SolidItem (Intersection slds))-                                        r d t sd--inside_difference :: Difference -> Vec -> Bool-inside_difference (Difference sa sb) pt =- (inside sa pt) && (not $ inside sb pt)---- note: inside is True for an empty intersection.--- this is actually the preferred semantics in --- some cases, strange as it may seem.-inside_intersection :: Intersection -> Vec -> Bool-inside_intersection (Intersection slds) pt =- foldl' (&&) True (map (\x -> inside x pt) slds) --bound_difference :: Difference -> Bbox-bound_difference (Difference sa sb) = bound sa--bound_intersection :: Intersection -> Bbox-bound_intersection (Intersection slds) =- if null slds - then empty_bbox- else foldl' bboverlap everything_bbox (map bound slds)--primcount_difference :: Difference -> Pcount-primcount_difference (Difference sa sb) = pcadd (primcount sa) (primcount sb)--primcount_intersection :: Intersection -> Pcount-primcount_intersection (Intersection slds) = foldl (pcadd) pcnone (map primcount slds)--instance Solid Difference where- rayint = rayint_difference- inside = inside_difference- bound  = bound_difference- primcount = primcount_difference--instance Solid Intersection where- rayint = rayint_intersection- inside = inside_intersection- bound  = bound_intersection- primcount = primcount_intersection
Glome.hs view
@@ -1,6 +1,10 @@-import Scene-import Trace-import Spd+{-# OPTIONS_GHC -fexcess-precision #-}+{-# OPTIONS_GHC -funbox-strict-fields #-}+{-# LANGUAGE BangPatterns #-}++import Data.Glome.Scene as Scene+import Data.Glome.Trace as Trace+import Data.Glome.Spd as Spd import TestScene import Graphics.Rendering.OpenGL import Graphics.UI.GLUT as GLUT@@ -13,6 +17,7 @@ import System.Console.GetOpt import Data.Maybe( fromMaybe ) -- import OpenEXR -- work in progress+import Unsafe.Coerce  -- import Debug.Trace -- import Data.ByteString @@ -44,9 +49,12 @@  -- convert trace result to  -- appropriate float type for OpenGL-fc :: Flt -> Float+fc :: Flt -> GLfloat fc x = realToFrac x +--fc :: Flt -> GLfloat+--fc = unsafeCoerce+ -- given a block of screen coordinates, return list of pixels gen_pixel_list :: Flt -> Flt -> Flt -> Flt -> Flt -> Flt -> Scene -> [(Flt,Flt,Flt,Flt,Flt,Flt)] gen_pixel_list curx cury stopx stopy maxx maxy scene =@@ -59,7 +67,7 @@        if x >= stopx          then          gp curx (y+1)-        else +        else          let scx = (x-midx) / midx              scy = (y-midy) / midy              --(Clr.Color r g b) = get_color scx (scy*(midy/midx)) scene@@ -107,8 +115,8 @@                                   (\y -> (x*block_size,y*block_size) )                                     [0..yblocks-1] )                                   [0..xblocks-1]-     pixels  = map -- (parMap rnf) -               (\(x,y) -> gen_pixel_list_packet x y (x+block_size) (y+block_size) maxx maxy scene)+     pixels  = (parMap rnf) +               (\(x,y) -> gen_pixel_list x y (x+block_size) (y+block_size) maxx maxy scene)                (blocks)  in   do@@ -138,8 +146,8 @@   print $ "(primitives,transforms,bounding objects): " ++ (show (primcount_scene scene))   t2 <-  getPOSIXTime   print $ "scene setup: " ++ (show (t2-t1))-  let sx = 720 :: GLsizei-  let sy = 480 :: GLsizei+  let sx = 1280 :: GLsizei+  let sy = 720 :: GLsizei   let sizex = fromIntegral sx   let sizey = fromIntegral sy   (name, _) <- getArgsAndInitialize
LICENSE view
@@ -1,4 +1,4 @@-    This program, Glome.hs, is copyright 2008 Jim Snow+    This library, GlomeVec, is copyright 2008 Jim Snow      This program is free software; you can redistribute it and/or modify     it under the terms of version 2 of the GNU General Public License as 
− Plane.hs
@@ -1,45 +0,0 @@-module Plane (plane, plane_offset) where-import Vec-import Solid---- A plane is effectively a half-space; everything below the plane is--- "inside", everything above is "outside".--data Plane = Plane Vec Flt deriving Show -- normal, perpendicular offset from origin---- Usually, the most convenient way to define a plane is --- by specifying a point on the plane and a normal--plane :: Vec -> Vec -> SolidItem-plane orig norm_ = SolidItem $ Plane norm d- where norm = vnorm norm_-       d = vdot orig norm---- we can also specify a point and a perpindicular offset:--plane_offset :: Vec -> Flt -> SolidItem-plane_offset pt off = SolidItem $ Plane pt off--rayint_plane :: Plane -> Ray -> Flt -> Texture -> Rayint-rayint_plane (Plane norm offset) (Ray orig dir) d t =- let hit = -(((vdot norm orig)-offset) / (vdot norm dir))- in if hit < 0 || hit > d -    then RayMiss-    else RayHit hit (vscaleadd orig dir hit) norm t--inside_plane :: Plane -> Vec -> Bool-inside_plane (Plane norm offset) pt =- let onplane = (vscale norm offset)-     newvec = vsub onplane pt- in vdot newvec norm > 0---- Note: attempting to use an infinite object (such as--- a plane) inside a bih will cause an exception.--bound_plane :: Plane -> Bbox-bound_plane (Plane norm offset) = everything_bbox--instance Solid Plane where- rayint = rayint_plane- inside = inside_plane- bound = bound_plane
− README
@@ -1,43 +0,0 @@-Glome.hs is a haskell port of my ocaml raytracer, glome. -(http://syn.cs.pdx.edu/~jsnow/glome)--To compile on unix-type systems, execute "./make", to run, execute "./run".  -Otherwise, invoke compiler commands manually.--Update: glome has been converted over to cabal, so you can now invoke--> runhaskell Setup.lhs configure --prefix=$HOME --user-> runhaskell Setup.lhs build-> runhaskell Setup.lhs install--(The "make" and "run" scripts should still work.)--Glome.hs depends on opengl bindings, which come in the standard ghc distribution.-Glome has been tested with ghc 6.8.2.--Features: -- can load files in NFF format-- handles diffuse illumination, shadows, and reflection-- renders triangles, spheres, cylinders, cones, disks, boxes-  and planes as base primitives-- supports csg group, difference, and intersection primitives-- supports transformations (rotate, scale, translate) of -  arbitrary geometry-- perlin noise and a few basic textures are implemented-- uses a bounding interval heirarchy acceleration structure-  or you can construct a BVH manually with the "Bound" primitive-- multiprocessor support is available, but it leaks memory-  and scaling is sub-linear-- packet tracing (2x2) of primary rays is enabled by default-- as of 0.5, glome uses type classes, and new primitives can-  be defined in their own module--Using: to load an NFF scene, run "./Glome -n [filename]".-Otherwise, a default scene is rendered, defined in "TestScene.hs".--Many of the features are only accessible by programming directly in-Haskell via TestScene.hs, as NFF does not support CSG or textures.--Refraction and photon mapping are not yet implemented.---jim
+ README.txt view
@@ -0,0 +1,12 @@++This is GlomeView, a graphical frontend to Glome, my raytracer.  Originally, Glome was a monolithic program, but I have now moved most of the internals to a couple of libraries, GlomeVec and GlomeTrace.++GlomeView requires HOpenGL.++This was one of the first things I wrote in Haskell.  As such, it has a few rough edges.++http://www.haskell.org/haskellwiki/Glome++Direct all questions to:+Jim Snow+jsnow@cs.pdx.edu
− Scene.hs
@@ -1,77 +0,0 @@-module Scene (Scene(Scene), Light(Light), Camera(Camera),-              scene, camera, light, -              sld, lits, cam, dtex, bground,-              primcount_scene,-              module Clr,-              module Vec,-              module Solid,-              module Sphere,-              module Triangle,-              module Bih,-              module Csg,-              module Plane,-              module Box,-              module Bound,-              module Cone,-              module Tex) where-import Clr-import Vec-import Solid-import Sphere-import Triangle-import Bih-import Csg-import Plane-import Box-import Bound-import Cone-import Tex---- This is the module to import if you want to have--- access to all the Solid constructors and scene--- defininition code.----LIGHTS---data Light = Light {litpos :: !Vec,-                    litcol :: !Color} deriving Show--light :: Vec -> Color -> Light-light pos clr = Light pos clr---- CAMERA ---data Camera = Camera {campos, fwd, up, right :: !Vec} -              deriving Show--default_cam = (Camera (vec 0.0 0.0 (-3.0)) -                      (vec 0.0 0.0 1.0) -                      (vec 0.0 1.0 0.0) -                      (vec 1.0 0.0 0.0) )--camera :: Vec -> Vec -> Vec -> Flt -> Camera-camera pos at up angle =- let fwd   = vnorm $ vsub at pos-     right = vnorm $ vcross up fwd-     up_   = vnorm $ vcross fwd right-     cam_scale = tan ((pi/180)*(angle/2))- in-  Camera pos fwd-         (vscale up_ cam_scale) -         (vscale right cam_scale)----SCENE---data Scene = Scene {sld     :: SolidItem,-                    lits    :: [Light], -                    cam     :: Camera, -                    dtex    :: Texture, -                    bground :: Color} deriving Show--scene :: SolidItem -> [Light] -> Camera -> Texture -> Color -> Scene-scene s l cam t clr = Scene s l cam t clr--primcount_scene :: Scene -> Pcount-primcount_scene (Scene sld _ _ _ _) = primcount sld--{--default_scene = (Scene (sphere (vec 0.0 0.0 0.0) 1.0) -                       [] default_cam t_white c_white)--}
+ Setup.hs view
@@ -0,0 +1,6 @@+module Main (main) where++import Distribution.Simple++main :: IO ()+main = defaultMain
− Setup.lhs
@@ -1,4 +0,0 @@-#! /usr/bin/env runhaskell--> import Distribution.Simple-> main = defaultMain
− Solid.hs
@@ -1,522 +0,0 @@-module Solid where-import Vec-import Clr-import Data.List hiding (group)----COMMON DATATYPES AND UTILITY FUNCTIONS---data Bbox = Bbox {p1 :: !Vec, p2 :: !Vec} deriving Show-data Interval = Interval !Flt !Flt deriving Show -- used instead of a tuple----union of two bounding boxes-bbjoin :: Bbox -> Bbox -> Bbox-bbjoin (Bbox p1a p2a) (Bbox p1b p2b) =- (Bbox (vmin p1a p1b) (vmax p2a p2b))----overlap of two bounding boxes-bboverlap :: Bbox -> Bbox -> Bbox-bboverlap (Bbox p1a p2a) (Bbox p1b p2b) =- (Bbox (vmax p1a p1b) (vmin p2a p2b))----split a bounding box into two-bbsplit :: Bbox -> Int -> Flt -> (Bbox,Bbox)-bbsplit (Bbox p1 p2) axis offset =- if (offset < (va p1 axis)) || (offset > (va p2 axis))- then error "degenerate bounding box split"- else ((Bbox p1 (vset p2 axis offset)),-       (Bbox (vset p1 axis offset) p2))---- generate a bounding box from a list of points-bbpts :: [Vec] -> Bbox-bbpts [] = empty_bbox-bbpts ((Vec x y z):[]) =- Bbox (Vec (x-delta) (y-delta) (z-delta)) -      (Vec (x+delta) (y+delta) (z+delta))--bbpts ((Vec x y z):pts) =- let (Bbox (Vec p1x p1y p1z) (Vec p2x p2y p2z)) = bbpts pts-     minx = fmin (x-delta) p1x-     miny = fmin (y-delta) p1y-     minz = fmin (z-delta) p1z-     maxx = fmax (x+delta) p2x-     maxy = fmax (y+delta) p2y-     maxz = fmax (z+delta) p2z in- Bbox (Vec minx miny minz) (Vec maxx maxy maxz)---- surface area, volume of bounding boxes-bbsa :: Bbox -> Flt-bbsa (Bbox p1 p2) =- let Vec dx dy dz = vsub p2 p1 - in dx*dy + dx*dz + dy*dz--bbvol :: Bbox -> Flt-bbvol (Bbox p1 p2) =- let (Vec dx dy dz) = vsub p2 p1- in dx*dy*dz--empty_bbox = - Bbox (Vec infinity infinity infinity) -      (Vec (-infinity) (-infinity) (-infinity))--everything_bbox =- Bbox (Vec (-infinity) (-infinity) (-infinity))-      (Vec infinity infinity infinity)---- Find a ray's entrance and exit from a bounding --- box.  If last entrance is before the first exit,--- we hit.  Otherwise, we miss. (It's up to the --- caller to figure that out.)--bbclip :: Ray -> Bbox -> Interval-bbclip (Ray (Vec ox oy oz) (Vec dx dy dz)) -       (Bbox (Vec p1x p1y p1z) (Vec p2x p2y p2z)) =- let dxrcp = 1/dx-     dyrcp = 1/dy-     dzrcp = 1/dz-     Interval inx outx = if dx > 0 -                         then Interval ((p1x-ox)*dxrcp) ((p2x-ox)*dxrcp)-                         else Interval ((p2x-ox)*dxrcp) ((p1x-ox)*dxrcp)-     Interval iny outy = if dy > 0-                         then Interval ((p1y-oy)*dyrcp) ((p2y-oy)*dyrcp)-                         else Interval ((p2y-oy)*dyrcp) ((p1y-oy)*dyrcp)-     Interval inz outz = if dz > 0-                         then Interval ((p1z-oz)*dzrcp) ((p2z-oz)*dzrcp)-                         else Interval ((p2z-oz)*dzrcp) ((p1z-oz)*dzrcp)- in-   Interval (fmax3 inx iny inz) (fmin3 outx outy outz)--data Rayint = RayHit {- depth    :: !Flt,- pos      :: !Vec,- norm     :: !Vec,- texture  :: Texture-} | RayMiss deriving Show--nearest :: Rayint -> Rayint -> Rayint-nearest a RayMiss = a-nearest RayMiss b = b-nearest !(RayHit da pa na ta) !(RayHit db pb nb tb) =- if da < db- then RayHit da pa na ta- else RayHit db pb nb tb--furthest :: Rayint -> Rayint -> Rayint-furthest !a !RayMiss = RayMiss-furthest !RayMiss !b = RayMiss-furthest !(RayHit da pa na ta) !(RayHit db pb nb tb) =- if da > db- then RayHit da pa na ta- else RayHit db pb nb tb--hit :: Rayint -> Bool-hit (RayHit _ _ _ _) = True-hit RayMiss = False--dist :: Rayint -> Flt-dist RayMiss = infinity-dist (RayHit d _ _ _) = d----Packet Types---data PacketResult = PacketResult !Rayint !Rayint !Rayint !Rayint-packetmiss = PacketResult RayMiss RayMiss RayMiss RayMiss---nearest_packetresult :: PacketResult -> PacketResult -> PacketResult-nearest_packetresult !(PacketResult a1 a2 a3 a4) !(PacketResult b1 b2 b3 b4) =- PacketResult (nearest a1 b1)-              (nearest a2 b2)-              (nearest a3 b3)-              (nearest a4 b4)---- move ray forward, intersect, fix result--- useful in csg-rayint_advance :: SolidItem -> Ray -> Flt -> Texture -> Flt -> Rayint-rayint_advance s r d t adv =- let a = adv+delta- in-  case (rayint s (ray_move r a) (d-a) t) of-   RayMiss -> RayMiss-   RayHit depth pos norm tex -> RayHit (depth+a) pos norm tex-----MATERIALS---data Material = Material {clr :: Color, -                          refl, refr, ior, -                          kd, shine :: !Flt} deriving Show-type Texture = Rayint -> Material---- this is sort of a no-op; we don't have a--- good way to show an arbitrary function-showTexture :: Texture -> String-showTexture t = show $ t RayMiss--instance Show Texture where- show = showTexture--m_white = (Material c_white 0 0 0 1 2)-t_white ri = m_white--t_uniform :: Material -> Texture-t_uniform m = \x -> m--interp :: Flt -> Flt -> Flt -> Flt-interp scale a b =- scale*a + (1-scale)*b----not really correct, but we'll go with it for now-m_interp :: Material -> Material -> Flt -> Material-m_interp m1 m2 scale =- let (Material m1c m1refl m1refr m1ior m1kd m1shine) = m1-     (Material m2c m2refl m2refr m2ior m2kd m2shine) = m2-     intp  = interp scale-     c     = cadd (cscale m1c scale) (cscale m2c (1-scale))-     refl  = intp m1refl m2refl-     refr  = intp m1refr m2refr-     ior   = intp m1ior m2ior-     kd    = intp m1kd m2kd-     shine = intp m1shine m2shine- in (Material c refl refr ior kd shine)----utility functions for "primcount"-newtype Pcount = Pcount (Int,Int,Int) deriving Show--pcadd :: Pcount -> Pcount -> Pcount-pcadd (Pcount (a1,a2,a3)) (Pcount (b1,b2,b3)) = Pcount (a1+b1, a2+b2, a3+b3)--asbound :: Pcount -> Pcount-asbound (Pcount (a,b,c)) = Pcount (0,b,a+c)--pcsinglexfm ::  Pcount-pcsinglexfm = Pcount (0,1,0)--pcsingleprim :: Pcount-pcsingleprim = Pcount (1,0,0)--pcsinglebound :: Pcount-pcsinglebound = Pcount (0,0,1)--pcnone :: Pcount-pcnone = Pcount (0,0,0)---- utility functions for rayint_debug-debug_wrap :: (Rayint,Int) -> Int -> (Rayint,Int)-debug_wrap (ri,a) b = (ri,(a+b))--nearest_debug :: (Rayint,Int) -> (Rayint,Int) -> (Rayint,Int)-nearest_debug (ari, an) (bri, bn) = ((nearest ari bri),(an+bn))----SOLID CLASS----class (Show a) => Solid a where- rayint :: a -> Ray -> Flt -> Texture -> Rayint- rayint_debug :: a -> Ray -> Flt -> Texture -> (Rayint, Int)- packetint :: a -> Ray -> Ray -> Ray -> Ray -> Flt -> Texture -> PacketResult - shadow :: a -> Ray -> Flt -> Bool- inside :: a -> Vec -> Bool- bound  :: a -> Bbox- tolist :: a -> [SolidItem]- transform :: a -> [Xfm] -> SolidItem- transform_leaf :: a -> [Xfm] -> SolidItem- flatten_transform :: a -> [SolidItem]- primcount :: a -> Pcount-- -- This is for counting bih split planes ands the like.- -- We have to provide an implementation for most composite- -- primitives.- rayint_debug s !r !d t = ((rayint s r d t),0)-- -- Sometimes, we can improve performance by - -- intersecting 4 rays at once.  This is - -- especially true of acceleration structures.- -- By default, we fall back on mono-rays.- packetint s !r1 !r2 !r3 !r4 !d t = -  PacketResult (rayint s r1 d t)-               (rayint s r2 d t)-               (rayint s r3 d t)-               (rayint s r4 d t)-- -- if there is no shadow function, we fall back on rayint- shadow s !r !d =-  case (rayint s r d t_white) of-   RayHit _ _ _ _ -> True-   RayMiss -> False-- -- This is here so we can flatten a group of groups- -- into a single group; the default is fine for everything- -- but groups and Void and SolidItem- tolist a = [SolidItem (a)]- - -- Method to transform an object; the default works fine- -- except for instances themselves, which will want to- -- collapse the two transformations into a sigle transform.- transform a xfm = SolidItem $ Instance (SolidItem a) (compose xfm)-- -- This is used by flatten_transform below.  For simple objects, it - -- works the same as transform, but for groups it transforms all the- -- objects individually.- transform_leaf = transform-- -- This prepares a composite primitive to be fed into the bih constructor- -- by pushing all the transformations out to the leaves and - -- throwing away manual bounding structures.  For simple primitives, this- -- is a no-op.- flatten_transform = tolist-- -- Figure out how complicated the scene really is.- -- Returns (primitives, matricies, bounding objects/planes).- -- Also, it forces the full construction of acceleration structures.- primcount s = pcsingleprim---- Existential type so we can make a heterogeneous list of solids,--- and embed them in composite types.--- http://notes-on-haskell.blogspot.com/2007/01/proxies-and-delegation-vs-existential.html--data SolidItem = forall a. Solid a => SolidItem a--instance Solid SolidItem where- rayint (SolidItem s) !r !d t = rayint s r d t- packetint (SolidItem s) !r1 !r2 !r3 !r4 !d t = packetint s r1 r2 r3 r4 d t- rayint_debug (SolidItem s) r d t = rayint_debug s r d t- shadow (SolidItem s) !r !d = shadow s r d- inside (SolidItem s) pt = inside s pt- bound  (SolidItem s) = bound s- tolist (SolidItem s) = tolist s -- don't wrap in a redundant SolidItem like everything else- transform (SolidItem s) xfm = transform s xfm -- same here- transform_leaf (SolidItem s) xfm = transform_leaf s xfm -- and here- flatten_transform (SolidItem s) = [SolidItem (flatten_transform s)] -- and here- primcount (SolidItem s) = primcount s--instance Show SolidItem where- show (SolidItem s) = "SI " ++ show s---- we implement "group", "void", and "instance" here because they're--- used by some of the other primitives---- GROUP ----group :: [SolidItem] -> SolidItem-group [] = SolidItem Void-group (sld:[]) = sld-group slds = SolidItem (flatten_group slds)---- smash a group of groups into a single group,--- so we can build an efficient bounding heirarchy-flatten_group :: [SolidItem] -> [SolidItem]-flatten_group slds = concat (map tolist slds)---- this lets us treat lists of SolidItems as regular Solids-rayint_group :: [SolidItem] -> Ray -> Flt -> Texture -> Rayint-rayint_group [] _ _ _ = RayMiss-rayint_group (x:xs) !r !d t = nearest (rayint x r d t) (rayint_group xs r d t)--packetint_group :: [SolidItem] -> Ray -> Ray -> Ray -> Ray -> Flt -> Texture -> PacketResult-packetint_group [] !r1 !r2 !r3 !r4 !d t = packetmiss-packetint_group (x:xs) !r1 !r2 !r3 !r4 !d t = - nearest_packetresult (packetint x r1 r2 r3 r4 d t) -                      (packetint_group xs r1 r2 r3 r4 d t)--rayint_debug_group :: [SolidItem] -> Ray -> Flt -> Texture -> (Rayint,Int)-rayint_debug_group [] _ _ _ = (RayMiss,0)-rayint_debug_group (x:xs) !r !d t = - nearest_debug (rayint_debug x r d t) -               (rayint_debug_group xs r d t)--shadow_group :: [SolidItem] -> Ray -> Flt -> Bool-shadow_group [] !r !d = False-shadow_group (x:xs) r d = (shadow x r d) || (shadow_group xs r d)--inside_group :: [SolidItem] -> Vec -> Bool-inside_group slds pt =- foldl' (||) False (map (\x -> inside x pt) slds)--bound_group :: [SolidItem] -> Bbox-bound_group slds = - foldl' bbjoin empty_bbox (map bound slds)--transform_leaf_group :: [SolidItem] -> [Xfm] -> SolidItem-transform_leaf_group slds xfms =- SolidItem $ map (\x -> transform_leaf x xfms) (tolist slds)--primcount_group :: [SolidItem] -> Pcount-primcount_group slds = foldl (pcadd) (Pcount (0,0,0)) (map primcount slds)--instance Solid [SolidItem] where- rayint = rayint_group- packetint = packetint_group- rayint_debug = rayint_debug_group- shadow = shadow_group- inside = inside_group- bound = bound_group- tolist a = concat $ map tolist a- transform_leaf = transform_leaf_group- flatten_transform a = concat $ map flatten_transform a- primcount = primcount_group---- VOID ----- non-object (originally called "Nothing", but that--- conflicted with the prelude maybe type, so we call--- it "Void" instead) -data Void = Void deriving Show--nothing = SolidItem Void--instance Solid Void where- rayint Void _ _ _ = RayMiss- packetint Void _ _ _ _ _ _ = packetmiss- shadow Void _ _ = False- inside Void _ = False- bound  Void = empty_bbox- tolist Void = []- transform Void xfms = SolidItem Void ---- INSTANCE ----- this would be better in its own module, but we need--- "Instance" to be defined here for the default implementation--- of "transform".  (I tried mutually recursive modules, it--- didn't work.  http://www.haskell.org/ghc/docs/latest/html/---  users_guide/separate-compilation.html#mutual-recursion ) ---- Another good reason to include Instance in Solid.hs--- is that it's referenced from Cone.hs---- An instance is a primitive that has been modified--- by a transformation (i.e. some combination of--- translation, rotation, and scaling).  This is a--- reasonably space-efficient way of making multiple copies--- of a complex object.---- It's unfortunate that "instance" is also a reserved word.  --- "instance Solid Instance where..." is a little confusing.--data Instance = Instance SolidItem Xfm deriving Show--rayint_instance :: Instance -> Ray -> Flt -> Texture -> Rayint-rayint_instance (Instance sld xfm) (Ray orig dir) d t =- let newdir  = invxfm_vec xfm dir-     neworig = invxfm_point xfm orig-     lenscale = vlen newdir-     invlenscale = 1/lenscale- in-  case (rayint sld (Ray neworig (vscale newdir invlenscale)) (d*lenscale) t) of-   RayMiss -> RayMiss-   RayHit depth pos n tex -> RayHit (depth*invlenscale) -                                    (xfm_point xfm pos) -                                    (vnorm (invxfm_norm xfm n)) -                                    tex--packetint_instance :: Instance -> Ray -> Ray -> Ray -> Ray -> Flt -> Texture -> PacketResult-packetint_instance (Instance sld xfm) !(Ray orig1 dir1) !(Ray orig2 dir2) -                                      !(Ray orig3 dir3) !(Ray orig4 dir4) d t =- let newdir1  = invxfm_vec xfm dir1-     newdir2  = invxfm_vec xfm dir2-     newdir3  = invxfm_vec xfm dir3-     newdir4  = invxfm_vec xfm dir4-     neworig1 = invxfm_point xfm orig1-     neworig2 = invxfm_point xfm orig2-     neworig3 = invxfm_point xfm orig3-     neworig4 = invxfm_point xfm orig4-     lenscale1 = vlen newdir1-     lenscale2 = vlen newdir2-     lenscale3 = vlen newdir3-     lenscale4 = vlen newdir4-     invlenscale1 = 1/lenscale1-     invlenscale2 = 1/lenscale2-     invlenscale3 = 1/lenscale3-     invlenscale4 = 1/lenscale4- in-  let pr = packetint sld (Ray neworig1 (vscale newdir1 invlenscale1)) -                         (Ray neworig2 (vscale newdir2 invlenscale2)) -                         (Ray neworig3 (vscale newdir3 invlenscale3)) -                         (Ray neworig4 (vscale newdir4 invlenscale4)) -                         (d*lenscale1) t-      PacketResult ri1 ri2 ri3 ri4 = pr -      fix ri ils = -       case ri of -        RayMiss -> RayMiss-        RayHit depth pos n tex -> RayHit (depth*ils) -                                         (xfm_point xfm pos) -                                         (vnorm (invxfm_norm xfm n)) -                                         tex-  in PacketResult (fix ri1 invlenscale1)-                  (fix ri2 invlenscale2)-                  (fix ri3 invlenscale3)-                  (fix ri4 invlenscale4)---- ugh, code duplication-rayint_debug_instance :: Instance -> Ray -> Flt -> Texture -> (Rayint,Int)-rayint_debug_instance (Instance sld xfm) (Ray orig dir) d t =- let newdir  = invxfm_vec xfm dir-     neworig = invxfm_point xfm orig-     lenscale = vlen newdir-     invlenscale = 1/lenscale- in-  case (rayint_debug sld (Ray neworig (vscale newdir invlenscale)) (d*lenscale) t) of-   (RayMiss, count) -> (RayMiss, count)-   (RayHit depth pos n tex, count) -> (RayHit (depth*invlenscale) -                                         (xfm_point xfm pos) -                                         (vnorm (invxfm_norm xfm n)) -                                         tex, count)--shadow_instance :: Instance -> Ray -> Flt -> Bool-shadow_instance (Instance sld xfm) (Ray orig dir) d =- let newdir  = invxfm_vec xfm dir-     neworig = invxfm_point xfm orig-     lenscale = vlen newdir-     invlenscale = 1/lenscale- in-  shadow sld (Ray neworig (vscale newdir invlenscale)) (d*lenscale)--inside_instance :: Instance -> Vec -> Bool-inside_instance (Instance s xfm) pt =- inside s (xfm_point xfm pt)--bound_instance :: Instance -> Bbox-bound_instance (Instance sld xfm) =- let (Bbox (Vec p1x p1y p1z) (Vec p2x p2y p2z)) = bound sld-     pxfm = xfm_point xfm- in-     bbpts  [(pxfm (Vec x y z)) | x <- [p1x,p2x],-                                  y <- [p1y,p2y],-                                  z <- [p1z,p2z]]---- If we try to create a transformation of--- a transformation, we can merge those--- into a single transformation.---- This ought to be tested to verify this--- is really applying transforms in the--- correct order...--transform_instance :: Instance -> [Xfm] -> SolidItem-transform_instance (Instance s xfm2) xfm1 =- transform s [compose ([xfm2]++xfm1) ]--transform_leaf_instance :: Instance -> [Xfm] -> SolidItem-transform_leaf_instance (Instance s xfm2) xfm1 =- transform_leaf s [compose ([xfm2]++xfm1) ]---- Flatten_transform attempts to push all transformations --- in a heirarchy out to the leaf nodes.  The case we're--- interested in here is an instance of a group, and we --- want to replace that with a group of individually --- transformed instances.  This could be construed as a--- waste of memory, but in some cases it's necessary.--flatten_transform_instance :: Instance -> [SolidItem]-flatten_transform_instance (Instance s xfm) = - [SolidItem $ transform_leaf s [xfm]]- -- group $ map (\x -> transform (flatten_transform x) [xfm]) (tolist s)--primcount_instance :: Instance -> Pcount-primcount_instance (Instance s xfm) = pcadd (primcount s) pcsinglexfm--instance Solid Instance where- rayint = rayint_instance- packetint = packetint_instance- rayint_debug = rayint_debug_instance- shadow = shadow_instance- inside = inside_instance- bound  = bound_instance- transform = transform_instance- transform_leaf = transform_leaf_instance- flatten_transform = flatten_transform_instance- primcount = primcount_instance
− SolidTexture.hs
@@ -1,127 +0,0 @@-{--module SolidTexture (square_wave, triangle_wave, sine_wave, -                     stripe, noise, turbulence-                    ) where -}--module SolidTexture where-import Clr-import Vec-import Data.Array.IArray---- INTERPOLATION FUNCTIONS ---square_wave :: Flt -> Flt-square_wave x =- let offset = x - (fromIntegral (floor x))- in if offset < 0.5 then 0 else 1--triangle_wave :: Flt -> Flt-triangle_wave x =- let offset = x - (fromIntegral (floor x))- in if offset < 0.5 -    then (offset*2)-    else (2-(offset*2))--sine_wave :: Flt -> Flt-sine_wave x = (sin (x*2*pi))*0.5 + 0.5---lump_wave :: Flt -> Flt-lump_wave x = 1 - x*x*x---- SCALAR TEXTURE FUNCTIONS ------ These are simple solid texture functions that take a --- point as argument and return a number 0 < n < 1--stripe :: Vec -> (Flt -> Flt) -> (Vec -> Flt)-stripe axis interp =- let len = vlen axis - in-  (\pos -> let offset = vdot pos axis -           in interp offset)----- PERLIN NOISE ------ (-6 t^5 + 15 t^4 - 10t^3 +1)--- "realistic ray tracing 2nd edition" inconsistent --- on whether it should be t^5 or t^6,--- but t^5 works and t^6 doesn't.-omega :: Flt -> Flt-omega t_ = - let t     = fabs t_-     tsqr  = t*t-     tcube = tsqr*t- in (-6)*tcube*tsqr + 15*tcube*t - 10*tcube + 1---- questionably random-phi :: Array Int Int-phi = listArray (0,11) [3,0,2,7,4,1,5,11,8,10,9,6]--grad :: Array Int Vec-grad = listArray (0,11) -         $ filter (\x -> let l = vlen x in l < 1.5 && l > 1.1) -                  [Vec x y z | x <- [(-1),0,1],-                               y <- [(-1),0,1],-                               z <- [(-1),0,1]] --gamma :: Int -> Int -> Int -> Vec-gamma i j k =- let a = phi!(mod (iabs k) 12)-     b = phi!(mod (iabs (j+a)) 12)-     c = phi!(mod (iabs (i+b)) 12)- in grad!c--knot :: Int -> Int -> Int -> Vec -> Flt-knot i j k v =- let Vec x y z = v- in (omega x) * (omega y) * (omega z) * (vdot (gamma i j k) v)--intGamma :: Int -> Int -> Int-intGamma i j =- let a = phi!(mod (iabs j) 16)-     b = phi!(mod (iabs (i+a)) 16)- in b--turbulence :: Vec -> Int -> Flt-turbulence p 1 = fabs(noise(p))-turbulence p n =- let newp = vscale p 0.5-     t = fabs (noise p)- in t + (0.5 * (turbulence newp (n-1)))--noise :: Vec -> Flt -noise (Vec x y z) =- let i = floor x-     j = floor y-     k = floor z-     u = x-(fromIntegral i)-     v = y-(fromIntegral j)-     w = z-(fromIntegral k)- in knot i j k             (Vec u v w) +-    knot (i+1) j k         (Vec (u-1) v w) +-    knot i (j+1) k         (Vec u (v-1) w) +-    knot i j (k+1)         (Vec u v (w-1)) +-    knot (i+1) (j+1) k     (Vec (u-1) (v-1) w) +-    knot (i+1) j (k+1)     (Vec (u-1) v (w-1)) +-    knot i (j+1) (k+1)     (Vec u (v-1) (w-1)) +-    knot (i+1) (j+1) (k+1) (Vec (u-1) (v-1) (w-1))--perlin :: Vec -> Flt-perlin v =- let p = ((noise v)+1)*0.5- in if p > 1 -    then error $ "perlin noise error, 1 < " ++ (show p)-    else if p < 0 -         then error $ "perlin noise error, 0 > " ++ (show p)-         else p----untested-perlin_turb :: Vec -> Int -> Flt-perlin_turb v l =- let p = turbulence v l- in if p > 1 -    then error $ "perlin turbulence error, 1 < " ++ (show p)-    else if p < 0 -         then error $ "perlin turbulence error, 0 > " ++ (show p)-         else p
− Spd.hs
@@ -1,244 +0,0 @@-module Spd where-import Scene---- NFF file format description:--- http://tog.acm.org/resources/SPD/NFF.TXT---- this would probably be much shorter if I used scanf instead of lex--lexignore s =- let t = lex s - in-  case t of -   [] -> [] -- newline-   [("",s1)] -> lexcr s1-   [(_,s1)] -> lexignore s1 --lexcr s = - let t = lex s- in -  case t of-   [(s1,[])] -> t-   [("",s1)] -> lexcr s1-   [("#",s1)] -> lexignore s1-   _ -> t--data BgColor = BgColor(Color)--readsSpdVec :: ReadS Vec-readsSpdVec s = [((Vec x y z),s3) | (x,s1) <- reads s  :: [(Flt,String)], -                                    (y,s2) <- reads s1 :: [(Flt,String)],-                                    (z,s3) <- reads s2 :: [(Flt,String)] ]-instance Read Vec where- readsPrec _ = readsSpdVec--readsSpdVecNorm :: ReadS (Vec,Vec)-readsSpdVecNorm s = [(((Vec x y z),(Vec nx ny nz)),s6) -                     | (x,s1) <- reads s  :: [(Flt,String)], -                       (y,s2) <- reads s1 :: [(Flt,String)],-                       (z,s3) <- reads s2 :: [(Flt,String)],-                       (nx,s4) <- reads s3  :: [(Flt,String)],-                       (ny,s5) <- reads s4  :: [(Flt,String)],-                       (nz,s6) <- reads s5  :: [(Flt,String)] ]--instance Read (Vec,Vec) where- readsPrec _ = readsSpdVecNorm----- if this seems intuitive, there's something wrong with you-readsSpdVecs :: ReadS [Vec]-readsSpdVecs s =- let parses = reads s :: [(Vec,String)]- in- if null parses- then [([],s)]- else-  let (v,rest) = head parses-      (vs,returns) = head (readsSpdVecs rest)-  in [((v:vs),returns)]--instance Read [Vec] where- readsPrec _ = readsSpdVecs--readsSpdVecsNorms :: ReadS [(Vec,Vec)]-readsSpdVecsNorms s = - let parses = readsSpdVecNorm s :: [((Vec,Vec),String)]- in- if null parses- then [([],s)]- else-  let (v,rest) = head parses-      (vs,returns) = head (readsSpdVecsNorms rest)-  in [((v:vs),returns)]--instance Read [(Vec,Vec)] where- readsPrec _ = readsSpdVecsNorms--{- "v"-   "from" Fx Fy Fz-   "at" Ax Ay Az-   "up" Ux Uy Uz-   "angle" angle-   "hither" hither-   "resolution" xres yres -}-readsSpdCam :: ReadS Camera-readsSpdCam s = [ (camera from at up angle,s14) | ("v", s1)      <- lexcr s,-                                                  ("from", s2)   <- lexcr s1,-                                                  (from, s3)     <- reads s2 :: [(Vec,String)],-                                                  ("at", s4)     <- lexcr s3,-                                                  (at, s5)       <- reads s4 :: [(Vec,String)],-                                                  ("up", s6)     <- lexcr s5,-                                                  (up, s7)       <- reads s6 :: [(Vec,String)],-                                                  ("angle", s8)  <- lexcr s7,-                                                  (angle, s9)    <- reads s8 :: [(Flt,String)],-                                                  ("hither", s10)<- lexcr s9,-                                                  (_,s11)        <- lexcr s10,-                                                  ("resolution", s12) <- lexcr s11,-                                                  (_, s13)       <- lexcr s12,-                                                  (_, s14)       <- lexcr s13 ]-instance Read Camera where- readsPrec _ = readsSpdCam----readsSpdClr :: ReadS Color-readsSpdClr s = [((Color r g b), s3) | (r, s1)  <- reads s  :: [(Flt,String)],-                                       (g, s2)  <- reads s1 :: [(Flt,String)],-                                       (b, s3)  <- reads s2 :: [(Flt,String)] ]-instance Read Color where- readsPrec _ = readsSpdClr----- "b" R G B-readsSpdBackground :: ReadS BgColor-readsSpdBackground s = [((BgColor clr), s2) | ("b", s1) <- lexcr s,-                                     (clr, s2) <- reads s1 :: [(Color,String)] ]-instance Read BgColor where- readsPrec _ = readsSpdBackground----- "l" X Y Z [R G B]-readsSpdLight :: ReadS Light-readsSpdLight s = [((Light pos clr),s3) | ("l", s1) <- lexcr s,-                                          (pos, s2) <- reads s1 :: [(Vec,String)],-                                          (clr, s3) <- reads s2 :: [(Color,String)] ]-                  ++-                  [((Light pos (Color 1 1 1)),s2) | ("l", s1) <- lexcr s,-                                                    (pos, s2) <- reads s1 :: [(Vec,String)] ]-instance Read Light where- readsPrec _ = readsSpdLight---- "f" red green blue Kd Ks Shine T index_of_refraction--- data Material = Material {clr :: Color, reflect, refract, ior, kd, ks, shine :: Flt}-readsSpdFill :: ReadS Texture-readsSpdFill s = [(\ri->Material clr ks (1-trans) ior kd shine, s7) | ("f", s1)    <- lexcr s,-                                    (clr, s2)    <- reads s1 :: [(Color,String)],-                                    (kd, s3)     <- reads s2 :: [(Flt,String)],-                                    (ks, s4)     <- reads s3 :: [(Flt,String)],-                                    (shine, s5)  <- reads s4 :: [(Flt,String)],-                                    (trans, s6)  <- reads s5 :: [(Flt,String)],-                                    (ior, s7)    <- reads s6 :: [(Flt,String)] ]--instance Read (Rayint -> Material) where- readsPrec _ = readsSpdFill----- "s" center.x center.y center.z radius---- "c"--- base.x base.y base.z base_radius--- apex.x apex.y apex.z apex_radius---- "p" total_vertices--- vert1.x vert1.y vert1.z--- [etc. for total_vertices vertices]--readsSpdSolid :: ReadS SolidItem-readsSpdSolid s = [((sphere center radius),s3) | ("s", s1) <- lexcr s,-                                                 (center,s2) <- reads s1 :: [(Vec,String)],-                                                 (radius,s3) <- reads s2 :: [(Flt,String)] ]-                  ++-                  [((cone e1 r1 e2 r2),s5) | ("c",s1) <- lexcr s,-                                             (e1,s2)  <- reads s1 :: [(Vec,String)],-                                             (r1,s3)  <- reads s2 :: [(Flt,String)],-                                             (e2,s4)  <- reads s3 :: [(Vec,String)],-                                             (r2,s5)  <- reads s4 :: [(Flt,String)] ]-                  ++-                  [(group (triangles verts),s3) | ("p",s1) <- lexcr s,-                                                  (n,s2) <- reads s1 :: [(Int,String)],-                                                  (verts,s3) <- readsSpdVecs s2 :: [([Vec],String)] ]-                  ++-                  [(group (trianglesnorms (vns)),s3) | ("pp",s1) <- lexcr s,-                                                       (n,s2) <- reads s1 :: [(Int,String)],-                                                       (vns,s3) <- readsSpdVecsNorms s2 :: [([(Vec,Vec)],String)] ]-                  {- ++-                  [(tex(Void,t),s1) | (t,s1) <- reads s :: [(Texture,String)]] -}----- instance Read Solid where--- readsPrec _ = readsSpdSolid----- same as readSpdVecs, just different types-readsSpdPrims :: ReadS [SolidItem]-readsSpdPrims s =- let parses = readsSpdSolid s :: [(SolidItem,String)]- in- if null parses- then [([],s)]- else-  let (v,rest) = head parses-      (vs,returns) = head (readsSpdPrims rest)-  in [((v:vs),returns)]--instance Read [SolidItem] where- readsPrec _ = readsSpdPrims---readsSpdTextureGroup :: ReadS SolidItem-readsSpdTextureGroup s =- [((tex (bih prims) t),s2) | (t,s1)     <- reads s :: [(Texture,String)],-                               (prims,s2) <- readsSpdPrims s1 :: [([SolidItem],String)] ]- -instance Read SolidItem where- readsPrec _ = readsSpdTextureGroup--accum_rss :: [Camera] -> [Light] -> [SolidItem] -> [BgColor] -> String -> ([Camera],[Light],[SolidItem],[BgColor],String)-accum_rss cams lights prims background s = -  if null s-   then (cams,lights,prims,background,s)-  else-   let cam = reads s :: [(Camera,String)]-       sld = reads s :: [(SolidItem,String)]-       lit = reads s :: [(Light,String)]-       bgc = reads s :: [(BgColor,String)]-   in-     if not $ null cam-     then-       let (c1,s1) = head cam-      in accum_rss (c1:cams) lights prims background s1-     else-      if not $ null sld-      then-       let (s2,s1) = head sld -       in  accum_rss cams lights (s2:prims) background s1-      else-       if not $ null lit-       then-        let (l1,s1) = head lit-        in accum_rss cams (l1:lights) prims background s1-       else-        if not $ null bgc-        then-         let (b1,s1) = head bgc-         in accum_rss cams lights prims (b1:background) s1-        else-         (cams,lights,prims,background,s)--readsSpdScene :: ReadS Scene-readsSpdScene s = -  let ((cam:cams),lights,prims,(BgColor(bgc):bgcs),s1) = accum_rss [] [] [] [] s-  in [((scene (bih prims) lights cam t_white bgc),s1)]--instance Read Scene where- readsPrec _ = readsSpdScene
− Sphere.hs
@@ -1,75 +0,0 @@-module Sphere (sphere) where-import Vec-import Solid--data Sphere = Sphere !Vec !Flt !Flt deriving Show--sphere :: Vec -> Flt -> SolidItem-sphere c r =- SolidItem (Sphere c r (1.0/r))---- adapted from graphics gems volume 1-rayint_sphere :: Sphere -> Ray -> Flt -> Texture -> Rayint-rayint_sphere (Sphere center r invr) (Ray e dir) dist t = - let eo = vsub center e-     v  = vdot eo dir- in- if (dist >= (v - r)) && (v > 0.0)- then-  let vsqr = v*v-      csqr = vdot eo eo-      rsqr = r*r-      disc = rsqr - (csqr - vsqr) in-  if disc < 0.0 then-   RayMiss-  else-   let d = sqrt disc-       hitdist = if (v-d) > 0 then (v-d) else (v+d)-   in if (hitdist < 0) || (hitdist > dist)-      then RayMiss-      else-       let p = vscaleadd e dir hitdist-           -- n = vscale (vsub p center) invr in-           -- n = vsub (vscale p invr) (vscale center invr) in-           n = vnorm (vsub p center) -       in RayHit hitdist p n t- else-  RayMiss--shadow_sphere :: Sphere -> Ray -> Flt -> Bool-shadow_sphere (Sphere center r invr) (Ray e dir) dist = - let eo = vsub center e-     v  = vdot eo dir- in- if (dist >= (v - r)) && (v > 0.0)- then-  let vsqr = v*v-      csqr = vdot eo eo-      rsqr = r*r-      disc = rsqr - (csqr - vsqr) in-  if disc < 0.0 then-  False-  else-   let d = sqrt disc-       hitdist = if (v-d) > 0 then (v-d) else (v+d)-   in if (hitdist < 0) || (hitdist > dist)-      then False-      else True- else-  False--inside_sphere :: Sphere -> Vec -> Bool-inside_sphere (Sphere center r invr) pt =- let offset = vsub center pt - in (vdot offset offset) < r*r--bound_sphere :: Sphere -> Bbox-bound_sphere (Sphere center r invr) =- let offset = (vec r r r) in- (Bbox (vsub center offset) (vadd center offset))--instance Solid Sphere where - rayint = rayint_sphere- shadow = shadow_sphere- inside = inside_sphere- bound  = bound_sphere
TestScene.hs view
@@ -1,7 +1,9 @@+{-# LANGUAGE ScopedTypeVariables #-}+ module TestScene (scn) where-import Scene+import Data.Glome.Scene import Data.List hiding (group)-import SolidTexture+import Data.Glome.Texture import System.Random  lights = [ Light (Vec (-100) 70 (140)) (cscale (Color 1 0.8 0.8) 2500)@@ -130,13 +132,13 @@  -- some textures m_shiny_white :: Material-m_shiny_white = (Material c_white 0.3 0 0 0.7 10)+m_shiny_white = (Material c_white 0.3 0 0 0.7 0.8 10)  t_shiny_white :: Texture t_shiny_white ri = m_shiny_white  m_dull_gray :: Material-m_dull_gray = (Material (Color 0.4 0.3 0.35) 0 0 0 0.2 1)+m_dull_gray = (Material (Color 0.4 0.3 0.35) 0 0 0 0.2 0 1)  t_mottled (RayHit _ pos norm _) =  --let scale = (stripe (Vec 1 1 1) sine_wave) pos@@ -159,13 +161,14 @@ --shouldn't happen t_stripe RayMiss = m_shiny_white  --m_matte c = (Material c 0 0 0 1 2)+m_matte :: Color -> Material+m_matte c = (Material c 0 0 0 1 0 2) +t_matte :: Color -> Texture t_matte c = - (\ri -> (Material c 0 0 0 1 2)) + (\ri -> (Material c 0 0 0 1 0 2))  -m_mirror = (Material (Color 0.8 0.8 1) 1 0 0 0.2 1000)+m_mirror = (Material (Color 0.8 0.8 1) 1 0 0 0.2 0.8 1000) t_mirror =   (\ri -> m_mirror) 
− Tex.hs
@@ -1,55 +0,0 @@-module Tex (tex) where-import Vec-import Solid---- Textured objects ----- The type "Texture" is used elsewhere, so--- we just call a textured object a "Tex".---- How textured objects work is a little strange:--- instead of having a texture applied to every object,--- which seems rather wastefull, we use the container --- object "Tex"; anything contained in that Tex has --- that texture.---- In the case of nested Tex objects, the innermost --- texture has precedence.  Textures are implemented--- by passing a Texture in to the rayint function.--- Most objects just return the Texture unchanged (as--- part of the RayHit record) but Tex overwrites the --- texture with its own.--data Tex = Tex SolidItem Texture deriving Show--tex :: SolidItem -> Texture -> SolidItem-tex s t = SolidItem $ Tex s t--rayint_tex :: Tex -> Ray -> Flt -> Texture -> Rayint-rayint_tex (Tex s tex) r d t = rayint s r d tex--rayint_debug_tex :: Tex -> Ray -> Flt -> Texture -> (Rayint,Int)-rayint_debug_tex (Tex s tex) r d t = rayint_debug s r d tex--packetint_tex :: Tex -> Ray -> Ray -> Ray -> Ray -> Flt -> Texture -> PacketResult-packetint_tex (Tex s tx) r1 r2 r3 r4 d t = packetint s r1 r2 r3 r4 d tx--shadow_tex :: Tex -> Ray -> Flt -> Bool-shadow_tex (Tex s _) r d = shadow s r d--inside_tex :: Tex -> Vec -> Bool-inside_tex (Tex s _) pt = inside s pt--bound_tex :: Tex -> Bbox -bound_tex (Tex s _) = bound s--primcount_tex :: Tex -> Pcount-primcount_tex (Tex s _) = primcount s--instance Solid Tex where- rayint = rayint_tex- rayint_debug = rayint_debug_tex- packetint = packetint_tex- shadow = shadow_tex- inside = inside_tex- bound = bound_tex- primcount = primcount_tex
− Trace.hs
@@ -1,143 +0,0 @@-module Trace where-import Scene-import Data.List-import Control.Concurrent.MVar-import System.IO.Unsafe---import Packet--{--We put lighting code in this file because it needs to be -mutually recursive with the trace function, for refraction-and reflection.- -}--data PacketColor = PacketColor !Color !Color !Color !Color---{--simple_shade :: Rayint -> [Light] -> Solid -> Color -> Color-simple_shade ri lights s bg =- case ri of-  (RayHit d p n t) ->-   let (Material clr refl refr ior kd shine) = t ri-   in cscale clr (vdot n (Vec 0.0 1.0 0.0))-  (RayMiss) -> bg--}---- set rgb to normal's xyz coordinates--- as a debugging aid-debug_norm_shade :: Rayint -> Ray -> Scene -> Int -> Int -> Color-debug_norm_shade ri (Ray o indir) scn recurs debug =- case ri of-  RayHit d p (Vec nx ny nz) t -> (Color (fabs $ nx/2) (fabs $ ny/2) (fabs $ nz/2))-  RayMiss -> bground scn---- no shadows, reflection, or lighting-flat_shade :: Rayint -> Ray -> Scene -> Int -> Int -> Color-flat_shade ri (Ray o indir) scn recurs debug =- case ri of-  RayMiss -> bground scn-  RayHit d p n t -> -   let (Material clr refl refr ior kd shine) = t ri-   in clr---- handles diffuse light, shadows, specular highlights and reflection--- todo: refraction-shade :: Rayint -> Ray -> Scene -> Int -> Int -> Color-shade ri (Ray o indir) scn recurs !debug = - case ri of-  (RayHit d p n t) ->-   let (Material clr refl_ refr ior kd shine) = t ri-       s    = sld scn-       lights = lits scn-       direct = foldl' cadd c_black -                 (map (\ (Light lp lc) ->-                   let eyedir = vinvert indir-                       lvec = vsub lp p-                       llen = vlen lvec-                       ldir = vscale lvec (1.0/llen)   -                       halfangle = bisect ldir eyedir-                       ldotn  = fmax 0 $ vdot ldir n-                       -- blinn  = fmax 0 ((vdot halfangle n)**(shine*3))-                       blinn = fmax 0 $ ((vdot halfangle n) ** shine) * ldotn-                       blinn_correct = if isNaN blinn then 0 else blinn-                       -- indotn = fmax 0 $ vdot eyedir n-                       intensity = 5.0 / (llen*llen)-                       --intensity = 0.2-                   in-                    if vdot n lvec < 0 -                    then c_black-                    else-                     if not $ shadow s (Ray (vscaleadd p n delta) ldir) (llen-(2*delta))-                     then-                       cadd -                        -- diffuse-                        --c_black-                        (cmul clr $ cscale lc $ ldotn * intensity)-                        -- blinn/torrance-sparrow  highlight (pbrt p 440)-                        (cscale lc $ blinn_correct * intensity)-                        -- c_black-                     else -                       c_black) lights)-       reflect_ = -         if (refl_ > delta) && (recurs > 0)-         then let outdir = reflect indir n -              in cscale (trace scn -                               (Ray (vscaleadd p outdir delta) outdir) -                               infinity (recurs-1) ) refl_-         else c_black-       refract = -         if (refr > delta) && (recurs > 0)-         then c_black-         else c_black-       in-         cadd direct $ cadd reflect_ refract--  (RayMiss) -> bground scn--trace :: Scene -> Ray -> Flt -> Int -> Color-trace scn ray depth recurs =- let (Scene sld lights cam dtex bgcolor) = scn - in shade (rayint sld ray depth dtex) ray scn recurs 0-         --- return depth as well as color, for post-processing effects-trace_depth :: Scene -> Ray -> Flt -> Int -> (Color,Flt)-trace_depth scn ray depth recurs =- let (Scene sld lights cam dtex bgcolor) = scn -     ri = rayint sld ray depth dtex -     d = case ri of-          RayHit d_ _ _ _ -> d_-          RayMiss -> infinity-     clr = shade ri ray scn recurs 0- in (clr,d)---- return hit position as well as color-trace_pos :: Scene -> Ray -> Flt -> Int -> (Color,Vec)-trace_pos scn ray depth recurs =- let (Scene sld lights cam dtex bgcolor) = scn -     ri = rayint sld ray depth dtex -     p = case ri of-          RayHit _ p _ _ -> p-          RayMiss -> (Vec 0 0 0) -- fixme-     clr = shade ri ray scn recurs 0- in (clr,p)--trace_debug :: Scene -> Ray -> Flt -> Int -> Color-trace_debug scn ray depth recurs =- let (Scene sld lights cam dtex bgcolor) = scn-     (ri,n) = rayint_debug sld ray depth dtex- in -  -- unsafePerformIO $-  -- do-  --  print n-  --  return $ -  cadd (shade ri ray scn recurs 0) (Color 0 ((fromIntegral (Prelude.abs n)) * 0.01) 0)--trace_packet :: Scene -> Ray -> Ray -> Ray -> Ray -> Flt -> Int -> PacketColor-trace_packet scn ray1 ray2 ray3 ray4 depth recurs =- let (Scene sld lights cam dtex bgcolor) = scn-     PacketResult ri1 ri2 ri3 ri4 = packetint sld ray1 ray2 ray3 ray4 depth dtex- in PacketColor (shade ri1 ray1 scn recurs 0)-                (shade ri2 ray2 scn recurs 0)-                (shade ri3 ray3 scn recurs 0)-                (shade ri4 ray4 scn recurs 0)
− Triangle.hs
@@ -1,135 +0,0 @@-module Triangle where-import Vec-import Solid---- Simple triangles, and triangles with normal vectors--- specified at each vertex.--data Triangle = Triangle Vec Vec Vec deriving Show-data TriangleNorm = TriangleNorm Vec Vec Vec Vec Vec Vec deriving Show--triangle :: Vec -> Vec -> Vec -> SolidItem-triangle v1 v2 v3 =- SolidItem (Triangle v1 v2 v3)--triangles :: [Vec] -> [SolidItem]-triangles (v1:vs) =- zipWith (\v2 v3 -> triangle v1 v2 v3) vs (tail vs)  --trianglenorm v1 v2 v3 n1 n2 n3 =- SolidItem (TriangleNorm v1 v2 v3 n1 n2 n3)--trianglesnorms :: [(Vec,Vec)] -> [SolidItem]-trianglesnorms (vn1:vns) =- zipWith (\vn2 vn3 -> trianglenorm (fst vn1) (fst vn2) (fst vn3)-                                   (snd vn1) (snd vn2) (snd vn3))-         vns (tail vns)---- adaptation of Moller and Trumbore from pbrt page 127-rayint_triangle :: Triangle -> Ray -> Flt -> Texture -> Rayint-rayint_triangle (Triangle p1 p2 p3) (Ray o dir) dist tex =- let e1 = vsub p2 p1-     e2 = vsub p3 p1-     s1 = vcross dir e2-     divisor = vdot s1 e1- in -   if (divisor == 0)-   then RayMiss-   else-     let invdivisor = 1.0 / divisor-         d = vsub o p1 -         b1 = (vdot d s1) * invdivisor-     in-       if (b1 < 0) || (b1 > 1) -       then RayMiss -       else-         let s2 = vcross d e1-             b2 = (vdot dir s2) * invdivisor-         in-           if (b2 < 0) || (b1 + b2 > 1) -           then RayMiss-           else-             let t = (vdot e2 s2) * invdivisor-           in-             if (t < 0) || (t > dist)-             then RayMiss-             else-               RayHit t (vscaleadd o dir t) (vnorm (vcross e1 e2)) tex--rayint_trianglenorm :: TriangleNorm -> Ray -> Flt -> Texture -> Rayint-rayint_trianglenorm (TriangleNorm p1 p2 p3 n1 n2 n3) (Ray o dir) dist tex =- let e1 = vsub p2 p1-     e2 = vsub p3 p1-     s1 = vcross dir e2-     divisor = vdot s1 e1- in -   if (divisor == 0)-   then RayMiss-   else-     let invdivisor = 1.0 / divisor-         d = vsub o p1 -         b1 = (vdot d s1) * invdivisor-     in-       if (b1 < 0) || (b1 > 1) -       then RayMiss -       else-         let s2 = vcross d e1-             b2 = (vdot dir s2) * invdivisor-         in-           if (b2 < 0) || (b1 + b2 > 1) -           then RayMiss-           else-             let t = (vdot e2 s2) * invdivisor-           in-             if (t < 0) || (t > dist)-             then RayMiss-             else-               let n1scaled = (vscale n1 (1-(b1+b2))) -                   n2scaled = (vscale n2 b1)-                   n3scaled = (vscale n3 b2)-                   norm = vnorm $ vadd3 n1scaled n2scaled n3scaled-               in RayHit t (vscaleadd o dir t) norm  tex--bound_triangle :: Triangle -> Bbox-bound_triangle (Triangle (Vec v1x v1y v1z) -                (Vec v2x v2y v2z) -                (Vec v3x v3y v3z)) =- Bbox-  (Vec ((fmin (fmin v1x v2x) v3x) - delta)-       ((fmin (fmin v1y v2y) v3y) - delta)-       ((fmin (fmin v1z v2z) v3z) - delta) )--  (Vec ((fmax (fmax v1x v2x) v3x) + delta)-       ((fmax (fmax v1y v2y) v3y) + delta)-       ((fmax (fmax v1z v2z) v3z) + delta) )--bound_trianglenorm :: TriangleNorm -> Bbox-bound_trianglenorm (TriangleNorm v1 v2 v3 n1 n2 n3) =- bound (Triangle v1 v2 v3)--transform_triangle :: Triangle -> [Xfm] -> SolidItem-transform_triangle (Triangle p1 p2 p3) xfms =- SolidItem $ Triangle (xfm_point (compose xfms) p1)-                      (xfm_point (compose xfms) p2)-                      (xfm_point (compose xfms) p3)--transform_trianglenorm :: TriangleNorm -> [Xfm] -> SolidItem-transform_trianglenorm (TriangleNorm p1 p2 p3 n1 n2 n3) xfms =- SolidItem $ TriangleNorm (xfm_point (compose xfms) p1)-                          (xfm_point (compose xfms) p2)-                          (xfm_point (compose xfms) p3)-                          (vnorm $ xfm_vec (compose xfms) n1)-                          (vnorm $ xfm_vec (compose xfms) n2)-                          (vnorm $ xfm_vec (compose xfms) n3)--instance Solid Triangle where- rayint = rayint_triangle- inside _ _ = False- bound = bound_triangle- transform = transform_triangle--instance Solid TriangleNorm where- rayint = rayint_trianglenorm- inside _ _ = False- bound = bound_trianglenorm- transform = transform_trianglenorm
− Vec.hs
@@ -1,525 +0,0 @@-{-# OPTIONS_GHC -fexcess-precision #-}--- make sure it gets enabled--- (doesn't seem to help much, though)--module Vec where---- Performance is pretty similar with Floats or Doubles--- best performance seems to be doubles with -fvia-C-type Flt = Double---- This is unnecessary, because haskell has sane mod--- semantics, unlike ocaml and c.-sane_mod :: Int -> Int -> Int-sane_mod a b =- let modres = mod a b in-  if modres < 0 -  then modres + b-  else modres---- maybe this is defined somewhere?-infinity :: Flt---infinity = 1.0 / 0.0-infinity = 1000000.0---- convert from degrees to native angle format (radians)-deg :: Flt -> Flt-deg !x = (x*3.1415926535897)/180---- convert from radians (noop)-rad :: Flt -> Flt-rad !x = x---- convert from rotations-rot :: Flt -> Flt-rot !x = x*3.1415926535897*2--{-abs_sub :: Flt -> Flt -> Flt-abs_sub a b =- if a > 0.0- then -  if b < a -  then a-b-  else 0.0- else-  if b < (-a)-  then a+b-  else 0.0--}--clamp :: Flt -> Flt -> Flt -> Flt-clamp !min !x !max- | x < min = min- | x > max = max- | otherwise = x---- delta = 0.00001 :: Flt-delta = 0.0001 :: Flt---- non-polymorphic versions; this speeds--- things up in ocaml, not sure about haskell-fmin :: Flt -> Flt -> Flt-fmin !a !b = if a > b then b else a--fmax :: Flt -> Flt -> Flt-fmax !a !b = if a > b then a else b--fmin3 :: Flt -> Flt -> Flt -> Flt-fmin3 !a !b !c = if a > b -                 then if b > c -                      then c-                      else b-                 else if a > c-                      then c-                      else a--fmax3 :: Flt -> Flt -> Flt -> Flt-fmax3 !a !b !c = if a > b-                 then if a > c-                      then a-                      else c-                 else if b > c-                      then b-                      else c--fmin4 :: Flt -> Flt -> Flt -> Flt -> Flt-fmin4 !a !b !c !d = fmin (fmin a b) (fmin c d)--fmax4 :: Flt -> Flt -> Flt -> Flt -> Flt-fmax4 !a !b !c !d = fmax (fmax a b) (fmax c d)--fabs :: Flt -> Flt-fabs !a = - if a < 0 then (-a) else a--iabs :: Int -> Int-iabs !a =- if a < 0 then (-a) else a--abs a = error "use non-polymorphic version, fabs"---- true if a and b are "almost" equal--- the (abs $ a-b) test doesn't work if--- a and b are large-about_equal :: Flt -> Flt -> Bool-about_equal !a !b =- if a > 1 - then-  fabs (1 - (a/b)) < (delta*10) - else-  (fabs $ a - b) < (delta*10)---data Vec = Vec {x, y, z :: !Flt} deriving Show-data Ray = Ray {origin, dir :: !Vec} deriving Show---data Plane = Plane {norm :: !Vec, offset :: !Flt} deriving Show--vec !x !y !z = (Vec x y z)-vzero = Vec 0.0 0.0 0.0---- for when we need a unit vector, but we --- don't care where it points-vunit = vx---- unit axis vectors-vx  = Vec 1 0 0-vy  = Vec 0 1 0-vz  = Vec 0 0 1-nvx = Vec (-1) 0 0-nvy = Vec 0 (-1) 0-nvz = Vec 0 0 (-1)---- this actually accounts for a--- noticeable amount of cpu time-va :: Vec -> Int -> Flt-va !(Vec x y z) !n = - case n of-  0 -> x-  1 -> y-  2 -> z--vset :: Vec -> Int -> Flt -> Vec-vset !(Vec x y z) !i !f =- case i of-  0 -> Vec f y z-  1 -> Vec x f z-  2 -> Vec x y f--vdot :: Vec -> Vec -> Flt-vdot !(Vec x1 y1 z1) !(Vec x2 y2 z2) =- (x1*x2)+(y1*y2)+(z1*z2)--vcross :: Vec -> Vec -> Vec-vcross !(Vec x1 y1 z1) !(Vec x2 y2 z2) =- Vec -  ((y1 * z2) - (z1 * y2))-  ((z1 * x2) - (x1 * z2))-  ((x1 * y2) - (y1 * x2))--vmap :: (Flt -> Flt) -> Vec -> Vec-vmap f !v1 = - Vec (f (x v1)) (f (y v1)) (f (z v1))--vmap2 :: (Flt -> Flt -> Flt) -> Vec -> Vec -> Vec-vmap2 f !v1 !v2 =- Vec (f (x v1) (x v2)) -     (f (y v1) (y v2)) -     (f (z v1) (z v2))--vinvert :: Vec -> Vec-vinvert !(Vec x1 y1 z1) =- Vec (-x1) (-y1) (-z1)--vlensqr :: Vec -> Flt-vlensqr !v1 = vdot v1 v1--vlen :: Vec -> Flt-vlen !v1 = sqrt (vdot v1 v1)--vadd :: Vec -> Vec -> Vec-vadd !(Vec x1 y1 z1) !(Vec x2 y2 z2) =- Vec (x1 + x2)-     (y1 + y2)-     (z1 + z2)--vadd3 :: Vec -> Vec -> Vec -> Vec-vadd3 !(Vec x1 y1 z1) !(Vec x2 y2 z2) !(Vec x3 y3 z3) =-    Vec (x1 + x2 + x3)-        (y1 + y2 + y3)-        (z1 + z2 + z3)--vsub :: Vec -> Vec -> Vec-vsub !(Vec x1 y1 z1) !(Vec x2 y2 z2) =- Vec (x1 - x2)-     (y1 - y2)-     (z1 - z2)--vmul :: Vec -> Vec -> Vec-vmul !(Vec x1 y1 z1) !(Vec x2 y2 z2) =- Vec (x1 * x2)-     (y1 * y2)-     (z1 * z2)--vinc :: Vec -> Flt -> Vec-vinc !(Vec x y z) !n =- Vec (x + n)-     (y + n)-     (z + n)--vdec :: Vec -> Flt -> Vec-vdec !(Vec x y z) !n =- Vec (x - n)-     (y - n)-     (z - n)--vmax :: Vec -> Vec -> Vec-vmax !(Vec x1 y1 z1) !(Vec x2 y2 z2) =- Vec (fmax x1 x2)-     (fmax y1 y2)-     (fmax z1 z2)--vmin :: Vec -> Vec -> Vec-vmin !(Vec x1 y1 z1) !(Vec x2 y2 z2) =- Vec (fmin x1 x2)-     (fmin y1 y2)-     (fmin z1 z2)--vmaxaxis :: Vec -> Int-vmaxaxis !(Vec x y z) =- if (x > y) - then if (x > z) -      then 0-      else 2- else if (y > z) -      then 1-      else 2--vscale :: Vec -> Flt -> Vec-vscale !(Vec x y z) !fac =- Vec (x * fac)-     (y * fac)-     (z * fac)--vscaleadd :: Vec -> Vec -> Flt -> Vec-vscaleadd !(Vec x1 y1 z1) !(Vec x2 y2 z2) fac =- Vec (x1 + (x2 * fac))-     (y1 + (y2 * fac))-     (z1 + (z2 * fac))-            -vnorm :: Vec -> Vec-vnorm !(Vec x1 y1 z1) = - let invlen = 1.0 / (sqrt ((x1*x1)+(y1*y1)+(z1*z1))) in- Vec (x1*invlen) (y1*invlen) (z1*invlen)--assert_norm :: Vec -> Vec-assert_norm v =- let l = vdot v v- in if l > (1+delta) -    then error $ "vector too long" ++ (show v)-    else if l < (1-delta)-         then error $ "vector too short: " ++ (show v)-         else v--bisect :: Vec -> Vec -> Vec-bisect !v1 !v2 = vnorm (vadd v1 v2)--vdist :: Vec -> Vec -> Flt-vdist v1 v2 = - let d = vsub v2 v1 in vlen d--reflect :: Vec -> Vec -> Vec-reflect !v !norm =-  -- vadd v $ vscale norm $ (-2) * (vdot v norm)-  vscaleadd v norm $ (-2) * (vdot v norm)--vrcp :: Vec -> Vec-vrcp !(Vec x y z) =- Vec (1/x) (1/y) (1/z)---- test for equality-veq :: Vec -> Vec -> Bool-veq !(Vec ax ay az) !(Vec bx by bz) =- (about_equal ax bx) && (about_equal ay by) && (about_equal az bz)----returns false on zero value-veqsign :: Vec -> Vec -> Bool-veqsign !(Vec ax ay az) !(Vec bx by bz) =- ax*bx > 0 && ay*by > 0 && az*bz > 0---- translate a ray's origin in ray's direction by d amount-ray_move :: Ray -> Flt -> Ray-ray_move !(Ray orig dir) !d =- (Ray (vscaleadd orig dir d) dir)---- find orthogonal vectors-orth :: Vec -> (Vec,Vec)-orth v1 =- if about_equal (vdot v1 v1) 1- then-  let x = (Vec 1 0 0)-      y = (Vec 0 1 0)-      dvx = vdot v1 x-      v2 = if dvx < 0.8 && dvx > (-0.8) -- don't want to cross with a-           then vnorm $ vcross v1 x     -- vector that's too similar-           else vnorm $ vcross v1 y-      v3 = vcross v1 v2-  in (v2,v3)- else error $ "orth: unnormalized vector" ++ (show v1)---- intersect a ray with a plane --- defined by a point and a normal--- (ray need not be normalized)-plane_int :: Ray -> Vec -> Vec -> Vec-plane_int !(Ray orig dir) !p !norm =- let newo = vsub orig p-     dist = -(vdot norm newo) / (vdot norm dir)- in vscaleadd orig dir dist--plane_int_dist :: Ray -> Vec -> Vec -> Flt-plane_int_dist !(Ray orig dir) !p !norm =- let newo = vsub orig p- in -(vdot norm newo) / (vdot norm dir)---- find intersection with plane--- from graphics gems -- an efficient ray-polygon intersection--- it seems that the ray need not be normalized--- let plane_intersect ray (n,d) =---  let t = -.((d +. (vdot n ray.origin)) /. (vdot n ray.dir))---  in vadd ray.origin (vscale ray.dir t)----- TRANSFORMATIONS ----data Matrix = Matrix !Flt !Flt !Flt !Flt  -                     !Flt !Flt !Flt !Flt  -                     !Flt !Flt !Flt !Flt deriving Show-data Xfm = Xfm !Matrix !Matrix deriving Show--ident_matrix = (Matrix 1 0 0 0  0 1 0 0  0 0 1 0)-ident_xfm = Xfm ident_matrix ident_matrix--mat_mult :: Matrix -> Matrix -> Matrix-mat_mult (Matrix a00 a01 a02 a03  a10 a11 a12 a13  a20 a21 a22 a23)-         (Matrix b00 b01 b02 b03  b10 b11 b12 b13  b20 b21 b22 b23) =- Matrix-   (a00*b00 + a01*b10 + a02*b20)-   (a00*b01 + a01*b11 + a02*b21)-   (a00*b02 + a01*b12 + a02*b22)-   (a00*b03 + a01*b13 + a02*b23 + a03)--   (a10*b00 + a11*b10 + a12*b20)-   (a10*b01 + a11*b11 + a12*b21)-   (a10*b02 + a11*b12 + a12*b22)-   (a10*b03 + a11*b13 + a12*b23 + a13)--   (a20*b00 + a21*b10 + a22*b20)-   (a20*b01 + a21*b11 + a22*b21)-   (a20*b02 + a21*b12 + a22*b22)-   (a20*b03 + a21*b13 + a22*b23 + a23)--xfm_mult :: Xfm -> Xfm -> Xfm-xfm_mult (Xfm a inva) (Xfm b invb) =- Xfm (mat_mult a b) (mat_mult invb inva)---- TRANSFORM UTILITY FUNCTIONS ------ If we multiply two transformation matricies, we get--- a transformation matrix equivalent to applying the --- second then the first.---- By reversing the list, the transforms are applied in the expected order.-compose :: [Xfm] -> Xfm-compose xfms = check_xfm $ foldr xfm_mult ident_xfm (reverse xfms)--check_xfm :: Xfm -> Xfm-check_xfm (Xfm m i) = - let (Matrix m00 m01 m02 m03  -             m10 m11 m12 m13  -             m20 m21 m22 m23) = mat_mult m i-     ae = about_equal- in-  if ae m00 1 && ae m01 0 && ae m02 0 && ae m03 0 &&-     ae m10 0 && ae m11 1 && ae m12 0 && ae m13 0 &&-     ae m20 0 && ae m21 0 && ae m22 1 && ae m23 0-  then (Xfm m i)-  else error $ "corrupt matrix " ++ (show (Xfm m i)) ++ "\n" ++ (show (mat_mult m i)) ---- rotate point (or vector) a about ray b by angle c-vrotate :: Vec -> Ray -> Flt -> Vec-vrotate pt (Ray orig axis_) angle =- let axis = assert_norm axis_-     transform = compose [ translate (vinvert orig)-                         , rotate axis angle-                         , translate orig-                         ]-     new_pt = xfm_point transform pt- in if about_equal (vlen (vsub orig pt)) (vlen (vsub orig new_pt))-    then new_pt-    else error $ "something is wrong with vrotate" ++ -                 (show $ vlen (vsub orig pt)) ++ " " ++ -                 (show $ vlen (vsub orig new_pt))----- TRANSFORM APPLICATION ----- these need to be fast---- point is treated as (x y z 1)-xfm_point :: Xfm -> Vec -> Vec-xfm_point !(Xfm (Matrix m00 m01 m02 m03  -                        m10 m11 m12 m13  -                        m20 m21 m22 m23) inv) -          !(Vec x y z) =- Vec (m00*x + m01*y + m02*z + m03)-     (m10*x + m11*y + m12*z + m13)-     (m20*x + m21*y + m22*z + m23)--invxfm_point :: Xfm -> Vec -> Vec-invxfm_point !(Xfm fwd (Matrix i00 i01 i02 i03  -                               i10 i11 i12 i13  -                               i20 i21 i22 i23)) -             !(Vec x y z) =-  Vec (i00*x + i01*y + i02*z + i03)-      (i10*x + i11*y + i12*z + i13)-      (i20*x + i21*y + i22*z + i23)---- vector is treated as (x y z 0)-xfm_vec :: Xfm -> Vec -> Vec-xfm_vec !(Xfm (Matrix m00 m01 m02 m03  -                      m10 m11 m12 m13  -                      m20 m21 m22 m23) inv) -        !(Vec x y z) =- Vec (m00*x + m01*y + m02*z)-     (m10*x + m11*y + m12*z)-     (m20*x + m21*y + m22*z)--invxfm_vec :: Xfm -> Vec -> Vec-invxfm_vec !(Xfm fwd (Matrix i00 i01 i02 i03  -                             i10 i11 i12 i13  -                             i20 i21 i22 i23)) -           !(Vec x y z) =-  Vec (i00*x + i01*y + i02*z)-      (i10*x + i11*y + i12*z)-      (i20*x + i21*y + i22*z)---- this one is tricky--- we transform by the inverse transpose-invxfm_norm :: Xfm -> Vec -> Vec-invxfm_norm !(Xfm fwd (Matrix i00 i01 i02 i03  -                              i10 i11 i12 i13  -                              i20 i21 i22 i23)) -            !(Vec x y z) =- Vec (i00*x + i10*y + i20*z)-     (i01*x + i11*y + i21*z)-     (i02*x + i12*y + i22*z)--xfm_ray :: Xfm -> Ray -> Ray-xfm_ray !xfm !(Ray orig dir) =- Ray (xfm_point xfm orig) (vnorm (xfm_vec xfm dir))--invxfm_ray !xfm !(Ray orig dir) =- Ray (invxfm_point xfm orig) (vnorm (invxfm_vec xfm dir))---- BASIC TRANSFORMS ----- move-translate :: Vec -> Xfm-translate (Vec x y z) =- check_xfm $ Xfm (Matrix 1 0 0   x   0 1 0   y   0 0 1   z) -                 (Matrix 1 0 0 (-x)  0 1 0 (-y)  0 0 1 (-z))---- strectch along three axes (if x==y==z, then it's uniform scaling)-scale :: Vec -> Xfm-scale (Vec x y z) =- check_xfm $ Xfm (Matrix   x  0 0 0  0   y  0 0  0 0   z  0)-                (Matrix (1/x) 0 0 0  0 (1/y) 0 0  0 0 (1/z) 0)---- rotate about an arbitrary axis and angle-rotate :: Vec -> Flt -> Xfm-rotate (Vec x y z) angle =- if not $ (vlen (Vec x y z)) `about_equal` 1- then error $ "please use a normalized vector for rotation: " ++ (show (vlen (Vec x y z)))- else -  let s = sin angle-      c = cos angle --      m00 = ((x*x)+((1-(x*x))*c)) -      m01 = (((x*y)*(1-c))-(z*s)) -      m02 = ((x*z*(1-c))+(y*s))--      m10 = (((x*y)*(1-c))+(z*s))-      m11 = ((y*y)+((1-(y*y))*c))-      m12 = ((y*z*(1-c))-(x*s))--      m20 = ((x*z*(1-c))-(y*s))-      m21 = ((y*z*(1-c))+(x*s))-      m22 = ((z*z)+((1-(z*z))*c))-  in-  check_xfm $ Xfm (Matrix m00 m01 m02 0  m10 m11 m12 0  m20 m21 m22 0)-                  (Matrix m00 m10 m20 0  m01 m11 m21 0  m02 m12 m22 0)---- convert canonical coordinates to uvw coordinates-xyz_to_uvw :: Vec -> Vec -> Vec -> Xfm-xyz_to_uvw u v w =- let Vec ux uy uz = u-     Vec vx vy vz = v-     Vec wx wy wz = w- in if (vdot u u) `about_equal` 1-    then-     if (vdot v v) `about_equal` 1-     then-      if (vdot w w) `about_equal` 1-      then -       if ((vdot u v) `about_equal` 0) && -          ((vdot u w) `about_equal` 0) && -          ((vdot v w) `about_equal` 0)-       then-        check_xfm $ Xfm (Matrix ux vx wx 0  uy vy wy 0  uz vz wz 0)-                        (Matrix ux uy uz 0  vx vy vz 0  wx wy wz 0)-       else error  "vectors aren't orthogonal"-      else error $ "unnormalized w " ++ (show w)-     else error $ "unnormalized v " ++ (show v)-    else error $ "unnormalized u " ++ (show u)--uvw_to_xyz :: Vec -> Vec -> Vec -> Xfm-uvw_to_xyz (Vec ux uy uz) (Vec vx vy vz) (Vec wx wy wz) =- check_xfm $ Xfm (Matrix ux uy uz 0  vx vy vz 0  wx wy wz 0)-                 (Matrix ux vx wx 0  uy vy wy 0  uz vz wz 0)
− balls3.spd
@@ -1,838 +0,0 @@-b 0.078 0.361 0.753-v-from 2.1 1.3 1.7-at 0 0 0-up 0 0 1-angle 45-hither 0.01-resolution 512 512-l 4 3 2-l 1 -4 4-l -3 1 5-f 1 0.75 0.33 0.8 0 100000 0 1-p 4-12 12 -0.5--12 12 -0.5--12 -12 -0.5-12 -12 -0.5-f 1 0.9 0.7 0.5 0.5 3.0827 0 1-s 0 0 0 0.5-s 0.272166 0.272166 0.544331 0.166667-s 0.420314 0.420314 0.618405 0.0555556-s 0.470715 0.470715 0.598245 0.0185185-s 0.461623 0.409245 0.557924 0.0185185-s 0.409245 0.461623 0.557924 0.0185185-s 0.429405 0.481784 0.658726 0.0185185-s 0.367935 0.472692 0.618405 0.0185185-s 0.379004 0.431383 0.678886 0.0185185-s 0.481784 0.429405 0.658726 0.0185185-s 0.431383 0.379004 0.678886 0.0185185-s 0.472692 0.367935 0.618405 0.0185185-s 0.461844 0.304709 0.43322 0.0555556-s 0.492085 0.33495 0.372739 0.0185185-s 0.424345 0.305171 0.369341 0.0185185-s 0.435193 0.368397 0.406378 0.0185185-s 0.529584 0.334488 0.436618 0.0185185-s 0.472692 0.367935 0.470257 0.0185185-s 0.499343 0.304247 0.497099 0.0185185-s 0.518736 0.271262 0.399581 0.0185185-s 0.488495 0.241021 0.460062 0.0185185-s 0.450996 0.241483 0.396183 0.0185185-s 0.304709 0.461844 0.43322 0.0555556-s 0.33495 0.492085 0.372739 0.0185185-s 0.368397 0.435193 0.406378 0.0185185-s 0.305171 0.424345 0.369341 0.0185185-s 0.271262 0.518736 0.399581 0.0185185-s 0.241483 0.450996 0.396183 0.0185185-s 0.241021 0.488495 0.460062 0.0185185-s 0.334488 0.529584 0.436618 0.0185185-s 0.304247 0.499343 0.497099 0.0185185-s 0.367935 0.472692 0.470257 0.0185185-s 0.230635 0.38777 0.729516 0.0555556-s 0.2506 0.446614 0.769837 0.0185185-s 0.301839 0.407906 0.732914 0.0185185-s 0.253236 0.449775 0.695877 0.0185185-s 0.179397 0.426478 0.766439 0.0185185-s 0.182032 0.429639 0.692479 0.0185185-s 0.159431 0.367634 0.726118 0.0185185-s 0.227999 0.384609 0.803476 0.0185185-s 0.208034 0.325765 0.763155 0.0185185-s 0.279238 0.345901 0.766553 0.0185185-s 0.115031 0.4293 0.544331 0.0555556-s 0.102505 0.502308 0.544331 0.0185185-s 0.160392 0.474661 0.581368 0.0185185-s 0.160392 0.474661 0.507294 0.0185185-s 0.0571437 0.456947 0.507294 0.0185185-s 0.115031 0.4293 0.470257 0.0185185-s 0.0696698 0.383939 0.507294 0.0185185-s 0.0571437 0.456947 0.581368 0.0185185-s 0.0696698 0.383939 0.581368 0.0185185-s 0.115031 0.4293 0.618405 0.0185185-s 0.082487 0.239622 0.655442 0.0555556-s 0.0438957 0.258053 0.715923 0.0185185-s 0.117687 0.252557 0.719322 0.0185185-s 0.0863845 0.308551 0.682285 0.0185185-s 0.00869528 0.245118 0.652044 0.0185185-s 0.0511841 0.295616 0.618405 0.0185185-s 0.0472866 0.226687 0.591563 0.0185185-s 0.0399982 0.189123 0.689081 0.0185185-s 0.0785895 0.170692 0.6286 0.0185185-s 0.11379 0.183628 0.692479 0.0185185-s 0.38777 0.230635 0.729516 0.0555556-s 0.446614 0.2506 0.769837 0.0185185-s 0.449775 0.253236 0.695877 0.0185185-s 0.407906 0.301839 0.732914 0.0185185-s 0.384609 0.227999 0.803476 0.0185185-s 0.345901 0.279238 0.766553 0.0185185-s 0.325765 0.208034 0.763155 0.0185185-s 0.426478 0.179397 0.766439 0.0185185-s 0.367634 0.159431 0.726118 0.0185185-s 0.429639 0.182032 0.692479 0.0185185-s 0.239622 0.082487 0.655442 0.0555556-s 0.258053 0.0438957 0.715923 0.0185185-s 0.308551 0.0863845 0.682285 0.0185185-s 0.252557 0.117687 0.719322 0.0185185-s 0.189123 0.0399982 0.689081 0.0185185-s 0.183628 0.11379 0.692479 0.0185185-s 0.170692 0.0785895 0.6286 0.0185185-s 0.245118 0.00869528 0.652044 0.0185185-s 0.226687 0.0472866 0.591563 0.0185185-s 0.295616 0.0511841 0.618405 0.0185185-s 0.4293 0.115031 0.544331 0.0555556-s 0.502308 0.102505 0.544331 0.0185185-s 0.474661 0.160392 0.507294 0.0185185-s 0.474661 0.160392 0.581368 0.0185185-s 0.456947 0.0571437 0.581368 0.0185185-s 0.4293 0.115031 0.618405 0.0185185-s 0.383939 0.0696698 0.581368 0.0185185-s 0.456947 0.0571437 0.507294 0.0185185-s 0.383939 0.0696698 0.507294 0.0185185-s 0.4293 0.115031 0.470257 0.0185185-s 0.643951 0.172546 1.11022e-16 0.166667-s 0.802608 0.281471 -0.111111 0.0555556-s 0.824035 0.30566 -0.177765 0.0185185-s 0.787796 0.241352 -0.171592 0.0185185-s 0.752156 0.305221 -0.15987 0.0185185-s 0.838847 0.34578 -0.117284 0.0185185-s 0.766968 0.345341 -0.099389 0.0185185-s 0.817421 0.321591 -0.0506299 0.0185185-s 0.874487 0.28191 -0.129006 0.0185185-s 0.853061 0.257721 -0.062352 0.0185185-s 0.838248 0.217602 -0.122833 0.0185185-s 0.643951 0.172546 -0.222222 0.0555556-s 0.61371 0.202787 -0.282703 0.0185185-s 0.5724 0.191718 -0.222222 0.0185185-s 0.624779 0.244096 -0.222222 0.0185185-s 0.68526 0.183615 -0.282703 0.0185185-s 0.696329 0.224924 -0.222222 0.0185185-s 0.715501 0.153374 -0.222222 0.0185185-s 0.632882 0.131237 -0.282703 0.0185185-s 0.663122 0.100996 -0.222222 0.0185185-s 0.591572 0.120168 -0.222222 0.0185185-s 0.594141 0.358439 -0.111111 0.0555556-s 0.619127 0.408291 -0.15987 0.0185185-s 0.665691 0.37761 -0.111111 0.0185185-s 0.638217 0.337042 -0.166667 0.0185185-s 0.547576 0.389119 -0.15987 0.0185185-s 0.566667 0.317871 -0.166667 0.0185185-s 0.522591 0.339267 -0.111111 0.0185185-s 0.57505 0.429687 -0.104315 0.0185185-s 0.550064 0.379835 -0.0555556 0.0185185-s 0.621614 0.399007 -0.0555556 0.0185185-s 0.802608 0.281471 0.111111 0.0555556-s 0.858698 0.329459 0.104938 0.0185185-s 0.845371 0.280879 0.0506299 0.0185185-s 0.798572 0.337088 0.062352 0.0185185-s 0.815936 0.330051 0.165419 0.0185185-s 0.75581 0.33768 0.122833 0.0185185-s 0.759846 0.282063 0.171592 0.0185185-s 0.862735 0.273842 0.153697 0.0185185-s 0.806645 0.225855 0.15987 0.0185185-s 0.849407 0.225263 0.099389 0.0185185-s 0.594141 0.358439 0.111111 0.0555556-s 0.613592 0.428945 0.122833 0.0185185-s 0.665691 0.37761 0.111111 0.0185185-s 0.621614 0.399007 0.0555556 0.0185185-s 0.542042 0.409774 0.122833 0.0185185-s 0.550064 0.379835 0.0555556 0.0185185-s 0.522591 0.339267 0.111111 0.0185185-s 0.586119 0.388377 0.178389 0.0185185-s 0.566667 0.317871 0.166667 0.0185185-s 0.638217 0.337042 0.166667 0.0185185-s 0.643951 0.172546 0.222222 0.0555556-s 0.674191 0.202787 0.282703 0.0185185-s 0.715501 0.191718 0.222222 0.0185185-s 0.663122 0.244096 0.222222 0.0185185-s 0.602641 0.183615 0.282703 0.0185185-s 0.591572 0.224924 0.222222 0.0185185-s 0.5724 0.153374 0.222222 0.0185185-s 0.655019 0.131237 0.282703 0.0185185-s 0.624779 0.100996 0.222222 0.0185185-s 0.696329 0.120168 0.222222 0.0185185-s 0.852418 0.0955788 1.89979e-16 0.0555556-s 0.922609 0.11107 -0.0178949 0.0185185-s 0.867231 0.135698 -0.0604812 0.0185185-s 0.877966 0.164775 0.00679642 0.0185185-s 0.907797 0.0709499 0.0425863 0.0185185-s 0.863153 0.124655 0.0672777 0.0185185-s 0.837606 0.0554592 0.0604812 0.0185185-s 0.897062 0.0418734 -0.0246914 0.0185185-s 0.826871 0.0263827 -0.00679642 0.0185185-s 0.841683 0.0665023 -0.0672777 0.0185185-s 0.69376 -0.0133465 0.111111 0.0555556-s 0.740325 -0.0440268 0.15987 0.0185185-s 0.76531 0.0058253 0.111111 0.0185185-s 0.721234 0.0272215 0.166667 0.0185185-s 0.668775 -0.0631985 0.15987 0.0185185-s 0.649684 0.00804971 0.166667 0.0185185-s 0.62221 -0.0325183 0.111111 0.0185185-s 0.712851 -0.0845947 0.104315 0.0185185-s 0.666287 -0.0539145 0.0555556 0.0185185-s 0.737837 -0.0347427 0.0555556 0.0185185-s 0.69376 -0.0133465 -0.111111 0.0555556-s 0.745859 -0.0646815 -0.122833 0.0185185-s 0.76531 0.0058253 -0.111111 0.0185185-s 0.737837 -0.0347427 -0.0555556 0.0185185-s 0.674309 -0.0838533 -0.122833 0.0185185-s 0.666287 -0.0539145 -0.0555556 0.0185185-s 0.62221 -0.0325183 -0.111111 0.0185185-s 0.701782 -0.0432853 -0.178389 0.0185185-s 0.649684 0.00804971 -0.166667 0.0185185-s 0.721234 0.0272215 -0.166667 0.0185185-s 0.172546 0.643951 1.11022e-16 0.166667-s 0.281471 0.802608 -0.111111 0.0555556-s 0.30566 0.824035 -0.177765 0.0185185-s 0.305221 0.752156 -0.15987 0.0185185-s 0.241352 0.787796 -0.171592 0.0185185-s 0.28191 0.874487 -0.129006 0.0185185-s 0.217602 0.838248 -0.122833 0.0185185-s 0.257721 0.853061 -0.062352 0.0185185-s 0.34578 0.838847 -0.117284 0.0185185-s 0.321591 0.817421 -0.0506299 0.0185185-s 0.345341 0.766968 -0.099389 0.0185185-s 0.358439 0.594141 -0.111111 0.0555556-s 0.408291 0.619127 -0.15987 0.0185185-s 0.337042 0.638217 -0.166667 0.0185185-s 0.37761 0.665691 -0.111111 0.0185185-s 0.429687 0.57505 -0.104315 0.0185185-s 0.399007 0.621614 -0.0555556 0.0185185-s 0.379835 0.550064 -0.0555556 0.0185185-s 0.389119 0.547576 -0.15987 0.0185185-s 0.339267 0.522591 -0.111111 0.0185185-s 0.317871 0.566667 -0.166667 0.0185185-s 0.172546 0.643951 -0.222222 0.0555556-s 0.142305 0.674191 -0.282703 0.0185185-s 0.100996 0.663122 -0.222222 0.0185185-s 0.153374 0.715501 -0.222222 0.0185185-s 0.213855 0.655019 -0.282703 0.0185185-s 0.224924 0.696329 -0.222222 0.0185185-s 0.244096 0.624779 -0.222222 0.0185185-s 0.161477 0.602641 -0.282703 0.0185185-s 0.191718 0.5724 -0.222222 0.0185185-s 0.120168 0.591572 -0.222222 0.0185185-s 0.0955788 0.852418 1.03629e-16 0.0555556-s 0.11107 0.922609 -0.0178949 0.0185185-s 0.164775 0.877966 0.00679642 0.0185185-s 0.135698 0.867231 -0.0604812 0.0185185-s 0.0418734 0.897062 -0.0246914 0.0185185-s 0.0665023 0.841683 -0.0672777 0.0185185-s 0.0263827 0.826871 -0.00679642 0.0185185-s 0.0709499 0.907797 0.0425863 0.0185185-s 0.0554592 0.837606 0.0604812 0.0185185-s 0.124655 0.863153 0.0672777 0.0185185-s -0.0133465 0.69376 -0.111111 0.0555556-s -0.0646815 0.745859 -0.122833 0.0185185-s -0.0347427 0.737837 -0.0555556 0.0185185-s 0.0058253 0.76531 -0.111111 0.0185185-s -0.0432853 0.701782 -0.178389 0.0185185-s 0.0272215 0.721234 -0.166667 0.0185185-s 0.00804971 0.649684 -0.166667 0.0185185-s -0.0838533 0.674309 -0.122833 0.0185185-s -0.0325183 0.62221 -0.111111 0.0185185-s -0.0539145 0.666287 -0.0555556 0.0185185-s -0.0133465 0.69376 0.111111 0.0555556-s -0.0440268 0.740325 0.15987 0.0185185-s 0.0272215 0.721234 0.166667 0.0185185-s 0.0058253 0.76531 0.111111 0.0185185-s -0.0845947 0.712851 0.104315 0.0185185-s -0.0347427 0.737837 0.0555556 0.0185185-s -0.0539145 0.666287 0.0555556 0.0185185-s -0.0631985 0.668775 0.15987 0.0185185-s -0.0325183 0.62221 0.111111 0.0185185-s 0.00804971 0.649684 0.166667 0.0185185-s 0.281471 0.802608 0.111111 0.0555556-s 0.329459 0.858698 0.104938 0.0185185-s 0.337088 0.798572 0.062352 0.0185185-s 0.280879 0.845371 0.0506299 0.0185185-s 0.273842 0.862735 0.153697 0.0185185-s 0.225263 0.849407 0.099389 0.0185185-s 0.225855 0.806645 0.15987 0.0185185-s 0.330051 0.815936 0.165419 0.0185185-s 0.282063 0.759846 0.171592 0.0185185-s 0.33768 0.75581 0.122833 0.0185185-s 0.172546 0.643951 0.222222 0.0555556-s 0.202787 0.674191 0.282703 0.0185185-s 0.244096 0.663122 0.222222 0.0185185-s 0.191718 0.715501 0.222222 0.0185185-s 0.131237 0.655019 0.282703 0.0185185-s 0.120168 0.696329 0.222222 0.0185185-s 0.100996 0.624779 0.222222 0.0185185-s 0.183615 0.602641 0.282703 0.0185185-s 0.153374 0.5724 0.222222 0.0185185-s 0.224924 0.591572 0.222222 0.0185185-s 0.358439 0.594141 0.111111 0.0555556-s 0.428945 0.613592 0.122833 0.0185185-s 0.399007 0.621614 0.0555556 0.0185185-s 0.37761 0.665691 0.111111 0.0185185-s 0.388377 0.586119 0.178389 0.0185185-s 0.337042 0.638217 0.166667 0.0185185-s 0.317871 0.566667 0.166667 0.0185185-s 0.409774 0.542042 0.122833 0.0185185-s 0.339267 0.522591 0.111111 0.0185185-s 0.379835 0.550064 0.0555556 0.0185185-s -0.371785 0.0996195 0.544331 0.166667-s -0.393621 0.220501 0.729516 0.0555556-s -0.368601 0.279642 0.766439 0.0185185-s -0.321889 0.238665 0.726118 0.0185185-s -0.372464 0.281062 0.692479 0.0185185-s -0.440333 0.261479 0.769837 0.0185185-s -0.444196 0.262898 0.695877 0.0185185-s -0.465353 0.202338 0.732914 0.0185185-s -0.389758 0.219082 0.803476 0.0185185-s -0.414778 0.15994 0.766553 0.0185185-s -0.343046 0.178104 0.763155 0.0185185-s -0.191247 0.166275 0.655442 0.0555556-s -0.130089 0.20793 0.652044 0.0185185-s -0.154295 0.172673 0.591563 0.0185185-s -0.192135 0.230419 0.618405 0.0185185-s -0.167041 0.201532 0.715923 0.0185185-s -0.229087 0.224021 0.682285 0.0185185-s -0.228199 0.159877 0.719322 0.0185185-s -0.129201 0.143787 0.689081 0.0185185-s -0.190359 0.102131 0.692479 0.0185185-s -0.153407 0.108529 0.6286 0.0185185-s -0.31427 0.31427 0.544331 0.0555556-s -0.277961 0.367156 0.507294 0.0185185-s -0.252306 0.297666 0.507294 0.0185185-s -0.31427 0.31427 0.470257 0.0185185-s -0.339925 0.383759 0.544331 0.0185185-s -0.376234 0.330873 0.507294 0.0185185-s -0.376234 0.330873 0.581368 0.0185185-s -0.277961 0.367156 0.581368 0.0185185-s -0.31427 0.31427 0.618405 0.0185185-s -0.252306 0.297666 0.581368 0.0185185-s -0.574159 0.153845 0.618405 0.0555556-s -0.612768 0.202534 0.658726 0.0185185-s -0.543919 0.184086 0.678886 0.0185185-s -0.554987 0.225396 0.618405 0.0185185-s -0.643008 0.172294 0.598245 0.0185185-s -0.585228 0.195155 0.557924 0.0185185-s -0.6044 0.123605 0.557924 0.0185185-s -0.631939 0.130984 0.658726 0.0185185-s -0.593331 0.0822954 0.618405 0.0185185-s -0.56309 0.112536 0.678886 0.0185185-s -0.494808 0.247614 0.43322 0.0555556-s -0.494287 0.313607 0.399581 0.0185185-s -0.452978 0.302539 0.460062 0.0185185-s -0.434629 0.269833 0.396183 0.0185185-s -0.536117 0.258683 0.372739 0.0185185-s -0.476459 0.214908 0.369341 0.0185185-s -0.536638 0.19269 0.406378 0.0185185-s -0.554467 0.291389 0.436618 0.0185185-s -0.554987 0.225396 0.470257 0.0185185-s -0.513157 0.28032 0.497099 0.0185185-s -0.552323 0.0329639 0.43322 0.0555556-s -0.625877 0.0248832 0.436618 0.0185185-s -0.584567 0.0138144 0.497099 0.0185185-s -0.593331 0.0822954 0.470257 0.0185185-s -0.593633 0.0440327 0.372739 0.0185185-s -0.561087 0.101445 0.406378 0.0185185-s -0.520079 0.0521134 0.369341 0.0185185-s -0.584869 -0.0244483 0.399581 0.0185185-s -0.511316 -0.0163676 0.396183 0.0185185-s -0.54356 -0.0355172 0.460062 0.0185185-s -0.451136 0.0058509 0.729516 0.0555556-s -0.447081 0.0051487 0.803476 0.0185185-s -0.386138 0.0172804 0.763155 0.0185185-s -0.439178 0.0688765 0.766553 0.0185185-s -0.512079 -0.00628079 0.769837 0.0185185-s -0.504176 0.0574471 0.732914 0.0185185-s -0.516134 -0.00557859 0.695877 0.0185185-s -0.459039 -0.0578769 0.766439 0.0185185-s -0.463094 -0.0571747 0.692479 0.0185185-s -0.398096 -0.0457452 0.726118 0.0185185-s -0.4293 -0.115031 0.544331 0.0555556-s -0.424299 -0.178985 0.581368 0.0185185-s -0.367336 -0.131634 0.581368 0.0185185-s -0.4293 -0.115031 0.618405 0.0185185-s -0.486264 -0.162382 0.544331 0.0185185-s -0.491265 -0.0984274 0.581368 0.0185185-s -0.491265 -0.0984274 0.507294 0.0185185-s -0.424299 -0.178985 0.507294 0.0185185-s -0.4293 -0.115031 0.470257 0.0185185-s -0.367336 -0.131634 0.507294 0.0185185-s -0.248762 -0.0483751 0.655442 0.0555556-s -0.183785 -0.0599222 0.689081 0.0185185-s -0.187119 -0.0172857 0.6286 0.0185185-s -0.215921 0.00673113 0.692479 0.0185185-s -0.245428 -0.0910116 0.715923 0.0185185-s -0.277564 -0.0243582 0.719322 0.0185185-s -0.310405 -0.0794645 0.682285 0.0185185-s -0.216626 -0.115028 0.652044 0.0185185-s -0.281603 -0.103481 0.618405 0.0185185-s -0.21996 -0.0723919 0.591563 0.0185185-s -0.471405 0.471405 1.11022e-16 0.166667-s -0.508983 0.690426 8.51251e-17 0.0555556-s -0.484794 0.755941 -0.0246914 0.0185185-s -0.436283 0.7029 -0.00679642 0.0185185-s -0.478434 0.695668 -0.0672777 0.0185185-s -0.557494 0.743468 -0.0178949 0.0185185-s -0.551134 0.683194 -0.0604812 0.0185185-s -0.581682 0.677953 0.00679642 0.0185185-s -0.515343 0.7507 0.0425863 0.0185185-s -0.539531 0.685185 0.0672777 0.0185185-s -0.466832 0.697658 0.0604812 0.0185185-s -0.335322 0.607487 0.111111 0.0555556-s -0.283164 0.659645 0.104315 0.0185185-s -0.286452 0.603979 0.0555556 0.0185185-s -0.33883 0.656357 0.0555556 0.0185185-s -0.332034 0.663153 0.15987 0.0185185-s -0.3877 0.659866 0.111111 0.0185185-s -0.384191 0.610996 0.166667 0.0185185-s -0.279656 0.610775 0.15987 0.0185185-s -0.331813 0.558618 0.166667 0.0185185-s -0.282943 0.555109 0.111111 0.0185185-s -0.335322 0.607487 -0.111111 0.0555556-s -0.313405 0.629404 -0.178389 0.0185185-s -0.331813 0.558618 -0.166667 0.0185185-s -0.384191 0.610996 -0.166667 0.0185185-s -0.316914 0.678274 -0.122833 0.0185185-s -0.3877 0.659866 -0.111111 0.0185185-s -0.33883 0.656357 -0.0555556 0.0185185-s -0.264535 0.625895 -0.122833 0.0185185-s -0.286452 0.603979 -0.0555556 0.0185185-s -0.282943 0.555109 -0.111111 0.0185185-s -0.645066 0.554344 -0.111111 0.0555556-s -0.681385 0.616373 -0.129006 0.0185185-s -0.649723 0.609912 -0.062352 0.0185185-s -0.607573 0.617144 -0.122833 0.0185185-s -0.676727 0.560805 -0.177765 0.0185185-s -0.602915 0.561576 -0.171592 0.0185185-s -0.640408 0.498776 -0.15987 0.0185185-s -0.718878 0.553573 -0.117284 0.0185185-s -0.682558 0.491544 -0.099389 0.0185185-s -0.687216 0.547112 -0.0506299 0.0185185-s -0.471405 0.471405 -0.222222 0.0555556-s -0.501645 0.501645 -0.282703 0.0185185-s -0.542955 0.490576 -0.222222 0.0185185-s -0.490576 0.542955 -0.222222 0.0185185-s -0.430095 0.482473 -0.282703 0.0185185-s -0.419026 0.523783 -0.222222 0.0185185-s -0.399854 0.452233 -0.222222 0.0185185-s -0.482473 0.430095 -0.282703 0.0185185-s -0.452233 0.399854 -0.222222 0.0185185-s -0.523783 0.419026 -0.222222 0.0185185-s -0.607487 0.335322 -0.111111 0.0555556-s -0.659645 0.283164 -0.104315 0.0185185-s -0.603979 0.286452 -0.0555556 0.0185185-s -0.656357 0.33883 -0.0555556 0.0185185-s -0.663153 0.332034 -0.15987 0.0185185-s -0.659866 0.3877 -0.111111 0.0185185-s -0.610996 0.384191 -0.166667 0.0185185-s -0.610775 0.279656 -0.15987 0.0185185-s -0.558618 0.331813 -0.166667 0.0185185-s -0.555109 0.282943 -0.111111 0.0185185-s -0.645066 0.554344 0.111111 0.0555556-s -0.668521 0.610229 0.153697 0.0185185-s -0.598918 0.585648 0.15987 0.0185185-s -0.619787 0.622977 0.099389 0.0185185-s -0.714669 0.578925 0.104938 0.0185185-s -0.665934 0.591673 0.0506299 0.0185185-s -0.691213 0.52304 0.062352 0.0185185-s -0.6938 0.541596 0.165419 0.0185185-s -0.670344 0.48571 0.122833 0.0185185-s -0.624197 0.517014 0.171592 0.0185185-s -0.607487 0.335322 0.111111 0.0555556-s -0.629404 0.313405 0.178389 0.0185185-s -0.558618 0.331813 0.166667 0.0185185-s -0.610996 0.384191 0.166667 0.0185185-s -0.678274 0.316914 0.122833 0.0185185-s -0.659866 0.3877 0.111111 0.0185185-s -0.656357 0.33883 0.0555556 0.0185185-s -0.625895 0.264535 0.122833 0.0185185-s -0.603979 0.286452 0.0555556 0.0185185-s -0.555109 0.282943 0.111111 0.0185185-s -0.471405 0.471405 0.222222 0.0555556-s -0.441164 0.501645 0.282703 0.0185185-s -0.399854 0.490576 0.222222 0.0185185-s -0.452233 0.542955 0.222222 0.0185185-s -0.512714 0.482473 0.282703 0.0185185-s -0.523783 0.523783 0.222222 0.0185185-s -0.542955 0.452233 0.222222 0.0185185-s -0.460336 0.430095 0.282703 0.0185185-s -0.490576 0.399854 0.222222 0.0185185-s -0.419026 0.419026 0.222222 0.0185185-s -0.643951 -0.172546 1.11022e-16 0.166667-s -0.835815 -0.157543 0.111111 0.0555556-s -0.871646 -0.122136 0.165419 0.0185185-s -0.799077 -0.135649 0.171592 0.0185185-s -0.82339 -0.0854653 0.122833 0.0185185-s -0.908384 -0.14403 0.104938 0.0185185-s -0.860128 -0.107359 0.062352 0.0185185-s -0.872552 -0.179437 0.0506299 0.0185185-s -0.884071 -0.194213 0.153697 0.0185185-s -0.84824 -0.229621 0.099389 0.0185185-s -0.811502 -0.207727 0.15987 0.0185185-s -0.643951 -0.172546 0.222222 0.0555556-s -0.61371 -0.142305 0.282703 0.0185185-s -0.5724 -0.153374 0.222222 0.0185185-s -0.624779 -0.100996 0.222222 0.0185185-s -0.68526 -0.161477 0.282703 0.0185185-s -0.696329 -0.120168 0.222222 0.0185185-s -0.715501 -0.191718 0.222222 0.0185185-s -0.632882 -0.213855 0.282703 0.0185185-s -0.663122 -0.244096 0.222222 0.0185185-s -0.591572 -0.224924 0.222222 0.0185185-s -0.69376 0.0133465 0.111111 0.0555556-s -0.674309 0.0838533 0.122833 0.0185185-s -0.62221 0.0325183 0.111111 0.0185185-s -0.666287 0.0539145 0.0555556 0.0185185-s -0.745859 0.0646815 0.122833 0.0185185-s -0.737837 0.0347427 0.0555556 0.0185185-s -0.76531 -0.0058253 0.111111 0.0185185-s -0.701782 0.0432853 0.178389 0.0185185-s -0.721234 -0.0272215 0.166667 0.0185185-s -0.649684 -0.00804971 0.166667 0.0185185-s -0.835815 -0.157543 -0.111111 0.0555556-s -0.899353 -0.119969 -0.117284 0.0185185-s -0.868703 -0.130205 -0.0506299 0.0185185-s -0.836885 -0.0844101 -0.099389 0.0185185-s -0.866465 -0.147308 -0.177765 0.0185185-s -0.803997 -0.111748 -0.15987 0.0185185-s -0.802927 -0.184881 -0.171592 0.0185185-s -0.898283 -0.193102 -0.129006 0.0185185-s -0.834745 -0.230676 -0.122833 0.0185185-s -0.867633 -0.203337 -0.062352 0.0185185-s -0.69376 0.0133465 -0.111111 0.0555556-s -0.668775 0.0631985 -0.15987 0.0185185-s -0.62221 0.0325183 -0.111111 0.0185185-s -0.649684 -0.00804971 -0.166667 0.0185185-s -0.740325 0.0440268 -0.15987 0.0185185-s -0.721234 -0.0272215 -0.166667 0.0185185-s -0.76531 -0.0058253 -0.111111 0.0185185-s -0.712851 0.0845947 -0.104315 0.0185185-s -0.737837 0.0347427 -0.0555556 0.0185185-s -0.666287 0.0539145 -0.0555556 0.0185185-s -0.643951 -0.172546 -0.222222 0.0555556-s -0.674191 -0.202787 -0.282703 0.0185185-s -0.715501 -0.191718 -0.222222 0.0185185-s -0.663122 -0.244096 -0.222222 0.0185185-s -0.602641 -0.183615 -0.282703 0.0185185-s -0.591572 -0.224924 -0.222222 0.0185185-s -0.5724 -0.153374 -0.222222 0.0185185-s -0.655019 -0.131237 -0.282703 0.0185185-s -0.624779 -0.100996 -0.222222 0.0185185-s -0.696329 -0.120168 -0.222222 0.0185185-s -0.786005 -0.343435 7.89572e-17 0.0555556-s -0.82165 -0.392454 0.0425863 0.0185185-s -0.753118 -0.370774 0.0604812 0.0185185-s -0.80984 -0.323622 0.0672777 0.0185185-s -0.854538 -0.365116 -0.0178949 0.0185185-s -0.842728 -0.296284 0.00679642 0.0185185-s -0.818893 -0.316097 -0.0604812 0.0185185-s -0.797815 -0.412267 -0.0246914 0.0185185-s -0.76217 -0.363249 -0.0672777 0.0185185-s -0.729282 -0.390587 -0.00679642 0.0185185-s -0.594141 -0.358439 -0.111111 0.0555556-s -0.542042 -0.409774 -0.122833 0.0185185-s -0.522591 -0.339267 -0.111111 0.0185185-s -0.550064 -0.379835 -0.0555556 0.0185185-s -0.613592 -0.428945 -0.122833 0.0185185-s -0.621614 -0.399007 -0.0555556 0.0185185-s -0.665691 -0.37761 -0.111111 0.0185185-s -0.586119 -0.388377 -0.178389 0.0185185-s -0.638217 -0.337042 -0.166667 0.0185185-s -0.566667 -0.317871 -0.166667 0.0185185-s -0.594141 -0.358439 0.111111 0.0555556-s -0.547576 -0.389119 0.15987 0.0185185-s -0.522591 -0.339267 0.111111 0.0185185-s -0.566667 -0.317871 0.166667 0.0185185-s -0.619127 -0.408291 0.15987 0.0185185-s -0.638217 -0.337042 0.166667 0.0185185-s -0.665691 -0.37761 0.111111 0.0185185-s -0.57505 -0.429687 0.104315 0.0185185-s -0.621614 -0.399007 0.0555556 0.0185185-s -0.550064 -0.379835 0.0555556 0.0185185-s 0.0996195 -0.371785 0.544331 0.166667-s 0.220501 -0.393621 0.729516 0.0555556-s 0.279642 -0.368601 0.766439 0.0185185-s 0.281062 -0.372464 0.692479 0.0185185-s 0.238665 -0.321889 0.726118 0.0185185-s 0.219082 -0.389758 0.803476 0.0185185-s 0.178104 -0.343046 0.763155 0.0185185-s 0.15994 -0.414778 0.766553 0.0185185-s 0.261479 -0.440333 0.769837 0.0185185-s 0.202338 -0.465353 0.732914 0.0185185-s 0.262898 -0.444196 0.695877 0.0185185-s 0.31427 -0.31427 0.544331 0.0555556-s 0.367156 -0.277961 0.507294 0.0185185-s 0.31427 -0.31427 0.470257 0.0185185-s 0.297666 -0.252306 0.507294 0.0185185-s 0.367156 -0.277961 0.581368 0.0185185-s 0.297666 -0.252306 0.581368 0.0185185-s 0.31427 -0.31427 0.618405 0.0185185-s 0.383759 -0.339925 0.544331 0.0185185-s 0.330873 -0.376234 0.581368 0.0185185-s 0.330873 -0.376234 0.507294 0.0185185-s 0.166275 -0.191247 0.655442 0.0555556-s 0.20793 -0.130089 0.652044 0.0185185-s 0.230419 -0.192135 0.618405 0.0185185-s 0.172673 -0.154295 0.591563 0.0185185-s 0.143787 -0.129201 0.689081 0.0185185-s 0.108529 -0.153407 0.6286 0.0185185-s 0.102131 -0.190359 0.692479 0.0185185-s 0.201532 -0.167041 0.715923 0.0185185-s 0.159877 -0.228199 0.719322 0.0185185-s 0.224021 -0.229087 0.682285 0.0185185-s 0.0058509 -0.451136 0.729516 0.0555556-s 0.0051487 -0.447081 0.803476 0.0185185-s 0.0688765 -0.439178 0.766553 0.0185185-s 0.0172804 -0.386138 0.763155 0.0185185-s -0.0578769 -0.459039 0.766439 0.0185185-s -0.0457452 -0.398096 0.726118 0.0185185-s -0.0571747 -0.463094 0.692479 0.0185185-s -0.00628079 -0.512079 0.769837 0.0185185-s -0.00557859 -0.516134 0.695877 0.0185185-s 0.0574471 -0.504176 0.732914 0.0185185-s -0.0483751 -0.248762 0.655442 0.0555556-s -0.0599222 -0.183785 0.689081 0.0185185-s 0.00673113 -0.215921 0.692479 0.0185185-s -0.0172857 -0.187119 0.6286 0.0185185-s -0.115028 -0.216626 0.652044 0.0185185-s -0.0723919 -0.21996 0.591563 0.0185185-s -0.103481 -0.281603 0.618405 0.0185185-s -0.0910116 -0.245428 0.715923 0.0185185-s -0.0794645 -0.310405 0.682285 0.0185185-s -0.0243582 -0.277564 0.719322 0.0185185-s -0.115031 -0.4293 0.544331 0.0555556-s -0.178985 -0.424299 0.581368 0.0185185-s -0.115031 -0.4293 0.618405 0.0185185-s -0.131634 -0.367336 0.581368 0.0185185-s -0.178985 -0.424299 0.507294 0.0185185-s -0.131634 -0.367336 0.507294 0.0185185-s -0.115031 -0.4293 0.470257 0.0185185-s -0.162382 -0.486264 0.544331 0.0185185-s -0.0984274 -0.491265 0.507294 0.0185185-s -0.0984274 -0.491265 0.581368 0.0185185-s 0.153845 -0.574159 0.618405 0.0555556-s 0.202534 -0.612768 0.658726 0.0185185-s 0.225396 -0.554987 0.618405 0.0185185-s 0.184086 -0.543919 0.678886 0.0185185-s 0.130984 -0.631939 0.658726 0.0185185-s 0.112536 -0.56309 0.678886 0.0185185-s 0.0822954 -0.593331 0.618405 0.0185185-s 0.172294 -0.643008 0.598245 0.0185185-s 0.123605 -0.6044 0.557924 0.0185185-s 0.195155 -0.585228 0.557924 0.0185185-s 0.0329639 -0.552323 0.43322 0.0555556-s 0.0248832 -0.625877 0.436618 0.0185185-s 0.0822954 -0.593331 0.470257 0.0185185-s 0.0138144 -0.584567 0.497099 0.0185185-s -0.0244483 -0.584869 0.399581 0.0185185-s -0.0355172 -0.54356 0.460062 0.0185185-s -0.0163676 -0.511316 0.396183 0.0185185-s 0.0440327 -0.593633 0.372739 0.0185185-s 0.0521134 -0.520079 0.369341 0.0185185-s 0.101445 -0.561087 0.406378 0.0185185-s 0.247614 -0.494808 0.43322 0.0555556-s 0.313607 -0.494287 0.399581 0.0185185-s 0.269833 -0.434629 0.396183 0.0185185-s 0.302539 -0.452978 0.460062 0.0185185-s 0.291389 -0.554467 0.436618 0.0185185-s 0.28032 -0.513157 0.497099 0.0185185-s 0.225396 -0.554987 0.470257 0.0185185-s 0.258683 -0.536117 0.372739 0.0185185-s 0.19269 -0.536638 0.406378 0.0185185-s 0.214908 -0.476459 0.369341 0.0185185-s -0.172546 -0.643951 1.11022e-16 0.166667-s -0.157543 -0.835815 0.111111 0.0555556-s -0.122136 -0.871646 0.165419 0.0185185-s -0.0854653 -0.82339 0.122833 0.0185185-s -0.135649 -0.799077 0.171592 0.0185185-s -0.194213 -0.884071 0.153697 0.0185185-s -0.207727 -0.811502 0.15987 0.0185185-s -0.229621 -0.84824 0.099389 0.0185185-s -0.14403 -0.908384 0.104938 0.0185185-s -0.179437 -0.872552 0.0506299 0.0185185-s -0.107359 -0.860128 0.062352 0.0185185-s 0.0133465 -0.69376 0.111111 0.0555556-s 0.0838533 -0.674309 0.122833 0.0185185-s 0.0539145 -0.666287 0.0555556 0.0185185-s 0.0325183 -0.62221 0.111111 0.0185185-s 0.0432853 -0.701782 0.178389 0.0185185-s -0.00804971 -0.649684 0.166667 0.0185185-s -0.0272215 -0.721234 0.166667 0.0185185-s 0.0646815 -0.745859 0.122833 0.0185185-s -0.0058253 -0.76531 0.111111 0.0185185-s 0.0347427 -0.737837 0.0555556 0.0185185-s -0.172546 -0.643951 0.222222 0.0555556-s -0.142305 -0.61371 0.282703 0.0185185-s -0.100996 -0.624779 0.222222 0.0185185-s -0.153374 -0.5724 0.222222 0.0185185-s -0.213855 -0.632882 0.282703 0.0185185-s -0.224924 -0.591572 0.222222 0.0185185-s -0.244096 -0.663122 0.222222 0.0185185-s -0.161477 -0.68526 0.282703 0.0185185-s -0.191718 -0.715501 0.222222 0.0185185-s -0.120168 -0.696329 0.222222 0.0185185-s -0.343435 -0.786005 7.27893e-17 0.0555556-s -0.392454 -0.82165 0.0425863 0.0185185-s -0.323622 -0.80984 0.0672777 0.0185185-s -0.370774 -0.753118 0.0604812 0.0185185-s -0.412267 -0.797815 -0.0246914 0.0185185-s -0.390587 -0.729282 -0.00679642 0.0185185-s -0.363249 -0.76217 -0.0672777 0.0185185-s -0.365116 -0.854538 -0.0178949 0.0185185-s -0.316097 -0.818893 -0.0604812 0.0185185-s -0.296284 -0.842728 0.00679642 0.0185185-s -0.358439 -0.594141 0.111111 0.0555556-s -0.389119 -0.547576 0.15987 0.0185185-s -0.317871 -0.566667 0.166667 0.0185185-s -0.339267 -0.522591 0.111111 0.0185185-s -0.429687 -0.57505 0.104315 0.0185185-s -0.379835 -0.550064 0.0555556 0.0185185-s -0.399007 -0.621614 0.0555556 0.0185185-s -0.408291 -0.619127 0.15987 0.0185185-s -0.37761 -0.665691 0.111111 0.0185185-s -0.337042 -0.638217 0.166667 0.0185185-s -0.358439 -0.594141 -0.111111 0.0555556-s -0.409774 -0.542042 -0.122833 0.0185185-s -0.379835 -0.550064 -0.0555556 0.0185185-s -0.339267 -0.522591 -0.111111 0.0185185-s -0.388377 -0.586119 -0.178389 0.0185185-s -0.317871 -0.566667 -0.166667 0.0185185-s -0.337042 -0.638217 -0.166667 0.0185185-s -0.428945 -0.613592 -0.122833 0.0185185-s -0.37761 -0.665691 -0.111111 0.0185185-s -0.399007 -0.621614 -0.0555556 0.0185185-s -0.157543 -0.835815 -0.111111 0.0555556-s -0.119969 -0.899353 -0.117284 0.0185185-s -0.0844101 -0.836885 -0.099389 0.0185185-s -0.130205 -0.868703 -0.0506299 0.0185185-s -0.193102 -0.898283 -0.129006 0.0185185-s -0.203337 -0.867633 -0.062352 0.0185185-s -0.230676 -0.834745 -0.122833 0.0185185-s -0.147308 -0.866465 -0.177765 0.0185185-s -0.184881 -0.802927 -0.171592 0.0185185-s -0.111748 -0.803997 -0.15987 0.0185185-s -0.172546 -0.643951 -0.222222 0.0555556-s -0.202787 -0.61371 -0.282703 0.0185185-s -0.244096 -0.624779 -0.222222 0.0185185-s -0.191718 -0.5724 -0.222222 0.0185185-s -0.131237 -0.632882 -0.282703 0.0185185-s -0.120168 -0.591572 -0.222222 0.0185185-s -0.100996 -0.663122 -0.222222 0.0185185-s -0.183615 -0.68526 -0.282703 0.0185185-s -0.153374 -0.715501 -0.222222 0.0185185-s -0.224924 -0.696329 -0.222222 0.0185185-s 0.0133465 -0.69376 -0.111111 0.0555556-s 0.0631985 -0.668775 -0.15987 0.0185185-s -0.00804971 -0.649684 -0.166667 0.0185185-s 0.0325183 -0.62221 -0.111111 0.0185185-s 0.0845947 -0.712851 -0.104315 0.0185185-s 0.0539145 -0.666287 -0.0555556 0.0185185-s 0.0347427 -0.737837 -0.0555556 0.0185185-s 0.0440268 -0.740325 -0.15987 0.0185185-s -0.0058253 -0.76531 -0.111111 0.0185185-s -0.0272215 -0.721234 -0.166667 0.0185185-s 0.471405 -0.471405 1.11022e-16 0.166667-s 0.690426 -0.508983 1.83812e-16 0.0555556-s 0.755941 -0.484794 -0.0246914 0.0185185-s 0.695668 -0.478434 -0.0672777 0.0185185-s 0.7029 -0.436283 -0.00679642 0.0185185-s 0.7507 -0.515343 0.0425863 0.0185185-s 0.697658 -0.466832 0.0604812 0.0185185-s 0.685185 -0.539531 0.0672777 0.0185185-s 0.743468 -0.557494 -0.0178949 0.0185185-s 0.677953 -0.581682 0.00679642 0.0185185-s 0.683194 -0.551134 -0.0604812 0.0185185-s 0.607487 -0.335322 -0.111111 0.0555556-s 0.629404 -0.313405 -0.178389 0.0185185-s 0.610996 -0.384191 -0.166667 0.0185185-s 0.558618 -0.331813 -0.166667 0.0185185-s 0.625895 -0.264535 -0.122833 0.0185185-s 0.555109 -0.282943 -0.111111 0.0185185-s 0.603979 -0.286452 -0.0555556 0.0185185-s 0.678274 -0.316914 -0.122833 0.0185185-s 0.656357 -0.33883 -0.0555556 0.0185185-s 0.659866 -0.3877 -0.111111 0.0185185-s 0.607487 -0.335322 0.111111 0.0555556-s 0.659645 -0.283164 0.104315 0.0185185-s 0.656357 -0.33883 0.0555556 0.0185185-s 0.603979 -0.286452 0.0555556 0.0185185-s 0.610775 -0.279656 0.15987 0.0185185-s 0.555109 -0.282943 0.111111 0.0185185-s 0.558618 -0.331813 0.166667 0.0185185-s 0.663153 -0.332034 0.15987 0.0185185-s 0.610996 -0.384191 0.166667 0.0185185-s 0.659866 -0.3877 0.111111 0.0185185-s 0.554344 -0.645066 0.111111 0.0555556-s 0.610229 -0.668521 0.153697 0.0185185-s 0.622977 -0.619787 0.099389 0.0185185-s 0.585648 -0.598918 0.15987 0.0185185-s 0.541596 -0.6938 0.165419 0.0185185-s 0.517014 -0.624197 0.171592 0.0185185-s 0.48571 -0.670344 0.122833 0.0185185-s 0.578925 -0.714669 0.104938 0.0185185-s 0.52304 -0.691213 0.062352 0.0185185-s 0.591673 -0.665934 0.0506299 0.0185185-s 0.471405 -0.471405 0.222222 0.0555556-s 0.501645 -0.441164 0.282703 0.0185185-s 0.542955 -0.452233 0.222222 0.0185185-s 0.490576 -0.399854 0.222222 0.0185185-s 0.430095 -0.460336 0.282703 0.0185185-s 0.419026 -0.419026 0.222222 0.0185185-s 0.399854 -0.490576 0.222222 0.0185185-s 0.482473 -0.512714 0.282703 0.0185185-s 0.452233 -0.542955 0.222222 0.0185185-s 0.523783 -0.523783 0.222222 0.0185185-s 0.335322 -0.607487 0.111111 0.0555556-s 0.313405 -0.629404 0.178389 0.0185185-s 0.384191 -0.610996 0.166667 0.0185185-s 0.331813 -0.558618 0.166667 0.0185185-s 0.264535 -0.625895 0.122833 0.0185185-s 0.282943 -0.555109 0.111111 0.0185185-s 0.286452 -0.603979 0.0555556 0.0185185-s 0.316914 -0.678274 0.122833 0.0185185-s 0.33883 -0.656357 0.0555556 0.0185185-s 0.3877 -0.659866 0.111111 0.0185185-s 0.554344 -0.645066 -0.111111 0.0555556-s 0.616373 -0.681385 -0.129006 0.0185185-s 0.617144 -0.607573 -0.122833 0.0185185-s 0.609912 -0.649723 -0.062352 0.0185185-s 0.553573 -0.718878 -0.117284 0.0185185-s 0.547112 -0.687216 -0.0506299 0.0185185-s 0.491544 -0.682558 -0.099389 0.0185185-s 0.560805 -0.676727 -0.177765 0.0185185-s 0.498776 -0.640408 -0.15987 0.0185185-s 0.561576 -0.602915 -0.171592 0.0185185-s 0.335322 -0.607487 -0.111111 0.0555556-s 0.283164 -0.659645 -0.104315 0.0185185-s 0.33883 -0.656357 -0.0555556 0.0185185-s 0.286452 -0.603979 -0.0555556 0.0185185-s 0.279656 -0.610775 -0.15987 0.0185185-s 0.282943 -0.555109 -0.111111 0.0185185-s 0.331813 -0.558618 -0.166667 0.0185185-s 0.332034 -0.663153 -0.15987 0.0185185-s 0.384191 -0.610996 -0.166667 0.0185185-s 0.3877 -0.659866 -0.111111 0.0185185-s 0.471405 -0.471405 -0.222222 0.0555556-s 0.441164 -0.441164 -0.282703 0.0185185-s 0.399854 -0.452233 -0.222222 0.0185185-s 0.452233 -0.399854 -0.222222 0.0185185-s 0.512714 -0.460336 -0.282703 0.0185185-s 0.523783 -0.419026 -0.222222 0.0185185-s 0.542955 -0.490576 -0.222222 0.0185185-s 0.460336 -0.512714 -0.282703 0.0185185-s 0.490576 -0.542955 -0.222222 0.0185185-s 0.419026 -0.523783 -0.222222 0.0185185
glome-hs.cabal view
@@ -1,22 +1,24 @@ Name:                glome-hs-Version:             0.51+Version:             0.60 Synopsis:            ray tracer Description:         Ray Tracer capable of rendering a variety of primitives,                      with support for CSG (difference and intersection of solids),                      BIH-based acceleration structure, and ability to load NFF-                     format files.+                     format files.  The rendering algorithms have been abstracted+                     to an external library, GlomeTrace.  This is just a front-end+                     to the library that renders scenes into an opengl window. License:             GPL License-file:        LICENSE Author:              Jim Snow Maintainer:          Jim Snow <jsnow@cs.pdx.edu>-Copyright:           Copyright 2008 Jim Snow-Homepage:            http://syn.cs.pdx.edu/~jsnow/glome+Copyright:           Copyright 2008,2010 Jim Snow+Homepage:            http://haskell.org/haskellwiki/Glome Stability:           experimental Category:            graphics-Build-Depends:       base,haskell98,time,parallel,GLUT,OpenGL,random,array+Build-Depends:       base >= 3 && < 4, haskell98, time, parallel, GLUT, OpenGL, random, array, GlomeVec, GlomeTrace build-type:          Simple-Executable:          glome-ghc-options:         -fglasgow-exts -funbox-strict-fields -threaded extensions:          BangPatterns -Main-is:             Glome.hs-+Cabal-Version: >= 1.2+extra-source-files:  README.txt,TestScene.hs+executable:          Glome+main-is:             Glome.hs
− make
@@ -1,9 +0,0 @@-#!/bin/bash-#rm *.o-#ghc -O3 --make Glome.hs-#ghc Glome.hs --make -O2 -threaded -fasm -optc-march=athlon64 -XFlexibleInstances -XTypeSynonymInstances-#ghc Glome.hs --make -O2 -fvia-c -fglasgow-exts -funbox-strict-fields -fbang-patterns -fexcess-precision -optc-ffast-math -optc-O2 -optc-mfpmath=sse -optc-msse2-#ghc Glome.hs --make -O2 -fasm -fglasgow-exts -funbox-strict-fields -fbang-patterns -fexcess-precision -prof -auto-all--runhaskell Setup.lhs configure --prefix=$HOME --user-runhaskell Setup.lhs build
− run
@@ -1,4 +0,0 @@-#!/bin/bash-#./Glome +RTS -N2 -sstderr -RTS-#./Glome +RTS-./dist/build/glome/glome