Mercurial > hg > orthanc-stone
annotate Samples/Qt/BasicScene.cpp @ 883:30268a0cafca am-dev
basic scene Qt sample working
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Tue, 09 Jul 2019 14:34:56 +0200 |
parents | 12b591d5d63c |
children | 56e4e9281076 |
rev | line source |
---|---|
849 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 #define GLEW_STATIC 1 | |
22 // From Stone | |
23 #include "../../Framework/OpenGL/OpenGLIncludes.h" | |
24 #include "../../Applications/Sdl/SdlOpenGLWindow.h" | |
25 #include "../../Framework/Scene2D/CairoCompositor.h" | |
26 #include "../../Framework/Scene2D/ColorTextureSceneLayer.h" | |
27 #include "../../Framework/Scene2D/OpenGLCompositor.h" | |
28 #include "../../Framework/Scene2D/PanSceneTracker.h" | |
29 #include "../../Framework/Scene2D/RotateSceneTracker.h" | |
30 #include "../../Framework/Scene2D/Scene2D.h" | |
31 #include "../../Framework/Scene2D/ZoomSceneTracker.h" | |
32 #include "../../Framework/Scene2DViewport/ViewportController.h" | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
33 #include "../../Framework/Scene2DViewport/UndoStack.h" |
849 | 34 |
35 #include "../../Framework/StoneInitialization.h" | |
36 #include "../../Framework/Messages/MessageBroker.h" | |
37 | |
38 // From Orthanc framework | |
39 #include <Core/Logging.h> | |
40 #include <Core/OrthancException.h> | |
41 #include <Core/Images/Image.h> | |
42 #include <Core/Images/ImageProcessing.h> | |
43 #include <Core/Images/PngWriter.h> | |
44 | |
45 #include <boost/make_shared.hpp> | |
46 #include <boost/ref.hpp> | |
47 #include "EmbeddedResources.h" | |
48 | |
49 //#include <SDL.h> | |
50 #include <stdio.h> | |
51 #include <QDebug> | |
52 #include <QWindow> | |
53 | |
54 static const unsigned int FONT_SIZE = 32; | |
55 static const int LAYER_POSITION = 150; | |
56 | |
57 using namespace OrthancStone; | |
58 | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
59 void PrepareScene(boost::shared_ptr<OrthancStone::ViewportController> controller) |
849 | 60 { |
61 Scene2D& scene(*controller->GetScene()); | |
62 // Texture of 2x2 size | |
63 { | |
64 Orthanc::Image i(Orthanc::PixelFormat_RGB24, 2, 2, false); | |
65 | |
66 uint8_t *p = reinterpret_cast<uint8_t*>(i.GetRow(0)); | |
67 p[0] = 255; | |
68 p[1] = 0; | |
69 p[2] = 0; | |
70 | |
71 p[3] = 0; | |
72 p[4] = 255; | |
73 p[5] = 0; | |
74 | |
75 p = reinterpret_cast<uint8_t*>(i.GetRow(1)); | |
76 p[0] = 0; | |
77 p[1] = 0; | |
78 p[2] = 255; | |
79 | |
80 p[3] = 255; | |
81 p[4] = 0; | |
82 p[5] = 0; | |
83 | |
84 scene.SetLayer(12, new ColorTextureSceneLayer(i)); | |
85 | |
86 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); | |
87 l->SetOrigin(-3, 2); | |
88 l->SetPixelSpacing(1.5, 1); | |
89 l->SetAngle(20.0 / 180.0 * 3.14); | |
90 scene.SetLayer(14, l.release()); | |
91 } | |
92 | |
93 // Texture of 1x1 size | |
94 { | |
95 Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); | |
96 | |
97 uint8_t *p = reinterpret_cast<uint8_t*>(i.GetRow(0)); | |
98 p[0] = 255; | |
99 p[1] = 0; | |
100 p[2] = 0; | |
101 | |
102 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); | |
103 l->SetOrigin(-2, 1); | |
104 l->SetAngle(20.0 / 180.0 * 3.14); | |
105 scene.SetLayer(13, l.release()); | |
106 } | |
107 | |
108 // Some lines | |
109 { | |
110 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer); | |
111 | |
112 layer->SetThickness(1); | |
113 | |
114 PolylineSceneLayer::Chain chain; | |
115 chain.push_back(ScenePoint2D(0 - 0.5, 0 - 0.5)); | |
116 chain.push_back(ScenePoint2D(0 - 0.5, 2 - 0.5)); | |
117 chain.push_back(ScenePoint2D(2 - 0.5, 2 - 0.5)); | |
118 chain.push_back(ScenePoint2D(2 - 0.5, 0 - 0.5)); | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
119 layer->AddChain(chain, true, 255, 0, 0); |
849 | 120 |
121 chain.clear(); | |
122 chain.push_back(ScenePoint2D(-5, -5)); | |
123 chain.push_back(ScenePoint2D(5, -5)); | |
124 chain.push_back(ScenePoint2D(5, 5)); | |
125 chain.push_back(ScenePoint2D(-5, 5)); | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
126 layer->AddChain(chain, true, 0, 255, 0); |
849 | 127 |
128 double dy = 1.01; | |
129 chain.clear(); | |
130 chain.push_back(ScenePoint2D(-4, -4)); | |
131 chain.push_back(ScenePoint2D(4, -4 + dy)); | |
132 chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); | |
133 chain.push_back(ScenePoint2D(4, 2)); | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
134 layer->AddChain(chain, false, 0, 0, 255); |
849 | 135 |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
136 // layer->SetColor(0,255, 255); |
849 | 137 scene.SetLayer(50, layer.release()); |
138 } | |
139 | |
140 // Some text | |
141 { | |
142 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); | |
143 layer->SetText("Hello"); | |
144 scene.SetLayer(100, layer.release()); | |
145 } | |
146 } | |
147 | |
148 | |
149 static void GLAPIENTRY OpenGLMessageCallback(GLenum source, | |
150 GLenum type, | |
151 GLuint id, | |
152 GLenum severity, | |
153 GLsizei length, | |
154 const GLchar* message, | |
155 const void* userParam ) | |
156 { | |
157 if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) | |
158 { | |
159 fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", | |
160 ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), | |
161 type, severity, message ); | |
162 } | |
163 } | |
164 | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
165 extern void InitGL(); |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
166 |
849 | 167 #include <QApplication> |
168 #include "BasicSceneWindow.h" | |
879 | 169 #include "Scene2DInteractor.h" |
170 | |
849 | 171 int main(int argc, char* argv[]) |
172 { | |
173 { | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
174 QApplication a(argc, argv); |
849 | 175 |
176 QSurfaceFormat requestedFormat; | |
177 requestedFormat.setVersion( 2, 0 ); | |
178 | |
179 OrthancStone::Samples::BasicSceneWindow window; | |
180 window.show(); | |
181 | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
182 MessageBroker broker; |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
183 boost::shared_ptr<UndoStack> undoStack(new UndoStack); |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
184 boost::shared_ptr<ViewportController> controller = boost::make_shared<ViewportController>( |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
185 undoStack, boost::ref(broker)); |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
186 PrepareScene(controller); |
849 | 187 |
879 | 188 boost::shared_ptr<OrthancStone::Scene2DInteractor> interactor(new BasicScene2DInteractor(controller)); |
189 window.GetOpenGlWidget().SetInteractor(interactor); | |
190 | |
849 | 191 QOpenGLContext * context = new QOpenGLContext; |
192 context->setFormat( requestedFormat ); | |
193 context->create(); | |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
194 context->makeCurrent(window.GetOpenGlWidget().context()->surface()); |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
195 |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
196 boost::shared_ptr<OpenGLCompositor> compositor = boost::make_shared<OpenGLCompositor>(window.GetOpenGlWidget(), *controller->GetScene()); |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
197 compositor->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
198 FONT_SIZE, Orthanc::Encoding_Latin1); |
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
199 |
883 | 200 interactor->SetCompositor(compositor); |
863
23701fbf228e
first rendering of a 2DScene in Qt widget
Alain Mazy <alain@mazy.be>
parents:
849
diff
changeset
|
201 window.GetOpenGlWidget().SetCompositor(compositor); |
849 | 202 |
203 return a.exec(); | |
204 } | |
205 } |