campvispainter.cpp 6.46 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-2013, all rights reserved,
schultezub's avatar
schultezub committed
6
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
7
//      Chair for Computer Aided Medical Procedures
8 9
//      Technische Universität München
//      Boltzmannstr. 3, 85748 Garching b. München, Germany
10
// 
schultezub's avatar
schultezub committed
11
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
12
// 
13 14 15 16
// 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
17
// 
18 19 20 21
// 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.
22 23 24
// 
// ================================================================================================

schultezub's avatar
schultezub committed
25
#include "campvispainter.h"
schultezub's avatar
schultezub committed
26

27
#include "tgt/assert.h"
schultezub's avatar
schultezub committed
28
#include "tgt/camera.h"
29 30 31
#include "tgt/quadric.h"
#include "tgt/shadermanager.h"
#include "tgt/textureunit.h"
32
#include "tgt/qt/qtthreadedcanvas.h"
33

schultezub's avatar
schultezub committed
34

35
#include "core/datastructures/imagedata.h"
36
#include "core/datastructures/renderdata.h"
37
#include "core/datastructures/imagerepresentationgl.h"
38
#include "core/pipeline/abstractpipeline.h"
39 40
#include "core/tools/job.h"
#include "core/tools/opengljobprocessor.h"
41
#include "core/tools/quadrenderer.h"
schultezub's avatar
schultezub committed
42

