webvr14xml 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. <krpano>
  2. <!--
  3. webvr.xml
  4. - krpano 1.19-pr14
  5. -->
  6. <!-- load the WebVR plugin and assign it to a 'webvr' variable for easier usage -->
  7. <plugin name="webvr" devices="html5" keep="true"
  8. url="webvr.js"
  9. onloaded="copy(webvr, plugin[webvr]);"
  10. mousespeed="0.00125"
  11. multireslock="true"
  12. fullscreen_mirroring="true"
  13. mobilevr_support="true"
  14. mobilevr_ipd="63.5"
  15. mobilevr_screensize="auto"
  16. mobilevr_lens_overlap="1.0"
  17. mobilevr_lens_fov="96"
  18. mobilevr_lens_dist="0.6"
  19. mobilevr_lens_dist2="1|0|0|0"
  20. mobilevr_lens_ca="0.0"
  21. mobilevr_lens_vign="100"
  22. mobilevr_wakelock="true"
  23. mobilevr_sensor_mode="3"
  24. mobilevr_autocalibration="false"
  25. mobilevr_touch_support="true"
  26. mobilevr_fake_support="false"
  27. vr_cursor="hotspot[vr_cursor]"
  28. vr_cursor_enabled="true"
  29. vr_cursor_onover="if(handcursor, tween(hotspot[vr_cursor].scale,0.4,0.1); vr_auto_click(get(vr_timeout)); );"
  30. vr_cursor_onout="tween(hotspot[vr_cursor].scale,0.3,0.1);"
  31. onavailable="webvr_onavailable();"
  32. onunavailable=""
  33. onunknowndevice="webvr_onunknowndevice();"
  34. onentervr="webvr_onentervr();"
  35. onexitvr="webvr_onexitvr();"
  36. />
  37. <!-- a custom xml data structure with the supported VR headsets -->
  38. <vrheadsets>
  39. <headset name="cb1" caption="Cardboard A" overlap="1.10" fov="96.0" dist="1.00" dist2="1|0|0|0" ca="0.000" vig="100" />
  40. <headset name="cb2" caption="Cardboard B" overlap="1.00" fov="96.0" dist="0.60" dist2="1|0|0|0" ca="0.000" vig="100" />
  41. <headset name="gvr" caption="GearVR" overlap="1.00" fov="112.0" dist="0.95" dist2="1|0|0|0" ca="0.090" vig="100" />
  42. <headset name="hom" caption="HOMiDO" overlap="1.00" fov="101.0" dist="1.10" dist2="1|0|0|0" ca="0.075" vig="100" />
  43. <headset name="one" caption="VR ONE" overlap="1.00" fov="109.9" dist="0.00" dist2="1.139|0.093|0.018|0.207" ca="0.090" vig="35" />
  44. <headset name="ccr" caption="ColorCross VR" overlap="1.00" fov="70.0" dist="0.65" dist2="1|0|0|0" ca="0.000" vig="100" />
  45. <headset name="nod" caption="No Distortion" overlap="1.00" fov="96.0" dist="0.00" dist2="1|0|0|0" ca="0.000" vig="100" />
  46. </vrheadsets>
  47. <!-- the VR cursor hotspot -->
  48. <hotspot name="vr_cursor" keep="true"
  49. url="webvr_cursor_80x80_17f.png"
  50. visible="false"
  51. enabled="false"
  52. distorted="true"
  53. crop="0|0|80|80"
  54. scale="0.3"
  55. depth="1000"
  56. />
  57. <!-- vr_auto_click() - call this action in the onover event of a
  58. hotspot to trigger automatically a click after some time. -->
  59. <action name="vr_auto_click" scope="local" args="vr_aclk_timeout">
  60. if(webvr.isenabled,
  61. if(vr_aclk_timeout == null, set(vr_aclk_timeout, 2000));
  62. copy(vr_aclk_t1, timertick);
  63. set(vr_aclk_waiting, true);
  64. copy(webvr.vr_aclk_hotspot, caller.name);
  65. set(hotspot[vr_cursor].crop,'0|0|80|80');
  66. asyncloop(vr_aclk_waiting AND webvr.vr_aclk_hotspot == caller.name,
  67. sub(dt, timertick, vr_aclk_t1);
  68. if(!caller.hovering,
  69. set(vr_aclk_waiting, false);
  70. set(hotspot[vr_cursor].crop,'0|0|80|80');
  71. ,
  72. div(f, dt, vr_aclk_timeout);
  73. mul(f, 16);
  74. roundval(f);
  75. Math.min(f, 16);
  76. mul(f, 80);
  77. txtadd(hotspot[vr_cursor].crop,get(f),'|0|80|80');
  78. <!-- wait another 100ms delay after finishing the animation before doing the click -->
  79. sub(dt, 100);
  80. if(dt GT vr_aclk_timeout,
  81. set(vr_aclk_waiting,false);
  82. set(hotspot[vr_cursor].crop,'0|0|80|80');
  83. <!-- call onclick -->
  84. callwith(caller, onclick() );
  85. );
  86. );
  87. );
  88. );
  89. </action>
  90. <!-- by pressing SPACE the headset could be re-centered -->
  91. <events name="webvr_events" devices="html5" keep="true"
  92. onkeydown="if(webvr AND webvr.isenabled AND keycode==32, webvr.resetSensor() );"
  93. onmousedown="if(webvr AND webvr.isenabled, webvr_showbuttons() );"
  94. onexitfullscreen="vr_setup_close();"
  95. />
  96. <!-- when WebVR support is available show an EnterVR button -->
  97. <action name="webvr_onavailable">
  98. webvr.loadsettings();
  99. if(layer[webvr_enterbutton], delayedcall(0.5, tween(layer[webvr_enterbutton].alpha,1.0); ); );
  100. </action>
  101. <action name="webvr_onunknowndevice">
  102. if(webvr.isfake AND device.desktop AND webvr.havesettings == false,
  103. <!-- set the 'no distortion' headset for fake desktop usage -->
  104. set(webvr.mobilevr_lens_overlap, 1.0);
  105. set(webvr.mobilevr_lens_fov, 96.0);
  106. set(webvr.mobilevr_lens_dist, 0.0);
  107. set(webvr.mobilevr_lens_dist2, '1|0|0|0');
  108. set(webvr.mobilevr_lens_ca, 0.0);
  109. set(webvr.mobilevr_lens_vign, 100);
  110. ,
  111. set(webvr.ask_user_for_screensize,true);
  112. );
  113. </action>
  114. <action name="webvr_onentervr">
  115. if(layer[webvr_enterbutton], tween(layer[webvr_enterbutton].alpha,0,0); );
  116. webvr_showbuttons();
  117. webvr_hide_all_non_vr_layers();
  118. <!-- when the screen size is unknown an no custom size is set, open the setup screen on entering the VR mode -->
  119. if(webvr.ismobilevr == true AND !webvr.isfake AND webvr.ask_user_for_screensize == true AND webvr.mobilevr_screensize == 'auto',
  120. set(webvr.ask_user_for_screensize, false);
  121. vr_setup();
  122. );
  123. if(webvr.isfake,
  124. webvr_show_fakemode_info(true);
  125. );
  126. </action>
  127. <action name="webvr_onexitvr">
  128. stopdelayedcall(vr_button_fadeout);
  129. if(layer[webvr_enterbutton], tween(layer[webvr_enterbutton].alpha,1); );
  130. tween(layer[webvr_exitbutton].alpha,0);
  131. tween(layer[webvr_setupbutton].alpha,0);
  132. webvr_show_fakemode_info(false);
  133. webvr_restore_layers();
  134. </action>
  135. <action name="webvr_hide_all_non_vr_layers" scope="local">
  136. for(set(i,0), i LT layer.count, inc(i),
  137. copy(lr, layer[get(i)]);
  138. if(lr.vr !== true,
  139. copy(lr.vr_backup_visible, lr.visible);
  140. set(lr.visible, false);
  141. );
  142. );
  143. </action>
  144. <action name="webvr_restore_layers" scope="local">
  145. for(set(i,0), i LT layer.count, inc(i),
  146. copy(lr, layer[get(i)]);
  147. if(lr.vr_backup_visible,
  148. copy(lr.visible, lr.vr_backup_visible);
  149. delete(lr.vr_backup_visible);
  150. );
  151. );
  152. </action>
  153. <action name="webvr_show_fakemode_info" scope="local" args="show">
  154. if(show == true,
  155. addlayer(webvr_fakemode_info);
  156. set(layer[webvr_fakemode_info],
  157. type='text',
  158. keep=true,
  159. align='bottom',
  160. y=80,
  161. bg=false,
  162. css='color:#FFFFFF;text-align:center;',
  163. html='[i][u]Simulated WebVR Mode![/u][/i][br]For real WebVR with headset tracking, either use a [a href="http://webvr.info" target="_blank" style="color:#FFFFFF;"]WebVR-API-capable[/a] desktop browser or a mobile device and a VR headset.'
  164. );
  165. ,
  166. removelayer(webvr_fakemode_info);
  167. );
  168. </action>
  169. <!-- ensure the same scaling on mobiles (regardless if mobilescale is 0.5 or 1.0) -->
  170. <krpano webvr_setup_scale="calc:(1.0 + 1.0*(device.mobile AND stagescale LT 1.0)) / (1.0 + 1.0*device.mobile)"
  171. webvr_button_scale.normal="1.0"
  172. webvr_button_scale.mobile="1.6"
  173. />
  174. <!-- the EnterVR/ExitVR and SetupVR buttons -->
  175. <style name="webvr_button_style"
  176. type="text"
  177. bgcolor="0x000000"
  178. bgalpha="0.5"
  179. bgroundedge="calc:9*webvr_setup_scale*webvr_button_scale"
  180. css="calc:'color:#FFFFFF;font-size:' + 20*webvr_setup_scale*webvr_button_scale + 'px;'"
  181. padding="calc:6*webvr_setup_scale*webvr_button_scale + ' ' + 10*webvr_setup_scale*webvr_button_scale"
  182. />
  183. <layer name="webvr_enterbutton" keep="true" vr="true"
  184. style="webvr_button_style"
  185. html="Enter VR"
  186. align="top" y="24"
  187. autoalpha="true" alpha="0.0"
  188. onclick="webvr.enterVR();"
  189. />
  190. <layer name="webvr_exitbutton" keep="true" vr="true"
  191. style="webvr_button_style"
  192. html="Exit VR"
  193. align="top" y="24"
  194. autoalpha="true" alpha="0.0"
  195. onclick="webvr.exitVR();"
  196. />
  197. <layer name="webvr_setupbutton" keep="true" vr="true"
  198. style="webvr_button_style"
  199. html="VR Setup"
  200. align="bottom" y="24"
  201. autoalpha="true" alpha="0.0"
  202. onclick="vr_setup();"
  203. />
  204. <action name="webvr_showbuttons">
  205. stopdelayedcall(vr_button_fadeout);
  206. if(webvr.ismobilevr,
  207. tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 1.0|1.0, 0.25);
  208. delayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 0.0|0.0, 1.0); );
  209. ,
  210. tween(layer[webvr_exitbutton].alpha, 1.0, 0.25);
  211. delayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha, 0.0, 1.0); );
  212. );
  213. </action>
  214. <!--
  215. VR Setup
  216. -->
  217. <action name="vr_setup" scope="local">
  218. <!-- store the setup settings in a 'vrsetup' object -->
  219. if(webvr.vrsetup === null, def(webvr.vrsetup, object); );
  220. copy(vrs, webvr.vrsetup);
  221. <!-- disable cursor -->
  222. set(webvr.vr_cursor_enabled, false);
  223. <!-- hide VR buttons -->
  224. tween(layer[webvr_exitbutton].alpha,0);
  225. tween(layer[webvr_setupbutton].alpha,0);
  226. <!-- create darken-background layer -->
  227. addlayer(vr_setup_darken);
  228. set(layer[vr_setup_darken], type='container', safearea=false, bgcolor=0x000000, bgalpha=0.5, bgcapture=true, handcursor=false, align='lefttop', width='100%', height='100%', zorder=99998);
  229. <!-- create element container -->
  230. addlayer(vr_setup_bg);
  231. set(layer[vr_setup_bg], type='container', handcursor=false, align='lefttop', width='100%', height='100%', zorder=99999);
  232. <!-- get and prepare device infos and settings -->
  233. copy(i_screensize, webvr.mobilevr_screensize);
  234. if(i_screensize == 'auto', copy(i_screensize, webvr.devicesize));
  235. if(i_screensize LE 0, set(i_screensize, 5.0));
  236. roundval(i_screensize, 1);
  237. txtadd(i_screensize, ' inch');
  238. copy(i_ipd, webvr.mobilevr_ipd);
  239. roundval(i_ipd, 1);
  240. txtadd(i_ipd, ' mm');
  241. copy(i_fov, webvr.mobilevr_lens_fov);
  242. roundval(i_fov, 1);
  243. copy(i_dist, webvr.mobilevr_lens_dist);
  244. roundval(i_dist, 2);
  245. copy(i_dist2, webvr.mobilevr_lens_dist2);
  246. txtsplit(i_dist2, '|', vrs.i_dist2_k1, vrs.i_dist2_k2, vrs.i_dist2_k3, vrs.i_dist2_k4);
  247. mul(vrs.i_dist2_k1,1);
  248. mul(vrs.i_dist2_k2,10);
  249. mul(vrs.i_dist2_k3,10);
  250. mul(vrs.i_dist2_k4,10);
  251. roundval(vrs.i_dist2_k1,2);
  252. roundval(vrs.i_dist2_k2,2);
  253. roundval(vrs.i_dist2_k3,2);
  254. roundval(vrs.i_dist2_k4,2);
  255. copy(i_vig, webvr.mobilevr_lens_vign);
  256. roundval(i_vig, 0);
  257. copy(i_overlap, webvr.mobilevr_lens_overlap);
  258. roundval(i_overlap, 2);
  259. copy(i_ca, webvr.mobilevr_lens_ca);
  260. roundval(i_ca, 3);
  261. set(i_headset, 'Custom');
  262. for(set(i,0), i LT vrheadsets.headset.count, inc(i),
  263. copy(hs, vrheadsets.headset[get(i)]);
  264. if(i_overlap == hs.overlap AND i_fov == hs.fov AND i_dist == hs.dist AND i_dist2 == hs.dist2 AND i_ca == hs.ca AND i_vig == hs.vig,
  265. copy(i_headset, hs.caption);
  266. );
  267. );
  268. <!-- when the screen size is unknown, mark it red -->
  269. set(known_size, true);
  270. set(sizcol, #FFFFFF);
  271. copy(i_devicename, webvr.devicename);
  272. if(i_devicename == 'Unknown',
  273. if(webvr.mobilevr_screensize == 'auto',
  274. set(sizcol, #AA0000);
  275. set(known_size, false);
  276. ,
  277. set(i_devicename, 'Custom');
  278. );
  279. );
  280. <!-- create layer for the main menu -->
  281. addlayer(vr_setup_m1);
  282. set(layer[vr_setup_m1], type='container', parent='vr_setup_bg', align='lefttop', width='100%', height='100%');
  283. <!-- create layer for the headset customization menu -->
  284. addlayer(vr_setup_m3);
  285. set(layer[vr_setup_m3], type='container', parent='vr_setup_bg', align='lefttop', width='100%', height='100%', visible=false);
  286. <!-- create layer for the calibration menu -->
  287. addlayer(vr_setup_m2);
  288. set(layer[vr_setup_m2], type='container', parent='vr_setup_bg', align='lefttop', width='100%', height='100%', visible=false);
  289. <!-- create the text elements -->
  290. set(vrs.vr_setup_text_parent, 'vr_setup_m1');
  291. vr_setup_createtext(vr_setup_title, 'MOBILE VR SETUP', center, center, 0, -225, #FFFFFF, false);
  292. vr_setup_createtext(vr_setup_dvn1, 'Device:', center, right, 0, -145, #FFFFFF, true, vr_setup_select('screen') );
  293. vr_setup_createtext(vr_setup_dvn2, get(i_devicename), center, left, 0, -145, get(sizcol), true, vr_setup_select('screen') );
  294. vr_setup_createtext(vr_setup_siz1, 'Screensize:', center, right, 0, -105, #FFFFFF, true, vr_setup_select('screen') );
  295. vr_setup_createtext(vr_setup_siz2, get(i_screensize), center, left, 0, -105, get(sizcol), true, vr_setup_select('screen') );
  296. vr_setup_createtext(vr_setup_ipd1, 'IPD:', center, right, 0, -35, #FFFFFF, true, vr_setup_select('ipd') );
  297. vr_setup_createtext(vr_setup_ipd2, get(i_ipd), center, left, 0, -35, #FFFFFF, true, vr_setup_select('ipd') );
  298. vr_setup_createtext(vr_setup_hmd1, 'VR Headset:', center, right, 0, +35, #FFFFFF, true, vr_setup_select('headset') );
  299. vr_setup_createtext(vr_setup_hmd2, get(i_headset), center, left, 0, +35, #FFFFFF, true, vr_setup_select('headset') );
  300. vr_setup_createtext(vr_setup_hmd3, 'Customize', center, center, 0, +75, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_customize_headset() );
  301. if(webvr.iswebvr == false,
  302. vr_setup_createtext(vr_setup_cal, 'Calibrate Gyroscope', center, center, 0, +145, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_calibration() );
  303. );
  304. vr_setup_createtext(vr_setup_sav, 'SAVE', center, center, -200, +225, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_save() );
  305. vr_setup_createtext(vr_setup_rst, 'RESET', center, center, 0, +225, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_reset() );
  306. vr_setup_createtext(vr_setup_cls, 'CLOSE', center, center, +200, +225, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_close() );
  307. <!-- and the adjusting buttons -->
  308. vr_setup_createbutton(vr_setup_btn1, '&#60;', left, left, 5%, -35, #FFFFFF, true, null);
  309. vr_setup_createbutton(vr_setup_btn2, '&#62;', right, right, 5%, -35, #FFFFFF, true, null);
  310. <!-- create the customize_headset text elements -->
  311. set(vrs.vr_setup_text_parent, 'vr_setup_m3');
  312. vr_setup_createtext(vr_setup_m31, 'VR HEADSET', center, center, 0, -225, #FFFFFF, false);
  313. vr_setup_createtext(vr_setup_fov1, 'FOV:', center, right, 0, -80, #FFFFFF, true, vr_setup_select('fov') );
  314. vr_setup_createtext(vr_setup_fov2, get(i_fov), center, left, 0, -80, #FFFFFF, true, vr_setup_select('fov') );
  315. vr_setup_createtext(vr_setup_dst1, 'Distortion:', center, right, 0, -32, #FFFFFF, true, vr_setup_select('dist') );
  316. vr_setup_createtext(vr_setup_dst2, get(i_dist), center, left, 0, -32, #FFFFFF, true, vr_setup_select('dist') );
  317. vr_setup_createtext(vr_setup_d2tx, 'Dist2:', center, right, 0, +16, #FFFFFF, true, vr_setup_select('dist2k1') );
  318. vr_setup_createtext(vr_setup_d2k1, get(vrs.i_dist2_k1), center, left, 0, +16, #FFFFFF, true, vr_setup_select('dist2k1') );
  319. vr_setup_createtext(vr_setup_d2k2, get(vrs.i_dist2_k2), center, left, +100, +16, #FFFFFF, true, vr_setup_select('dist2k2') );
  320. vr_setup_createtext(vr_setup_d2k3, get(vrs.i_dist2_k3), center, left, +200, +16, #FFFFFF, true, vr_setup_select('dist2k3') );
  321. vr_setup_createtext(vr_setup_d2k4, get(vrs.i_dist2_k4), center, left, +300, +16, #FFFFFF, true, vr_setup_select('dist2k4') );
  322. vr_setup_createtext(vr_setup_cac1, 'CA Corr:', center, right, 0, +64, #FFFFFF, true, vr_setup_select('ca') );
  323. vr_setup_createtext(vr_setup_cac2, get(i_ca), center, left, 0, +64, #FFFFFF, true, vr_setup_select('ca') );
  324. vr_setup_createtext(vr_setup_vig1, 'Vignette:', center, right, 0, +112, #FFFFFF, true, vr_setup_select('vignette') );
  325. vr_setup_createtext(vr_setup_vig2, get(i_vig), center, left, 0, +112, #FFFFFF, true, vr_setup_select('vignette') );
  326. vr_setup_createtext(vr_setup_olp1, 'Overlap:', center, right, 0, +160, #FFFFFF, true, vr_setup_select('overlap') );
  327. vr_setup_createtext(vr_setup_olp2, get(i_overlap), center, left, 0, +160, #FFFFFF, true, vr_setup_select('overlap') );
  328. vr_setup_createtext(vr_setup_m35, 'CLOSE', center, center, 0, +225, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_close_sub_menus() );
  329. <!-- create the calibration text elements -->
  330. set(vrs.vr_setup_text_parent, 'vr_setup_m2');
  331. vr_setup_createtext(vr_setup_cb1, 'GYROSCOPE', center, center, 0, -225, #FFFFFF, false);
  332. 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') );
  333. vr_setup_createtext(vr_setup_cb3, 'CALIBRATE', center, center, 0, +55, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_do_calibration() );
  334. vr_setup_createtext(vr_setup_cb4, 'RESET', center, center, 0, +125, #FFFFFF, true, set(bg,true), set(bg,false), webvr.resetcalibration() );
  335. vr_setup_createtext(vr_setup_cb5, 'CLOSE', center, center, 0, +225, #FFFFFF, true, set(bg,true), set(bg,false), vr_setup_close_sub_menus() );
  336. vr_setup_createtext(vr_setup_cb6, 'Calibrating...', bottom, center, 0, 40, #FFFFFF, false, null );
  337. vr_setup_createtext(vr_setup_cb7, 'Calibration okay.', bottom, center, 0, 40, #FFFFFF, false, null );
  338. vr_setup_createtext(vr_setup_cb8, 'Calibration failed!', bottom, center, 0, 40, #FFFFFF, false, null );
  339. set(layer[vr_setup_cb6].autoalpha, true);
  340. set(layer[vr_setup_cb7].autoalpha, true);
  341. set(layer[vr_setup_cb8].autoalpha, true);
  342. set(layer[vr_setup_cb6].alpha, 0.0);
  343. set(layer[vr_setup_cb7].alpha, 0.0);
  344. set(layer[vr_setup_cb8].alpha, 0.0);
  345. <!-- pre-select the screen size for adjusting when it is unknown, otherwise the IPD -->
  346. if(known_size == false,
  347. vr_setup_select('screen', true);
  348. ,
  349. vr_setup_select('ipd', true);
  350. );
  351. </action>
  352. <action name="vr_setup_createtext" scope="local" args="layername, text, align, edge, x, y, color, enabled, ondown, onup, onclick">
  353. addlayer(get(layername));
  354. set(layer[get(layername)],
  355. parent=get(webvr.vrsetup.vr_setup_text_parent),
  356. type='text',
  357. css=calc('text-align:' + (align == 'bottom' ? 'center' : align) + ';color:' + color + ';font-size:' + (40 * webvr_setup_scale) + 'px;font-weight:bold;'),
  358. padding=calc(0 + ' ' + (8 * webvr_setup_scale)),
  359. bgroundedge=calc(8 * webvr_setup_scale),
  360. bg=false,
  361. bgcolor=0xFFFFFF,
  362. bgalpha=0.25,
  363. align=get(align),
  364. edge=get(edge),
  365. x=calc(x * webvr_setup_scale),
  366. y=calc(y * webvr_setup_scale),
  367. html=get(text),
  368. enabled=get(enabled),
  369. ondown=get(ondown),
  370. onup=get(onup),
  371. onclick=get(onclick)
  372. );
  373. </action>
  374. <action name="vr_setup_createbutton" scope="local" args="layername, text, align, edge, x, y, color, enabled, ondown, onup, onclick">
  375. vr_setup_createtext(get(layername), get(text), get(align), get(edge), get(x), get(y), get(color), get(enabled), get(ondown), get(onup), get(onclick));
  376. set(layer[get(layername)],
  377. css=calc('vertical-align:middle;text-align:center;color:' + color + ';font-size:' + (60 * webvr_setup_scale) + 'px;font-weight:bold;'),
  378. bg=true,
  379. padding=0,
  380. bgroundedge=calc(40 * webvr_setup_scale),
  381. width=calc(70 * webvr_setup_scale),
  382. height=calc(70 * webvr_setup_scale),
  383. vcenter=true
  384. );
  385. </action>
  386. <action name="vr_setup_reset" scope="local">
  387. <!-- reset to the defaults -->
  388. set(webvr.mobilevr_screensize, 'auto');
  389. copy(i_screensize, webvr.devicesize);
  390. if(i_screensize LE 0, set(i_screensize, 5.0); );
  391. roundval(i_screensize, 1);
  392. set(layer[vr_setup_dvn2].html, get(webvr.devicename));
  393. txtadd(layer[vr_setup_siz2].html, get(i_screensize), ' inch');
  394. set(webvr.mobilevr_ipd, 63.5);
  395. copy(i_ipd, webvr.mobilevr_ipd);
  396. roundval(i_ipd, 1);
  397. txtadd(layer[vr_setup_ipd2].html, get(i_ipd), ' mm');
  398. <!-- set fake custom lens settings and call 'next' headset to switch to the default 'Cardboard' settings -->
  399. set(webvr.mobilevr_lens_fov, 100);
  400. set(webvr.mobilevr_lens_dist, 0.5);
  401. set(webvr.mobilevr_lens_dist2, '1|0|0|0');
  402. set(webvr.mobilevr_lens_vign, 100);
  403. set(webvr.mobilevr_lens_overlap, 1.0);
  404. set(webvr.mobilevr_lens_ca, 0.0);
  405. if(webvr.isfake AND device.desktop,
  406. <!-- select 'no distortion' headset for fake desktop usage -->
  407. vr_setup_change_headset(-1);
  408. ,
  409. <!-- select 'Cardboard A' headset for Mobile-VR usage -->
  410. vr_setup_change_headset(+1);
  411. );
  412. copy(vrs, webvr.vrsetup);
  413. vr_setup_select(get(vrs.var), true);
  414. </action>
  415. <action name="vr_setup_close">
  416. <!-- 2. parameter == true => remove children elements too -->
  417. removelayer(vr_setup_darken, true);
  418. removelayer(vr_setup_bg, true);
  419. <!-- enable cursor -->
  420. set(webvr.vr_cursor_enabled, true);
  421. </action>
  422. <action name="vr_setup_save">
  423. webvr.saveSettings();
  424. vr_setup_close();
  425. </action>
  426. <action name="vr_setup_customize_headset" scope="local">
  427. set(layer[vr_setup_darken].bgalpha, 0.1);
  428. set(layer[vr_setup_m1].visible,false);
  429. set(layer[vr_setup_m2].visible,false);
  430. set(layer[vr_setup_m3].visible,true);
  431. set(layer[vr_setup_hmd1].parent, vr_setup_m3);
  432. set(layer[vr_setup_hmd2].parent, vr_setup_m3);
  433. set(layer[vr_setup_btn1].parent, vr_setup_m3);
  434. set(layer[vr_setup_btn2].parent, vr_setup_m3);
  435. set(layer[vr_setup_hmd1].y, calc(-145 * webvr_setup_scale));
  436. set(layer[vr_setup_hmd2].y, calc(-145 * webvr_setup_scale));
  437. copy(vrs, webvr.vrsetup);
  438. copy(vrs.old_selection, vrs.var);
  439. vr_setup_select('headset');
  440. </action>
  441. <action name="vr_setup_calibration">
  442. set(layer[vr_setup_m1].visible,false);
  443. set(layer[vr_setup_m2].visible,true);
  444. </action>
  445. <action name="vr_setup_close_sub_menus" scope="local">
  446. set(layer[vr_setup_darken].bgalpha, 0.5);
  447. set(layer[vr_setup_m1].visible,true);
  448. set(layer[vr_setup_m2].visible,false);
  449. set(layer[vr_setup_m3].visible,false);
  450. set(layer[vr_setup_hmd1].parent, vr_setup_m1);
  451. set(layer[vr_setup_hmd2].parent, vr_setup_m1);
  452. set(layer[vr_setup_btn1].parent, vr_setup_m1);
  453. set(layer[vr_setup_btn2].parent, vr_setup_m1);
  454. set(layer[vr_setup_hmd1].y, calc(+35 * webvr_setup_scale));
  455. set(layer[vr_setup_hmd2].y, calc(+35 * webvr_setup_scale));
  456. copy(vrs, webvr.vrsetup);
  457. if(vrs.old_selection,
  458. vr_setup_select(get(vrs.old_selection));
  459. delete(vrs.old_selection);
  460. );
  461. </action>
  462. <action name="vr_setup_do_calibration">
  463. if(!webvr.isfake,
  464. tween(layer[vr_setup_cb6].alpha, 1.0, 0.1);
  465. tween(layer[vr_setup_cb7].alpha, 0.0, 0.1);
  466. tween(layer[vr_setup_cb8].alpha, 0.0, 0.1);
  467. webvr.calibrate(
  468. tween(layer[vr_setup_cb6].alpha, 0.0, 0.1);
  469. tween(layer[vr_setup_cb7].alpha, 1.0, 0.1);
  470. delayedcall(2.0, tween(layer[vr_setup_cb7].alpha, 0.0, 0.25) );
  471. ,
  472. tween(layer[vr_setup_cb6].alpha, 0.0, 0.1);
  473. tween(layer[vr_setup_cb8].alpha, 1.0, 0.1);
  474. delayedcall(2.0, tween(layer[vr_setup_cb8].alpha, 0.0, 0.25) );
  475. );
  476. );
  477. </action>
  478. <action name="vr_setup_update_dist2" scope="local">
  479. copy(vrs, webvr.vrsetup);
  480. txtadd(webvr.mobilevr_lens_dist2, get(vrs.i_dist2_k1), '|', calc(vrs.i_dist2_k2/10.0), '|', calc(vrs.i_dist2_k3/10.0), '|', calc(vrs.i_dist2_k4/10.0));
  481. vr_setup_change_headset(0);
  482. </action>
  483. <action name="vr_setup_select" scope="local" args="selected_var, noanimation">
  484. copy(vrs, webvr.vrsetup);
  485. <!-- select a setting for adjusting -->
  486. set(layer[vr_setup_siz2].bg, false);
  487. set(layer[vr_setup_ipd2].bg, false);
  488. set(layer[vr_setup_hmd2].bg, false);
  489. set(layer[vr_setup_fov2].bg, false);
  490. set(layer[vr_setup_dst2].bg, false);
  491. set(layer[vr_setup_d2k1].bg, false);
  492. set(layer[vr_setup_d2k2].bg, false);
  493. set(layer[vr_setup_d2k3].bg, false);
  494. set(layer[vr_setup_d2k4].bg, false);
  495. set(layer[vr_setup_vig2].bg, false);
  496. set(layer[vr_setup_cac2].bg, false);
  497. set(layer[vr_setup_olp2].bg, false);
  498. set(layer[vr_setup_btn1].ondown, vr_setup_change_ondown(-1) );
  499. set(layer[vr_setup_btn2].ondown, vr_setup_change_ondown(+1) );
  500. set(vrs.setting, null);
  501. set(vrs.var, get(selected_var));
  502. set(vrs.var_value, null);
  503. set(vrs.var_callback, null);
  504. if(selected_var == 'screen',
  505. set(vrs.setting, vr_setup_siz2);
  506. set(vrs.var_name, 'webvr.mobilevr_screensize');
  507. set(vrs.var_postfix, ' inch');
  508. copy(vrs.var_value, get(vrs.var_name));
  509. if(vrs.var_value == 'auto', copy(vrs.var_value, webvr.devicesize));
  510. if(vrs.var_value LE 0, set(vrs.var_value, 5.0));
  511. set(vrs.var_step, 0.1);
  512. set(vrs.var_min, 4);
  513. set(vrs.var_max, 10);
  514. set(vrs.var_round, 1);
  515. set(vrs.var_callback, vr_setup_change_screen() );
  516. );
  517. if(selected_var == 'ipd',
  518. set(vrs.setting, vr_setup_ipd2);
  519. set(vrs.var_name, 'webvr.mobilevr_ipd');
  520. set(vrs.var_postfix, ' mm');
  521. copy(vrs.var_value, get(vrs.var_name));
  522. set(vrs.var_step, 0.1);
  523. set(vrs.var_min, 40);
  524. set(vrs.var_max, 80);
  525. set(vrs.var_round, 1);
  526. );
  527. if(selected_var == 'headset',
  528. set(vrs.setting, vr_setup_hmd2);
  529. set(layer[vr_setup_btn1].ondown, vr_setup_change_headset(-1) );
  530. set(layer[vr_setup_btn2].ondown, vr_setup_change_headset(+1) );
  531. );
  532. if(selected_var == 'fov',
  533. set(vrs.setting, vr_setup_fov2);
  534. set(vrs.var_name, 'webvr.mobilevr_lens_fov');
  535. set(vrs.var_postfix, '');
  536. copy(vrs.var_value, get(vrs.var_name));
  537. set(vrs.var_step, 0.1);
  538. set(vrs.var_min, 40);
  539. set(vrs.var_max, 179);
  540. set(vrs.var_round, 1);
  541. set(vrs.var_callback, vr_setup_change_headset(0) );
  542. );
  543. if(selected_var == 'dist',
  544. set(vrs.setting, vr_setup_dst2);
  545. set(vrs.var_name, 'webvr.mobilevr_lens_dist');
  546. set(vrs.var_postfix, '');
  547. copy(vrs.var_value, get(vrs.var_name));
  548. set(vrs.var_step, 0.01);
  549. set(vrs.var_min, 0);
  550. set(vrs.var_max, 5);
  551. set(vrs.var_round, 2);
  552. set(vrs.var_callback, vr_setup_change_headset(0) );
  553. );
  554. if(selected_var == 'dist2k1',
  555. set(vrs.setting, vr_setup_d2k1);
  556. set(vrs.var_name, 'webvr.vrsetup.i_dist2_k1');
  557. set(vrs.var_postfix, '');
  558. copy(vrs.var_value, get(vrs.var_name));
  559. set(vrs.var_step, 0.01);
  560. set(vrs.var_min, -9);
  561. set(vrs.var_max, +9);
  562. set(vrs.var_round, 2);
  563. set(vrs.var_callback, vr_setup_update_dist2() );
  564. );
  565. if(selected_var == 'dist2k2',
  566. set(vrs.setting, vr_setup_d2k2);
  567. set(vrs.var_name, 'webvr.vrsetup.i_dist2_k2');
  568. set(vrs.var_postfix, '');
  569. copy(vrs.var_value, get(vrs.var_name));
  570. set(vrs.var_step, 0.01);
  571. set(vrs.var_min, -9);
  572. set(vrs.var_max, +9);
  573. set(vrs.var_round, 2);
  574. set(vrs.var_callback, vr_setup_update_dist2() );
  575. );
  576. if(selected_var == 'dist2k3',
  577. set(vrs.setting, vr_setup_d2k3);
  578. set(vrs.var_name, 'webvr.vrsetup.i_dist2_k3');
  579. set(vrs.var_postfix, '');
  580. copy(vrs.var_value, get(vrs.var_name));
  581. set(vrs.var_step, 0.01);
  582. set(vrs.var_min, -9);
  583. set(vrs.var_max, +9);
  584. set(vrs.var_round, 2);
  585. set(vrs.var_callback, vr_setup_update_dist2() );
  586. );
  587. if(selected_var == 'dist2k4',
  588. set(vrs.setting, vr_setup_d2k4);
  589. set(vrs.var_name, 'webvr.vrsetup.i_dist2_k4');
  590. set(vrs.var_postfix, '');
  591. copy(vrs.var_value, get(vrs.var_name));
  592. set(vrs.var_step, 0.01);
  593. set(vrs.var_min, -9);
  594. set(vrs.var_max, +9);
  595. set(vrs.var_round, 2);
  596. set(vrs.var_callback, vr_setup_update_dist2() );
  597. );
  598. if(selected_var == 'vignette',
  599. set(vrs.setting, vr_setup_vig2);
  600. set(vrs.var_name, 'webvr.mobilevr_lens_vign');
  601. set(vrs.var_postfix, '');
  602. copy(vrs.var_value, get(vrs.var_name));
  603. set(vrs.var_step, 1);
  604. set(vrs.var_min, 10);
  605. set(vrs.var_max, 200);
  606. set(vrs.var_round, 0);
  607. set(vrs.var_callback, vr_setup_change_headset(0) );
  608. );
  609. if(selected_var == 'ca',
  610. set(vrs.setting, vr_setup_cac2);
  611. set(vrs.var_name, 'webvr.mobilevr_lens_ca');
  612. set(vrs.var_postfix, '');
  613. copy(vrs.var_value, get(vrs.var_name));
  614. set(vrs.var_step, 0.01);
  615. set(vrs.var_min, -1.0);
  616. set(vrs.var_max, +1.0);
  617. set(vrs.var_round, 2);
  618. set(vrs.var_callback, vr_setup_change_headset(0) );
  619. );
  620. if(selected_var == 'overlap',
  621. set(vrs.setting, vr_setup_olp2);
  622. set(vrs.var_name, 'webvr.mobilevr_lens_overlap');
  623. set(vrs.var_postfix, '');
  624. copy(vrs.var_value, get(vrs.var_name));
  625. set(vrs.var_step, 0.01);
  626. set(vrs.var_min, 0.5);
  627. set(vrs.var_max, 2.0);
  628. set(vrs.var_round, 2);
  629. set(vrs.var_callback, vr_setup_change_headset(0) );
  630. );
  631. if(vrs.setting != null,
  632. set(layer[get(vrs.setting)].bg, true);
  633. if(noanimation == true,
  634. set(layer[vr_setup_btn1].y, get(layer[get(vrs.setting)].y));
  635. set(layer[vr_setup_btn2].y, get(layer[get(vrs.setting)].y));
  636. ,
  637. tween(layer[vr_setup_btn1].y, get(layer[get(vrs.setting)].y));
  638. tween(layer[vr_setup_btn2].y, get(layer[get(vrs.setting)].y));
  639. );
  640. );
  641. </action>
  642. <action name="vr_setup_change_screen" scope="local">
  643. set(layer[vr_setup_dvn2].html, 'Custom');
  644. set(layer[vr_setup_dvn2].css, calc('color:#FFFFFF;font-size:'+40*webvr_setup_scale+'px;font-weight:bold;'));
  645. set(layer[vr_setup_siz2].css, calc('color:#FFFFFF;font-size:'+40*webvr_setup_scale+'px;font-weight:bold;'));
  646. </action>
  647. <action name="vr_setup_change_ondown" scope="local">
  648. copy(t0,timertick);
  649. set(t1,0);
  650. asyncloop(caller.pressed,
  651. copy(t2,timertick);
  652. sub(dt,t2,t1);
  653. if(dt GT 100,
  654. copy(t1,t2);
  655. sub(dt,t1,t0);
  656. div(dt,1000);
  657. Math.max(dt,1);
  658. mul(dt,%1);
  659. vr_setup_adjust(get(dt));
  660. );
  661. );
  662. </action>
  663. <action name="vr_setup_adjust" scope="local">
  664. copy(vrs, webvr.vrsetup);
  665. if(vrs.setting != null,
  666. mul(change, vrs.var_step, %1);
  667. add(vrs.var_value, change);
  668. Math.max(vrs.var_value, vrs.var_min);
  669. Math.min(vrs.var_value, vrs.var_max);
  670. roundval(vrs.var_value, get(vrs.var_round));
  671. tween(get(vrs.var_name), get(vrs.var_value), 0.1);
  672. txtadd(layer[get(vrs.setting)].html, get(vrs.var_value), get(vrs.var_postfix));
  673. if(vrs.var_callback != null, vrs.var_callback());
  674. );
  675. </action>
  676. <action name="vr_setup_change_headset" scope="local" args="indexchange">
  677. set(i_headset, 'Custom');
  678. if(indexchange != 0,
  679. copy(i_fov, webvr.mobilevr_lens_fov);
  680. roundval(i_fov, 1);
  681. copy(i_dist, webvr.mobilevr_lens_dist);
  682. roundval(i_dist, 2);
  683. copy(i_dist2, webvr.mobilevr_lens_dist2);
  684. copy(i_vig, webvr.mobilevr_lens_vign);
  685. roundval(i_vig, 0);
  686. copy(i_ca, webvr.mobilevr_lens_ca);
  687. roundval(i_ca, 3);
  688. copy(i_overlap, webvr.mobilevr_lens_overlap);
  689. roundval(i_overlap, 2);
  690. set(i_hsindex, -1);
  691. copy(i_hscount, vrheadsets.headset.count);
  692. for(set(i,0), i LT i_hscount, inc(i),
  693. copy(hs, vrheadsets.headset[get(i)]);
  694. if(i_overlap == hs.overlap AND i_fov == hs.fov AND i_dist == hs.dist AND i_dist2 == hs.dist2 AND i_ca == hs.ca AND i_vig == hs.vig,
  695. copy(i_hsindex, i);
  696. copy(i_headset, hs.caption);
  697. );
  698. );
  699. if(indexchange GT 0,
  700. add(i_hsindex, 1);
  701. if(i_hsindex GE i_hscount, set(i_hsindex,0));
  702. ,
  703. sub(i_hsindex, 1);
  704. if(i_hsindex LT 0, sub(i_hsindex,i_hscount,1));
  705. );
  706. copy(hs, vrheadsets.headset[get(i_hsindex)]);
  707. copy(i_headset, hs.caption);
  708. copy(i_overlap, hs.overlap);
  709. copy(i_fov, hs.fov);
  710. copy(i_dist, hs.dist);
  711. copy(i_dist2, hs.dist2);
  712. copy(i_ca, hs.ca);
  713. copy(i_vig, hs.vig);
  714. );
  715. copy(layer[vr_setup_hmd2].html, i_headset);
  716. if(indexchange != 0,
  717. copy(webvr.mobilevr_lens_overlap, i_overlap);
  718. copy(webvr.mobilevr_lens_fov, i_fov);
  719. copy(webvr.mobilevr_lens_dist, i_dist);
  720. copy(webvr.mobilevr_lens_dist2, i_dist2);
  721. copy(webvr.mobilevr_lens_ca, i_ca);
  722. copy(webvr.mobilevr_lens_vign, i_vig);
  723. copy(layer[vr_setup_olp2].html, i_overlap);
  724. copy(layer[vr_setup_fov2].html, i_fov);
  725. copy(layer[vr_setup_dst2].html, i_dist);
  726. txtsplit(i_dist2, '|', i_dist2_k1, i_dist2_k2, i_dist2_k3, i_dist2_k4);
  727. mul(i_dist2_k1,1);
  728. mul(i_dist2_k2,10);
  729. mul(i_dist2_k3,10);
  730. mul(i_dist2_k4,10);
  731. roundval(i_dist2_k1,2);
  732. roundval(i_dist2_k2,2);
  733. roundval(i_dist2_k3,2);
  734. roundval(i_dist2_k4,2);
  735. copy(layer[vr_setup_d2k1].html, i_dist2_k1);
  736. copy(layer[vr_setup_d2k2].html, i_dist2_k2);
  737. copy(layer[vr_setup_d2k3].html, i_dist2_k3);
  738. copy(layer[vr_setup_d2k4].html, i_dist2_k4);
  739. copy(layer[vr_setup_cac2].html, i_ca);
  740. copy(layer[vr_setup_vig2].html, i_vig);
  741. );
  742. </action>
  743. </krpano>