/* -*-c++-*- */ /* osgEarth - Geospatial SDK for OpenSceneGraph * Copyright 2020 Pelican Mapping * http://osgearth.org * * osgEarth is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #ifndef OSGEARTH_MODEL_SOURCE_H #define OSGEARTH_MODEL_SOURCE_H 1 #include #include #include #include #include #include #include #include #include namespace osgEarth { class Map; class ProgressCallback; /** * Configuration options for a models source. */ class OSGEARTH_EXPORT ModelSourceOptions : public DriverConfigOptions { public: ModelSourceOptions( const ConfigOptions& options =ConfigOptions() ); /** dtor */ virtual ~ModelSourceOptions(); public: // properties /** minimum camera range at which the data is visible */ optional& minRange() { return _minRange; } const optional& minRange() const { return _minRange; } /** maximum camera range at which the data is visible */ optional& maxRange() { return _maxRange; } const optional& maxRange() const { return _maxRange; } /** render bin order */ optional& renderOrder() { return _renderOrder; } const optional& renderOrder() const { return _renderOrder; } optional& renderBin() { return _renderBin; } const optional& renderBin() const { return _renderBin; } /** whether to read the depth buffer when rendering */ optional& depthTestEnabled() { return _depthTestEnabled; } const optional& depthTestEnabled() const { return _depthTestEnabled; } public: virtual Config getConfig() const; protected: virtual void mergeConfig( const Config& conf ); private: void fromConfig( const Config& conf ); optional _minRange, _maxRange; optional _renderOrder; optional _renderBin; optional _depthTestEnabled; optional _overlay; }; /** * A ModelSource is a plugin object that generates OSG nodes. */ class OSGEARTH_EXPORT ModelSource : public osg::Object, public Revisioned { public: ModelSource( const ModelSourceOptions& options =ModelSourceOptions() ); /** dtor */ virtual ~ModelSource(); /** * Opens the model source and returns a status. */ const Status& open(const osgDB::Options* readOptions); /** * Status after calling open. */ const Status& getStatus() const { return _status; } /** * Creates the top level node for this model source. */ osg::Node* createNode( const Map* map, ProgressCallback* progress ); /** * Access to the scene graph callbacks */ void setSceneGraphCallbacks(SceneGraphCallbacks* value) { _sgCallbacks = value; } SceneGraphCallbacks* getSceneGraphCallbacks() const { return _sgCallbacks.get(); } public: // META_Object specialization // these are neseccary to we can load ModelSource implementations as plugins virtual osg::Object* cloneType() const { return 0; } // cloneType() not appropriate virtual osg::Object* clone(const osg::CopyOp&) const { return 0; } // clone() not appropriate virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast(obj)!=NULL; } virtual const char* className() const { return "ModelSource"; } virtual const char* libraryName() const { return "osgEarth"; } public: /** Get the options used to create this model source */ const ModelSourceOptions& getOptions() const { return _options; } /** * Gets the list of areas with data for this ModelSource */ const DataExtentList& getDataExtents() const { return _dataExtents; } DataExtentList& getDataExtents() { return _dataExtents; } protected: /** * Perform one-time initialization and return the initial status. * This is called internally by open(). */ virtual Status initialize(const osgDB::Options* readOptions) =0; /** * Subclass implements this method to create a scene graph within the * context of the provided Map. */ virtual osg::Node* createNodeImplementation( const Map* map, ProgressCallback* progress ) =0; protected: /** Subclass can set the status with this */ void setStatus(const Status& value) { _status = value; } private: const ModelSourceOptions _options; optional _minRange; optional _maxRange; optional _renderOrder; DataExtentList _dataExtents; Status _status; osg::ref_ptr _sgCallbacks; friend class Map; friend class ModelSourceFactory; }; //-------------------------------------------------------------------- class OSGEARTH_EXPORT ModelSourceDriver : public osgDB::ReaderWriter { protected: const ModelSourceOptions& getModelSourceOptions( const osgDB::ReaderWriter::Options* rwOpt ) const; virtual ~ModelSourceDriver(); }; //-------------------------------------------------------------------- /** * Creates TileSource instances and chains them together to create * tile source "pipelines" for data access and processing. */ class OSGEARTH_EXPORT ModelSourceFactory { public: static ModelSource* create( const ModelSourceOptions& options ); virtual ~ModelSourceFactory(); }; } #endif // OSGEARTH_MODEL_SOURCE_H