schultezub's avatar
schultezub committed
43
namespace campvis {
44
    const std::string CampVisPainter::loggerCat_ = "CAMPVis.core.CampVisPainter";
schultezub's avatar
schultezub committed
45

46
    CampVisPainter::CampVisPainter(tgt::GLCanvas* canvas, AbstractPipeline* pipeline)
47
        : tgt::Painter(canvas)
schultezub's avatar
schultezub committed
48 49
        , _pipeline(0)
        , _copyShader(0)
50 51
    {
        tgtAssert(getCanvas() != 0, "The given canvas must not be 0!");
52
        _dirty = true;
schultezub's avatar
schultezub committed
53
        setPipeline(pipeline);
schultezub's avatar
schultezub committed
54 55
    }

56
    CampVisPainter::~CampVisPainter() {
schultezub's avatar
schultezub committed
57

58
    }
schultezub's avatar
schultezub committed
59

60
    void CampVisPainter::paint() {
61 62 63
        if (getCanvas() == 0)
            return;

64 65 66 67
        const tgt::ivec2& size = getCanvas()->getSize();
        glViewport(0, 0, size.x, size.y);

        // try get Data
68
        ScopedTypedData<RenderData> rd(_pipeline->getDataContainer(), _pipeline->getRenderTargetID());
69
        ImageRepresentationGL::ScopedRepresentation repGL(_pipeline->getDataContainer(), _pipeline->getRenderTargetID());
70
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
71
        if (rd != 0 || (repGL != 0 && repGL->getDimensionality() == 2)) {
72 73 74 75 76 77 78 79
            // activate shader
            _copyShader->activate();
            _copyShader->setIgnoreUniformLocationError(true);
            _copyShader->setUniform("_viewportSize", size);
            _copyShader->setUniform("_viewportSizeRCP", 1.f / tgt::vec2(size));
            _copyShader->setIgnoreUniformLocationError(false);

            // bind input textures
80 81 82 83 84
            tgt::TextureUnit colorUnit;
            if (rd)
                rd->bindColorTexture(_copyShader, colorUnit);
            else if (repGL)
                repGL->bind(_copyShader, colorUnit);
85
            LGL_ERROR;
86 87

            // execute the shader
88 89 90
            _copyShader->setAttributeLocation(0, "in_Position");
            _copyShader->setAttributeLocation(1, "in_TexCoords");
            QuadRdr.renderQuad();
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
            _copyShader->deactivate();
            LGL_ERROR;
        }
        else {
            // TODO: render some nifty error texture
            //       so long, we do some dummy rendering
            tgt::Camera c(tgt::vec3(0.f,0.f,2.f)); 
            c.look();  
            glColor3f(1.f, 0.f, 0.f);  
            tgt::Sphere sphere(.5f, 64, 32);  
            sphere.render();

            /*
            // render error texture
            if (!errorTex_) {
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                return;
            }
            glClear(GL_DEPTH_BUFFER_BIT);

            glActiveTexture(GL_TEXTURE0);
            errorTex_->bind();
            errorTex_->enable();

            glColor3f(1.f, 1.f, 1.f);
            renderQuad();

            errorTex_->disable();*/
schultezub's avatar
schultezub committed
119
        }
120
        LGL_ERROR;
121 122

        getCanvas()->swap();
schultezub's avatar
schultezub committed
123 124
    }

125
    void CampVisPainter::sizeChanged(const tgt::ivec2& size) {
schultezub's avatar
schultezub committed
126
        _pipeline->setRenderTargetSize(size);
schultezub's avatar
schultezub committed
127 128
    }

129
    void CampVisPainter::init() {
schultezub's avatar
schultezub committed
130 131
        try {
            // TODO:    Remove hardcoded paths, and use ShdrMgr.addPath() at some central location
132
            _copyShader = ShdrMgr.load("core/glsl/passthrough.vert", "core/glsl/copyimage.frag", "");
schultezub's avatar
schultezub committed
133
        }
schultezub's avatar
schultezub committed
134 135
        catch (tgt::Exception& e) {
            LERRORC("main.cpp", "Encountered tgt::Exception: " << e.what());
schultezub's avatar
schultezub committed
136
        }
schultezub's avatar
schultezub committed
137
    }
schultezub's avatar
schultezub committed
138

139
    void CampVisPainter::deinit() {
140
        ShdrMgr.dispose(_copyShader);
schultezub's avatar
schultezub committed
141 142 143 144

        if (_pipeline != 0) {
            _pipeline->s_renderTargetChanged.disconnect(this);
            if (getCanvas()->getEventHandler() != 0)
145
                getCanvas()->getEventHandler()->removeEventListener(_pipeline);
schultezub's avatar
schultezub committed
146 147
            _pipeline = 0;
        }
148 149
    }

150
    void CampVisPainter::setPipeline(AbstractPipeline* pipeline) {
schultezub's avatar
schultezub committed
151 152 153 154
        tgtAssert(pipeline != 0, "The given pipeline must not be 0.");
        if (_pipeline != 0) {
            _pipeline->s_renderTargetChanged.disconnect(this);
            if (getCanvas()->getEventHandler() != 0)
155
                getCanvas()->getEventHandler()->removeEventListener(_pipeline);
schultezub's avatar
schultezub committed
156
        }
schultezub's avatar
schultezub committed
157

schultezub's avatar
schultezub committed
158
        _pipeline = pipeline;
159
        _pipeline->s_renderTargetChanged.connect(this, &CampVisPainter::onRenderTargetChanged);
schultezub's avatar
schultezub committed
160 161
        _pipeline->setRenderTargetSize(getCanvas()->getSize());
        if (getCanvas()->getEventHandler() != 0)
162
            getCanvas()->getEventHandler()->addEventListenerToFront(_pipeline);
schultezub's avatar
schultezub committed
163
    }
schultezub's avatar
schultezub committed
164

165 166
    void CampVisPainter::repaint() {
        GLJobProc.enqueueJob(getCanvas(), makeJobOnHeap(this, &CampVisPainter::paint), OpenGLJobProcessor::PaintJob);
schultezub's avatar
schultezub committed
167
    }
schultezub's avatar
schultezub committed
168

169
    void CampVisPainter::onRenderTargetChanged() {
170 171 172
        repaint();
    }

173
    void CampVisPainter::setCanvas(tgt::GLCanvas* canvas) {
174 175 176
        tgtAssert(dynamic_cast<tgt::QtThreadedCanvas*>(canvas) != 0, "Canvas must be of type QtThreadedCanvas!");
        Painter::setCanvas(canvas);
    }
177
}