Added new osgVolume::VolumeScene and osgVolume::MultipassTechnique class shells that will be filled out to provide multi-pass volume rendering that handles mixing of

3D meshes with volume rendering and segmentation of volumes via a user defined hull mesh.
This commit is contained in:
Robert Osfield
2013-11-21 18:17:44 +00:00
parent 1b269a7711
commit 5bea13c172
6 changed files with 330 additions and 3 deletions

View File

@@ -69,6 +69,8 @@
#include <osgVolume/VolumeTile>
#include <osgVolume/RayTracedTechnique>
#include <osgVolume/FixedFunctionTechnique>
#include <osgVolume/MultipassTechnique>
#include <osgVolume/VolumeScene>
enum ShadingModel
{
@@ -437,6 +439,9 @@ int main( int argc, char **argv )
arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information");
arguments.getApplicationUsage()->addCommandLineOption("--images [filenames]","Specify a stack of 2d images to build the 3d volume from.");
arguments.getApplicationUsage()->addCommandLineOption("--shader","Use OpenGL Shading Language. (default)");
arguments.getApplicationUsage()->addCommandLineOption("--multi-pass","Use MultipassTechnique to render volumes.");
arguments.getApplicationUsage()->addCommandLineOption("--model","load 3D model and insert into the scene along with the volume.");
arguments.getApplicationUsage()->addCommandLineOption("--hull","load 3D hull that defines the extents of the region to volume render.");
arguments.getApplicationUsage()->addCommandLineOption("--no-shader","Disable use of OpenGL Shading Language.");
arguments.getApplicationUsage()->addCommandLineOption("--gpu-tf","Aply the transfer function on the GPU. (default)");
arguments.getApplicationUsage()->addCommandLineOption("--cpu-tf","Apply the transfer function on the CPU.");
@@ -618,11 +623,36 @@ int main( int argc, char **argv )
bool useManipulator = false;
while(arguments.read("--manipulator") || arguments.read("-m")) { useManipulator = true; }
bool useShader = true;
while(arguments.read("--shader")) { useShader = true; }
while(arguments.read("--no-shader")) { useShader = false; }
bool useMultipass = false;
while(arguments.read("--multi-pass")) useMultipass = true;
std::string filename;
osg::ref_ptr<osg::Group> models;
while(arguments.read("--model",filename))
{
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile(filename);
if (model.valid())
{
if (!models) models = new osg::Group;
models->addChild(model.get());
}
}
osg::ref_ptr<osg::Group> hulls;
while(arguments.read("--hull",filename))
{
osg::ref_ptr<osg::Node> hull = osgDB::readNodeFile(filename);
if (hull.valid())
{
if (!hulls) hulls = new osg::Group;
hulls->addChild(hull.get());
}
}
bool gpuTransferFunction = true;
while(arguments.read("--gpu-tf")) { gpuTransferFunction = true; }
while(arguments.read("--cpu-tf")) { gpuTransferFunction = false; }
@@ -1098,7 +1128,14 @@ int main( int argc, char **argv )
layer->addProperty(sp);
tile->setVolumeTechnique(new osgVolume::RayTracedTechnique);
if (useMultipass)
{
tile->setVolumeTechnique(new osgVolume::MultipassTechnique);
}
else
{
tile->setVolumeTechnique(new osgVolume::RayTracedTechnique);
}
}
else
{
@@ -1165,6 +1202,28 @@ int main( int argc, char **argv )
loadedModel = group;
}
if (hulls.get())
{
tile->addChild(hulls.get());
}
// add add models into the scene alongside the volume
if (models.get())
{
osg::ref_ptr<osg::Group> group = new osg::Group;
group->addChild(models.get());
group->addChild(loadedModel.get());
loadedModel = group.get();
}
// if we want to do multi-pass volume rendering we need decorate the whole scene with a VolumeScene node.
if (useMultipass)
{
osg::ref_ptr<osgVolume::VolumeScene> volumeScene = new osgVolume::VolumeScene;
volumeScene->addChild(loadedModel.get());
loadedModel = volumeScene.get();
}
// set the scene to render
viewer.setSceneData(loadedModel.get());

View File

