Mercurial > hg > orthanc-stone
annotate Samples/Sdl/BasicScene.cpp @ 885:56e4e9281076 am-dev
sharing code between Qt/SDL BasiceScene sample
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Tue, 09 Jul 2019 16:44:25 +0200 |
parents | 31319fe867b9 |
children | 9c2f6d6b9f4a |
rev | line source |
---|---|
600 | 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 | |
22 // From Stone | |
23 #include "../../Applications/Sdl/SdlOpenGLWindow.h" | |
24 #include "../../Framework/Scene2D/OpenGLCompositor.h" | |
858
e3c56d4f863f
GuiAdapter : mouse event routing in SDL + split the undo stack from the
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
25 #include "../../Framework/Scene2DViewport/UndoStack.h" |
610
0c4c0693b97c
OrthancStone::StoneInitialize()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
607
diff
changeset
|
26 #include "../../Framework/StoneInitialization.h" |
654
462a5074f914
Turned the scene into an observable to be able to dynamically react to
Benjamin Golinvaux <bgo@osimis.io>
parents:
617
diff
changeset
|
27 #include "../../Framework/Messages/MessageBroker.h" |
600 | 28 |
29 // From Orthanc framework | |
30 #include <Core/Logging.h> | |
31 #include <Core/OrthancException.h> | |
32 | |
720
f2ee003ba955
Switch to make_shared in various places
Benjamin Golinvaux <bgo@osimis.io>
parents:
706
diff
changeset
|
33 #include <boost/make_shared.hpp> |
f2ee003ba955
Switch to make_shared in various places
Benjamin Golinvaux <bgo@osimis.io>
parents:
706
diff
changeset
|
34 #include <boost/ref.hpp> |
f2ee003ba955
Switch to make_shared in various places
Benjamin Golinvaux <bgo@osimis.io>
parents:
706
diff
changeset
|
35 |
600 | 36 #include <SDL.h> |
37 #include <stdio.h> | |
38 | |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
39 |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
40 #include "../Shared/SharedBasicScene.h" |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
41 |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
42 using namespace OrthancStone; |
600 | 43 |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
44 boost::shared_ptr<BasicScene2DInteractor> interactor; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
45 |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
46 void HandleApplicationEvent(boost::shared_ptr<OrthancStone::ViewportController> controller, |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
47 const OrthancStone::OpenGLCompositor& compositor, |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
48 const SDL_Event& event) |
600 | 49 { |
818
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
804
diff
changeset
|
50 using namespace OrthancStone; |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
654
diff
changeset
|
51 Scene2D& scene(*controller->GetScene()); |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
52 if (event.type == SDL_MOUSEBUTTONDOWN || event.type == SDL_MOUSEBUTTONUP || event.type == SDL_MOUSEMOTION) |
600 | 53 { |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
54 // TODO: this code is copy/pasted from GuiAdapter::Run() -> find the right place |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
55 int scancodeCount = 0; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
56 const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
57 bool ctrlPressed(false); |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
58 bool shiftPressed(false); |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
59 bool altPressed(false); |
600 | 60 |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
61 if (SDL_SCANCODE_LCTRL < scancodeCount && keyboardState[SDL_SCANCODE_LCTRL]) |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
62 ctrlPressed = true; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
63 if (SDL_SCANCODE_RCTRL < scancodeCount && keyboardState[SDL_SCANCODE_RCTRL]) |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
64 ctrlPressed = true; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
65 if (SDL_SCANCODE_LSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_LSHIFT]) |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
66 shiftPressed = true; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
67 if (SDL_SCANCODE_RSHIFT < scancodeCount && keyboardState[SDL_SCANCODE_RSHIFT]) |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
68 shiftPressed = true; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
69 if (SDL_SCANCODE_LALT < scancodeCount && keyboardState[SDL_SCANCODE_LALT]) |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
70 altPressed = true; |
600 | 71 |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
72 GuiAdapterMouseEvent guiEvent; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
73 ConvertFromPlatform(guiEvent, ctrlPressed, shiftPressed, altPressed, event); |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
74 PointerEvent pointerEvent; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
75 pointerEvent.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); |
600 | 76 |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
77 interactor->OnMouseEvent(guiEvent, pointerEvent); |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
78 return; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
79 } |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
80 else if ((event.type == SDL_KEYDOWN || event.type == SDL_KEYUP) && event.key.repeat == 0 /* Ignore key bounce */) |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
81 { |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
82 GuiAdapterKeyboardEvent guiEvent; |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
83 ConvertFromPlatform(guiEvent, event); |
600 | 84 |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
85 interactor->OnKeyboardEvent(guiEvent); |
600 | 86 } |
87 | |
88 } | |
89 | |
90 | |
91 static void GLAPIENTRY | |
92 OpenGLMessageCallback(GLenum source, | |
93 GLenum type, | |
94 GLuint id, | |
95 GLenum severity, | |
96 GLsizei length, | |
97 const GLchar* message, | |
98 const void* userParam ) | |
99 { | |
100 if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) | |
101 { | |
102 fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", | |
103 ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), | |
104 type, severity, message ); | |
105 } | |
106 } | |
107 | |
108 | |
818
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
804
diff
changeset
|
109 void Run(boost::shared_ptr<OrthancStone::ViewportController> controller) |
600 | 110 { |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
654
diff
changeset
|
111 SdlOpenGLWindow window("Hello", 1024, 768); |
611
e3f21a265be5
Added version directive to GLSL shader code + glew init function in sample code
Benjamin Golinvaux <bgo@osimis.io>
parents:
610
diff
changeset
|
112 |
721
af0aa0c149fa
FitContent is now wrapped by the controller (for observability)
Benjamin Golinvaux <bgo@osimis.io>
parents:
720
diff
changeset
|
113 controller->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); |
611
e3f21a265be5
Added version directive to GLSL shader code + glew init function in sample code
Benjamin Golinvaux <bgo@osimis.io>
parents:
610
diff
changeset
|
114 |
600 | 115 glEnable(GL_DEBUG_OUTPUT); |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
611
diff
changeset
|
116 glDebugMessageCallback(OpenGLMessageCallback, 0); |
600 | 117 |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
118 boost::shared_ptr<OpenGLCompositor> compositor(new OpenGLCompositor(window, *controller->GetScene())); |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
119 compositor->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
120 BASIC_SCENE_FONT_SIZE, Orthanc::Encoding_Latin1); |
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
121 interactor->SetCompositor(compositor); |
600 | 122 |
123 bool stop = false; | |
124 while (!stop) | |
125 { | |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
126 compositor->Refresh(); |
600 | 127 |
128 SDL_Event event; | |
129 while (!stop && | |
130 SDL_PollEvent(&event)) | |
131 { | |
132 if (event.type == SDL_QUIT) | |
133 { | |
134 stop = true; | |
135 break; | |
136 } | |
137 else if (event.type == SDL_WINDOWEVENT && | |
138 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) | |
139 { | |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
140 compositor->UpdateSize(); |
600 | 141 } |
142 else if (event.type == SDL_KEYDOWN && | |
143 event.key.repeat == 0 /* Ignore key bounce */) | |
144 { | |
145 switch (event.key.keysym.sym) | |
146 { | |
147 case SDLK_f: | |
148 window.GetWindow().ToggleMaximize(); | |
149 break; | |
150 | |
151 case SDLK_q: | |
152 stop = true; | |
153 break; | |
154 | |
155 default: | |
156 break; | |
157 } | |
158 } | |
602
03c4b998fcd0
display scene positions in the basic sample
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
600
diff
changeset
|
159 |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
160 HandleApplicationEvent(controller, *compositor, event); |
600 | 161 } |
162 | |
163 SDL_Delay(1); | |
164 } | |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
165 interactor.reset(); |
600 | 166 } |
167 | |
168 | |
607
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
169 |
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
170 |
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
171 /** |
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
172 * IMPORTANT: The full arguments to "main()" are needed for SDL on |
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
173 * Windows. Otherwise, one gets the linking error "undefined reference |
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
174 * to `SDL_main'". https://wiki.libsdl.org/FAQWindows |
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
175 **/ |
f4b37a991dac
using glew to build on Windows
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
602
diff
changeset
|
176 int main(int argc, char* argv[]) |
600 | 177 { |
818
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
804
diff
changeset
|
178 using namespace OrthancStone; |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
654
diff
changeset
|
179 StoneInitialize(); |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
611
diff
changeset
|
180 Orthanc::Logging::EnableInfoLevel(true); |
600 | 181 |
182 try | |
183 { | |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
654
diff
changeset
|
184 MessageBroker broker; |
858
e3c56d4f863f
GuiAdapter : mouse event routing in SDL + split the undo stack from the
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
185 boost::shared_ptr<UndoStack> undoStack(new UndoStack); |
818
e42b491f1fb2
Removed typedefs to shared_ptr by making them explicit. Removed using namespace
Benjamin Golinvaux <bgo@osimis.io>
parents:
804
diff
changeset
|
186 boost::shared_ptr<ViewportController> controller = boost::make_shared<ViewportController>( |
858
e3c56d4f863f
GuiAdapter : mouse event routing in SDL + split the undo stack from the
Benjamin Golinvaux <bgo@osimis.io>
parents:
818
diff
changeset
|
187 undoStack, boost::ref(broker)); |
885
56e4e9281076
sharing code between Qt/SDL BasiceScene sample
Alain Mazy <alain@mazy.be>
parents:
882
diff
changeset
|
188 interactor.reset(new BasicScene2DInteractor(controller)); |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
654
diff
changeset
|
189 PrepareScene(controller); |
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
654
diff
changeset
|
190 Run(controller); |
600 | 191 } |
192 catch (Orthanc::OrthancException& e) | |
193 { | |
194 LOG(ERROR) << "EXCEPTION: " << e.What(); | |
195 } | |
196 | |
700
059e1fd05fd6
Introduced the ViewportController that sits between the application and the
Benjamin Golinvaux <bgo@osimis.io>
parents:
654
diff
changeset
|
197 StoneFinalize(); |
600 | 198 |
199 return 0; | |
200 } |