1<?xml version="1.0" encoding="UTF-8"?>
2<!--
3Examiner Navigation Mode
4Camera navigation SCXML state machine for Coin 3.1.
5-->
6
7<scxml
8  xmlns="http://www.w3.org/2008/07/scxml"
9  version="1.0"
10  profile="x-coin"
11  name="examiner-mode"
12  initial="idle"
13  exmode="lax">
14
15  <state id="base">
16    <!-- A few "global" event transitions that work regardless of active substate. -->
17
18    <transition event="error.*"><log level="9"/></transition>
19
20    <transition event="sim.coin3d.coin.SoKeyboardEvent.DOWN.LEFT_ALT" target="interact"/>
21    <transition event="sim.coin3d.coin.SoKeyboardEvent.UP.LEFT_ALT" target="idle"/>
22
23    <transition event="sim.coin3d.coin.navigation.ViewAll">
24      <send targettype="x-coin-navigation" target="Misc"
25            event="x-coin-navigation.Misc.ViewAll" namelist="_sessionid"/>
26    </transition>
27
28    <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON2" target="contextmenurequest"/>
29
30    <transition event="sim.coin3d.coin.PopupMenuOpen" target="idle"/>
31
32    <transition event="sim.coin3d.coin.navigation.Seek" target="seek_wait"/>
33
34    <!-- ** INTERACT MODE ************************************************** -->
35    <state id="interact">
36      <!-- A "dead state".
37           Only interactive scene graph parts will react in this mode,
38           if in mixed-navigation-mode. -->
39    </state>
40
41
42    <!-- ** IDLE MODE ****************************************************** -->
43    <state id="idle">
44      <transition event="sim.coin3d.coin.SoKeyboardEvent.DOWN.S" target="seek"/>
45
46      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1" target="rotate"/>
47
48      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON3" target="pan_button_move"/>
49
50      <!-- we dolly, not zoom, for non-orthographic cameras -->
51      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON4"
52                  cond="coin:camera.getTypeId()=='OrthographicCamera'"
53                  target="zoom_step_in"/>
54      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON4"
55                  cond="coin:camera.getTypeId()!='OrthographicCamera'"
56                  target="dolly_step_in"/>
57
58      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON5"
59                  cond="coin:camera.getTypeId()=='OrthographicCamera'"
60                  target="zoom_step_out"/>
61      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON5"
62                  cond="coin:camera.getTypeId()!='OrthographicCamera'"
63                  target="dolly_step_out"/>
64
65      <transition event="sim.coin3d.coin.SoKeyboardEvent.DOWN.LEFT_SHIFT" target="pan_shift_wait"/>
66
67      <transition event="sim.coin3d.coin.SoKeyboardEvent.DOWN.LEFT_CONTROL"
68                  cond="coin:camera.getTypeId()=='OrthographicCamera'"
69                  target="zoom_ctrl_wait"/>
70      <transition event="sim.coin3d.coin.SoKeyboardEvent.DOWN.LEFT_CONTROL"
71                  cond="coin:camera.getTypeId()!='OrthographicCamera'"
72                  target="dolly_ctrl_wait"/>
73
74      <transition event="x-coin-navigation.Rotate.TRIGGER_SPIN" target="spin">
75        <assign location="coin:temp.rotation" expr="_event.rotation"/>
76        <assign location="coin:temp.from" expr="_event.from"/>
77        <send targettype="x-coin-navigation" target="Spin"
78              event="x-coin-navigation.Spin.BEGIN" namelist="_sessionid rotation from"/>
79      </transition>
80    </state>
81
82
83    <!-- ** ROTATE MODE *************************************************** -->
84    <state id="rotate" src="coin:scxml/navigation/common.xml#common_mouse_rotate">
85
86      <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON1" target="idle"/>
87
88      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON3"
89                  cond="coin:camera.getTypeId()=='OrthographicCamera'"
90                  target="zoom_buttons_move">
91        <assign location="coin:temp.mouseposition" expr="_event.getNormalizedPosition()"/>
92        <send targettype="x-coin-navigation" target="Zoom"
93              event="x-coin-navigation.Zoom.BEGIN" namelist="_sessionid mouseposition"/>
94      </transition>
95      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON3"
96                  cond="coin:camera.getTypeId()!='OrthographicCamera'"
97                  target="dolly_buttons_move">
98        <assign location="coin:temp.mouseposition" expr="_event.getNormalizedPosition()"/>
99        <send targettype="x-coin-navigation" target="Dolly"
100              event="x-coin-navigation.Dolly.BEGIN" namelist="_sessionid mouseposition"/>
101      </transition>
102
103    </state>
104
105    <!-- ** PAN MODE ******************************************************* -->
106    <state id="pan">
107      <state id="pan_shift_wait">
108        <transition event="sim.coin3d.coin.SoKeyboardEvent.UP.LEFT_SHIFT" target="idle"/>
109        <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1" target="pan_shift_move"/>
110      </state>
111
112      <state id="pan_shift_move"
113             src="coin:scxml/navigation/common.xml#common_mouse_pan">
114
115        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON1" target="pan_shift_wait"/>
116        <transition event="sim.coin3d.coin.SoKeyboardEvent.UP.LEFT_SHIFT" target="rotate"/>
117
118      </state>
119
120      <state id="pan_button_move"
121             src="coin:scxml/navigation/common.xml#common_mouse_pan">
122
123        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON3" target="idle"/>
124        <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1"
125                    cond="coin:camera.getTypeId()=='OrthographicCamera'"
126                    target="zoom_buttons_move"/>
127        <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1"
128                    cond="coin:camera.getTypeId()!='OrthographicCamera'"
129                    target="dolly_buttons_move"/>
130      </state>
131    </state>
132
133
134    <!-- ** SPIN MODE ****************************************************** -->
135    <state id="spin">
136      <onentry>
137        <send targettype="x-coin-navigation" target="Misc"
138              event="x-coin-navigation.Misc.Redraw"/>
139      </onentry>
140      <onexit>
141        <send targettype="x-coin-navigation" target="Spin"
142              event="x-coin-navigation.Spin.END"/>
143      </onexit>
144
145      <transition event="sim.coin3d.coin.GLRender.POST_RENDER">
146        <send targettype="x-coin-navigation" target="Spin"
147              event="x-coin-navigation.Spin.UPDATE"/>
148      </transition>
149      <transition event="sim.coin3d.coin.GLRender.POST_RENDER">
150        <send targettype="x-coin-navigation" target="Misc"
151              event="x-coin-navigation.Misc.Redraw"/>
152      </transition>
153
154      <transition event="sim.coin3d.coin.SoKeyboardEvent.DOWN.ESCAPE" target="idle"/>
155
156      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1" target="rotate"/>
157      <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON3" target="pan_button_move"/>
158    </state>
159
160
161    <!-- ** ZOOM MODE ****************************************************** -->
162    <state id="zoom">
163
164      <state id="zoom_ctrl_wait">
165        <transition event="sim.coin3d.coin.SoKeyboardEvent.UP.LEFT_CONTROL" target="idle"/>
166        <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1" target="zoom_ctrl_move"/>
167      </state>
168
169      <state id="zoom_ctrl_move"
170             src="coin:scxml/navigation/common.xml#common_mouse_zoom">
171        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON1" target="zoom_ctrl_wait"/>
172        <transition event="sim.coin3d.coin.SoKeyboardEvent.UP.LEFT_CONTROL" target="rotate"/>
173      </state>
174
175      <state id="zoom_buttons_move"
176             src="coin:scxml/navigation/common.xml#common_mouse_zoom">
177        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON3" target="rotate"/>
178        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON1" target="pan_button_move"/>
179      </state>
180
181      <state id="zoom_step">
182        <transition event="zoom_step_in_container.done" target="idle"/>
183        <transition event="zoom_step_out_container.done" target="idle"/>
184
185        <state id="zoom_step_in_container">
186          <onentry>
187            <send targettype="x-coin-navigation" target="Zoom"
188                  event="x-coin-navigation.Zoom.ZOOM_IN" namelist="_sessionid"/>
189          </onentry>
190          <final id="zoom_step_in"/>
191        </state>
192
193        <state id="zoom_step_out_container">
194          <onentry>
195            <send targettype="x-coin-navigation" target="Zoom"
196                  event="x-coin-navigation.Zoom.ZOOM_OUT" namelist="_sessionid"/>
197          </onentry>
198          <final id="zoom_step_out"/>
199        </state>
200      </state>
201    </state>
202
203
204    <!-- ** DOLLY MODE ***************************************************** -->
205    <state id="dolly">
206
207      <state id="dolly_ctrl_wait">
208        <transition event="sim.coin3d.coin.SoKeyboardEvent.UP.LEFT_CONTROL" target="idle"/>
209        <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1" target="dolly_ctrl_move"/>
210      </state>
211
212      <state id="dolly_ctrl_move"
213             src="coin:scxml/navigation/common.xml#common_mouse_dolly">
214        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON1" target="dolly_ctrl_wait"/>
215        <transition event="sim.coin3d.coin.SoKeyboardEvent.UP.LEFT_CONTROL" target="rotate"/>
216      </state>
217
218      <state id="dolly_buttons_move"
219             src="coin:scxml/navigation/common.xml#common_mouse_dolly">
220        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON3" target="rotate"/>
221        <transition event="sim.coin3d.coin.SoMouseButtonEvent.UP.BUTTON1" target="pan_button_move"/>
222      </state>
223
224      <state id="dolly_step">
225        <transition event="dolly_step_in_container.done" target="idle"/>
226        <transition event="dolly_step_out_container.done" target="idle"/>
227
228        <state id="dolly_step_in_container">
229          <onentry>
230            <assign location="coin:temp.absminfocaldistance" expr="2.0"/>
231            <assign location="coin:temp.motiontype" expr="'linear'"/>
232            <send targettype="x-coin-navigation" target="Dolly"
233                  event="x-coin-navigation.Dolly.STEP_IN" namelist="_sessionid absminfocaldistance motiontype"/>
234          </onentry>
235          <final id="dolly_step_in"/>
236        </state>
237
238        <state id="dolly_step_out_container">
239          <onentry>
240            <assign location="coin:temp.absmaxfocaldistance" expr="20.0"/>
241            <assign location="coin:temp.motiontype" expr="'linear'"/>
242            <send targettype="x-coin-navigation" target="Dolly"
243                  event="x-coin-navigation.Dolly.STEP_OUT" namelist="_sessionid absmaxfocaldistance motiontype"/>
244          </onentry>
245          <final id="dolly_step_out"/>
246        </state>
247      </state>
248    </state>
249
250
251    <!-- ** SEEK MODE ****************************************************** -->
252    <state id="seek">
253      <initial id="seek_initial"><transition target="seek_wait"/></initial>
254      <transition event="seek.done" target="idle"/>
255      <state id="seek_wait">
256        <transition event="sim.coin3d.coin.SoKeyboardEvent.DOWN.S" target="idle"/>
257        <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1" target="seek_move">
258          <assign location="coin:temp.mouseposition" expr="_event.getNormalizedPosition()"/>
259          <send targettype="x-coin-navigation" target="Seek"
260                event="x-coin-navigation.Seek.BEGIN" namelist="_sessionid mouseposition"/>
261        </transition>
262      </state>
263
264      <state id="seek_move">
265        <onentry>
266          <send targettype="x-coin-navigation" target="Misc"
267                event="x-coin-navigation.Misc.Redraw"/>
268        </onentry>
269
270        <transition event="sim.coin3d.coin.GLRender.POST_RENDER">
271          <send targettype="x-coin-navigation" target="Seek"
272                event="x-coin-navigation.Seek.UPDATE"/>
273        </transition>
274        <transition event="sim.coin3d.coin.GLRender.POST_RENDER">
275          <send targettype="x-coin-navigation" target="Misc"
276                event="x-coin-navigation.Misc.Redraw" namelist="_sessionid"/>
277        </transition>
278        <transition event="sim.coin3d.coin.SoMouseButtonEvent.DOWN.BUTTON1" target="seek_move">
279          <assign location="coin:temp.mouseposition" expr="_event.getNormalizedPosition()"/>
280          <send targettype="x-coin-navigation" target="Seek"
281                event="x-coin-navigation.Seek.END" namelist="_sessionid"/>
282          <send targettype="x-coin-navigation" target="Seek"
283                event="x-coin-navigation.Seek.BEGIN" namelist="_sessionid mouseposition"/>
284        </transition>
285        <transition event="x-coin-navigation.Seek.DONE" target="seek_done">
286          <send targettype="x-coin-navigation" target="Seek"
287                event="x-coin-navigation.Seek.END" namelist="_sessionid"/>
288        </transition>
289        <transition event="x-coin-navigation.Seek.MISS" target="seek_done">
290          <send targettype="x-coin-navigation" target="Seek"
291                event="x-coin-navigation.Seek.END" namelist="_sessionid"/>
292        </transition>
293      </state>
294      <final id="seek_done"/>
295    </state>
296
297
298    <!-- hook state(s) -->
299    <state id="contextmenurequest">
300      <transition target="idle"/>
301    </state>
302
303  </state>
304
305  <final id="exit"/> <!-- the buck can stop here -->
306</scxml>
307