@@ -0,0 +1,60 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGVOLUME_MULTIPASSTECHNIQUE
#define OSGVOLUME_MULTIPASSTECHNIQUE 1
#include <osgVolume/VolumeTechnique>
#include <osg/MatrixTransform>
namespace osgVolume {
class OSGVOLUME_EXPORT MultipassTechnique : public VolumeTechnique
{
public:
MultipassTechnique();
MultipassTechnique(const MultipassTechnique&,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
META_Object(osgVolume, MultipassTechnique);
virtual void init();
virtual void update(osgUtil::UpdateVisitor* nv);
virtual void cull(osgUtil::CullVisitor* nv);
/** Clean scene graph from any terrain technique specific nodes.*/
virtual void cleanSceneGraph();
/** Traverse the terrain subgraph.*/
virtual void traverse(osg::NodeVisitor& nv);
protected:
virtual ~MultipassTechnique();
osg::ref_ptr<osg::MatrixTransform> _transform;
typedef std::map<osgUtil::CullVisitor::Identifier*, osg::Matrix> ModelViewMatrixMap;
OpenThreads::Mutex _mutex;
ModelViewMatrixMap _modelViewMatrixMap;
osg::ref_ptr<osg::StateSet> _whenMovingStateSet;
};
}
#endif

View File

@@ -0,0 +1,44 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGVOLUMESCENE
#define OSGVOLUMESCENE 1
#include <osg/Group>
#include <osgVolume/Export>
namespace osgVolume {
/** VolumeScene provides high level support for doing multi-pass rendering of volumes where the main scene to rendered to color and depth textures and then re-rendered for the purposes of volume rendering.*/
class OSGVOLUME_EXPORT VolumeScene : public osg::Group
{
public:
VolumeScene();
/** Copy constructor using CopyOp to manage deep vs shallow copy.*/
VolumeScene(const VolumeScene&,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY);
META_Node(osgVolume, VolumeScene);
virtual void traverse(osg::NodeVisitor& nv);
protected:
virtual ~VolumeScene();
};
}
#endif

View File

@@ -12,10 +12,12 @@ SET(TARGET_H
${HEADER_PATH}/FixedFunctionTechnique
${HEADER_PATH}/Layer
${HEADER_PATH}/Locator
${HEADER_PATH}/MultipassTechnique
${HEADER_PATH}/Property
${HEADER_PATH}/RayTracedTechnique
${HEADER_PATH}/Version
${HEADER_PATH}/Volume
${HEADER_PATH}/VolumeScene
${HEADER_PATH}/VolumeTechnique
${HEADER_PATH}/VolumeTile
)
@@ -25,17 +27,19 @@ SET(TARGET_SRC
FixedFunctionTechnique.cpp
Layer.cpp
Locator.cpp
MultipassTechnique.cpp
Property.cpp
RayTracedTechnique.cpp
Version.cpp
Volume.cpp
VolumeScene.cpp
VolumeTechnique.cpp
VolumeTile.cpp
${OPENSCENEGRAPH_VERSIONINFO_RC}
)
SET(TARGET_LIBRARIES
SET(TARGET_LIBRARIES
osgUtil
osgDB
osgGA

View File

@@ -0,0 +1,124 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#include <osgVolume/MultipassTechnique>
#include <osgVolume/VolumeTile>
#include <osg/Geometry>
#include <osg/io_utils>
#include <osg/Program>
#include <osg/TexGen>
#include <osg/Texture1D>
#include <osg/Texture2D>
#include <osg/Texture3D>
#include <osg/TransferFunction>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
namespace osgVolume
{
MultipassTechnique::MultipassTechnique()
{
}
MultipassTechnique::MultipassTechnique(const MultipassTechnique& fft,const osg::CopyOp& copyop):
VolumeTechnique(fft,copyop)
{
}
MultipassTechnique::~MultipassTechnique()
{
}
void MultipassTechnique::init()
{
OSG_INFO<<"MultipassTechnique::init()"<<std::endl;
if (!_volumeTile)
{
OSG_NOTICE<<"MultipassTechnique::init(), error no volume tile assigned."<<std::endl;
return;
}
if (_volumeTile->getLayer()==0)
{
OSG_NOTICE<<"MultipassTechnique::init(), error no layer assigend to volume tile."<<std::endl;
return;
}
if (_volumeTile->getLayer()->getImage()==0)
{
OSG_NOTICE<<"MultipassTechnique::init(), error no image assigned to layer."<<std::endl;
return;
}
OSG_NOTICE<<"MultipassTechnique::init() Need to set up"<<std::endl;
}
void MultipassTechnique::update(osgUtil::UpdateVisitor* /*uv*/)
{
// OSG_NOTICE<<"MultipassTechnique:update(osgUtil::UpdateVisitor* nv):"<<std::endl;
}
void MultipassTechnique::cull(osgUtil::CullVisitor* cv)
{
OSG_NOTICE<<"MultipassTechnique::cull() Need to set up"<<std::endl;
}
void MultipassTechnique::cleanSceneGraph()
{
OSG_NOTICE<<"MultipassTechnique::cleanSceneGraph()"<<std::endl;
}
void MultipassTechnique::traverse(osg::NodeVisitor& nv)
{
// OSG_NOTICE<<"MultipassTechnique::traverse(osg::NodeVisitor& nv)"<<std::endl;
if (!_volumeTile) return;
// if app traversal update the frame count.
if (nv.getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR)
{
if (_volumeTile->getDirty()) _volumeTile->init();
osgUtil::UpdateVisitor* uv = dynamic_cast<osgUtil::UpdateVisitor*>(&nv);
if (uv)
{
update(uv);
return;
}
}
else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR)
{
osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(&nv);
if (cv)
{
cull(cv);
return;
}
}
if (_volumeTile->getDirty())
{
OSG_INFO<<"******* Doing init ***********"<<std::endl;
_volumeTile->init();
}
}
} // end of osgVolume namespace

View File

@@ -0,0 +1,36 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#include <osgVolume/VolumeScene>
#include <OpenThreads/ScopedLock>
using namespace osgVolume;
VolumeScene::VolumeScene()
{
}
VolumeScene::VolumeScene(const VolumeScene& vs, const osg::CopyOp& copyop):
osg::Group(vs,copyop)
{
}
VolumeScene::~VolumeScene()
{
}
void VolumeScene::traverse(osg::NodeVisitor& nv)
{
Group::traverse(nv);
}