115 lines
4.3 KiB
C++
115 lines
4.3 KiB
C++
/* -*-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 <http://www.gnu.org/licenses/>
|
|
*/
|
|
#ifndef OSGEARTH_SHADER_FACTORY_H
|
|
#define OSGEARTH_SHADER_FACTORY_H 1
|
|
|
|
#include <osgEarth/Common>
|
|
#include <osgEarth/VirtualProgram>
|
|
#include <osgEarth/ColorFilter>
|
|
#include <vector>
|
|
|
|
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<osg::Shader> >& 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<void(std::string&, osg::Referenced*)>);
|
|
|
|
//! 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<void(osg::Shader*, osg::Referenced*)>);
|
|
|
|
//! 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
|