2012-08-24 22:31:49 +02:00
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
|
|
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
|
|
|
|
// Digital Ltd. LLC
|
2012-10-17 01:18:30 +02:00
|
|
|
//
|
2012-08-24 22:31:49 +02:00
|
|
|
// All rights reserved.
|
2012-10-17 01:18:30 +02:00
|
|
|
//
|
2012-08-24 22:31:49 +02:00
|
|
|
// Redistribution and use in source and binary forms, with or without
|
|
|
|
// modification, are permitted provided that the following conditions are
|
|
|
|
// met:
|
|
|
|
// * Redistributions of source code must retain the above copyright
|
|
|
|
// notice, this list of conditions and the following disclaimer.
|
|
|
|
// * Redistributions in binary form must reproduce the above
|
|
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
|
|
// in the documentation and/or other materials provided with the
|
|
|
|
// distribution.
|
|
|
|
// * Neither the name of Industrial Light & Magic nor the names of
|
|
|
|
// its contributors may be used to endorse or promote products derived
|
2012-10-17 01:18:30 +02:00
|
|
|
// from this software without specific prior written permission.
|
|
|
|
//
|
2012-08-24 22:31:49 +02:00
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
//
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef INCLUDED_IMF_ENVMAP_H
|
|
|
|
#define INCLUDED_IMF_ENVMAP_H
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// Environment maps
|
|
|
|
//
|
|
|
|
// Environment maps define a mapping from 3D directions to 2D
|
|
|
|
// pixel space locations. Environment maps are typically used
|
|
|
|
// in 3D rendering, for effects such as quickly approximating
|
|
|
|
// how shiny surfaces reflect their environment.
|
|
|
|
//
|
|
|
|
// Environment maps can be stored in scanline-based or in tiled
|
|
|
|
// OpenEXR files. The fact that an image is an environment map
|
|
|
|
// is indicated by the presence of an EnvmapAttribute whose name
|
|
|
|
// is "envmap". (Convenience functions to access this attribute
|
|
|
|
// are defined in header file ImfStandardAttributes.h.)
|
|
|
|
// The attribute's value defines the mapping from 3D directions
|
|
|
|
// to 2D pixel space locations.
|
|
|
|
//
|
|
|
|
// This header file defines the set of possible EnvmapAttribute
|
|
|
|
// values.
|
|
|
|
//
|
|
|
|
// For each possible EnvmapAttribute value, this header file also
|
|
|
|
// defines a set of convienience functions to convert between 3D
|
|
|
|
// directions and 2D pixel locations.
|
|
|
|
//
|
|
|
|
// Most of the convenience functions defined below require a
|
|
|
|
// dataWindow parameter. For scanline-based images, and for
|
|
|
|
// tiled images with level mode ONE_LEVEL, the dataWindow
|
|
|
|
// parameter should be set to the image's data window, as
|
|
|
|
// defined in the image header. For tiled images with level
|
|
|
|
// mode MIPMAP_LEVELS or RIPMAP_LEVELS, the data window of the
|
|
|
|
// image level that is being accessed should be used instead.
|
|
|
|
// (See the dataWindowForLevel() methods in ImfTiledInputFile.h
|
|
|
|
// and ImfTiledOutputFile.h.)
|
|
|
|
//
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#include "ImathBox.h"
|
|
|
|
|
|
|
|
namespace Imf {
|
|
|
|
|
|
|
|
//--------------------------------
|
|
|
|
// Supported environment map types
|
|
|
|
//--------------------------------
|
|
|
|
|
|
|
|
enum Envmap
|
|
|
|
{
|
|
|
|
ENVMAP_LATLONG = 0, // Latitude-longitude environment map
|
|
|
|
ENVMAP_CUBE = 1, // Cube map
|
|
|
|
|
|
|
|
NUM_ENVMAPTYPES // Number of different environment map types
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
// Latitude-Longitude Map:
|
|
|
|
//
|
|
|
|
// The environment is projected onto the image using polar coordinates
|
|
|
|
// (latitude and longitude). A pixel's x coordinate corresponds to
|
|
|
|
// its longitude, and the y coordinate corresponds to its latitude.
|
|
|
|
// Pixel (dataWindow.min.x, dataWindow.min.y) has latitude +pi/2 and
|
|
|
|
// longitude +pi; pixel (dataWindow.max.x, dataWindow.max.y) has
|
|
|
|
// latitude -pi/2 and longitude -pi.
|
|
|
|
//
|
|
|
|
// In 3D space, latitudes -pi/2 and +pi/2 correspond to the negative and
|
|
|
|
// positive y direction. Latitude 0, longitude 0 points into positive
|
|
|
|
// z direction; and latitude 0, longitude pi/2 points into positive x
|
|
|
|
// direction.
|
|
|
|
//
|
|
|
|
// The size of the data window should be 2*N by N pixels (width by height),
|
|
|
|
// where N can be any integer greater than 0.
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
namespace LatLongMap
|
|
|
|
{
|
|
|
|
//----------------------------------------------------
|
|
|
|
// Convert a 3D direction to a 2D vector whose x and y
|
|
|
|
// components represent the corresponding latitude
|
|
|
|
// and longitude.
|
|
|
|
//----------------------------------------------------
|
|
|
|
|
|
|
|
Imath::V2f latLong (const Imath::V3f &direction);
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Convert the position of a pixel to a 2D vector whose
|
|
|
|
// x and y components represent the corresponding latitude
|
|
|
|
// and longitude.
|
|
|
|
//--------------------------------------------------------
|
|
|
|
|
|
|
|
Imath::V2f latLong (const Imath::Box2i &dataWindow,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::V2f &pixelPosition);
|
2012-08-24 22:31:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------
|
|
|
|
// Convert a 2D vector, whose x and y components represent
|
|
|
|
// longitude and latitude, into a corresponding pixel position.
|
|
|
|
//-------------------------------------------------------------
|
|
|
|
|
|
|
|
Imath::V2f pixelPosition (const Imath::Box2i &dataWindow,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::V2f &latLong);
|
2012-08-24 22:31:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Convert a 3D direction vector into a corresponding
|
|
|
|
// pixel position. pixelPosition(dw,dir) is equivalent
|
|
|
|
// to pixelPosition(dw,latLong(dw,dir)).
|
|
|
|
//-----------------------------------------------------
|
|
|
|
|
|
|
|
Imath::V2f pixelPosition (const Imath::Box2i &dataWindow,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::V3f &direction);
|
2012-08-24 22:31:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Convert the position of a pixel in a latitude-longitude
|
|
|
|
// map into a corresponding 3D direction.
|
|
|
|
//--------------------------------------------------------
|
|
|
|
|
|
|
|
Imath::V3f direction (const Imath::Box2i &dataWindow,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::V2f &pixelPosition);
|
2012-08-24 22:31:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Cube Map:
|
|
|
|
//
|
|
|
|
// The environment is projected onto the six faces of an
|
|
|
|
// axis-aligned cube. The cube's faces are then arranged
|
|
|
|
// in a 2D image as shown below.
|
|
|
|
//
|
|
|
|
// 2-----------3
|
|
|
|
// / /|
|
|
|
|
// / / | Y
|
|
|
|
// / / | |
|
|
|
|
// 6-----------7 | |
|
|
|
|
// | | | |
|
|
|
|
// | | | |
|
|
|
|
// | 0 | 1 *------- X
|
|
|
|
// | | / /
|
|
|
|
// | | / /
|
|
|
|
// | |/ /
|
|
|
|
// 4-----------5 Z
|
2012-10-17 01:18:30 +02:00
|
|
|
//
|
2012-08-24 22:31:49 +02:00
|
|
|
// dataWindow.min
|
|
|
|
// /
|
2012-10-17 01:18:30 +02:00
|
|
|
// /
|
2012-08-24 22:31:49 +02:00
|
|
|
// +-----------+
|
|
|
|
// |3 Y 7|
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// | ---+---Z | +X face
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// |1 5|
|
|
|
|
// +-----------+
|
|
|
|
// |6 Y 2|
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// | Z---+--- | -X face
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// |4 0|
|
|
|
|
// +-----------+
|
|
|
|
// |6 Z 7|
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// | ---+---X | +Y face
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// |2 3|
|
|
|
|
// +-----------+
|
|
|
|
// |0 1|
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// | ---+---X | -Y face
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// |4 Z 5|
|
|
|
|
// +-----------+
|
|
|
|
// |7 Y 6|
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// | X---+--- | +Z face
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// |5 4|
|
|
|
|
// +-----------+
|
|
|
|
// |2 Y 3|
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// | ---+---X | -Z face
|
|
|
|
// | | |
|
|
|
|
// | | |
|
|
|
|
// |0 1|
|
|
|
|
// +-----------+
|
|
|
|
// /
|
|
|
|
// /
|
|
|
|
// dataWindow.max
|
|
|
|
//
|
|
|
|
// The size of the data window should be N by 6*N pixels
|
|
|
|
// (width by height), where N can be any integer greater
|
|
|
|
// than 0.
|
2012-10-17 01:18:30 +02:00
|
|
|
//
|
2012-08-24 22:31:49 +02:00
|
|
|
//--------------------------------------------------------------
|
|
|
|
|
|
|
|
//------------------------------------
|
|
|
|
// Names for the six faces of the cube
|
|
|
|
//------------------------------------
|
|
|
|
|
|
|
|
enum CubeMapFace
|
|
|
|
{
|
|
|
|
CUBEFACE_POS_X, // +X face
|
|
|
|
CUBEFACE_NEG_X, // -X face
|
|
|
|
CUBEFACE_POS_Y, // +Y face
|
|
|
|
CUBEFACE_NEG_Y, // -Y face
|
|
|
|
CUBEFACE_POS_Z, // +Z face
|
|
|
|
CUBEFACE_NEG_Z // -Z face
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace CubeMap
|
|
|
|
{
|
|
|
|
//---------------------------------------------
|
|
|
|
// Width and height of a cube's face, in pixels
|
|
|
|
//---------------------------------------------
|
|
|
|
|
|
|
|
int sizeOfFace (const Imath::Box2i &dataWindow);
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------
|
|
|
|
// Compute the region in the environment map
|
|
|
|
// that is covered by the specified face.
|
|
|
|
//------------------------------------------
|
|
|
|
|
|
|
|
Imath::Box2i dataWindowForFace (CubeMapFace face,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::Box2i &dataWindow);
|
2012-08-24 22:31:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------
|
|
|
|
// Convert the coordinates of a pixel within a face
|
|
|
|
// [in the range from (0,0) to (s-1,s-1), where
|
|
|
|
// s == sizeOfFace(dataWindow)] to pixel coordinates
|
|
|
|
// in the environment map.
|
|
|
|
//----------------------------------------------------
|
|
|
|
|
|
|
|
Imath::V2f pixelPosition (CubeMapFace face,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::Box2i &dataWindow,
|
|
|
|
Imath::V2f positionInFace);
|
2012-08-24 22:31:49 +02:00
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Convert a 3D direction into a cube face, and a pixel position
|
|
|
|
// within that face.
|
|
|
|
//
|
|
|
|
// If you have a 3D direction, dir, the following code fragment
|
|
|
|
// finds the position, pos, of the corresponding pixel in an
|
|
|
|
// environment map with data window dw:
|
|
|
|
//
|
|
|
|
// CubeMapFace f;
|
|
|
|
// V2f pif, pos;
|
|
|
|
//
|
|
|
|
// faceAndPixelPosition (dir, dw, f, pif);
|
|
|
|
// pos = pixelPosition (f, dw, pif);
|
|
|
|
//
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
|
|
|
|
void faceAndPixelPosition (const Imath::V3f &direction,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::Box2i &dataWindow,
|
|
|
|
CubeMapFace &face,
|
|
|
|
Imath::V2f &positionInFace);
|
|
|
|
|
2012-08-24 22:31:49 +02:00
|
|
|
|
|
|
|
// --------------------------------------------------------
|
|
|
|
// Given a cube face and a pixel position within that face,
|
|
|
|
// compute the corresponding 3D direction.
|
|
|
|
// --------------------------------------------------------
|
|
|
|
|
|
|
|
Imath::V3f direction (CubeMapFace face,
|
2012-10-17 01:18:30 +02:00
|
|
|
const Imath::Box2i &dataWindow,
|
|
|
|
const Imath::V2f &positionInFace);
|
2012-08-24 22:31:49 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace Imf
|
|
|
|
|
|
|
|
#endif
|