/usr/share/doc/libghc-diagrams-lib-doc/html/src/Diagrams-ThreeD-Camera.html is in libghc-diagrams-lib-doc 1.2.0.3-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Diagrams/ThreeD/Camera.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE DeriveDataTypeable #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# LANGUAGE FlexibleContexts #-}</span>
<a name="line-3"></a><span class='hs-comment'>{-# LANGUAGE GADTs #-}</span>
<a name="line-4"></a><span class='hs-comment'>{-# LANGUAGE MultiParamTypeClasses #-}</span>
<a name="line-5"></a><span class='hs-comment'>{-# LANGUAGE TemplateHaskell #-}</span>
<a name="line-6"></a><span class='hs-comment'>{-# LANGUAGE TypeFamilies #-}</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-9"></a><span class='hs-comment'>-- |</span>
<a name="line-10"></a><span class='hs-comment'>-- Module : Diagrams.ThreeD.Camera</span>
<a name="line-11"></a><span class='hs-comment'>-- Copyright : (c) 2013 diagrams-lib team (see LICENSE)</span>
<a name="line-12"></a><span class='hs-comment'>-- License : BSD-style (see LICENSE)</span>
<a name="line-13"></a><span class='hs-comment'>-- Maintainer : diagrams-discuss@googlegroups.com</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- Types to specify viewpoint for 3D rendering.</span>
<a name="line-16"></a><span class='hs-comment'>--</span>
<a name="line-17"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Diagrams</span><span class='hs-varop'>.</span><span class='hs-conid'>ThreeD</span><span class='hs-varop'>.</span><span class='hs-conid'>Camera</span>
<a name="line-20"></a> <span class='hs-layout'>(</span> <span class='hs-conid'>Camera</span> <span class='hs-comment'>-- do not export constructor</span>
<a name="line-21"></a> <span class='hs-comment'>-- These are safe to construct manually</span>
<a name="line-22"></a> <span class='hs-layout'>,</span> <span class='hs-conid'>PerspectiveLens</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>OrthoLens</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-23"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>horizontalFieldOfView</span><span class='hs-layout'>,</span> <span class='hs-varid'>verticalFieldOfView</span>
<a name="line-24"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>orthoWidth</span><span class='hs-layout'>,</span> <span class='hs-varid'>orthoHeight</span>
<a name="line-25"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>camLoc</span><span class='hs-layout'>,</span> <span class='hs-varid'>camForward</span><span class='hs-layout'>,</span> <span class='hs-varid'>camUp</span><span class='hs-layout'>,</span> <span class='hs-varid'>camRight</span><span class='hs-layout'>,</span> <span class='hs-varid'>camLens</span>
<a name="line-26"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>facing_ZCamera</span><span class='hs-layout'>,</span> <span class='hs-varid'>mm50Camera</span>
<a name="line-27"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mm50</span><span class='hs-layout'>,</span> <span class='hs-varid'>mm50Wide</span><span class='hs-layout'>,</span> <span class='hs-varid'>mm50Narrow</span>
<a name="line-28"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>aspect</span><span class='hs-layout'>,</span> <span class='hs-varid'>camAspect</span>
<a name="line-29"></a> <span class='hs-layout'>)</span>
<a name="line-30"></a> <span class='hs-keyword'>where</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Lens</span> <span class='hs-layout'>(</span><span class='hs-varid'>makeLenses</span><span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Cross</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span>
<a name="line-36"></a>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Diagrams</span><span class='hs-varop'>.</span><span class='hs-conid'>Angle</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Diagrams</span><span class='hs-varop'>.</span><span class='hs-conid'>Core</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Diagrams</span><span class='hs-varop'>.</span><span class='hs-conid'>ThreeD</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Diagrams</span><span class='hs-varop'>.</span><span class='hs-conid'>ThreeD</span><span class='hs-varop'>.</span><span class='hs-conid'>Vector</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="Camera"></a><span class='hs-comment'>-- Parameterize Camera on the lens type, so that Backends can express which</span>
<a name="line-43"></a><a name="Camera"></a><span class='hs-comment'>-- lenses they handle.</span>
<a name="line-44"></a><a name="Camera"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Camera</span>
<a name="line-45"></a> <span class='hs-layout'>{</span> <span class='hs-varid'>camLoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>P3</span>
<a name="line-46"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>forward</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>R3</span>
<a name="line-47"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>up</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>R3</span>
<a name="line-48"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>lens</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>l</span>
<a name="line-49"></a> <span class='hs-layout'>}</span>
<a name="line-50"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Typeable</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="CameraLens"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Typeable</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>CameraLens</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>where</span>
<a name="line-53"></a> <span class='hs-comment'>-- | The natural aspect ratio of the projection.</span>
<a name="line-54"></a> <span class='hs-varid'>aspect</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Double</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="PerspectiveLens"></a><span class='hs-comment'>-- | A perspective projection</span>
<a name="line-57"></a><a name="PerspectiveLens"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>PerspectiveLens</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PerspectiveLens</span>
<a name="line-58"></a> <span class='hs-layout'>{</span> <span class='hs-sel'>_horizontalFieldOfView</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Angle</span> <span class='hs-comment'>-- ^ Horizontal field of view.</span>
<a name="line-59"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_verticalFieldOfView</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Angle</span> <span class='hs-comment'>-- ^ Vertical field of view.</span>
<a name="line-60"></a> <span class='hs-layout'>}</span>
<a name="line-61"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Typeable</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="makeLenses"></a><span class='hs-definition'>makeLenses</span> <span class='hs-chr'>'</span><span class='hs-chr'>'</span><span class='hs-conid'>PerspectiveLens</span>
<a name="line-64"></a>
<a name="line-65"></a><a name="instance%20CameraLens%20PerspectiveLens"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>CameraLens</span> <span class='hs-conid'>PerspectiveLens</span> <span class='hs-keyword'>where</span>
<a name="line-66"></a> <span class='hs-varid'>aspect</span> <span class='hs-layout'>(</span><span class='hs-conid'>PerspectiveLens</span> <span class='hs-varid'>h</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>angleRatio</span> <span class='hs-varid'>h</span> <span class='hs-varid'>v</span>
<a name="line-67"></a>
<a name="line-68"></a><a name="OrthoLens"></a><span class='hs-comment'>-- | An orthographic projection</span>
<a name="line-69"></a><a name="OrthoLens"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>OrthoLens</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OrthoLens</span>
<a name="line-70"></a> <span class='hs-layout'>{</span> <span class='hs-sel'>_orthoWidth</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Double</span> <span class='hs-comment'>-- ^ Width</span>
<a name="line-71"></a> <span class='hs-layout'>,</span> <span class='hs-sel'>_orthoHeight</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Double</span> <span class='hs-comment'>-- ^ Height</span>
<a name="line-72"></a> <span class='hs-layout'>}</span>
<a name="line-73"></a> <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Typeable</span>
<a name="line-74"></a>
<a name="line-75"></a><span class='hs-definition'>makeLenses</span> <span class='hs-chr'>'</span><span class='hs-chr'>'</span><span class='hs-conid'>OrthoLens</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="instance%20CameraLens%20OrthoLens"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>CameraLens</span> <span class='hs-conid'>OrthoLens</span> <span class='hs-keyword'>where</span>
<a name="line-78"></a> <span class='hs-varid'>aspect</span> <span class='hs-layout'>(</span><span class='hs-conid'>OrthoLens</span> <span class='hs-varid'>h</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>h</span> <span class='hs-varop'>/</span> <span class='hs-varid'>v</span>
<a name="line-79"></a>
<a name="line-80"></a><span class='hs-keyword'>type</span> <span class='hs-keyword'>instance</span> <span class='hs-conid'>V</span> <span class='hs-layout'>(</span><span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>R3</span>
<a name="line-81"></a>
<a name="line-82"></a><a name="instance%20Transformable%20(Camera%20l)"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Transformable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-83"></a> <span class='hs-varid'>transform</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-conid'>Camera</span> <span class='hs-varid'>p</span> <span class='hs-varid'>f</span> <span class='hs-varid'>u</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-84"></a> <span class='hs-conid'>Camera</span> <span class='hs-layout'>(</span><span class='hs-varid'>transform</span> <span class='hs-varid'>t</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-85"></a> <span class='hs-layout'>(</span><span class='hs-varid'>transform</span> <span class='hs-varid'>t</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-86"></a> <span class='hs-layout'>(</span><span class='hs-varid'>transform</span> <span class='hs-varid'>t</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span>
<a name="line-87"></a> <span class='hs-varid'>l</span>
<a name="line-88"></a>
<a name="line-89"></a><a name="instance%20Renderable%20(Camera%20l)%20NullBackend"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Renderable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-conid'>NullBackend</span> <span class='hs-keyword'>where</span>
<a name="line-90"></a> <span class='hs-varid'>render</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mempty</span>
<a name="line-91"></a>
<a name="line-92"></a><a name="mm50Camera"></a><span class='hs-comment'>-- | A camera at the origin facing along the negative Z axis, with its</span>
<a name="line-93"></a><span class='hs-comment'>-- up-axis coincident with the positive Y axis. The field of view is</span>
<a name="line-94"></a><span class='hs-comment'>-- chosen to match a 50mm camera on 35mm film. Note that Cameras take</span>
<a name="line-95"></a><span class='hs-comment'>-- up no space in the Diagram.</span>
<a name="line-96"></a><span class='hs-definition'>mm50Camera</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Backend</span> <span class='hs-varid'>b</span> <span class='hs-conid'>R3</span><span class='hs-layout'>,</span> <span class='hs-conid'>Renderable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Camera</span> <span class='hs-conid'>PerspectiveLens</span><span class='hs-layout'>)</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Diagram</span> <span class='hs-varid'>b</span> <span class='hs-conid'>R3</span>
<a name="line-97"></a><span class='hs-definition'>mm50Camera</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>facing_ZCamera</span> <span class='hs-varid'>mm50</span>
<a name="line-98"></a>
<a name="line-99"></a><a name="facing_ZCamera"></a><span class='hs-comment'>-- | 'facing_ZCamera l' is a camera at the origin facing along the</span>
<a name="line-100"></a><span class='hs-comment'>-- negative Z axis, with its up-axis coincident with the positive Y</span>
<a name="line-101"></a><span class='hs-comment'>-- axis, with the projection defined by l.</span>
<a name="line-102"></a><span class='hs-definition'>facing_ZCamera</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>CameraLens</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-conid'>Backend</span> <span class='hs-varid'>b</span> <span class='hs-conid'>R3</span><span class='hs-layout'>,</span> <span class='hs-conid'>Renderable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span>
<a name="line-103"></a> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Diagram</span> <span class='hs-varid'>b</span> <span class='hs-conid'>R3</span>
<a name="line-104"></a><span class='hs-definition'>facing_ZCamera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkQD</span> <span class='hs-layout'>(</span><span class='hs-conid'>Prim</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>origin</span> <span class='hs-varid'>unit_Z</span> <span class='hs-varid'>unitY</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-105"></a> <span class='hs-varid'>mempty</span> <span class='hs-varid'>mempty</span> <span class='hs-varid'>mempty</span> <span class='hs-layout'>(</span><span class='hs-conid'>Query</span> <span class='hs-varop'>.</span> <span class='hs-varid'>const</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Any</span> <span class='hs-varop'>$</span> <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-106"></a>
<a name="line-107"></a><a name="mm50"></a><span class='hs-definition'>mm50</span><span class='hs-layout'>,</span> <span class='hs-varid'>mm50Wide</span><span class='hs-layout'>,</span> <span class='hs-varid'>mm50Narrow</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PerspectiveLens</span>
<a name="line-108"></a>
<a name="line-109"></a><span class='hs-comment'>-- | mm50 has the field of view of a 50mm lens on standard 35mm film,</span>
<a name="line-110"></a><span class='hs-comment'>-- hence an aspect ratio of 3:2.</span>
<a name="line-111"></a><span class='hs-definition'>mm50</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PerspectiveLens</span> <span class='hs-layout'>(</span><span class='hs-num'>40.5</span> <span class='hs-varop'>@@</span> <span class='hs-varid'>deg</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-num'>27</span> <span class='hs-varop'>@@</span> <span class='hs-varid'>deg</span><span class='hs-layout'>)</span>
<a name="line-112"></a>
<a name="line-113"></a><a name="mm50Wide"></a><span class='hs-comment'>-- | mm50blWide has the same vertical field of view as mm50, but an</span>
<a name="line-114"></a><span class='hs-comment'>-- aspect ratio of 1.6, suitable for wide screen computer monitors.</span>
<a name="line-115"></a><span class='hs-definition'>mm50Wide</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PerspectiveLens</span> <span class='hs-layout'>(</span><span class='hs-num'>43.2</span> <span class='hs-varop'>@@</span> <span class='hs-varid'>deg</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-num'>27</span> <span class='hs-varop'>@@</span> <span class='hs-varid'>deg</span><span class='hs-layout'>)</span>
<a name="line-116"></a>
<a name="line-117"></a><a name="mm50Narrow"></a><span class='hs-comment'>-- | mm50Narrow has the same vertical field of view as mm50, but an</span>
<a name="line-118"></a><span class='hs-comment'>-- aspect ratio of 4:3, for VGA and similar computer resulotions.</span>
<a name="line-119"></a><span class='hs-definition'>mm50Narrow</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>PerspectiveLens</span> <span class='hs-layout'>(</span><span class='hs-num'>36</span> <span class='hs-varop'>@@</span> <span class='hs-varid'>deg</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-num'>27</span> <span class='hs-varop'>@@</span> <span class='hs-varid'>deg</span><span class='hs-layout'>)</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="camForward"></a><span class='hs-definition'>camForward</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Direction</span>
<a name="line-122"></a><span class='hs-definition'>camForward</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>direction</span> <span class='hs-varop'>.</span> <span class='hs-varid'>forward</span>
<a name="line-123"></a>
<a name="line-124"></a><a name="camUp"></a><span class='hs-definition'>camUp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Direction</span>
<a name="line-125"></a><span class='hs-definition'>camUp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>direction</span> <span class='hs-varop'>.</span> <span class='hs-varid'>up</span>
<a name="line-126"></a>
<a name="line-127"></a><a name="camRight"></a><span class='hs-definition'>camRight</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Direction</span>
<a name="line-128"></a><span class='hs-definition'>camRight</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>direction</span> <span class='hs-varid'>right</span> <span class='hs-keyword'>where</span>
<a name="line-129"></a> <span class='hs-varid'>right</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cross3</span> <span class='hs-layout'>(</span><span class='hs-varid'>forward</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>up</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="camLens"></a><span class='hs-definition'>camLens</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>l</span>
<a name="line-132"></a><span class='hs-definition'>camLens</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lens</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="camAspect"></a><span class='hs-definition'>camAspect</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CameraLens</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Double</span>
<a name="line-135"></a><span class='hs-definition'>camAspect</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>aspect</span> <span class='hs-varop'>.</span> <span class='hs-varid'>camLens</span>
</pre></body>
</html>
|