webvr.xml.backup-2021-02-01-09-40-07 33 KB

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