digraphvisualizationpipeline.h 5.54 KB
Newer Older
1
2
// ================================================================================================
// 
schultezub's avatar
schultezub committed
3
// This file is part of the CAMPVis Software Framework.
4
5
// 
// If not explicitly stated otherwise: Copyright (C) 2012, all rights reserved,
schultezub's avatar
schultezub committed
6
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
7
8
9
//      Chair for Computer Aided Medical Procedures
//      Technische Universität München
//      Boltzmannstr. 3, 85748 Garching b. München, Germany
schultezub's avatar
schultezub committed
10
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 
// The licensing of this softare is not yet resolved. Until then, redistribution in source or
// binary forms outside the CAMP chair is not permitted, unless explicitly stated in legal form.
// However, the names of the original authors and the above copyright notice must retain in its
// original state in any case.
// 
// Legal disclaimer provided by the BSD license:
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
// 
// ================================================================================================

#ifndef DIGRAPHVISUALIZATIONPIPELINE_H__
#define DIGRAPHVISUALIZATIONPIPELINE_H__

#include "sigslot/sigslot.h"
#include "tgt/vector.h"
#include "tgt/event/eventlistener.h"
36
#include "core/pipeline/autoevaluationpipeline.h"
37
38
39
40
41
#include "core/properties/genericproperty.h"

#include <map>
#include <set>

schultezub's avatar
schultezub committed
42
namespace campvis {
43
44
45
    class VisualizationProcessor;

    /**
46
     * Specialization of the AutoEvaluationPipeline that performs automatic evaluation based on
47
48
     * an acyclic directed dependency graph.
     * 
49
     * \todo    Implement thread-safety. The current graph implementation is \b not thread-safe.
50
     */
51
    class DigraphVisualizationPipeline : public AutoEvaluationPipeline {
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
    public:
        /**
         * Creates a DigraphVisualizationPipeline.
         */
        DigraphVisualizationPipeline();

        /**
         * Virtual Destructor
         **/
        virtual ~DigraphVisualizationPipeline();


        /**
         * Execute this pipeline.
         * Pipeline must have a valid canvas set before calling this method.
         **/
        virtual void execute() = 0;


        /**
         * Adds a processor to this pipeline, so that it will be managed.
         * 
         * \note    Add each processor only once!
         * \param   processor   Processor to add
         */
        void addProcessor(AbstractProcessor* processor);

        /**
         * Adds a dependency link between two processors.
         * The processor \a childProc needs to be executed every time when \a fatherProc has been evaluated.
         * \note    Add each dependency between two processors only once!
         * \param   fatherProc  The processor \a childProc is dependent on.
         * \param   childProc   The dependent processor of \a fatherProc.
         */
        void addProcessorDependency(AbstractProcessor* fatherProc, AbstractProcessor* childProc);


    protected:
        /**
         * Struct for the nodes defining the processor evaluation dependency graph.
         * Each Node represents one processor and stores the processors which are dependent on this
         * processors, hence, the ones which need to be updated afterwards.
         * 
         * \todo    This struct is \b not thread-safe!
         */
        struct DependencyNode {
            /**
             * Creates a new DependencyNode for the given Processor
             * \param   processor   The processor this node represents. Must not be 0.
             */
            DependencyNode(AbstractProcessor* processor);

            /**
             * Adds the given DependencyNode as dependency (child) of this node.
             * \param   dependency  DependencyNode containing a processor which needs to be updated after this one.
             */
            void addDependency(DependencyNode* dependency);

            AbstractProcessor* _processor;              ///< Processor this node wraps around
            bool _isVisualizationProcessor;             ///< Flag whether \a _processor is a VisualizationProcessor (hence, needs an OpenGL context)
            std::set<DependencyNode*> _dependentNodes;  ///< Set of all dependent nodes.
        };

        /**
         * Slot getting called when one of the observed processors got invalidated.
         * The default behaviour is just to set the invalidation level to invalid.
         * \param   processor   The processor that emitted the signal
         */
120
        virtual void onProcessorInvalidated(AbstractProcessor* processor);
121
122
123
124
125
126
127
128
129
130
131


        static const std::string loggerCat_;

        std::map<AbstractProcessor*, DependencyNode*> _processorNodeMap;
        tbb::atomic<DependencyNode*> _topNodeToEvaluate;
    };

}

#endif // DIGRAPHVISUALIZATIONPIPELINE_H__