⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imfenvmap.h

📁 image converter source code
💻 H
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas// Digital Ltd. LLC// // All rights reserved.// // 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// from this software without specific prior written permission. // // 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,				 const Imath::V2f &pixelPosition);    //-------------------------------------------------------------    // 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,				       const Imath::V2f &latLong);    //-----------------------------------------------------    // 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,				       const Imath::V3f &direction);    //--------------------------------------------------------    // Convert the position of a pixel in a latitude-longitude    // map into a corresponding 3D direction.    //--------------------------------------------------------    Imath::V3f		direction (const Imath::Box2i &dataWindow,				   const Imath::V2f &pixelPosition);}//--------------------------------------------------------------// 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// //   dataWindow.min//        ///       / //      +-----------+//      |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.// //--------------------------------------------------------------//------------------------------------// 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,					   const Imath::Box2i &dataWindow);    //----------------------------------------------------    // 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,				       const Imath::Box2i &dataWindow,				       Imath::V2f positionInFace);    //--------------------------------------------------------------    // 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,					      const Imath::Box2i &dataWindow,					      CubeMapFace &face,					      Imath::V2f &positionInFace);       // --------------------------------------------------------    // Given a cube face and a pixel position within that face,    // compute the corresponding 3D direction.    // --------------------------------------------------------    Imath::V3f		direction (CubeMapFace face,				   const Imath::Box2i &dataWindow,				   const Imath::V2f &positionInFace);}} // namespace Imf#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -