Blame exrenvmap/makeCubeMap.cpp

Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
//
Packit Service 6754ca
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
Packit Service 6754ca
// Digital Ltd. LLC
Packit Service 6754ca
// 
Packit Service 6754ca
// All rights reserved.
Packit Service 6754ca
// 
Packit Service 6754ca
// Redistribution and use in source and binary forms, with or without
Packit Service 6754ca
// modification, are permitted provided that the following conditions are
Packit Service 6754ca
// met:
Packit Service 6754ca
// *       Redistributions of source code must retain the above copyright
Packit Service 6754ca
// notice, this list of conditions and the following disclaimer.
Packit Service 6754ca
// *       Redistributions in binary form must reproduce the above
Packit Service 6754ca
// copyright notice, this list of conditions and the following disclaimer
Packit Service 6754ca
// in the documentation and/or other materials provided with the
Packit Service 6754ca
// distribution.
Packit Service 6754ca
// *       Neither the name of Industrial Light & Magic nor the names of
Packit Service 6754ca
// its contributors may be used to endorse or promote products derived
Packit Service 6754ca
// from this software without specific prior written permission. 
Packit Service 6754ca
// 
Packit Service 6754ca
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 6754ca
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 6754ca
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 6754ca
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 6754ca
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 6754ca
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 6754ca
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 6754ca
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 6754ca
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 6754ca
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 6754ca
//
Packit Service 6754ca
///////////////////////////////////////////////////////////////////////////
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
//
Packit Service 6754ca
//      function makeCubeMap() -- makes cube-face environment maps
Packit Service 6754ca
//
Packit Service 6754ca
//-----------------------------------------------------------------------------
Packit Service 6754ca
Packit Service 6754ca
#include <makeCubeMap.h>
Packit Service 6754ca
Packit Service 6754ca
#include <resizeImage.h>
Packit Service 6754ca
#include <ImfRgbaFile.h>
Packit Service 6754ca
#include <ImfTiledRgbaFile.h>
Packit Service 6754ca
#include <ImfStandardAttributes.h>
Packit Service 6754ca
#include "Iex.h"
Packit Service 6754ca
#include <iostream>
Packit Service 6754ca
#include <algorithm>
Packit Service 6754ca
#include <string>
Packit Service 6754ca
#include <string.h>
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
#include "namespaceAlias.h"
Packit Service 6754ca
using namespace IMF;
Packit Service 6754ca
using namespace std;
Packit Service 6754ca
using namespace IMATH;
Packit Service 6754ca
Packit Service 6754ca
namespace {
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
makeCubeMapSingleFile (EnvmapImage &image1,
Packit Service 6754ca
                       Header &header,
Packit Service 6754ca
                       RgbaChannels channels,
Packit Service 6754ca
                       const char outFileName[],
Packit Service 6754ca
                       int tileWidth,
Packit Service 6754ca
                       int tileHeight,
Packit Service 6754ca
                       LevelMode levelMode,
Packit Service 6754ca
                       LevelRoundingMode roundingMode,
Packit Service 6754ca
                       Compression compression,
Packit Service 6754ca
                       int mapWidth,
Packit Service 6754ca
                       float filterRadius,
Packit Service 6754ca
                       int numSamples,
Packit Service 6754ca
                       bool verbose)
Packit Service 6754ca
{
Packit Service 6754ca
    if (levelMode == RIPMAP_LEVELS)
Packit Service 6754ca
        throw IEX::NoImplExc ("Cannot generate ripmap cube-face environments.");
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Open the file that will contain the cube-face map,
Packit Service 6754ca
    // and write the header.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    int mapHeight = mapWidth * 6;
Packit Service 6754ca
Packit Service 6754ca
    header.dataWindow() = Box2i (V2i (0, 0), V2i (mapWidth - 1, mapHeight - 1));
Packit Service 6754ca
    header.displayWindow() = header.dataWindow();
Packit Service 6754ca
    header.compression() = compression;
Packit Service 6754ca
Packit Service 6754ca
    addEnvmap (header, ENVMAP_CUBE);
Packit Service 6754ca
Packit Service 6754ca
    TiledRgbaOutputFile out (outFileName,
Packit Service 6754ca
                             header,
Packit Service 6754ca
                             channels,
Packit Service 6754ca
                             tileWidth, tileHeight,
Packit Service 6754ca
                             levelMode,
Packit Service 6754ca
                             roundingMode);
Packit Service 6754ca
    if (verbose)
Packit Service 6754ca
        cout << "writing file " << outFileName << endl;
Packit Service 6754ca
Packit Service 6754ca
    //
Packit Service 6754ca
    // Generate the pixels for the various levels of the cube-face map,
Packit Service 6754ca
    // and store them in the file.  The pixels for the highest-resolution
Packit Service 6754ca
    // level are generated by resampling the original input image; for
Packit Service 6754ca
    // each of the other levels, the pixels are generated by resampling
Packit Service 6754ca
    // the previous level.
Packit Service 6754ca
    //
Packit Service 6754ca
Packit Service 6754ca
    EnvmapImage image2;
Packit Service 6754ca
    EnvmapImage *iptr1 = &image1;
Packit Service 6754ca
    EnvmapImage *iptr2 = &image2;
Packit Service 6754ca
    
Packit Service 6754ca
    for (int level = 0; level < out.numLevels(); ++level)
Packit Service 6754ca
    {
Packit Service 6754ca
        if (verbose)
Packit Service 6754ca
            cout << "level " << level << endl;
Packit Service 6754ca
Packit Service 6754ca
        Box2i dw = out.dataWindowForLevel (level);
Packit Service 6754ca
        resizeCube (*iptr1, *iptr2, dw, filterRadius, numSamples);
Packit Service 6754ca
Packit Service 6754ca
        out.setFrameBuffer (&iptr2->pixels()[0][0], 1, dw.max.x + 1);
Packit Service 6754ca
Packit Service 6754ca
        for (int tileY = 0; tileY < out.numYTiles (level); ++tileY)
Packit Service 6754ca
            for (int tileX = 0; tileX < out.numXTiles (level); ++tileX)
Packit Service 6754ca
                out.writeTile (tileX, tileY, level);
Packit Service 6754ca
Packit Service 6754ca
        swap (iptr1, iptr2);
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    if (verbose)
Packit Service 6754ca
        cout << "done." << endl;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
makeCubeMapSixFiles (EnvmapImage &image1,
Packit Service 6754ca
                     Header &header,
Packit Service 6754ca
                     RgbaChannels channels,
Packit Service 6754ca
                     const char outFileName[],
Packit Service 6754ca
                     int tileWidth,
Packit Service 6754ca
                     int tileHeight,
Packit Service 6754ca
                     Compression compression,
Packit Service 6754ca
                     int mapWidth,
Packit Service 6754ca
                     float filterRadius,
Packit Service 6754ca
                     int numSamples,
Packit Service 6754ca
                     bool verbose)
Packit Service 6754ca
{
Packit Service 6754ca
    static const char *faceNames[] =
Packit Service 6754ca
        {"+X", "-X", "+Y", "-Y", "+Z", "-Z"};
Packit Service 6754ca
Packit Service 6754ca
    size_t pos = strchr (outFileName, '%') - outFileName;
Packit Service 6754ca
Packit Service 6754ca
    int mapHeight = mapWidth * 6;
Packit Service 6754ca
    const Box2i dw (V2i (0, 0), V2i (mapWidth - 1, mapHeight - 1));
Packit Service 6754ca
    const Box2i faceDw (V2i (0, 0), V2i (mapWidth - 1, mapWidth - 1));
Packit Service 6754ca
Packit Service 6754ca
    EnvmapImage image2;
Packit Service 6754ca
    resizeCube (image1, image2, dw, filterRadius, numSamples);
Packit Service 6754ca
    const Rgba *pixels = &(image2.pixels())[0][0];
Packit Service 6754ca
Packit Service 6754ca
    for (int i = 0; i < 6; ++i)
Packit Service 6754ca
    {
Packit Service 6754ca
        string name = string (outFileName).replace (pos, 1, faceNames[i]);
Packit Service 6754ca
Packit Service 6754ca
        if (verbose)
Packit Service 6754ca
            cout << "writing file " << name << endl;
Packit Service 6754ca
Packit Service 6754ca
        TiledRgbaOutputFile out (name.c_str(),
Packit Service 6754ca
                                 tileWidth, tileHeight,
Packit Service 6754ca
                                 ONE_LEVEL, ROUND_DOWN,
Packit Service 6754ca
                                 faceDw,        // displayWindow
Packit Service 6754ca
                                 faceDw,        // dataWindow
Packit Service 6754ca
                                 channels,
Packit Service 6754ca
                                 1,             // pixelAspectRatio
Packit Service 6754ca
                                 V2f (0, 0),    // screenWindowCenter
Packit Service 6754ca
                                 1,             // screenWindowWidth
Packit Service 6754ca
                                 INCREASING_Y,  // lineOrder
Packit Service 6754ca
                                 compression);
Packit Service 6754ca
Packit Service 6754ca
        out.setFrameBuffer (pixels, 1, dw.max.x + 1);
Packit Service 6754ca
Packit Service 6754ca
        for (int tileY = 0; tileY < out.numYTiles(); ++tileY)
Packit Service 6754ca
            for (int tileX = 0; tileX < out.numXTiles(); ++tileX)
Packit Service 6754ca
                    out.writeTile (tileX, tileY);
Packit Service 6754ca
Packit Service 6754ca
        pixels += mapWidth * mapWidth;
Packit Service 6754ca
    }
Packit Service 6754ca
Packit Service 6754ca
    if (verbose)
Packit Service 6754ca
        cout << "done." << endl;
Packit Service 6754ca
}
Packit Service 6754ca
Packit Service 6754ca
} //namespace
Packit Service 6754ca
Packit Service 6754ca
Packit Service 6754ca
void
Packit Service 6754ca
makeCubeMap (EnvmapImage &image1,
Packit Service 6754ca
             Header &header,
Packit Service 6754ca
             RgbaChannels channels,
Packit Service 6754ca
             const char outFileName[],
Packit Service 6754ca
             int tileWidth,
Packit Service 6754ca
             int tileHeight,
Packit Service 6754ca
             LevelMode levelMode,
Packit Service 6754ca
             LevelRoundingMode roundingMode,
Packit Service 6754ca
             Compression compression,
Packit Service 6754ca
             int mapWidth,
Packit Service 6754ca
             float filterRadius,
Packit Service 6754ca
             int numSamples,
Packit Service 6754ca
             bool verbose)
Packit Service 6754ca
{
Packit Service 6754ca
    if (strchr (outFileName, '%'))
Packit Service 6754ca
    {
Packit Service 6754ca
        makeCubeMapSixFiles (image1,
Packit Service 6754ca
                             header,
Packit Service 6754ca
                             channels,
Packit Service 6754ca
                             outFileName,
Packit Service 6754ca
                             tileWidth,
Packit Service 6754ca
                             tileHeight,
Packit Service 6754ca
                             compression,
Packit Service 6754ca
                             mapWidth,
Packit Service 6754ca
                             filterRadius,
Packit Service 6754ca
                             numSamples,
Packit Service 6754ca
                             verbose);
Packit Service 6754ca
    }
Packit Service 6754ca
    else
Packit Service 6754ca
    {
Packit Service 6754ca
        makeCubeMapSingleFile (image1,
Packit Service 6754ca
                               header,
Packit Service 6754ca
                               channels,
Packit Service 6754ca
                               outFileName,
Packit Service 6754ca
                               tileWidth,
Packit Service 6754ca
                               tileHeight,
Packit Service 6754ca
                               levelMode,
Packit Service 6754ca
                               roundingMode,
Packit Service 6754ca
                               compression,
Packit Service 6754ca
                               mapWidth,
Packit Service 6754ca
                               filterRadius,
Packit Service 6754ca
                               numSamples,
Packit Service 6754ca
                               verbose);
Packit Service 6754ca
    }
Packit Service 6754ca
}