From 61ce7dd5ac6e0e9bd526e223b014230f36f81a8a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 1 Oct 2006 19:09:00 +0000 Subject: [PATCH] From Brede Johansen, "I have added "billboardCenter" as a reader option to use the center of a billboard as the pivot point." --- src/osgPlugins/OpenFlight/Document.cpp | 3 +++ src/osgPlugins/OpenFlight/Document.h | 3 +++ src/osgPlugins/OpenFlight/GeometryRecords.cpp | 24 ++++++++++++++++++- src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp | 7 ++++-- src/osgPlugins/OpenFlight/Record.h | 2 ++ 5 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/osgPlugins/OpenFlight/Document.cpp b/src/osgPlugins/OpenFlight/Document.cpp index 5742acd1e..8fe7fb188 100644 --- a/src/osgPlugins/OpenFlight/Document.cpp +++ b/src/osgPlugins/OpenFlight/Document.cpp @@ -14,6 +14,7 @@ Document::Document() : _preserveObject(false), _defaultDOFAnimationState(false), _useTextureAlphaForTransparancyBinning(true), + _useBillboardCenter(false), _doUnitsConversion(true), _desiredUnits(METERS), _done(false), @@ -38,12 +39,14 @@ Document::~Document() void Document::pushLevel() { _levelStack.push_back(_currentPrimaryRecord.get()); + _levelStack.back()->pushLevel(*this); _level++; } void Document::popLevel() { + _levelStack.back()->popLevel(*this); _levelStack.pop_back(); if (!_levelStack.empty()) diff --git a/src/osgPlugins/OpenFlight/Document.h b/src/osgPlugins/OpenFlight/Document.h index db38c0684..ac849c71f 100644 --- a/src/osgPlugins/OpenFlight/Document.h +++ b/src/osgPlugins/OpenFlight/Document.h @@ -150,6 +150,8 @@ class Document bool getDefaultDOFAnimationState() const { return _defaultDOFAnimationState; } void setUseTextureAlphaForTransparancyBinning(bool flag) { _useTextureAlphaForTransparancyBinning=flag; } bool getUseTextureAlphaForTransparancyBinning() const { return _useTextureAlphaForTransparancyBinning; } + void setUseBillboardCenter(bool flag) { _useBillboardCenter=flag; } + bool getUseBillboardCenter() const { return _useBillboardCenter; } void setDoUnitsConversion(bool flag) { _doUnitsConversion=flag; } bool getDoUnitsConversion() const { return _doUnitsConversion; } void setDesiredUnits(CoordUnits units ) { _desiredUnits=units; } @@ -166,6 +168,7 @@ class Document bool _preserveObject; bool _defaultDOFAnimationState; bool _useTextureAlphaForTransparancyBinning; + bool _useBillboardCenter; bool _doUnitsConversion; CoordUnits _desiredUnits; diff --git a/src/osgPlugins/OpenFlight/GeometryRecords.cpp b/src/osgPlugins/OpenFlight/GeometryRecords.cpp index 41d356c41..802ad8463 100644 --- a/src/osgPlugins/OpenFlight/GeometryRecords.cpp +++ b/src/osgPlugins/OpenFlight/GeometryRecords.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "Registry.h" #include "Document.h" #include "RecordInputStream.h" @@ -416,7 +417,7 @@ protected: return osg::PrimitiveSet::POLYGON; } - virtual ~Face() + virtual void popLevel(Document& document) { if (_geode.valid()) { @@ -464,6 +465,27 @@ protected: } } } + + if (document.getUseBillboardCenter()) + { + // Set billboard rotation point to center of face. + osg::Billboard* billboard = dynamic_cast(_geode.get()); + if (billboard) + { + for (unsigned int i=0; igetNumDrawables(); ++i) + { + osg::BoundingBox bb = billboard->getDrawable(i)->getBound(); + billboard->setPosition(i,bb.center()); + + osgUtil::TransformAttributeFunctor tf(osg::Matrix::translate(-bb.center())); + billboard->getDrawable(i)->accept(tf); + + billboard->getDrawable(i)->dirtyBound(); + } + + billboard->dirtyBound(); + } + } } } }; diff --git a/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp b/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp index 11196f18a..bb26365e0 100644 --- a/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp +++ b/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp @@ -171,11 +171,14 @@ class FLTReaderWriter : public ReaderWriter document.setDefaultDOFAnimationState((options->getOptionString().find("dofAnimation")!=std::string::npos)); osg::notify(osg::DEBUG_INFO) << readerMsg << "dofAnimation=" << document.getDefaultDOFAnimationState() << std::endl; + document.setUseBillboardCenter((options->getOptionString().find("billboardCenter")!=std::string::npos)); + osg::notify(osg::DEBUG_INFO) << readerMsg << "billboardCenter=" << document.getUseBillboardCenter() << std::endl; + document.setUseTextureAlphaForTransparancyBinning(options->getOptionString().find("noTextureAlphaForTransparancyBinning")==std::string::npos); - osg::notify(osg::DEBUG_INFO) << readerMsg << "noTextureAlphaForTransparancyBinning=" << document.getUseTextureAlphaForTransparancyBinning() << std::endl; + osg::notify(osg::DEBUG_INFO) << readerMsg << "noTextureAlphaForTransparancyBinning=" << !document.getUseTextureAlphaForTransparancyBinning() << std::endl; document.setDoUnitsConversion((options->getOptionString().find("noUnitsConversion")==std::string::npos)); // default to true, unless noUnitsConversion is specified. - osg::notify(osg::DEBUG_INFO) << readerMsg << "noUnitsConversion=" << document.getDoUnitsConversion() << std::endl; + osg::notify(osg::DEBUG_INFO) << readerMsg << "noUnitsConversion=" << !document.getDoUnitsConversion() << std::endl; if (document.getDoUnitsConversion()) { diff --git a/src/osgPlugins/OpenFlight/Record.h b/src/osgPlugins/OpenFlight/Record.h index a798cf643..c49595c8f 100644 --- a/src/osgPlugins/OpenFlight/Record.h +++ b/src/osgPlugins/OpenFlight/Record.h @@ -64,6 +64,8 @@ public: PrimaryRecord(); virtual void read(RecordInputStream& in, Document& document); + virtual void pushLevel(Document& /*document*/) {} + virtual void popLevel(Document& /*document*/) {} // Ancillary operations virtual void setID(const std::string& /*id*/) {}