webvr.xml 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  1. <krpano>
  2. <!-- load the WebVR plugin and assign it to a 'webvr' variable for easier usage -->
  3. <plugin name="WebVR" devices="html5" keep="true"
  4. url="webvr.js"
  5. onloaded="copy(webvr, plugin[WebVR]);"
  6. mousespeed="0.00125"
  7. mobilevr_support="true"
  8. mobilevr_ipd="63.5"
  9. mobilevr_screensize="auto"
  10. mobilevr_lens_fov="96"
  11. mobilevr_lens_dist="0.6"
  12. mobilevr_lens_vign="100"
  13. mobilevr_lens_overlap="1.0"
  14. mobilevr_webvr_dist="false"
  15. mobilevr_sensor_mode="3"
  16. mobilevr_fake_support="false"
  17. vr_cursor="hotspot[vr_cursor]"
  18. vr_cursor_onover="if(handcursor, tween(hotspot[vr_cursor].scale,0.4,0.1); vr_auto_click(get(vr_timeout)); );"
  19. vr_cursor_onout="tween(hotspot[vr_cursor].scale,0.3,0.1);"
  20. onavailable="webvr_onavailable();"
  21. onunavailable=""
  22. onunknowndevice="set(ask_user_for_screensize,true);"
  23. onentervr="webvr_onentervr();"
  24. onexitvr="webvr_onexitvr();"
  25. />
  26. <!-- a custom xml data structure with the supported VR headsets -->
  27. <vrheadsets>
  28. <headset name="cb1" caption="Cardboard A" fov="96.0" dist="1.00" vig="100" overlap="1.1" />
  29. <headset name="cb2" caption="Cardboard B" fov="96.0" dist="0.60" vig="100" overlap="1.0" />
  30. <headset name="gvr" caption="GearVR" fov="112.0" dist="0.95" vig="100" overlap="1.0" />
  31. <headset name="one" caption="VR ONE" fov="179.0" dist="5.00" vig="53" overlap="1.0" />
  32. <headset name="hom" caption="HOMiDO" fov="101.0" dist="1.10" vig="70" overlap="1.0" />
  33. <headset name="ccr" caption="ColorCross VR" fov="70.0" dist="0.65" vig="100" overlap="1.0" />
  34. </vrheadsets>
  35. <!-- the VR cursor hotspot -->
  36. <hotspot name="vr_cursor" keep="true"
  37. url="webvr_cursor_80x80_17f.png"
  38. visible="false"
  39. enabled="false"
  40. distorted="true"
  41. crop="0|0|80|80"
  42. scale="0.3"
  43. depth="1000"
  44. />
  45. <!-- vr_auto_click() - call this action in the onover event of a
  46. hotspot to trigger automatically a click after some time. -->
  47. <action name="vr_auto_click">
  48. if(webvr.isenabled,
  49. if(%1 != null, set(vr_aclk_timeout, %1), set(vr_aclk_timeout, 2000));
  50. copy(vr_aclk_t1, timertick);
  51. set(vr_aclk_waiting, true);
  52. set(hotspot[vr_cursor].crop,'0|0|80|80');
  53. asyncloop(vr_aclk_waiting,
  54. sub(dt, timertick,vr_aclk_t1);
  55. if(!hovering,
  56. set(vr_aclk_waiting, false);
  57. set(hotspot[vr_cursor].crop,'0|0|80|80');
  58. ,
  59. div(f, dt, vr_aclk_timeout);
  60. mul(f, 16);
  61. roundval(f);
  62. Math.min(f, 16);
  63. mul(f, 80);
  64. txtadd(hotspot[vr_cursor].crop,get(f),'|0|80|80');
  65. <!-- wait another 100ms delay after finishing the animation before doing the click -->
  66. sub(dt, 100);
  67. if(dt GT vr_aclk_timeout,
  68. set(vr_aclk_waiting,false);
  69. set(hotspot[vr_cursor].crop,'0|0|80|80');
  70. <!-- call onclick -->
  71. onclick();
  72. );
  73. );
  74. );
  75. );
  76. </action>
  77. <!-- by pressing SPACE the Oculus Rift could be re-centered -->
  78. <events name="webvr_events" devices="html5" keep="true"
  79. onkeydown="if(keycode==32, webvr.resetSensor(0) );"
  80. onmousedown="if(webvr AND webvr.isenabled, webvr_showbuttons() );"
  81. />
  82. <!-- when WebVR support is available show an EnterVR button loadsettings();-->
  83. <action name="webvr_onavailable">
  84. delayedcall(0.5, tween(layer[webvr_enterbutton].alpha,1.0); );
  85. </action>
  86. <action name="webvr_onentervr">
  87. tween(layer[webvr_enterbutton].alpha,0,0);
  88. webvr_showbuttons();
  89. webvr_hide_all_non_vr_layers();
  90. <!-- when vr_setup(); the screen size is unknown an no custom size is set, open the setup screen on entering the VR mode -->
  91. if(webvr.ismobilevr == true AND !webvr.isfake AND ask_user_for_screensize == true AND webvr.mobilevr_screensize == 'auto',
  92. set(ask_user_for_screensize, false);
  93. );
  94. </action>
  95. <action name="webvr_onexitvr">
  96. stopdelayedcall(vr_button_fadeout);
  97. tween(layer[webvr_enterbutton].alpha,1);
  98. tween(layer[webvr_exitbutton].alpha,0);
  99. tween(layer[webvr_setupbutton].alpha,0);
  100. webvr_restore_layers();
  101. </action>
  102. <action name="webvr_hide_all_non_vr_layers">
  103. for(set(i,0), i LT layer.count, inc(i),
  104. copy(lr, layer[get(i)]);
  105. if(lr.vr !== true,
  106. copy(lr.vr_backup_visible, lr.visible);
  107. set(lr.visible, false);
  108. );
  109. );
  110. </action>
  111. <action name="webvr_restore_layers">
  112. for(set(i,0), i LT layer.count, inc(i),
  113. copy(lr, layer[get(i)]);
  114. if(lr.vr_backup_visible,
  115. copy(lr.visible, lr.vr_backup_visible);
  116. delete(lr.vr_backup_visible);
  117. );
  118. );
  119. </action>
  120. <!-- ensure the same scaling on mobiles (regardless if mobilescale is 0.5 or 1.0) -->
  121. <krpano webvr_setup_scale="calc:(1.0 + 1.0*(device.mobile AND stagescale LT 1.0)) / (1.0 + 1.0*device.mobile)"
  122. webvr_button_scale.normal="1.0"
  123. webvr_button_scale.mobile="1.6"
  124. />
  125. <!-- the EnterVR/ExitVR and SetupVR buttons -->
  126. <style name="webvr_button_style"
  127. url="%SWFPATH%/plugins/textfield.swf"
  128. backgroundcolor="0x000000"
  129. backgroundalpha="0.5"
  130. roundedge="calc:9*webvr_setup_scale*webvr_button_scale"
  131. css="calc:'color:#FFFFFF;font-size:' + 20*webvr_setup_scale*webvr_button_scale + 'px;'"
  132. padding="calc:6*webvr_setup_scale*webvr_button_scale + ' ' + 10*webvr_setup_scale*webvr_button_scale"
  133. />
  134. <layer name="webvr_enterbutton" keep="true" vr="true"
  135. style="webvr_button_style"
  136. html="启动 VR"
  137. align="top" y="24"
  138. autoalpha="true" alpha="0.0"
  139. onclick="webvr.enterVR();"
  140. />
  141. <layer name="webvr_exitbutton" keep="true" vr="true"
  142. style="webvr_button_style"
  143. html="退出"
  144. align="top" y="24"
  145. autoalpha="true" alpha="0.0"
  146. onclick="webvr.exitVR();"
  147. />
  148. <layer name="webvr_setupbutton" keep="true" vr="true"
  149. style="webvr_button_style"
  150. html="设置"
  151. align="bottom" y="24"
  152. autoalpha="true" alpha="0.0"
  153. onclick="vr_setup()"
  154. />
  155. <action name="webvr_showbuttons">
  156. stopdelayedcall(vr_button_fadeout);
  157. if(webvr.ismobilevr,
  158. tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 1.0|1.0, 0.25);
  159. ,
  160. tween(layer[webvr_exitbutton].alpha, 1.0, 0.25);
  161. );
  162. </action>
  163. <action name="webvr_showbuttons2">
  164. stopdelayedcall(vr_button_fadeout);
  165. if(webvr.ismobilevr,
  166. tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 1.0|1.0, 0.25);
  167. delayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 0.0|0.0, 1.0); );
  168. ,
  169. tween(layer[webvr_exitbutton].alpha, 1.0, 0.25);
  170. delayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha, 0.0, 1.0); );
  171. );
  172. </action>
  173. <!--
  174. VR Setup
  175. -->
  176. <action name="vr_setup">
  177. <!-- disable cursor -->
  178. set(webvr.vr_cursor_enabled, false);
  179. <!-- hide VR buttons -->
  180. tween(layer[webvr_exitbutton].alpha,0);
  181. tween(layer[webvr_setupbutton].alpha,0);
  182. <!-- create background layer -->
  183. addlayer(vr_setup_bg);
  184. set(layer[vr_setup_bg].type, container);
  185. set(layer[vr_setup_bg].bgcolor, 0x000000);
  186. set(layer[vr_setup_bg].bgalpha, 0.5);
  187. set(layer[vr_setup_bg].bgcapture, true);
  188. set(layer[vr_setup_bg].handcursor, false);
  189. set(layer[vr_setup_bg].align, lefttop);
  190. set(layer[vr_setup_bg].width, 100%);
  191. set(layer[vr_setup_bg].height, 100%);
  192. set(layer[vr_setup_bg].zorder, 99999);
  193. <!-- get and prepare device infos and settings -->
  194. copy(i_screensize, webvr.mobilevr_screensize);
  195. if(i_screensize == 'auto', copy(i_screensize, webvr.devicesize));
  196. if(i_screensize LE 0, set(i_screensize, 5.0));
  197. roundval(i_screensize, 1);
  198. txtadd(i_screensize, ' inch');
  199. copy(i_ipd, webvr.mobilevr_ipd);
  200. roundval(i_ipd, 1);
  201. txtadd(i_ipd, ' mm');
  202. copy(i_fov, webvr.mobilevr_lens_fov);
  203. roundval(i_fov, 0);
  204. copy(i_dist, webvr.mobilevr_lens_dist);
  205. roundval(i_dist, 2);
  206. copy(i_vig, webvr.mobilevr_lens_vign);
  207. roundval(i_vig, 0);
  208. copy(i_overlap, webvr.mobilevr_lens_overlap);
  209. roundval(i_overlap, 2);
  210. set(i_headset, 'Custom');
  211. for(set(i,0), i LT vrheadsets.headset.count, inc(i),
  212. copy(hs, vrheadsets.headset[get(i)]);
  213. if(i_fov == hs.fov AND i_dist == hs.dist AND i_vig == hs.vig AND i_overlap == hs.overlap, copy(i_headset, hs.caption));
  214. );
  215. <!-- when the screen size is unknown, mark it red -->
  216. set(known_size, true);
  217. set(sizcol, #FFFFFF);
  218. copy(i_devicename, webvr.devicename);
  219. if(i_devicename == 'Unknown',
  220. if(webvr.mobilevr_screensize == 'auto',
  221. set(sizcol, #AA0000);
  222. set(known_size, false);
  223. ,
  224. set(i_devicename, 'Custom');
  225. );
  226. );
  227. <!-- create layer for the main menu -->
  228. addlayer(vr_setup_m1);
  229. set(layer[vr_setup_m1].type, container);
  230. set(layer[vr_setup_m1].parent, vr_setup_bg);
  231. set(layer[vr_setup_m1].align, lefttop);
  232. set(layer[vr_setup_m1].width, 100%);
  233. set(layer[vr_setup_m1].height, 100%);
  234. <!-- create layer for the headset customization menu -->
  235. addlayer(vr_setup_m3);
  236. set(layer[vr_setup_m3].type, container);
  237. set(layer[vr_setup_m3].parent, vr_setup_bg);
  238. set(layer[vr_setup_m3].align, lefttop);
  239. set(layer[vr_setup_m3].width, 100%);
  240. set(layer[vr_setup_m3].height, 100%);
  241. set(layer[vr_setup_m3].visible, false);
  242. <!-- create layer for the calibration menu -->
  243. addlayer(vr_setup_m2);
  244. set(layer[vr_setup_m2].type, container);
  245. set(layer[vr_setup_m2].parent, vr_setup_bg);
  246. set(layer[vr_setup_m2].align, lefttop);
  247. set(layer[vr_setup_m2].width, 100%);
  248. set(layer[vr_setup_m2].height, 100%);
  249. set(layer[vr_setup_m2].visible, false);
  250. <!-- create the text elements -->
  251. set(vr_setup_text_parent, 'vr_setup_m1');
  252. vr_setup_createtext(vr_setup_title, 'VR SETUP', center, center, 0, -225, #FFFFFF, false);
  253. vr_setup_createtext(vr_setup_dvn1, 'Device:', center, right, 0, -145, #FFFFFF, true, vr_setup_select('screen') );
  254. vr_setup_createtext(vr_setup_dvn2, get(i_devicename), center, left, 0, -145, get(sizcol), true, vr_setup_select('screen') );
  255. vr_setup_createtext(vr_setup_siz1, 'Screensize:', center, right, 0, -105, #FFFFFF, true, vr_setup_select('screen') );
  256. vr_setup_createtext(vr_setup_siz2, get(i_screensize), center, left, 0, -105, get(sizcol), true, vr_setup_select('screen') );
  257. vr_setup_createtext(vr_setup_ipd1, 'IPD:', center, right, 0, -35, #FFFFFF, true, vr_setup_select('ipd') );
  258. vr_setup_createtext(vr_setup_ipd2, get(i_ipd), center, left, 0, -35, #FFFFFF, true, vr_setup_select('ipd') );
  259. vr_setup_createtext(vr_setup_hmd1, 'VR Headset:', center, right, 0, +35, #FFFFFF, true, vr_setup_select('headset') );
  260. vr_setup_createtext(vr_setup_hmd2, get(i_headset), center, left, 0, +35, #FFFFFF, true, vr_setup_select('headset') );
  261. vr_setup_createtext(vr_setup_hmd3, 'Customize', center, center, 0, +75, #FFFFFF, true, set(background,true), set(background,false), vr_setup_customize_headset() );
  262. if(webvr.iswebvr == false,
  263. vr_setup_createtext(vr_setup_cal, 'Calibrate Gyroscope', center, center, 0, +145, #FFFFFF, true, set(background,true), set(background,false), vr_setup_calibration() );
  264. );
  265. vr_setup_createtext(vr_setup_sav, 'SAVE', center, center, -200, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_save() );
  266. vr_setup_createtext(vr_setup_rst, 'RESET', center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_reset() );
  267. vr_setup_createtext(vr_setup_cls, 'CLOSE', center, center, +200, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close() );
  268. <!-- and the adjusting buttons -->
  269. vr_setup_createbutton(vr_setup_btn1, '&#60;', left, left, 5%, -35, #FFFFFF, true, null);
  270. vr_setup_createbutton(vr_setup_btn2, '&#62;', right, right, 5%, -35, #FFFFFF, true, null);
  271. <!-- create the customize_headset text elements -->
  272. set(vr_setup_text_parent, 'vr_setup_m3');
  273. vr_setup_createtext(vr_setup_m31, 'VR HEADSET', center, center, 0, -225, #FFFFFF, false);
  274. vr_setup_createtext(vr_setup_fov1, 'FOV:', center, right, 0, -42, #FFFFFF, true, vr_setup_select('fov') );
  275. vr_setup_createtext(vr_setup_fov2, get(i_fov), center, left, 0, -42, #FFFFFF, true, vr_setup_select('fov') );
  276. vr_setup_createtext(vr_setup_dst1, 'Distortion:', center, right, 0, +6, #FFFFFF, true, vr_setup_select('dist') );
  277. vr_setup_createtext(vr_setup_dst2, get(i_dist), center, left, 0, +6, #FFFFFF, true, vr_setup_select('dist') );
  278. vr_setup_createtext(vr_setup_vig1, 'Vignette:', center, right, 0, +54, #FFFFFF, true, vr_setup_select('vignette') );
  279. vr_setup_createtext(vr_setup_vig2, get(i_vig), center, left, 0, +54, #FFFFFF, true, vr_setup_select('vignette') );
  280. vr_setup_createtext(vr_setup_olp1, 'Overlap:', center, right, 0, +102, #FFFFFF, true, vr_setup_select('overlap') );
  281. vr_setup_createtext(vr_setup_olp2, get(i_overlap), center, left, 0, +102, #FFFFFF, true, vr_setup_select('overlap') );
  282. vr_setup_createtext(vr_setup_m35, 'CLOSE', center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
  283. <!-- create the calibration text elements -->
  284. set(vr_setup_text_parent, 'vr_setup_m2');
  285. vr_setup_createtext(vr_setup_cb1, 'GYROSCOPE', center, center, 0, -225, #FFFFFF, false);
  286. vr_setup_createtext(vr_setup_cb2, 'Place the device on a flat and[br]stable surface and tab calibrate[br]to correct a gyroscope drifting.', center, center, 0, -95, #FFFFFF, false, vr_setup_select('screen') );
  287. vr_setup_createtext(vr_setup_cb3, 'CALIBRATE', center, center, 0, +55, #FFFFFF, true, set(background,true), set(background,false), vr_setup_do_calibration() );
  288. vr_setup_createtext(vr_setup_cb4, 'RESET', center, center, 0, +125, #FFFFFF, true, set(background,true), set(background,false), webvr.resetcalibration() );
  289. vr_setup_createtext(vr_setup_cb5, 'CLOSE', center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
  290. vr_setup_createtext(vr_setup_cb6, 'Calibrating...', bottom, center, 0, 40, #FFFFFF, false, null );
  291. vr_setup_createtext(vr_setup_cb7, 'Calibration okay.', bottom, center, 0, 40, #FFFFFF, false, null );
  292. vr_setup_createtext(vr_setup_cb8, 'Calibration failed!', bottom, center, 0, 40, #FFFFFF, false, null );
  293. set(layer[vr_setup_cb6].autoalpha, true);
  294. set(layer[vr_setup_cb7].autoalpha, true);
  295. set(layer[vr_setup_cb8].autoalpha, true);
  296. set(layer[vr_setup_cb6].alpha, 0.0);
  297. set(layer[vr_setup_cb7].alpha, 0.0);
  298. set(layer[vr_setup_cb8].alpha, 0.0);
  299. <!-- pre-select the screen size for adjusting when it is unknown, otherwise the IPD -->
  300. if(known_size == false,
  301. vr_setup_select('screen', true);
  302. ,
  303. vr_setup_select('ipd', true);
  304. );
  305. </action>
  306. <action name="vr_setup_createtext">
  307. <!--
  308. %1 = name
  309. %2 = text
  310. %3 = align
  311. %4 = edge
  312. %5 = x
  313. %6 = y
  314. %7 = color
  315. %8 = enabled
  316. %9 = ondown
  317. %10 = onup
  318. %11 = onclick
  319. -->
  320. addlayer(%1);
  321. set(layer[%1].parent, get(vr_setup_text_parent));
  322. set(layer[%1].url, '%SWFPATH%/plugins/textfield.swf');
  323. set(layer[%1].css, calc('text-align:%3;color:%7;font-size:'+40*webvr_setup_scale+'px;font-weight:bold;'));
  324. set(layer[%1].padding, calc(0 + ' ' + 8*webvr_setup_scale));
  325. set(layer[%1].roundedge, calc(8*webvr_setup_scale));
  326. set(layer[%1].background, false);
  327. set(layer[%1].backgroundcolor, 0xFFFFFF);
  328. set(layer[%1].backgroundalpha, 0.25);
  329. set(layer[%1].align, %3);
  330. set(layer[%1].edge, %4);
  331. set(layer[%1].x, calc(%5 * webvr_setup_scale));
  332. set(layer[%1].y, calc(%6 * webvr_setup_scale));
  333. set(layer[%1].html, %2);
  334. set(layer[%1].enabled, %8);
  335. set(layer[%1].ondown, %9);
  336. set(layer[%1].onup, %10);
  337. set(layer[%1].onclick, %11);
  338. </action>
  339. <action name="vr_setup_createbutton">
  340. vr_setup_createtext(%1,%2,%3,%4,%5,%6,%7,%8,%9);
  341. set(layer[%1].css, calc('vertical-align:middle;text-align:center;color:%7;font-size:'+60*webvr_setup_scale+'px;font-weight:bold;'));
  342. set(layer[%1].background, true);
  343. set(layer[%1].padding, 0);
  344. set(layer[%1].roundedge, calc(40 * webvr_setup_scale));
  345. set(layer[%1].width, calc(70 * webvr_setup_scale));
  346. set(layer[%1].height, calc(70 * webvr_setup_scale));
  347. set(layer[%1].vcenter, true);
  348. </action>
  349. <action name="vr_setup_reset">
  350. <!-- reset to the defaults -->
  351. set(webvr.mobilevr_screensize, 'auto');
  352. copy(i_screensize, webvr.devicesize);
  353. if(i_screensize LE 0, set(i_screensize, 5.0));
  354. roundval(i_screensize, 1);
  355. set(layer[vr_setup_dvn2].html, get(webvr.devicename));
  356. txtadd(layer[vr_setup_siz2].html, get(i_screensize), ' inch');
  357. set(webvr.mobilevr_ipd, 63.5);
  358. copy(i_ipd, webvr.mobilevr_ipd);
  359. roundval(i_ipd, 1);
  360. txtadd(layer[vr_setup_ipd2].html, get(i_ipd), ' mm');
  361. <!-- set fake custom lens settings and call 'next' headset to switch to the default 'Cardboard' settings -->
  362. set(webvr.mobilevr_lens_fov, 100);
  363. set(webvr.mobilevr_lens_dist, 0.5);
  364. set(webvr.mobilevr_lens_vign, 100);
  365. set(webvr.mobilevr_lens_overlap, 1.0);
  366. vr_setup_change_headset(+1);
  367. vr_setup_select(get(selected_var));
  368. </action>
  369. <action name="vr_setup_close">
  370. <!-- 2. parameter == true => remove children elements too -->
  371. removelayer(vr_setup_bg, true);
  372. <!-- enable cursor -->
  373. set(webvr.vr_cursor_enabled, true);
  374. </action>
  375. <!-- webvr.saveSettings(); -->
  376. <action name="vr_setup_save">
  377. vr_setup_close();
  378. </action>
  379. <action name="vr_setup_customize_headset">
  380. set(layer[vr_setup_m1].visible,false);
  381. set(layer[vr_setup_m2].visible,false);
  382. set(layer[vr_setup_m3].visible,true);
  383. set(layer[vr_setup_hmd1].parent, vr_setup_m3);
  384. set(layer[vr_setup_hmd2].parent, vr_setup_m3);
  385. set(layer[vr_setup_btn1].parent, vr_setup_m3);
  386. set(layer[vr_setup_btn2].parent, vr_setup_m3);
  387. set(layer[vr_setup_hmd1].y, calc(-145 * webvr_setup_scale));
  388. set(layer[vr_setup_hmd2].y, calc(-145 * webvr_setup_scale));
  389. copy(old_selection, selected_var);
  390. vr_setup_select('headset');
  391. </action>
  392. <action name="vr_setup_calibration">
  393. set(layer[vr_setup_m1].visible,false);
  394. set(layer[vr_setup_m2].visible,true);
  395. </action>
  396. <action name="vr_setup_close_sub_menus">
  397. set(layer[vr_setup_m1].visible,true);
  398. set(layer[vr_setup_m2].visible,false);
  399. set(layer[vr_setup_m3].visible,false);
  400. set(layer[vr_setup_hmd1].parent, vr_setup_m1);
  401. set(layer[vr_setup_hmd2].parent, vr_setup_m1);
  402. set(layer[vr_setup_btn1].parent, vr_setup_m1);
  403. set(layer[vr_setup_btn2].parent, vr_setup_m1);
  404. set(layer[vr_setup_hmd1].y, calc(+35 * webvr_setup_scale));
  405. set(layer[vr_setup_hmd2].y, calc(+35 * webvr_setup_scale));
  406. if(old_selection,
  407. vr_setup_select(get(old_selection));
  408. delete(old_selection);
  409. );
  410. </action>
  411. <action name="vr_setup_do_calibration">
  412. if(!webvr.isfake,
  413. tween(layer[vr_setup_cb6].alpha, 1.0, 0.1);
  414. tween(layer[vr_setup_cb7].alpha, 0.0, 0.1);
  415. tween(layer[vr_setup_cb8].alpha, 0.0, 0.1);
  416. webvr.calibrate(
  417. tween(layer[vr_setup_cb6].alpha, 0.0, 0.1);
  418. tween(layer[vr_setup_cb7].alpha, 1.0, 0.1);
  419. delayedcall(2.0, tween(layer[vr_setup_cb7].alpha, 0.0, 0.25) );
  420. ,
  421. tween(layer[vr_setup_cb6].alpha, 0.0, 0.1);
  422. tween(layer[vr_setup_cb8].alpha, 1.0, 0.1);
  423. delayedcall(2.0, tween(layer[vr_setup_cb8].alpha, 0.0, 0.25) );
  424. );
  425. );
  426. </action>
  427. <action name="vr_setup_select">
  428. <!-- select a setting for adjusting -->
  429. set(layer[vr_setup_siz2].background, false);
  430. set(layer[vr_setup_ipd2].background, false);
  431. set(layer[vr_setup_hmd2].background, false);
  432. set(layer[vr_setup_fov2].background, false);
  433. set(layer[vr_setup_dst2].background, false);
  434. set(layer[vr_setup_vig2].background, false);
  435. set(layer[vr_setup_olp2].background, false);
  436. set(selected_setting, null);
  437. delete(selected_var_value);
  438. set(layer[vr_setup_btn1].ondown, vr_setup_change_ondown(-1) );
  439. set(layer[vr_setup_btn2].ondown, vr_setup_change_ondown(+1) );
  440. set(selected_var_callback, null);
  441. set(selected_var, %1);
  442. if(selected_var == 'screen',
  443. set(selected_setting, vr_setup_siz2);
  444. set(selected_var_name, 'webvr.mobilevr_screensize');
  445. set(selected_var_postfix, ' inch');
  446. copy(selected_var_value, get(selected_var_name));
  447. if(selected_var_value == 'auto', copy(selected_var_value, webvr.devicesize));
  448. if(selected_var_value LE 0, set(selected_var_value, 5.0));
  449. set(selected_var_step, 0.1);
  450. set(selected_var_min, 4);
  451. set(selected_var_max, 10);
  452. set(selected_var_round, 1);
  453. set(selected_var_callback, vr_setup_change_screen() );
  454. );
  455. if(selected_var == 'ipd',
  456. set(selected_setting, vr_setup_ipd2);
  457. set(selected_var_name, 'webvr.mobilevr_ipd');
  458. set(selected_var_postfix, ' mm');
  459. copy(selected_var_value, get(selected_var_name));
  460. set(selected_var_step, 0.1);
  461. set(selected_var_min, 40);
  462. set(selected_var_max, 80);
  463. set(selected_var_round, 1);
  464. );
  465. if(selected_var == 'headset',
  466. set(selected_setting, vr_setup_hmd2);
  467. set(layer[vr_setup_btn1].ondown, vr_setup_change_headset(-1) );
  468. set(layer[vr_setup_btn2].ondown, vr_setup_change_headset(+1) );
  469. );
  470. if(selected_var == 'fov',
  471. set(selected_setting, vr_setup_fov2);
  472. set(selected_var_name, 'webvr.mobilevr_lens_fov');
  473. set(selected_var_postfix, '');
  474. copy(selected_var_value, get(selected_var_name));
  475. set(selected_var_step, 0.1);
  476. set(selected_var_min, 40);
  477. set(selected_var_max, 179);
  478. set(selected_var_round, 1);
  479. set(selected_var_callback, vr_setup_change_headset(0) );
  480. );
  481. if(selected_var == 'dist',
  482. set(selected_setting, vr_setup_dst2);
  483. set(selected_var_name, 'webvr.mobilevr_lens_dist');
  484. set(selected_var_postfix, '');
  485. copy(selected_var_value, get(selected_var_name));
  486. set(selected_var_step, 0.01);
  487. set(selected_var_min, 0);
  488. set(selected_var_max, 5);
  489. set(selected_var_round, 2);
  490. set(selected_var_callback, vr_setup_change_headset(0) );
  491. );
  492. if(selected_var == 'vignette',
  493. set(selected_setting, vr_setup_vig2);
  494. set(selected_var_name, 'webvr.mobilevr_lens_vign');
  495. set(selected_var_postfix, '');
  496. copy(selected_var_value, get(selected_var_name));
  497. set(selected_var_step, 1);
  498. set(selected_var_min, 10);
  499. set(selected_var_max, 200);
  500. set(selected_var_round, 0);
  501. set(selected_var_callback, vr_setup_change_headset(0) );
  502. );
  503. if(selected_var == 'overlap',
  504. set(selected_setting, vr_setup_olp2);
  505. set(selected_var_name, 'webvr.mobilevr_lens_overlap');
  506. set(selected_var_postfix, '');
  507. copy(selected_var_value, get(selected_var_name));
  508. set(selected_var_step, 0.01);
  509. set(selected_var_min, 0.5);
  510. set(selected_var_max, 2.0);
  511. set(selected_var_round, 2);
  512. set(selected_var_callback, vr_setup_change_headset(0) );
  513. );
  514. if(selected_setting != null,
  515. set(layer[get(selected_setting)].background, true);
  516. if(%2 == true,
  517. set(layer[vr_setup_btn1].y, get(layer[get(selected_setting)].y));
  518. set(layer[vr_setup_btn2].y, get(layer[get(selected_setting)].y));
  519. ,
  520. tween(layer[vr_setup_btn1].y, get(layer[get(selected_setting)].y));
  521. tween(layer[vr_setup_btn2].y, get(layer[get(selected_setting)].y));
  522. );
  523. );
  524. </action>
  525. <action name="vr_setup_change_screen">
  526. set(layer[vr_setup_dvn2].html, 'Custom');
  527. set(layer[vr_setup_dvn2].css, 'color:#FFFFFF;font-size:40px;font-weight:bold;');
  528. set(layer[vr_setup_siz2].css, 'color:#FFFFFF;font-size:40px;font-weight:bold;');
  529. </action>
  530. <action name="vr_setup_change_ondown">
  531. copy(t0,timertick);
  532. set(t1,0);
  533. asyncloop(pressed,
  534. copy(t2,timertick);
  535. sub(dt,t2,t1);
  536. if(dt GT 100,
  537. copy(t1,t2);
  538. sub(dt,t1,t0);
  539. div(dt,1000);
  540. Math.max(dt,1);
  541. mul(dt,%1);
  542. vr_setup_adjust(get(dt));
  543. );
  544. );
  545. </action>
  546. <action name="vr_setup_adjust">
  547. if(selected_setting != null,
  548. mul(change, selected_var_step, %1);
  549. add(selected_var_value, change);
  550. Math.max(selected_var_value, selected_var_min);
  551. Math.min(selected_var_value, selected_var_max);
  552. roundval(selected_var_value, get(selected_var_round));
  553. tween(get(selected_var_name), get(selected_var_value), 0.1);
  554. txtadd(layer[get(selected_setting)].html, get(selected_var_value), get(selected_var_postfix));
  555. if(selected_var_callback != null, selected_var_callback());
  556. );
  557. </action>
  558. <action name="vr_setup_change_headset">
  559. set(i_headset, 'Custom');
  560. if(%1 != 0,
  561. copy(i_fov, webvr.mobilevr_lens_fov);
  562. roundval(i_fov, 0);
  563. copy(i_dist, webvr.mobilevr_lens_dist);
  564. roundval(i_dist, 2);
  565. copy(i_vig, webvr.mobilevr_lens_vign);
  566. roundval(i_vig, 0);
  567. copy(i_overlap, webvr.mobilevr_lens_overlap);
  568. roundval(i_overlap, 2);
  569. set(i_hsindex, -1);
  570. copy(i_hscount, vrheadsets.headset.count);
  571. for(set(i,0), i LT i_hscount, inc(i),
  572. copy(hs, vrheadsets.headset[get(i)]);
  573. if(i_fov == hs.fov AND i_dist == hs.dist AND i_vig == hs.vig AND i_overlap == hs.overlap, copy(i_hsindex, i); copy(i_headset, hs.caption); );
  574. );
  575. if(%1 GT 0,
  576. <!-- loop right -->
  577. add(i_hsindex, 1);
  578. if(i_hsindex GE i_hscount, set(i_hsindex,0));
  579. ,
  580. <!-- loop left -->
  581. sub(i_hsindex, 1);
  582. if(i_hsindex LT 0, sub(i_hsindex,i_hscount,1));
  583. );
  584. copy(hs, vrheadsets.headset[get(i_hsindex)]);
  585. copy(i_headset, hs.caption);
  586. copy(i_fov, hs.fov);
  587. copy(i_dist, hs.dist);
  588. copy(i_vig, hs.vig);
  589. copy(i_overlap, hs.overlap);
  590. );
  591. copy(layer[vr_setup_hmd2].html, i_headset);
  592. if(%1 != 0,
  593. copy(webvr.mobilevr_lens_fov, i_fov);
  594. copy(webvr.mobilevr_lens_dist, i_dist);
  595. copy(webvr.mobilevr_lens_vign, i_vig);
  596. copy(webvr.mobilevr_lens_overlap, i_overlap);
  597. copy(layer[vr_setup_fov2].html, i_fov);
  598. copy(layer[vr_setup_dst2].html, i_dist);
  599. copy(layer[vr_setup_vig2].html, i_vig);
  600. copy(layer[vr_setup_olp2].html, i_overlap);
  601. );
  602. </action>
  603. </krpano>