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

379 lines
13 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/>
*/
#pragma once
#include <osgEarth/Common>
#include <osgEarth/CachePolicy>
#include <osgEarth/ShaderGenerator>
#include <osgEarth/Threading>
#include <osgEarth/SpatialReference>
#include <atomic>
#include <set>
#include <unordered_set>
#include <unordered_map>
namespace osgText {
class Font;
}
namespace osgEarth
{
class Cache;
class Capabilities;
class Profile;
class URIReadCallback;
class ObjectIndex;
class StateSetCache;
namespace Util
{
class ShaderFactory;
}
/**
* Application-wide global repository.
*/
class OSGEARTH_EXPORT Registry
{
public:
//! Access the global Registry singleton.
static Registry* instance();
/** Gets a well-known named profile instance.
* @deprecated Use Profile::get(name) */
const Profile* getNamedProfile( const std::string& name ) const;
/** Gets the global-geodetic builtin profile
* @deprecated Use Profile::get("global-geodetic") */
const Profile* getGlobalGeodeticProfile() const;
/** @deprecated Gets the global-meractor builtin profile (mercator/WGS84 datum)
* @deprecated Use Profile::get("global-mercator") */
const Profile* getGlobalMercatorProfile() const;
/** Gets the spherical-mercator builtin profile (mercator/sphere)
* @deprecated Use Profile::get("spherical-mercator") */
const Profile* getSphericalMercatorProfile() const;
/** Gets a default cache object - based on environment settings - unless setDefaultCache
was called to override it. */
Cache* getDefaultCache() const;
/** Sets a default cache that a Map will use if none other is specified. */
void setDefaultCache(Cache* cache);
/** The default cache policy (used when no policy is set elsewhere) */
const optional<CachePolicy>& defaultCachePolicy() const;
void setDefaultCachePolicy( const CachePolicy& policy );
/** The override cache policy (overrides all others if set) */
const optional<CachePolicy>& overrideCachePolicy() const;
void setOverrideCachePolicy( const CachePolicy& policy );
/** The default cache driver. */
void setDefaultCacheDriverName( const std::string& name );
const std::string& getDefaultCacheDriverName() const;
/**
* Given a CachePolicy, composites in the default and override cache policies
* as necessary to create an effective CachePolicy. First it will populate
* any unset properties in "cp" with defaults if they are available. Then it
* will override any properties in "cp" with overrides that are available.
*/
bool resolveCachePolicy(optional<CachePolicy>& cp) const;
/**
* Whether the given filename is blacklisted
*/
bool isBlacklisted(const std::string &filename);
/**
* Blacklist the given filename
*/
void blacklist(const std::string &filename);
/**
* Gets the number of blacklisted filenames
*/
unsigned int getNumBlacklistedFilenames();
/**
* Clears the blacklist
*/
void clearBlacklist();
/**
* Sets or gets a default system font to use
*/
void setDefaultFont( osgText::Font* font );
osgText::Font* getDefaultFont();
/**
* The graphics hardware capabilities for this platform.
*/
bool hasCapabilities() const;
const Capabilities& getCapabilities() const;
void setCapabilities( Capabilities* caps );
static const Capabilities& capabilities() { return instance()->getCapabilities(); }
/**
* Gets or sets the default shader factory. You can replace the default
* shader factory if you want to alter any of osgEarth's baseline shaders
* (advanced usage).
*/
Util::ShaderFactory* getShaderFactory() const;
void setShaderFactory( Util::ShaderFactory* lib );
static Util::ShaderFactory* shaderFactory() { return instance()->getShaderFactory(); }
/**
* The default shader generator.
* @deprecated REMOVE in 4.0; use ShaderGenerator directly
*/
ShaderGeneratorProxy getShaderGenerator() const;
void setShaderGenerator(ShaderGenerator* gen);
static ShaderGeneratorProxy shaderGenerator() { return instance()->getShaderGenerator(); }
/**
* Global object index.
*/
ObjectIndex* getObjectIndex() const;
static ObjectIndex* objectIndex() { return instance()->getObjectIndex(); }
/**
* A default StateSetCache to use by any process that uses one.
* A StateSetCache assist in stateset sharing across multiple nodes.
* Note: A registry-wide SSC is only supported in OSG 3.1.4+. See
* the Registry.cpp comments for details.
* @deprecated REMOVE in 4.0
*/
StateSetCache* getStateSetCache() const;
void setStateSetCache( StateSetCache* cache );
static StateSetCache* stateSetCache() { return instance()->getStateSetCache(); }
/**
* A shared cache for osg::Program objects created by the shader
* composition subsystem (VirtualProgram).
*/
ProgramRepo& getProgramRepo();
static ProgramRepo& programRepo() { return instance()->getProgramRepo(); }
/**
* Sets a global read callback for URI objects.
* @deprecated REMOVE in 4.0
*/
void setURIReadCallback( URIReadCallback* callback );
/**
* Gets the global read callback for URI objects.
* @deprecated REMOVE in 4.0
*/
URIReadCallback* getURIReadCallback() const;
/**
* Gets the default set of osgDB::Options to use.
* @deprecated
*/
const osgDB::Options* getDefaultOptions() const;
/**
* Clones an options structure (fixing the archive caching), or creates
* a new one.
*/
static osgDB::Options* cloneOrCreateOptions( const osgDB::Options* options =0L );
/**
* Registers a Units definition.
*/
void registerUnits(const UnitsType& prototype);
UnitsType getUnits(const std::string& name) const;
/**
* The name of the default terrain engine driver
*/
//void setDefaultTerrainEngineDriverName( const std::string& name );
const std::string& getDefaultTerrainEngineDriverName() const { return _terrainEngineDriver; }
/**
* If set, all MapNodes will use the terrain driver specified here regardless
* of the driver in the TerrainOptions/earth file.
*/
optional<std::string>& overrideTerrainEngineDriverName() { return _overrideTerrainEngineDriverName; }
const optional<std::string>& overrideTerrainEngineDriverName() const { return _overrideTerrainEngineDriverName; }
/**
* For debugging - tracks activities in progress.
*/
void startActivity(const std::string& name);
void startActivity(const std::string& name, const std::string& text);
void endActivity(const std::string& name);
void getActivities(std::set<std::string>& output);
/**
* Gets the mime-type corresponding to a given extension.
*/
std::string getMimeTypeForExtension(const std::string& extension);
/**
* Gets the file extension corresponding to a given mime-type.
*/
std::string getExtensionForMimeType(const std::string& mimeType);
/**
* Sets the policy for calling osg::Texture::setUnRefImageDataAfterApply
* in the osgEarth terrain engine.
*/
optional<bool>& unRefImageDataAfterApply() { return _unRefImageDataAfterApply; }
const optional<bool>& unRefImageDataAfterApply() const { return _unRefImageDataAfterApply; }
/**
* Adds a texture image unit number that osgEarth should never use.
*/
void setTextureImageUnitOffLimits(int unit);
const std::set<int> getOffLimitsTextureImageUnits() const;
/**
* Gets the device pixel ratio.
*/
float getDevicePixelRatio() const;
/**
* Sets the device pixel ratio. This value will be used to scale the size of objects specified in pixels.
* This value is useful when running in high dpi environments on high resolution displays.
*/
void setDevicePixelRatio(float devicePixelRatio);
/**
* Maximum number of vertices to allow in a single osg::Geometry drawable
* when performing optimization processing. This varies based on hardware
* capabilities. Default is 65535.
*/
void setMaxNumberOfVertsPerDrawable(unsigned value);
unsigned getMaxNumberOfVertsPerDrawable() const;
/**
* Maximum dimension (in either axis of images loaded from a URI).
* Default is UINT_MAX. This will effectively limit the size of
* texture data throughout osgEarth.
*/
void setMaxTextureSize(int value);
int getMaxTextureSize() const;
/**
* Release OpenGL resources associated with anything in the reigstry
*/
void releaseGLObjects(class osg::State*) const;
//! Release any resources held by the registry so it can be re-used
void release();
//! Register singleton objects with the registry and defer
//! their destruction to happen with the registry's own.
template<typename R> R* registerSingleton(R* singleton)
{
std::lock_guard<std::mutex> lock(_regMutex);
_singletons.push_back(singleton);
return singleton;
}
//! Gets (or creates on demand) a named singleton object.
//! FUNC must have the signature std::function<T*()>
template<typename T, typename FUNC> T* getOrCreate(const std::string& name, FUNC&& create)
{
std::lock_guard<std::mutex> lock(_regMutex);
auto& s = _namedSingletons[name];
if (!s.valid()) s = create();
return dynamic_cast<T*>(s.get());
}
virtual ~Registry();
protected:
Registry();
mutable std::mutex _regMutex;
ProgramRepo _programRepo;
mutable osg::ref_ptr<Cache> _defaultCache;
mutable optional<CachePolicy> _defaultCachePolicy;
mutable optional<CachePolicy> _overrideCachePolicy;
mutable bool _overrideCachePolicyInitialized;
typedef std::unordered_set<std::string> StringSet;
Threading::Mutexed<StringSet> _blacklist;
osg::ref_ptr<Util::ShaderFactory> _shaderLib;
osg::ref_ptr<ShaderGenerator> _shaderGen;
// system capabilities:
osg::ref_ptr< Capabilities > _caps;
mutable std::mutex _capsMutex;
void initCapabilities();
osg::ref_ptr<osgDB::Options> _defaultOptions;
osg::ref_ptr<URIReadCallback> _uriReadCallback;
osg::ref_ptr<osgText::Font> _defaultFont;
std::vector<UnitsType> _unitsVector;
osg::ref_ptr<StateSetCache> _stateSetCache;
std::string _terrainEngineDriver;
optional<std::string> _overrideTerrainEngineDriverName;
mutable optional<std::string> _cacheDriver;
typedef std::pair<std::string,std::string> Activity;
struct ActivityLess {
bool operator()(const Activity& lhs, const Activity& rhs) const {
return lhs.first < rhs.first;
}
};
std::set<Activity,ActivityLess> _activities;
mutable std::mutex _activityMutex;
optional<bool> _unRefImageDataAfterApply;
mutable osg::ref_ptr<ObjectIndex> _objectIndex;
std::set<int> _offLimitsTextureImageUnits;
float _devicePixelRatio;
unsigned _maxImageDimension;
typedef std::unordered_map<SpatialReference::Key, osg::ref_ptr<SpatialReference> > SRSCache;
Threading::Mutexed<SRSCache> _srsCache;
unsigned _maxVertsPerDrawable;
std::vector<osg::ref_ptr<osg::Referenced>> _singletons;
std::unordered_map<std::string, osg::ref_ptr<osg::Referenced>> _namedSingletons;
//! Gets a spatial reference object (internal)
//! Please use SpatialReference::get() instead of calling this directly
osg::ref_ptr<SpatialReference> getOrCreateSRS(const SpatialReference::Key& key);
friend class SpatialReference;
};
extern OSGEARTH_EXPORT std::int64_t g_startupPrivateBytes;
}