glreduction.h 4.96 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
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
36
37
// ================================================================================================
// 
// This file is part of the CAMPVis Software Framework.
// 
// If not explicitly stated otherwise: Copyright (C) 2012, all rights reserved,
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
//      Chair for Computer Aided Medical Procedures
//      Technische Universität München
//      Boltzmannstr. 3, 85748 Garching b. München, Germany
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
// 
// 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 GLREDUCTION_H__
#define GLREDUCTION_H__

#include "tgt/exception.h"
#include "tgt/tgt_gl.h"
#include "tgt/vector.h"

#include <string>
38
#include <vector>
39
40
41
42
43
44
45
46
47
48
49
50
51

namespace tgt {
    class FramebufferObject;
    class Shader;
    class Texture;
}

namespace campvis {
    class ImageData;
    class FaceGeometry;

    /**
     * Class performing a reduction of 2D image data using OpenGL.
52
     * \note    All methods need to be called from a valid OpenGL context.
53
54
55
     */
    class GlReduction {
    public:
56
57
58
59
60
        /// Operation to be performed by reduction
        enum ReductionOperator {
            MIN,                ///< Minimum
            MAX,                ///< Maximum
            PLUS,               ///< Sum (plus)
61
62
            MULTIPLICATION,     ///< Product (multiplication)
            MIN_MAX             ///< Minimum/Maximum (WORKS ONLY with single channel images!)
63
        };
64

65
66
67
68
69
        /**
         * Constructor
         * \param   reductionOperator   Operation to be performed by reduction
         */
        GlReduction(ReductionOperator reductionOperator);
70

71
72
73
74
        /**
         * Destructor
         */
        ~GlReduction();
75

76
77
78
79
80
81
82
        /**
         * Performs the reduction on the given image.
         * \note    Image must be two-dimensional!
         * \note    Reduction will be performed on a copy, \a image will not change.
         * \param   image   Pointer to ImageData to perform reduction on, must be two-dimensional.
         * \return  A vector of floats containing the reduction results for each channel of the input image.
         */
83
        std::vector<float> reduce(const ImageData* image);
84

85
86
87
88
89
90
91
        /**
         * Performs the reduction on the given OpenGL texture.
         * \note    Image must be two-dimensional!
         * \note    Reduction will be performed on a copy, \a texture will not change.
         * \param   image   Pointer to a texture to perform reduction on, must be two-dimensional.
         * \return  A vector of floats containing the reduction results for each channel of the input texture.
         */
92
        std::vector<float> reduce(const tgt::Texture* texture);
93

94
95
96
97
98
99
100
101
102

    private:
        /**
         * Performs a reduction of \a currentSize in each dimension and adjusts \a texCoordMultiplier.
         * \param   currentSize         Current size to reduce (ceiling division by 2)
         * \param   texCoordMultiplier  Tex coordinates multiplier to adjust (divide by 2 if dimension got reduced)
         */
        static void reduceSizes(tgt::ivec2& currentSize, tgt::vec2& texCoordMultiplier);

103
104
105
106
107
108
109
        /**
         * Generates the GLSL header corresponding to the given reduction operator.
         * \param   reductionOperator   Operation to be performed by reduction
         * \return  A std::string with the corresponding GLSL header.
         */
        static std::string generateGlslHeader(ReductionOperator reductionOperator);

110

111
112
113
        ReductionOperator _reductionOperator;   ///< Operation to be performed by reduction
        tgt::Shader* _shader;                   ///< OpenGL shader performing the reduction
        tgt::FramebufferObject* _fbo;           ///< FBO performing the reduction
114
115
116
117
118
119
120

        const static std::string loggerCat_;
    };

}

#endif // GLREDUCTION_H__