Show
Ignore:
Timestamp:
09/29/08 12:56:42 (6 years ago)
Author:
robert
Message:

Added support for using ImageSequence? to animate volumes

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgvolume/osgvolume.cpp

    r8953 r8954  
    2222#include <osg/Texture3D> 
    2323#include <osg/Texture1D> 
     24#include <osg/ImageSequence> 
    2425#include <osg/TexGen> 
    2526#include <osg/Geode> 
     
    4546 
    4647#include <osgGA/EventVisitor> 
     48#include <osgGA/TrackballManipulator> 
     49#include <osgGA/FlightManipulator> 
     50#include <osgGA/KeySwitchMatrixManipulator> 
    4751 
    4852#include <osgUtil/CullVisitor> 
     
    17871791    viewer.addEventHandler(new osgViewer::WindowSizeHandler); 
    17881792         
     1793    { 
     1794        osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator; 
     1795 
     1796        keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() ); 
     1797        keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() ); 
     1798 
     1799        viewer.setCameraManipulator( keyswitchManipulator.get() ); 
     1800    } 
     1801 
    17891802    // add the stats handler 
    17901803    viewer.addEventHandler(new osgViewer::StatsHandler); 
     
    18971910    while(arguments.read("--cpu-tf")) { gpuTransferFunction = false; } 
    18981911 
    1899     osg::ref_ptr<osg::Image> image_3d; 
    1900      
     1912    typedef std::list< osg::ref_ptr<osg::Image> > Images; 
     1913    Images images; 
     1914 
     1915 
    19011916    std::string vh_filename; 
    19021917    while (arguments.read("--vh", vh_filename))  
     
    19191934        if (!raw_filename.empty()) 
    19201935        { 
    1921             image_3d = readRaw(xdim, ydim, zdim, 1, 1, "little", raw_filename); 
     1936            images.push_back(readRaw(xdim, ydim, zdim, 1, 1, "little", raw_filename)); 
    19221937        } 
    19231938         
     
    19601975    while (arguments.read("--raw", sizeX, sizeY, sizeZ, numberBytesPerComponent, numberOfComponents, endian, raw_filename))  
    19611976    { 
    1962         image_3d = readRaw(sizeX, sizeY, sizeZ, numberBytesPerComponent, numberOfComponents, endian, raw_filename); 
     1977        images.push_back(readRaw(sizeX, sizeY, sizeZ, numberBytesPerComponent, numberOfComponents, endian, raw_filename)); 
    19631978    } 
    19641979 
     
    19791994        // pack the textures into a single texture. 
    19801995        ProcessRow processRow; 
    1981         image_3d = createTexture3D(imageList, processRow, numComponentsDesired, s_maximumTextureSize, t_maximumTextureSize, r_maximumTextureSize, resizeToPowerOfTwo); 
     1996        images.push_back(createTexture3D(imageList, processRow, numComponentsDesired, s_maximumTextureSize, t_maximumTextureSize, r_maximumTextureSize, resizeToPowerOfTwo)); 
    19821997    } 
    19831998 
     
    19922007        return 1; 
    19932008    } 
     2009     
    19942010 
    19952011    // assume remaining arguments are file names of textures. 
    1996     for(int pos=1;pos<arguments.argc() && !image_3d;++pos) 
     2012    for(int pos=1;pos<arguments.argc();++pos) 
    19972013    { 
    19982014        if (!arguments.isOption(pos)) 
     
    20012017            if (osgDB::getLowerCaseFileExtension(filename)=="dicom") 
    20022018            { 
    2003                 image_3d = osgDB::readImageFile( filename ); 
     2019                images.push_back(osgDB::readImageFile( filename )); 
    20042020            } 
    20052021            else 
     
    20382054                    // pack the textures into a single texture. 
    20392055                    ProcessRow processRow; 
    2040                     image_3d = createTexture3D(imageList, processRow, numComponentsDesired, s_maximumTextureSize, t_maximumTextureSize, r_maximumTextureSize, resizeToPowerOfTwo); 
     2056                    images.push_back(createTexture3D(imageList, processRow, numComponentsDesired, s_maximumTextureSize, t_maximumTextureSize, r_maximumTextureSize, resizeToPowerOfTwo)); 
    20412057 
    20422058                } 
     
    20442060                { 
    20452061                    // not an option so assume string is a filename. 
    2046                     image_3d = osgDB::readImageFile( filename ); 
     2062                    images.push_back(osgDB::readImageFile( filename )); 
    20472063                } 
    20482064                else 
     
    20552071    } 
    20562072     
    2057     if (!image_3d)  
     2073    if (images.empty())  
    20582074    { 
    20592075        std::cout<<"No model loaded, please specify and volumetric image file on the command line."<<std::endl; 
    20602076        return 1; 
    20612077    } 
     2078 
     2079 
     2080    Images::iterator sizeItr = images.begin(); 
     2081    xSize = (*sizeItr)->s(); 
     2082    ySize = (*sizeItr)->t(); 
     2083    zSize = (*sizeItr)->r(); 
     2084    ++sizeItr; 
     2085    for(;sizeItr != images.end(); ++sizeItr) 
     2086    { 
     2087        if ((*sizeItr)->s() != xSize ||  
     2088            (*sizeItr)->t() != ySize || 
     2089            (*sizeItr)->r() != zSize) 
     2090        { 
     2091            std::cout<<"Images in sequence are not of the same dimensions."<<std::endl; 
     2092            return 1; 
     2093        } 
     2094    } 
     2095 
    20622096 
    20632097#if 0 
     
    20712105    } 
    20722106#else 
    2073         xSize = image_3d->s(); 
    2074         ySize = image_3d->t(); 
    2075         zSize = image_3d->r(); 
    20762107#endif 
    20772108 
    20782109 
    20792110    osg::Vec4 minValue, maxValue; 
    2080     if (osgVolume::computeMinMax(image_3d.get(), minValue, maxValue)); 
     2111    bool computeMinMax = false; 
     2112    for(Images::iterator itr = images.begin(); 
     2113        itr != images.end(); 
     2114        ++itr) 
     2115    { 
     2116        if (osgVolume::computeMinMax(itr->get(), minValue, maxValue)) computeMinMax = true; 
     2117    } 
     2118     
     2119     
     2120    if (computeMinMax) 
    20812121    { 
    20822122        osg::notify(osg::NOTICE)<<"Min value "<<minValue<<std::endl; 
     
    20962136        float offset = -minComponent * scale; 
    20972137 
    2098         osgVolume::offsetAndScaleImage(image_3d.get(),  
    2099             osg::Vec4(offset, offset, offset, offset), 
    2100             osg::Vec4(scale, scale, scale, scale)); 
    2101  
    2102     } 
    2103  
    2104 #if 0 
    2105     osg::Vec4 newMinValue, newMaxValue; 
    2106     if (osgVolume::computeMinMax(image_3d.get(), newMinValue, newMaxValue)); 
    2107     { 
    2108         osg::notify(osg::NOTICE)<<"After min value "<<newMinValue<<std::endl; 
    2109         osg::notify(osg::NOTICE)<<"After max value "<<newMaxValue<<std::endl; 
    2110  
    2111     } 
    2112 #endif 
     2138 
     2139        for(Images::iterator itr = images.begin(); 
     2140            itr != images.end(); 
     2141            ++itr) 
     2142        {         
     2143            osgVolume::offsetAndScaleImage(itr->get(),  
     2144                osg::Vec4(offset, offset, offset, offset), 
     2145                osg::Vec4(scale, scale, scale, scale)); 
     2146        } 
     2147    } 
     2148 
    21132149     
    21142150    if (colourSpaceOperation!=NO_COLOUR_SPACE_OPERATION) 
    21152151    { 
    2116         doColourSpaceConversion(colourSpaceOperation, image_3d.get(), colourModulate); 
     2152        for(Images::iterator itr = images.begin(); 
     2153            itr != images.end(); 
     2154            ++itr) 
     2155        {         
     2156            doColourSpaceConversion(colourSpaceOperation, itr->get(), colourModulate); 
     2157        } 
    21172158    } 
    21182159     
    21192160    if (!gpuTransferFunction && transferFunction.valid()) 
    21202161    { 
    2121         image_3d = applyTransferFunction(image_3d.get(), transferFunction.get()); 
    2122     } 
    2123      
    2124     osg::ref_ptr<osg::Image> normalmap_3d = createNormalMap ? createNormalMapTexture(image_3d.get()) : 0; 
    2125  
    2126  
    2127      
     2162        for(Images::iterator itr = images.begin(); 
     2163            itr != images.end(); 
     2164            ++itr) 
     2165        {         
     2166            *itr = applyTransferFunction(itr->get(), transferFunction.get()); 
     2167        } 
     2168    } 
     2169     
     2170    osg::ref_ptr<osg::Image> image_3d = 0; 
     2171 
     2172    if (images.size()==1) 
     2173    { 
     2174        osg::notify(osg::NOTICE)<<"Single image "<<images.size()<<" volumes."<<std::endl; 
     2175        image_3d = images.front(); 
     2176    } 
     2177    else 
     2178    { 
     2179        osg::notify(osg::NOTICE)<<"Creating sequence of "<<images.size()<<" volumes."<<std::endl; 
     2180     
     2181        osg::ref_ptr<osg::ImageSequence> imageSequence = new osg::ImageSequence; 
     2182        image_3d = imageSequence.get(); 
     2183        for(Images::iterator itr = images.begin(); 
     2184            itr != images.end(); 
     2185            ++itr) 
     2186        {         
     2187            imageSequence->addImage(itr->get()); 
     2188        } 
     2189        imageSequence->play(); 
     2190    } 
     2191     
     2192    osg::ref_ptr<osg::Image> normalmap_3d = 0; 
     2193    if (createNormalMap) 
     2194    { 
     2195        if (images.size()==1) 
     2196        { 
     2197            normalmap_3d = createNormalMapTexture(images.front().get()); 
     2198        } 
     2199        else 
     2200        { 
     2201            osg::ref_ptr<osg::ImageSequence> normalmapSequence = new osg::ImageSequence; 
     2202            normalmap_3d = normalmapSequence.get(); 
     2203            for(Images::iterator itr = images.begin(); 
     2204                itr != images.end(); 
     2205                ++itr) 
     2206            {         
     2207                normalmapSequence->addImage(createNormalMapTexture(itr->get())); 
     2208            } 
     2209            normalmapSequence->play(); 
     2210        } 
     2211    } 
     2212 
    21282213    // create a model from the images. 
    21292214    osg::Node* rootNode = 0;