24.09., 9:00 - 11:00: Due to updates GitLab will be unavailable for some minutes between 09:00 and 11:00.

ambientvolumegenerator.h 4.26 KB
Newer Older
Jakob Weiss's avatar
Jakob Weiss committed
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
// ================================================================================================
// 
// This file is part of the CAMPVis Software Framework.
// 
// If not explicitly stated otherwise: Copyright (C) 2012-2015, all rights reserved,
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
//      Chair for Computer Aided Medical Procedures
//      Technische Universitaet Muenchen
//      Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
// 
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
// 
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 
// except in compliance with the License. You may obtain a copy of the License at
// 
// http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software distributed under the 
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
// either express or implied. See the License for the specific language governing permissions 
// and limitations under the License.
// 
// ================================================================================================

#ifndef AMBIENTVOLUMEGENERATOR_H__
#define AMBIENTVOLUMEGENERATOR_H__

#include <string>

#include "core/datastructures/imagerepresentationgl.h"
#include "core/pipeline/abstractprocessordecorator.h"
#include "core/pipeline/visualizationprocessor.h"
#include "core/properties/datanameproperty.h"
#include "core/properties/floatingpointproperty.h"
#include "core/properties/optionproperty.h"
#include "core/properties/transferfunctionproperty.h"
#include "core/properties/colorproperty.h"

#include "modules/modulesapi.h"

namespace cgt {
    class BufferObject;
    class Shader;
}


namespace campvis {
    /**
     * transforms an intensity image with a transfer function, outputting an RGBA volume using OpenGL Compute Shaders.
     */
    class CAMPVIS_MODULES_API AmbientVolumeGenerator : public AbstractProcessor, public HasProcessorDecorators {
    public:
        /**
         * Constructs a new GlGaussianFilter Processor
         **/
        AmbientVolumeGenerator();

        /**
         * Destructor
         **/
        virtual ~AmbientVolumeGenerator();

        /// \see AbstractProcessor::init
Jakob Weiss's avatar
Jakob Weiss committed
64
        virtual void init() override;
Jakob Weiss's avatar
Jakob Weiss committed
65
        /// \see AbstractProcessor::deinit
Jakob Weiss's avatar
Jakob Weiss committed
66
        virtual void deinit() override;
Jakob Weiss's avatar
Jakob Weiss committed
67 68 69 70 71 72
        
        /** 
         * To be used in ProcessorFactory static methods
         */
        static const std::string getId() { return "AmbientVolumeGenerator"; };
        /// \see AbstractProcessor::getName()
Jakob Weiss's avatar
Jakob Weiss committed
73
        virtual const std::string getName() const override { return getId(); };
Jakob Weiss's avatar
Jakob Weiss committed
74
        /// \see AbstractProcessor::getDescription()
Jakob Weiss's avatar
Jakob Weiss committed
75
        virtual const std::string getDescription() const override { return "Precomputes an local ambient occlusion volume which stores ambient color + emission for each voxel."; };
Jakob Weiss's avatar
Jakob Weiss committed
76
        /// \see AbstractProcessor::getAuthor()
Jakob Weiss's avatar
Jakob Weiss committed
77
        virtual const std::string getAuthor() const override { return "Jakob Weiss <jakob.weiss@tum.de>"; };
Jakob Weiss's avatar
Jakob Weiss committed
78
        /// \see AbstractProcessor::getProcessorState()
Jakob Weiss's avatar
Jakob Weiss committed
79
        virtual ProcessorState getProcessorState() const override { return AbstractProcessor::TESTING; };
Jakob Weiss's avatar
Jakob Weiss committed
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

        DataNameProperty p_inputImage;      ///< ID for input volume
        DataNameProperty p_outputImage;     ///< ID for output gradient volume

        TransferFunctionProperty p_transferFunction;

        IVec3Property p_workgroupSize;      ///< Size of the workgroup

    protected:
        /// \see AbstractProcessor::updateResult
        virtual void updateResult(DataContainer& dataContainer) override;

        /// \see AbstractProcessor::updateProperties
        virtual void updateProperties(DataContainer & dataContainer) override;

        /**
         * Generates the shader tailored for the current input image. Simple caching is applied so as not to re-compile the shader
         * on every image update if the image metadata does not change
         */
        void generateShader(const ImageRepresentationGL::ScopedRepresentation& img, const cgt::ImageUnit& imgUnit);

        cgt::Shader* _shader;             ///< Shader for performing median filtering

        static const std::string loggerCat_;
    };
}

#endif // AMBIENTVOLUMEGENERATOR_H__