OpenWalnut 1.3.1
WGEPostprocessingNode.h
00001 //---------------------------------------------------------------------------
00002 //
00003 // Project: OpenWalnut ( http://www.openwalnut.org )
00004 //
00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
00006 // For more information see http://www.openwalnut.org/copying
00007 //
00008 // This file is part of OpenWalnut.
00009 //
00010 // OpenWalnut is free software: you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as published by
00012 // the Free Software Foundation, either version 3 of the License, or
00013 // (at your option) any later version.
00014 //
00015 // OpenWalnut is distributed in the hope that it will be useful,
00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018 // GNU Lesser General Public License for more details.
00019 //
00020 // You should have received a copy of the GNU Lesser General Public License
00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
00022 //
00023 //---------------------------------------------------------------------------
00024 
00025 #ifndef WGEPOSTPROCESSINGNODE_H
00026 #define WGEPOSTPROCESSINGNODE_H
00027 
00028 #include <map>
00029 #include <utility>
00030 
00031 #include <osg/Switch>
00032 
00033 #include "../../common/WPropertyVariable.h"
00034 #include "../../common/WItemSelection.h"
00035 #include "../../common/WSharedAssociativeContainer.h"
00036 
00037 #include "../offscreen/WGEOffscreenRenderNode.h"
00038 #include "../offscreen/WGEOffscreenRenderPass.h"
00039 #include "../offscreen/WGEOffscreenFinalPass.h"
00040 #include "../callbacks/WGESwitchCallback.h"
00041 #include "../callbacks/WGENodeMaskCallback.h"
00042 #include "../WGEGroupNode.h"
00043 
00044 
00045 #include "WGEPostprocessor.h"
00046 
00047 /**
00048  * This class enables you to add arbitrary nodes that get post-processed in screen space. The only thing you need to take care of is your shader.
00049  * You need some special parts in it. Please see the all-in-one super-shader-example module WMShaderExample in modules/template.
00050  *
00051  * \note Although this is an osg::Switch node, you should avoid using its inherited API unless you know what you do. Using the osg::Switch API
00052  * might be useful for those who want to modify the post-processing pipeline.
00053  */
00054 class WGEPostprocessingNode: public osg::Switch // NOLINT
00055 {
00056 public:
00057     /**
00058      * Convenience typedef for an osg::ref_ptr
00059      */
00060     typedef osg::ref_ptr< WGEPostprocessingNode > RefPtr;
00061 
00062     /**
00063      * Convenience typedef for an osg::ref_ptr; const
00064      */
00065     typedef osg::ref_ptr< const WGEPostprocessingNode > ConstRefPtr;
00066 
00067     /**
00068      * Create a new post-processing node. It uses the WGEOffscreenRenderNode to setup an offscreen, shader-based post-processing for rendered
00069      * images. This is not limited to geometry but can also be used for ray-traced images.
00070      *
00071      * \note The width and hight define the offscreen texture size. The viewport if each rendering is automatically set to the one of the
00072      * reference camera. This means, width and height only define the maximal supported resolution without upscaling of your postprocessor.
00073      *
00074      * \param reference camera used as reference
00075      * \param width the width of the textures used in this rendering. Must be in [8,4096] and a power of two.
00076      * \param height the height of the textures used in this rendering. Must be in [8,4096] and a power of two.
00077      * \param noHud If true, no hud gets displayed showing the created and used textures.
00078      */
00079     WGEPostprocessingNode( osg::ref_ptr< osg::Camera > reference, size_t width = 2048, size_t height = 2048, bool noHud = false );
00080 
00081     /**
00082      * Destructor.
00083      */
00084     virtual ~WGEPostprocessingNode();
00085 
00086     /**
00087      * Returns the set of properties controlling the post-processing node. You can use them to provide them to the user for example.
00088      *
00089      * \return the properties as a group.
00090      */
00091     WPropGroup getProperties() const;
00092 
00093     /**
00094      * Inserts a node to the post-processor and injects the needed code to the specified shader. See class documentation for further details on
00095      * how the shader gets modified. If you are using an group node, be yourself aware that all nodes in this group need to have the same shader!
00096      * If not, post-processing will not work properly.
00097      *
00098      * \note this is thread-safe and can be done from every thread
00099      * \note it does NOT apply the shader.
00100      *
00101      * \param node the node to post-process
00102      * \param shader the shader used for the node
00103      */
00104     void insert( osg::ref_ptr< osg::Node > node, WGEShader::RefPtr shader = NULL );
00105 
00106     /**
00107      * Removes the node from the post-processing. If it is not in the post-processing pipeline, nothing happens.
00108      *
00109      * \note this is thread-safe and can be done from every thread
00110      *
00111      * \param node the node to remove
00112      */
00113     void remove( osg::ref_ptr< osg::Node > node );
00114 
00115     /**
00116      * Removes all associated nodes.
00117      *
00118      * \note this is thread-safe and can be done from every thread
00119      */
00120     void clear();
00121 
00122 protected:
00123 private:
00124     /**
00125      * This type is used to actually store the association between a node and its associated shader and custom preprocessor.
00126      */
00127     typedef WSharedAssociativeContainer<
00128         std::map<
00129             osg::ref_ptr< osg::Node >,
00130             std::pair<
00131                 WGEShader::RefPtr,
00132                 WGEShaderPreprocessor::SPtr
00133             >
00134         >
00135     > NodeShaderAssociation;
00136 
00137     /**
00138      * List of nodes and their corresponding shader and preprocessor.
00139      */
00140     NodeShaderAssociation m_nodeShaderAssociation;
00141 
00142     /**
00143      * The group of child nodes to post-process.
00144      */
00145     osg::ref_ptr< WGEGroupNode > m_childs;
00146 
00147     /**
00148      * All the properties of the post-processor.
00149      */
00150     WPropGroup m_properties;
00151 
00152     /**
00153      * If true, post-processing is enabled.
00154      */
00155     WPropBool m_active;
00156 
00157     /**
00158      * Activate to show the texture HUDs
00159      */
00160     WPropBool m_showHud;
00161 
00162     /**
00163      * The property containing the currently active method or a combination.
00164      */
00165     WPropSelection m_activePostprocessor;
00166 
00167     /**
00168      * The postprocessors.
00169      */
00170     WGEPostprocessor::ProcessorList m_postprocs;
00171 
00172     /**
00173      * Callback for changes in m_activePostprocessor.
00174      */
00175     void postprocessorSelected();
00176 };
00177 
00178 #endif  // WGEPOSTPROCESSINGNODE_H
00179