/* -*-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. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #ifndef OSGEARTH_SHADER_FACTORY_H #define OSGEARTH_SHADER_FACTORY_H 1 #include #include #include #include namespace osgEarth { namespace Util { /** * A factory object that generates shader program "scaffolding" for VirtualProgram * attributes. Ths factory generates main() functions for each stage in the shader * pipline. You don't use it directly; instead you just create VirtualProgram * attributes, and those VPs will automatically invoke this factory object to * generate their main() functions. * * The default ShaderFactory is stored in the osgEarth registry. You can replace it, * but this is advanced usage and rarely necessary. If you think you need to alter * the built-in mains, consider whether you can accomplish your goal by using a * VirtualProgram instead! */ class OSGEARTH_EXPORT ShaderFactory : public osg::Referenced { public: /** * Construtor */ ShaderFactory(); /** * Creates a Shader for each of the stages represented in the function map. */ virtual VirtualProgram::StageMask createMains( osg::State& state, const VirtualProgram::FunctionLocationMap& unctions, const VirtualProgram::ShaderMap& in_shaders, const VirtualProgram::ExtensionsSet& in_extensions, std::vector< osg::ref_ptr >& out_mains) const; /** * Builds a shader function that executes an image filter chain. * @param functionName Name to give to the resulting shader function * @param chain Color filter chain to execute */ virtual osg::Shader* createColorFilterChainFragmentShader( const std::string& functionName, const ColorFilterChain& chain ) const; /** * The name of the range uniform created by createRangeUniform(). */ virtual std::string getRangeUniformName() const; /** * Creates a uniform that's used by the RangeUniformCullCallback to convey * "distance to viewpoint" in a shader program. */ osg::Uniform* createRangeUniform() const; //! Remove all preprocessor callbacks void clearProcessorCallbacks(); //! Install a shader post-processing callback //! This will run on each shader before it gets included UID addPreProcessorCallback( osg::Referenced* host, std::function); //! Remove a callback you installed void removePreProcessorCallback(UID uid); //! Install a shader post-processing callback //! This will run on each shader before it gets included UID addPostProcessorCallback( osg::Referenced* host, std::function); //! Remove a callback you installed void removePostProcessorCallback(UID uid); //! Returns a string you can use as your shader header, //! including the #version, precision, and extensions strings. static std::string getGLSLHeader(); protected: /** dtor */ virtual ~ShaderFactory() { } }; } } // namespace osgEarth #endif // OSGEARTH_SHADER_FACTORY_H