/* -*-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 OSGEARTHSYMBOLOGY_MODEL_SYMBOL_H #define OSGEARTHSYMBOLOGY_MODEL_SYMBOL_H 1 #include #include #include #include namespace osgEarth { namespace Util { class InstanceResource; } /** * Represents an external 3D model */ class OSGEARTH_EXPORT ModelSymbol : public InstanceSymbol { public: META_Object(osgEarth, ModelSymbol); ModelSymbol(const ModelSymbol& rhs,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); ModelSymbol( const Config& conf =Config() ); /** dtor */ virtual ~ModelSymbol() { } /** heading in degrees */ optional& heading() { return _heading; } const optional& heading() const { return _heading; } /** pitch in degrees */ optional& pitch() { return _pitch; } const optional& pitch() const { return _pitch; } /** roll in degrees */ optional& roll() { return _roll; } const optional& roll() const { return _roll; } /** whether to automatically scale the model from meters to pixels */ optional& autoScale() { return _autoScale; } const optional& autoScale() const { return _autoScale; } /** minimum scale of the model when autoscale is enabled */ optional& minAutoScale() { return _minAutoScale; } const optional& minAutoScale() const { return _minAutoScale; } /** maximum scale of the model when autoscale is enabled */ optional& maxAutoScale() { return _maxAutoScale; } const optional& maxAutoScale() const { return _maxAutoScale; } /** Name of a specific model in the catalog */ optional& name() { return _name; } const optional& name() const { return _name; } /** Maximum acceptable model length (size in the X dimension) */ optional& maxSizeX() { return _maxSizeX; } const optional& maxSizeX() const { return _maxSizeX; } /** Maximum acceptable model width (size in the Y dimension) */ optional& maxSizeY() { return _maxSizeY; } const optional& maxSizeY() const { return _maxSizeY; } /** Model instance scale factor */ optional& scaleX() { return _scaleX; } const optional& scaleX() const { return _scaleX; } /** Model instance scale factor */ optional& scaleY() { return _scaleY; } const optional& scaleY() const { return _scaleY; } /** Model instance scale factor */ optional& scaleZ() { return _scaleZ; } const optional& scaleZ() const { return _scaleZ; } /** Calculate model orientation from components of feature */ optional& orientationFromFeature() { return _orientationFromFeature; }; const optional& orientationFromFeature() const { return _orientationFromFeature; }; public: // non-serialized properties (for programmatic use only) /** Explicit model to use for model placement */ void setModel( osg::Node* node ) { _node = node; } osg::Node* getModel() const { return _node.get(); } public: virtual Config getConfig() const; virtual void mergeConfig( const Config& conf ); static void parseSLD(const Config& c, class Style& style); public: // InstanceSymbol /** Creates a new (empty) resource appropriate for this symbol */ virtual InstanceResource* createResource() const; protected: optional _heading; optional _pitch; optional _roll; optional _autoScale; optional _minAutoScale; optional _maxAutoScale; osg::ref_ptr _node; optional _name; optional _maxSizeX; optional _maxSizeY; optional _scaleX; optional _scaleY; optional _scaleZ; optional _orientationFromFeature; }; } // namespace osgEarth #endif