Update to 2.0.0 tree from current Fremantle build
[opencv] / 3rdparty / include / OpenEXR / ImfEnvmap.h
1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
4 // Digital Ltd. LLC
5 // 
6 // All rights reserved.
7 // 
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
10 // met:
11 // *       Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // *       Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 // *       Neither the name of Industrial Light & Magic nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission. 
20 // 
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 ///////////////////////////////////////////////////////////////////////////
34
35
36 #ifndef INCLUDED_IMF_ENVMAP_H
37 #define INCLUDED_IMF_ENVMAP_H
38
39 //-----------------------------------------------------------------------------
40 //
41 //      Environment maps
42 //
43 //      Environment maps define a mapping from 3D directions to 2D
44 //      pixel space locations.  Environment maps are typically used
45 //      in 3D rendering, for effects such as quickly approximating
46 //      how shiny surfaces reflect their environment.
47 //
48 //      Environment maps can be stored in scanline-based or in tiled
49 //      OpenEXR files.  The fact that an image is an environment map
50 //      is indicated by the presence of an EnvmapAttribute whose name
51 //      is "envmap". (Convenience functions to access this attribute
52 //      are defined in header file ImfStandardAttributes.h.)
53 //      The attribute's value defines the mapping from 3D directions
54 //      to 2D pixel space locations.
55 //
56 //      This header file defines the set of possible EnvmapAttribute
57 //      values.
58 //
59 //      For each possible EnvmapAttribute value, this header file also
60 //      defines a set of convienience functions to convert between 3D
61 //      directions and 2D pixel locations.
62 //
63 //      Most of the convenience functions defined below require a
64 //      dataWindow parameter.  For scanline-based images, and for
65 //      tiled images with level mode ONE_LEVEL, the dataWindow
66 //      parameter should be set to the image's data window, as
67 //      defined in the image header.  For tiled images with level
68 //      mode MIPMAP_LEVELS or RIPMAP_LEVELS, the data window of the
69 //      image level that is being accessed should be used instead.
70 //      (See the dataWindowForLevel() methods in ImfTiledInputFile.h
71 //      and ImfTiledOutputFile.h.)
72 //
73 //-----------------------------------------------------------------------------
74
75 #include "ImathBox.h"
76
77 namespace Imf {
78
79 //--------------------------------
80 // Supported environment map types
81 //--------------------------------
82
83 enum Envmap
84 {
85     ENVMAP_LATLONG = 0,         // Latitude-longitude environment map
86     ENVMAP_CUBE = 1,            // Cube map
87
88     NUM_ENVMAPTYPES             // Number of different environment map types
89 };
90
91
92 //-------------------------------------------------------------------------
93 // Latitude-Longitude Map:
94 //
95 // The environment is projected onto the image using polar coordinates
96 // (latitude and longitude).  A pixel's x coordinate corresponds to
97 // its longitude, and the y coordinate corresponds to its latitude.
98 // Pixel (dataWindow.min.x, dataWindow.min.y) has latitude +pi/2 and
99 // longitude +pi; pixel (dataWindow.max.x, dataWindow.max.y) has
100 // latitude -pi/2 and longitude -pi.
101 //
102 // In 3D space, latitudes -pi/2 and +pi/2 correspond to the negative and
103 // positive y direction.  Latitude 0, longitude 0 points into positive
104 // z direction; and latitude 0, longitude pi/2 points into positive x
105 // direction.
106 //
107 // The size of the data window should be 2*N by N pixels (width by height),
108 // where N can be any integer greater than 0.
109 //-------------------------------------------------------------------------
110
111 namespace LatLongMap
112 {
113     //----------------------------------------------------
114     // Convert a 3D direction to a 2D vector whose x and y
115     // components represent the corresponding latitude
116     // and longitude.
117     //----------------------------------------------------
118
119     Imath::V2f          latLong (const Imath::V3f &direction);
120
121
122     //--------------------------------------------------------
123     // Convert the position of a pixel to a 2D vector whose
124     // x and y components represent the corresponding latitude
125     // and longitude.
126     //--------------------------------------------------------
127
128     Imath::V2f          latLong (const Imath::Box2i &dataWindow,
129                                  const Imath::V2f &pixelPosition);
130
131
132     //-------------------------------------------------------------
133     // Convert a 2D vector, whose x and y components represent
134     // longitude and latitude, into a corresponding pixel position.
135     //-------------------------------------------------------------
136
137     Imath::V2f          pixelPosition (const Imath::Box2i &dataWindow,
138                                        const Imath::V2f &latLong);
139
140
141     //-----------------------------------------------------
142     // Convert a 3D direction vector into a corresponding
143     // pixel position.  pixelPosition(dw,dir) is equivalent
144     // to pixelPosition(dw,latLong(dw,dir)).
145     //-----------------------------------------------------
146
147     Imath::V2f          pixelPosition (const Imath::Box2i &dataWindow,
148                                        const Imath::V3f &direction);
149
150
151     //--------------------------------------------------------
152     // Convert the position of a pixel in a latitude-longitude
153     // map into a corresponding 3D direction.
154     //--------------------------------------------------------
155
156     Imath::V3f          direction (const Imath::Box2i &dataWindow,
157                                    const Imath::V2f &pixelPosition);
158 }
159
160
161 //--------------------------------------------------------------
162 // Cube Map:
163 //
164 // The environment is projected onto the six faces of an
165 // axis-aligned cube.  The cube's faces are then arranged
166 // in a 2D image as shown below.
167 //
168 //          2-----------3
169 //         /           /|
170 //        /           / |       Y
171 //       /           /  |       |
172 //      6-----------7   |       |
173 //      |           |   |       |
174 //      |           |   |       |
175 //      |   0       |   1       *------- X
176 //      |           |  /       /
177 //      |           | /       /
178 //      |           |/       /
179 //      4-----------5       Z
180 // 
181 //   dataWindow.min
182 //        /
183 //       / 
184 //      +-----------+
185 //      |3    Y    7|
186 //      |     |     |
187 //      |     |     |
188 //      |  ---+---Z |  +X face
189 //      |     |     |
190 //      |     |     |
191 //      |1         5|
192 //      +-----------+
193 //      |6    Y    2|
194 //      |     |     |
195 //      |     |     |
196 //      | Z---+---  |  -X face
197 //      |     |     |
198 //      |     |     |
199 //      |4         0|
200 //      +-----------+
201 //      |6    Z    7|
202 //      |     |     |
203 //      |     |     |
204 //      |  ---+---X |  +Y face
205 //      |     |     |
206 //      |     |     |
207 //      |2         3|
208 //      +-----------+
209 //      |0         1|
210 //      |     |     |
211 //      |     |     |
212 //      |  ---+---X |  -Y face
213 //      |     |     |
214 //      |     |     |
215 //      |4    Z    5|
216 //      +-----------+
217 //      |7    Y    6|
218 //      |     |     |
219 //      |     |     |
220 //      | X---+---  |  +Z face
221 //      |     |     |
222 //      |     |     |
223 //      |5         4|
224 //      +-----------+
225 //      |2    Y    3|
226 //      |     |     |
227 //      |     |     |
228 //      |  ---+---X |  -Z face
229 //      |     |     |
230 //      |     |     |
231 //      |0         1|
232 //      +-----------+
233 //                 /
234 //                /
235 //          dataWindow.max
236 //
237 // The size of the data window should be N by 6*N pixels
238 // (width by height), where N can be any integer greater
239 // than 0.
240 // 
241 //--------------------------------------------------------------
242
243 //------------------------------------
244 // Names for the six faces of the cube
245 //------------------------------------
246
247 enum CubeMapFace
248 {
249     CUBEFACE_POS_X,     // +X face
250     CUBEFACE_NEG_X,     // -X face
251     CUBEFACE_POS_Y,     // +Y face
252     CUBEFACE_NEG_Y,     // -Y face
253     CUBEFACE_POS_Z,     // +Z face
254     CUBEFACE_NEG_Z,     // -Z face
255 };
256
257 namespace CubeMap
258 {
259     //---------------------------------------------
260     // Width and height of a cube's face, in pixels
261     //---------------------------------------------
262
263     int                 sizeOfFace (const Imath::Box2i &dataWindow);
264
265
266     //------------------------------------------
267     // Compute the region in the environment map
268     // that is covered by the specified face.
269     //------------------------------------------
270
271     Imath::Box2i        dataWindowForFace (CubeMapFace face,
272                                            const Imath::Box2i &dataWindow);
273
274
275     //----------------------------------------------------
276     // Convert the coordinates of a pixel within a face
277     // [in the range from (0,0) to (s-1,s-1), where
278     // s == sizeOfFace(dataWindow)] to pixel coordinates
279     // in the environment map.
280     //----------------------------------------------------
281
282     Imath::V2f          pixelPosition (CubeMapFace face,
283                                        const Imath::Box2i &dataWindow,
284                                        Imath::V2f positionInFace);
285
286
287     //--------------------------------------------------------------
288     // Convert a 3D direction into a cube face, and a pixel position
289     // within that face.
290     //
291     // If you have a 3D direction, dir, the following code fragment
292     // finds the position, pos, of the corresponding pixel in an
293     // environment map with data window dw:
294     //
295     // CubeMapFace f;
296     // V2f pif, pos;
297     //
298     // faceAndPixelPosition (dir, dw, f, pif);
299     // pos = pixelPosition (f, dw, pif);
300     //
301     //--------------------------------------------------------------
302
303     void                faceAndPixelPosition (const Imath::V3f &direction,
304                                               const Imath::Box2i &dataWindow,
305                                               CubeMapFace &face,
306                                               Imath::V2f &positionInFace);
307
308    
309     // --------------------------------------------------------
310     // Given a cube face and a pixel position within that face,
311     // compute the corresponding 3D direction.
312     // --------------------------------------------------------
313
314     Imath::V3f          direction (CubeMapFace face,
315                                    const Imath::Box2i &dataWindow,
316                                    const Imath::V2f &positionInFace);
317 }
318
319
320 } // namespace Imf
321
322 #endif