This file is indexed.

/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'>=&gt;</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'>-&gt;</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'>=&gt;</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'>=&gt;</span>
<a name="line-103"></a>                  <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-conid'>Camera</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-&gt;</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>