From ed724a730e35c8f2d5567aab674180cb3d524cd1 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 17 Mar 2014 15:54:52 +0000 Subject: [PATCH] Added support for animating volume hulls. --- .../deprecated/SlideShowConstructor | 3 + src/osgPlugins/p3d/ReaderWriterP3D.cpp | 9 +-- .../deprecated/SlideShowConstructor.cpp | 66 +++++++++---------- src/osgVolume/MultipassTechnique.cpp | 12 +++- 4 files changed, 46 insertions(+), 44 deletions(-) diff --git a/include/osgPresentation/deprecated/SlideShowConstructor b/include/osgPresentation/deprecated/SlideShowConstructor index b5c49cccd..02afad5d3 100644 --- a/include/osgPresentation/deprecated/SlideShowConstructor +++ b/include/osgPresentation/deprecated/SlideShowConstructor @@ -312,6 +312,8 @@ public: colorModulate(1.0f,1.0f,1.0f,1.0f), technique(RayTraced) { + hullPositionData.position = osg::Vec3(0.0,0.0,0.0); + hullPositionData.frame = osgPresentation::SlideShowConstructor::MODEL; } std::string options; @@ -557,6 +559,7 @@ protected: } osg::Node* decorateSubgraphForPosition(osg::Node* node, PositionData& positionData); + osg::Node* decorateSubgraphForPositionAndAnimation(osg::Node* node, const PositionData& positionData); osg::ref_ptr _options; diff --git a/src/osgPlugins/p3d/ReaderWriterP3D.cpp b/src/osgPlugins/p3d/ReaderWriterP3D.cpp index 5def0dc23..69dab8dff 100644 --- a/src/osgPlugins/p3d/ReaderWriterP3D.cpp +++ b/src/osgPlugins/p3d/ReaderWriterP3D.cpp @@ -1423,15 +1423,8 @@ void ReaderWriterP3DXML::parseVolume(osgPresentation::SlideShowConstructor& cons osgDB::XmlNode* child = itr->get(); if (match(child->name,"hull")) { - osgPresentation::SlideShowConstructor::PositionData hullPositionData; - hullPositionData.position = osg::Vec3(0.0,0.0,0.0); volumeData.hull = child->contents; - - if (getProperties(child,hullPositionData)) - { - volumeData.hullPositionData = hullPositionData; - } - + getProperties(child, volumeData.hullPositionData); } } diff --git a/src/osgPresentation/deprecated/SlideShowConstructor.cpp b/src/osgPresentation/deprecated/SlideShowConstructor.cpp index ae2749ecd..56baf0ff6 100644 --- a/src/osgPresentation/deprecated/SlideShowConstructor.cpp +++ b/src/osgPresentation/deprecated/SlideShowConstructor.cpp @@ -2134,21 +2134,12 @@ void SlideShowConstructor::addModel(const std::string& filename, const PositionD } -void SlideShowConstructor::addModel(osg::Node* subgraph, const PositionData& positionData, const ModelData& modelData, const ScriptData& scriptData) +osg::Node* SlideShowConstructor::decorateSubgraphForPositionAndAnimation(osg::Node* node, const PositionData& positionData) { + osg::Node* subgraph = node; osg::Object::DataVariance defaultMatrixDataVariance = osg::Object::DYNAMIC; // STATIC - if (!modelData.effect.empty()) - { - if (modelData.effect=="SpecularHighlights" || modelData.effect=="glossy") - { - osgFX::SpecularHighlights* specularHighlights = new osgFX::SpecularHighlights; - specularHighlights->setTextureUnit(1); - specularHighlights->addChild(subgraph); - subgraph = specularHighlights; - } - } - + OSG_INFO<<"SlideShowConstructor::decorateSubgraphForPositionAndAnimation() "<getBound().radius() * referenceSizeRatio; - - // attach any meterial animation. - if (positionData.requiresMaterialAnimation()) - subgraph = attachMaterialAnimation(subgraph,positionData); - // attached any rotation if (positionData.rotation[0]!=0.0) { @@ -2299,6 +2285,32 @@ void SlideShowConstructor::addModel(osg::Node* subgraph, const PositionData& pos subgraph = animation_transform; } + return subgraph; +} + + +void SlideShowConstructor::addModel(osg::Node* subgraph, const PositionData& positionData, const ModelData& modelData, const ScriptData& scriptData) +{ + if (!modelData.effect.empty()) + { + if (modelData.effect=="SpecularHighlights" || modelData.effect=="glossy") + { + osgFX::SpecularHighlights* specularHighlights = new osgFX::SpecularHighlights; + specularHighlights->setTextureUnit(1); + specularHighlights->addChild(subgraph); + subgraph = specularHighlights; + } + } + + + + // attach any meterial animation. + if (positionData.requiresMaterialAnimation()) + subgraph = attachMaterialAnimation(subgraph,positionData); + + + subgraph = decorateSubgraphForPositionAndAnimation(subgraph, positionData); + findImageStreamsAndAddCallbacks(subgraph); addToCurrentLayer(subgraph); @@ -2847,27 +2859,13 @@ void SlideShowConstructor::addVolume(const std::string& filename, const Position } } -// if (!volumeData.hull.empty()) + if (!volumeData.hull.empty()) { osg::ref_ptr hull = osgDB::readNodeFile(volumeData.hull, _options.get()); if (hull.valid()) { - if (volumeData.hullPositionData.position!=osg::Vec3(0.0f,0.0f,0.0f) || volumeData.hullPositionData.requiresScale() || volumeData.hullPositionData.requiresRotate()) - { - osg::Matrix matrix(osg::Matrix::scale(1.0f/volumeData.hullPositionData.scale.x(),1.0f/volumeData.hullPositionData.scale.y(),1.0f/volumeData.hullPositionData.scale.z())* - osg::Matrix::rotate(osg::DegreesToRadians(volumeData.hullPositionData.rotate[0]),volumeData.hullPositionData.rotate[1],volumeData.hullPositionData.rotate[2],volumeData.hullPositionData.rotate[3])* - osg::Matrix::translate(volumeData.hullPositionData.position)); - - osg::ref_ptr transform = new osg::MatrixTransform; - transform->setMatrix(osg::Matrix::inverse(matrix)); - - transform->addChild(hull.get()); - tile->addChild(transform.get()); - } - else - { - tile->addChild(hull.get()); - } + hull = decorateSubgraphForPositionAndAnimation(hull.get(), volumeData.hullPositionData); + tile->addChild(hull.get()); } } diff --git a/src/osgVolume/MultipassTechnique.cpp b/src/osgVolume/MultipassTechnique.cpp index 875752d24..ac6cc9346 100644 --- a/src/osgVolume/MultipassTechnique.cpp +++ b/src/osgVolume/MultipassTechnique.cpp @@ -626,9 +626,17 @@ void MultipassTechnique::init() } -void MultipassTechnique::update(osgUtil::UpdateVisitor* /*uv*/) +void MultipassTechnique::update(osgUtil::UpdateVisitor* uv) { -// OSG_NOTICE<<"MultipassTechnique:update(osgUtil::UpdateVisitor* nv):"<getNumChildren()>0) + { + getVolumeTile()->osg::Group::traverse(*uv); + } + else + { + _transform->accept(*uv); + } } void MultipassTechnique::backfaceSubgraphCullTraversal(osgUtil::CullVisitor* cv)