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