DYT/Tool/OpenSceneGraph-3.6.5/include/osgEarth/ResourceLibrary

151 lines
5.0 KiB
Plaintext
Raw Permalink Normal View History

2024-12-24 23:49:36 +00:00
/* -*-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 <http://www.gnu.org/licenses/>
*/
#ifndef OSGEARTHSYMBOLOGY_RESOURCE_LIBRARY_H
#define OSGEARTHSYMBOLOGY_RESOURCE_LIBRARY_H 1
#include <osgEarth/Common>
#include <osgEarth/Skins>
#include <osgEarth/InstanceResource>
#include <osgEarth/ModelResource>
#include <osgEarth/ModelSymbol>
#include <osgEarth/Threading>
#include <osgEarth/Random>
#include <map>
namespace osgEarth { namespace Util
{
/**
* ResourceLibrary manages a collection of external resources that a
* build system can use the construct geometries.
*/
class OSGEARTH_EXPORT ResourceLibrary : public osg::Referenced
{
public:
/**
* Creates a new resource library with a source URI. The library
* will populate upon first use..
*/
ResourceLibrary(
const std::string& name,
const URI& uri);
/**
* Creates a new resource library from a config.
*/
ResourceLibrary( const Config& conf );
/** dtor */
virtual ~ResourceLibrary() { }
/**
* Initialize the catalog by loading its contents into memory
*/
bool initialize( const osgDB::Options* options );
/**
* Gets the name of the lib.
*/
const std::string& getName() const { return _name; }
void setName(const std::string& name) { _name = name; }
/**
* Adds a resource to the library.
*/
void addResource( Resource* resource );
/**
* Removes a resource from the library.
*/
void removeResource( Resource* resource );
public: // Skin resource functions
/**
* Finds and returns a Skin resource by name.
*/
SkinResource* getSkin( const std::string& name, const osgDB::Options* dbOptions =0L ) const;
/**
* Returns a list of all Skin resources.
*/
void getSkins( SkinResourceVector& output, const osgDB::Options* dbOptions =0L ) const;
/**
* Returns a list of all Skin resources that match the criteria specified
* in the symbol.
*/
void getSkins( const SkinSymbol* symbol, SkinResourceVector& output, const osgDB::Options* dbOptions =0L ) const;
/**
* Returns a skin that matches the criteria specified in the symbol. The method
* will randomly select a suitable skin if there are more than one match.
*/
SkinResource* getSkin( const SkinSymbol* symbol, unsigned int rand, const osgDB::Options* dbOptions =0L ) const;
public: // Instance functions
/**
* Finds an instance-resource by name.
*/
InstanceResource* getInstance( const std::string& name, const osgDB::Options* dbOptions =0L ) const;
ModelResource* getModel( const ModelSymbol* ms, const osgDB::Options* dbOptions =0L ) const;
/**
* Returns a list of all Model resources.
*/
void getModels( ModelResourceVector& output, const osgDB::Options* dbOptions =0L ) const;
/**
* Returns a list of models that match the input symbol.
*/
void getModels(const ModelSymbol* ms, ModelResourceVector& output, const osgDB::Options* dbOptions =0L) const;
public: // serialization functions
void mergeConfig( const Config& conf );
Config getConfig() const;
optional<URI>& uri() { return _uri; }
const optional<URI>& uri() const { return _uri; }
protected:
// NB: this must be a std::map (not an unordered_map) because the selection
// logic iterates over the collection, and the iteration order needs to be
// constant across implementations (platforms).
template<typename T> struct ResourceMap : public std::map<std::string, osg::ref_ptr<T> > { };
optional<URI> _uri;
std::string _name;
bool _initialized;
mutable Threading::ReadWriteMutex _mutex;
ResourceMap<SkinResource> _skins;
ResourceMap<InstanceResource> _instances;
bool matches( const SkinSymbol* symbol, SkinResource* skin ) const;
};
} }
#endif // OSGEARTHSYMBOLOGY_RESOURCE_LIBRARY_H