columbia1.cpp 6.97 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
38
39
40
41
42
// ================================================================================================
// 
// 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 Universitt Mnchen
//      Boltzmannstr. 3, 85748 Garching b. Mnchen, 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.
// 
// ================================================================================================

#include "columbia1.h"

#include "tgt/event/keyevent.h"
#include "tgt/glcontext.h"
#include "tgt/qt/qtcontextmanager.h"
#include "core/datastructures/imagedata.h"

#include "core/classification/geometry1dtransferfunction.h"
#include "core/classification/tfgeometry1d.h"

namespace campvis {

    Columbia1::Columbia1()
43
        : AutoEvaluationPipeline()
44
        , _camera("camera", "Camera")
45
        , _boundsData("BoundsData", "Bounds Data", "sfr", DataNameProperty::READ)
46
        , _imageReader()
47
        , _flowReader()
48
        , _vtkReader()
49
50
51
52
        , _vr(&_canvasSize)
        , _sr(&_canvasSize)
        , _src(&_canvasSize)
        , _gr(&_canvasSize)
53
        , _sft()
54
55
        , _sfr(&_canvasSize)
        , _compositor(&_canvasSize)
56
57
58
        , _trackballEH(0)
    {
        addProperty(&_camera);
59
        addProperty(&_boundsData);
60

61
        _trackballEH = new TrackballNavigationEventListener(&_camera, &_canvasSize);
62
63
64
        _trackballEH->addLqModeProcessor(&_vr);
        _trackballEH->addLqModeProcessor(&_src);
        _trackballEH->addLqModeProcessor(&_sfr);
65
        addEventListenerToBack(_trackballEH);
66
67

        addProcessor(&_imageReader);
68
69
70
71
72
73
74
75
        addProcessor(&_imageSplitter);
        addProcessor(&_vr);

        addProcessor(&_flowReader);
        addProcessor(&_flowSplitter);

        //addProcessor(&_vtkReader);

76
        //addProcessor(&_src);
77
        addProcessor(&_sr);
78
79
        //addProcessor(&_gr);

80
        addProcessor(&_sft);
81
        addProcessor(&_sfr);
82
83

        addProcessor(&_compositor);
84
85
86
87
88
89
90
    }

    Columbia1::~Columbia1() {
        delete _trackballEH;
    }

    void Columbia1::init() {
91
        AutoEvaluationPipeline::init();
92
        
93
        _imageSplitter.s_validated.connect(this, &Columbia1::onProcessorValidated);
94
95

        _camera.addSharedProperty(&_vr.p_camera);
96
        _camera.addSharedProperty(&_src.p_camera);
97
        _camera.addSharedProperty(&_gr.p_camera);
98
        _camera.addSharedProperty(&_sfr.p_camera);
99

100
        _vr.p_outputImage.setValue("vr");
101
        _sr.p_targetImageID.setValue("sr");
102
        _src.p_targetImageID.setValue("src");
103
        _compositor.p_targetImageId.setValue("composited");
104

105
        _renderTargetID.setValue("composited");
106

107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
        _imageReader.p_url.setValue("D:/Medical Data/Columbia/inputs/FullVolumeLV_3D_25Hz_[IM_0004]_NIF_diffused_crop_00.ltf");
        _imageReader.p_size.setValue(tgt::ivec3(224, 176, 208));
        _imageReader.p_numChannels.setValue(1);
        _imageReader.p_baseType.selectById("uint8");
        _imageReader.p_targetImageID.setValue("image");
        _imageReader.p_targetImageID.connect(&_imageSplitter.p_inputID);

        _imageSplitter.p_outputID.setValue("image.single");
        _imageSplitter.p_outputID.connect(&_vr.p_inputVolume);

        _flowReader.p_url.setValue("D:/Medical Data/Columbia/outputs/FullVolumeLV_3D_25Hz_[IM_0004]_NIF_crop_flow_field_00_00.ltf");
        _flowReader.p_size.setValue(tgt::ivec3(224, 176, 208));
        _flowReader.p_numChannels.setValue(3);
        _flowReader.p_baseType.selectById("float");
        _flowReader.p_targetImageID.setValue("flow");
        _flowReader.p_targetImageID.connect(&_flowSplitter.p_inputID);

        _flowSplitter.p_outputID.setValue("flow.single");
        _flowSplitter.p_outputID.connect(&_src.p_sourceImageID);
        _flowSplitter.p_outputID.connect(&_sr.p_sourceImageID);
        _flowSplitter.p_outputID.connect(&_sft.p_strainId);
         
129
130
131
132
        _vtkReader.p_targetImageID.setValue("mesh");
        _vtkReader.p_url.setValue("D:/Medical Data/Columbia/inputs/Myocardium Meshes/FullVolumeLV_3D_25Hz_ED_Mesh_Endo.vtk");
        _vtkReader.p_targetImageID.connect(&_gr.p_geometryID);

133
134
135
        Geometry1DTransferFunction* dvrTF = new Geometry1DTransferFunction(128, tgt::vec2(0.f, 1.f));
        dvrTF->addGeometry(TFGeometry1D::createQuad(tgt::vec2(.1f, .125f), tgt::col4(255, 0, 0, 32), tgt::col4(255, 0, 0, 32)));
        dvrTF->addGeometry(TFGeometry1D::createQuad(tgt::vec2(.4f, .5f), tgt::col4(0, 255, 0, 128), tgt::col4(0, 255, 0, 128)));
136
        static_cast<TransferFunctionProperty*>(_vr.getProperty("TransferFunction"))->replaceTF(dvrTF);
137
        _vr.p_outputImage.connect(&_compositor.p_secondImageId);
138

139
140
        _gr.p_renderTargetID.setValue("gr");

141
        _sft.p_outputID.setValue("fibers");
142
143
144
        _sft.p_outputID.connect(&_sfr.p_strainId);

        _sfr.p_renderTargetID.setValue("sfr");
145
146
        _sfr.p_renderTargetID.connect(static_cast<DataNameProperty*>(_vr.getProperty("GeometryImageId")));
        _sfr.p_renderTargetID.connect(&_compositor.p_firstImageId);
147
148
149
    }

    void Columbia1::deinit() {
150
        _canvasSize.s_changed.disconnect(this);
151
        AutoEvaluationPipeline::deinit();
152
153
154
155
156
157
158
    }

    const std::string Columbia1::getName() const {
        return "Columbia1";
    }

    void Columbia1::onProcessorValidated(AbstractProcessor* processor) {
159
        if (processor == &_imageSplitter) {
160
            // update camera
161
            DataContainer::ScopedTypedData<ImageData> img(_data, _imageSplitter.p_outputID.getValue());
162
            if (img != 0) {
163
                _trackballEH->reinitializeCamera(img);
164
165
166
            }
        }
    }
167
    
168
}