source: NonGTP/OpenEXR/include/IlmImf/ImfEnvmap.h @ 855

Revision 855, 10.8 KB checked in by igarcia, 18 years ago (diff)
Line 
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
77namespace Imf {
78
79//--------------------------------
80// Supported environment map types
81//--------------------------------
82
83enum 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
111namespace 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
247enum 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
257namespace 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
Note: See TracBrowser for help on using the repository browser.