webplayer2.js 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346
  1. "use strict";
  2. b4w.register("embed_main", function(exports, require) {
  3. var m_app = require("app");
  4. var m_camera_anim = require("camera_anim");
  5. var m_cfg = require("config");
  6. var m_cont = require("container");
  7. var m_ctl = require("controls");
  8. var m_data = require("data");
  9. var m_gp_conf = require("gp_conf");
  10. var m_hmd = require("hmd");
  11. var m_hmd_conf = require("hmd_conf");
  12. var m_input = require("input");
  13. var m_main = require("main");
  14. var m_scs = require("scenes");
  15. var m_sfx = require("sfx");
  16. var m_storage = require("storage");
  17. var m_version = require("version");
  18. var BUILT_IN_SCRIPTS_ID = "built_in_scripts";
  19. var DEFAULT_QUALITY = "HIGH";
  20. var DEFAULT_STEREO = "NONE";
  21. var CAMERA_AUTO_ROTATE_SPEED = 0.3;
  22. var HIDE_MENU_DELAY = 2000;
  23. var ANIM_ELEM_DELAY = 50;
  24. var LOGO_SHOW_DELAY = 300;
  25. var LOGO_HIDE_DELAY = 300;
  26. var LOGO_CIRCLE_HIDE_DELAY = 300;
  27. var CAPTION_SHOW_DELAY = 300;
  28. var CAPTION_HIDE_DELAY = 300;
  29. var MENU_BUTTON_SHOW_DELAY = 300;
  30. var PRELOADER_HIDE_DELAY = 300;
  31. var TWITTER_CHAR = "t";
  32. var FB_CHAR = "f";
  33. var GOOGLE_CHAR = "g";
  34. var VK_CHAR = "v";
  35. var WEIBO_CHAR = "w";
  36. var _menu_close_func = null;
  37. var _is_panel_open_top = false;
  38. var _is_panel_open_left = false;
  39. var _is_anim_top = false;
  40. var _is_anim_left = false;
  41. var _is_qual_menu_opened = false;
  42. var _is_stereo_menu_opened = false;
  43. var _is_help_menu_opened = false;
  44. var _no_social = false;
  45. var _socials = [];
  46. var _is_first_stage = false;
  47. var _is_second_stage = false;
  48. var _is_third_stage = false;
  49. var _circle_container;
  50. var _preloader_caption;
  51. var _first_stage;
  52. var _second_stage;
  53. var _third_stage;
  54. var _load_container;
  55. var _preloader_container;
  56. var _opened_button;
  57. var _logo_container;
  58. var _buttons_container;
  59. var _quality_buttons_container;
  60. var _stereo_buttons_container;
  61. var _help_info_container;
  62. var _help_button;
  63. var _hor_button_section;
  64. var _selected_object;
  65. var _vec2_tmp = new Float32Array(2);
  66. var _player_buttons = [
  67. {type: "simple_button", id: "opened_button", callback: open_menu},
  68. {type: "simple_button", id: "help_button", callback: open_help},
  69. {type: "simple_button", id: "close_help", callback: close_help},
  70. {type: "trigger_button",
  71. id: "fullscreen_on_button",
  72. callback: enter_fullscreen,
  73. replace_button_id: "fullscreen_off_button",
  74. replace_button_cb: exit_fullscreen},
  75. {type: "trigger_button",
  76. id: "pause_button",
  77. callback: pause_engine,
  78. replace_button_id: "play_button",
  79. replace_button_cb: resume_engine},
  80. {type: "trigger_button",
  81. id: "auto_rotate_on_button",
  82. callback: rotate_camera,
  83. replace_button_id: "auto_rotate_off_button",
  84. replace_button_cb: stop_camera},
  85. {type: "trigger_button",
  86. id: "sound_on_button",
  87. callback: stop_sound,
  88. replace_button_id: "sound_off_button",
  89. replace_button_cb: play_sound},
  90. {type: "menu_button",
  91. id: "stereo_buttons_container",
  92. callback: open_stereo_menu,
  93. child_buttons_array_id: ["def_mode_button",
  94. "anag_mode_button",
  95. "hmd_mode_button"],
  96. child_buttons_array_cb: [
  97. function(){change_stereo("NONE")},
  98. function(){change_stereo("ANAGLYPH")},
  99. function(){change_stereo("HMD")}]},
  100. {type: "menu_button",
  101. id: "quality_buttons_container",
  102. callback: open_qual_menu,
  103. child_buttons_array_id: ["low_mode_button",
  104. "high_mode_button",
  105. "ultra_mode_button"],
  106. child_buttons_array_cb: [
  107. function(){change_quality(m_cfg.P_LOW)},
  108. function(){change_quality(m_cfg.P_HIGH)},
  109. function(){change_quality(m_cfg.P_ULTRA)}]}
  110. ]
  111. exports.init = function() {
  112. var is_debug = (m_version.type() == "DEBUG");
  113. var is_html = b4w.module_check(m_cfg.get("built_in_module_name"));
  114. var show_fps = false;
  115. var alpha = false;
  116. var dds_available = false;
  117. var min50_available = false;
  118. var url_params = m_app.get_url_params();
  119. var min_capabilities = false;
  120. var pvr_available = false;
  121. if (url_params && "compressed_textures" in url_params &&
  122. !is_html && !is_debug) {
  123. dds_available = true;
  124. min50_available = true;
  125. if ("compressed_textures_pvr" in url_params)
  126. pvr_available = true;
  127. }
  128. if (url_params && "show_fps" in url_params)
  129. show_fps = true;
  130. if (url_params && "no_social" in url_params)
  131. _no_social = true;
  132. if (url_params && "alpha" in url_params)
  133. alpha = true;
  134. if (url_params && url_params["load"])
  135. m_storage.init("b4w_webplayer:" + url_params["load"]);
  136. else
  137. m_storage.init("b4w_webplayer:" + window.location.href);
  138. if (url_params && "min_capabilities" in url_params)
  139. min_capabilities = true;
  140. if (url_params && "socials" in url_params) {
  141. var socials = url_params["socials"].split("");
  142. _socials = socials.filter(function (value, index, array) {
  143. return array.indexOf(value) == index;
  144. })
  145. }
  146. set_stereo_config();
  147. set_quality_config();
  148. if (!alpha)
  149. m_cfg.set("background_color", [0.224, 0.224, 0.224, 1.0]);
  150. // disable physics in HTML version
  151. m_app.init({
  152. canvas_container_id: "main_canvas_container",
  153. callback: init_cb,
  154. gl_debug: is_debug,
  155. physics_enabled: !is_html,
  156. show_fps: show_fps,
  157. report_init_failure: false,
  158. console_verbose: is_debug,
  159. error_purge_elements: ['control_panel'],
  160. //alpha: alpha,
  161. key_pause_enabled: false,
  162. fps_elem_id: "fps_container",
  163. fps_wrapper_id: "fps_wrapper",
  164. assets_pvr_available: pvr_available,
  165. assets_dds_available: dds_available,
  166. assets_min50_available: min50_available,
  167. min_capabilities: min_capabilities,
  168. alpha:true,
  169. background_color:[0,0,0,0]
  170. })
  171. }
  172. function init_cb(canvas_element, success) {
  173. cache_dom_elems();
  174. if (!success) {
  175. display_no_webgl_bg();
  176. return;
  177. }
  178. m_main.pause();
  179. // add_engine_version();
  180. check_fullscreen();
  181. // set_quality_button();
  182. // set_stereo_button();
  183. // init_control_buttons();
  184. // prepare_soc_btns();
  185. m_gp_conf.update();
  186. var file = search_file();
  187. if (!file)
  188. return;
  189. anim_logo(file);
  190. window.addEventListener("resize", on_resize);
  191. on_resize();
  192. }
  193. function prepare_soc_btns() {
  194. var socials = _socials;
  195. if (!socials.length)
  196. return;
  197. var char_btns_array = [TWITTER_CHAR, FB_CHAR, GOOGLE_CHAR, VK_CHAR, WEIBO_CHAR];
  198. socials = socials.filter(function(value, index, array) {
  199. return char_btns_array.indexOf(value) >= 0;
  200. })
  201. if (!socials.length)
  202. return;
  203. var elem_ids = ["tw_button", "fb_button", "g_button", "vk_button", "weibo_button"];
  204. var ordered_elem_ids = [];
  205. var removing_elem_ids = [];
  206. for (var i = 0; i < socials.length; i++) {
  207. switch (socials[i]) {
  208. case TWITTER_CHAR:
  209. ordered_elem_ids.push("tw_button");
  210. break;
  211. case FB_CHAR:
  212. ordered_elem_ids.push("fb_button");
  213. break;
  214. case GOOGLE_CHAR:
  215. ordered_elem_ids.push("g_button");
  216. break;
  217. case VK_CHAR:
  218. ordered_elem_ids.push("vk_button");
  219. break;
  220. case WEIBO_CHAR:
  221. ordered_elem_ids.push("weibo_button");
  222. break;
  223. }
  224. }
  225. for (var i = 0; i < elem_ids.length; i++) {
  226. if (ordered_elem_ids.indexOf(elem_ids[i]) < 0) {
  227. removing_elem_ids.push(elem_ids[i])
  228. }
  229. }
  230. for (var i = 0; i < removing_elem_ids.length; i++) {
  231. var elem = document.getElementById(removing_elem_ids[i]);
  232. elem.parentElement.removeChild(elem);
  233. }
  234. var children = document.querySelector("#vert_section_button").children;
  235. var ar = [];
  236. ar.slice.call(children).sort(function(a, b) {
  237. return ordered_elem_ids.indexOf(a.id) - ordered_elem_ids.indexOf(b.id);
  238. }).forEach(function(next){
  239. document.querySelector("#vert_section_button").appendChild(next);
  240. })
  241. }
  242. function display_no_webgl_bg() {
  243. var url_params = m_app.get_url_params(true);
  244. if (url_params && url_params["fallback_image"]) {
  245. var image_wrapper = document.createElement("div");
  246. image_wrapper.className = "image_wrapper";
  247. document.body.appendChild(image_wrapper);
  248. _preloader_container.style.display = "none";
  249. image_wrapper.style.backgroundImage = 'url(' + url_params["fallback_image"] + ')';
  250. } else if (url_params && url_params["fallback_video"]) {
  251. var video_wrapper = document.createElement("div");
  252. var video_elem = document.createElement("video");
  253. video_wrapper.className = "video_wrapper";
  254. video_wrapper.appendChild(video_elem);
  255. video_elem.autoplay = true;
  256. for (var i = 0; i < url_params["fallback_video"].length; i++) {
  257. var source = document.createElement("source");
  258. source.src = url_params["fallback_video"][i];
  259. video_elem.appendChild(source);
  260. }
  261. document.body.appendChild(video_wrapper);
  262. _preloader_container.style.display = "none";
  263. } else
  264. report_app_error("Browser could not initialize WebGL", "For more info visit",
  265. "https://www.blend4web.com/doc/en/problems_and_solutions.html")
  266. }
  267. function cache_dom_elems() {
  268. _preloader_container = document.querySelector("#preloader_container");
  269. /* _circle_container = document.querySelector("#circle_container");
  270. _preloader_caption = document.querySelector("#preloader_caption");
  271. _first_stage = document.querySelector("#first_stage");
  272. _second_stage = document.querySelector("#second_stage");
  273. _third_stage = document.querySelector("#third_stage");
  274. _load_container = document.querySelector("#load_container");
  275. _opened_button = document.querySelector("#opened_button");
  276. _logo_container = document.querySelector("#logo_container");
  277. _buttons_container = document.querySelector("#buttons_container");
  278. _quality_buttons_container = document.querySelector("#quality_buttons_container");
  279. _stereo_buttons_container = document.querySelector("#stereo_buttons_container");
  280. _help_info_container = document.querySelector("#help_info_container");
  281. _help_button = document.querySelector("#help_button");
  282. _hor_button_section = document.querySelector("#hor_button_section"); */
  283. }
  284. function add_engine_version() {
  285. var version_cont = document.querySelector("#rel_version");
  286. var version = m_version.version_str();
  287. if (version)
  288. version_cont.innerHTML = m_version.version_str();
  289. }
  290. function check_fullscreen() {
  291. var fullscreen_on_button = document.querySelector("#fullscreen_on_button");
  292. if (!m_app.check_fullscreen())
  293. fullscreen_on_button.parentElement.removeChild(fullscreen_on_button);
  294. }
  295. function check_autorotate() {
  296. var autorotate_on_button = document.querySelector("#auto_rotate_on_button");
  297. if (!m_camera_anim.check_auto_rotate())
  298. autorotate_on_button.parentElement.removeChild(autorotate_on_button);
  299. }
  300. function set_quality_button() {
  301. var quality = m_storage.get("quality");
  302. if (!quality || quality == "CUSTOM") {
  303. quality = DEFAULT_QUALITY;
  304. m_storage.set("quality", quality);
  305. }
  306. _quality_buttons_container.className = "control_panel_button";
  307. switch (quality) {
  308. case "LOW":
  309. _quality_buttons_container.classList.add("low_mode_button");
  310. break;
  311. case "HIGH":
  312. _quality_buttons_container.classList.add("high_mode_button");
  313. break;
  314. case "ULTRA":
  315. _quality_buttons_container.classList.add("ultra_mode_button");
  316. break;
  317. }
  318. }
  319. function set_stereo_button() {
  320. var stereo = m_storage.get("stereo") || DEFAULT_STEREO;
  321. m_storage.set("stereo", stereo);
  322. _stereo_buttons_container.className = "control_panel_button";
  323. switch (stereo) {
  324. case "NONE":
  325. _stereo_buttons_container.classList.add("def_mode_button");
  326. break;
  327. case "ANAGLYPH":
  328. _stereo_buttons_container.classList.add("anag_mode_button");
  329. break;
  330. case "HMD":
  331. _stereo_buttons_container.classList.add("hmd_mode_button");
  332. if (m_input.can_use_device(m_input.DEVICE_HMD))
  333. m_hmd_conf.update();
  334. break;
  335. }
  336. }
  337. function init_control_buttons() {
  338. window.oncontextmenu = function(e) {
  339. e.preventDefault();
  340. e.stopPropagation();
  341. return false;
  342. };
  343. init_links();
  344. for (var i = 0; i < _player_buttons.length; i++) {
  345. var button = _player_buttons[i];
  346. var elem = document.getElementById(button.id);
  347. add_hover_class_to_button(elem);
  348. switch (button.type) {
  349. case "simple_button":
  350. if (elem)
  351. if (is_touch())
  352. elem.addEventListener("touchend", button.callback);
  353. else
  354. elem.addEventListener("mouseup", button.callback);
  355. break;
  356. case "menu_button":
  357. (function(button){
  358. if (elem)
  359. if (is_touch())
  360. elem.addEventListener("touchend", function(e) {
  361. button.callback(e, button);
  362. });
  363. else
  364. elem.addEventListener("mouseup", function(e) {
  365. button.callback(e, button);
  366. });
  367. })(button);
  368. break;
  369. case "trigger_button":
  370. (function(button){
  371. if (elem)
  372. if (is_touch())
  373. elem.addEventListener("touchend", function(e) {
  374. button.callback(e);
  375. });
  376. else
  377. elem.addEventListener("mouseup", function(e) {
  378. button.callback(e);
  379. });
  380. })(button);
  381. break;
  382. }
  383. }
  384. }
  385. function init_links() {
  386. var button_links = document.querySelectorAll(".control_panel_button a");
  387. for (var i = 0; i < button_links.length; i++) {
  388. var link = button_links[i];
  389. if (link.hasAttribute("href"))
  390. link.href += document.location.href;
  391. add_hover_class_to_button(link.parentNode);
  392. }
  393. }
  394. function search_file() {
  395. var module_name = m_cfg.get("built_in_module_name");
  396. if (b4w.module_check(module_name)) {
  397. var bd = require(module_name);
  398. var file = bd["data"]["main_file"];
  399. remove_built_in_scripts();
  400. return file;
  401. } else {
  402. var url_params = m_app.get_url_params();
  403. //_logo_container.style.display = "block";
  404. if (url_params && url_params["load"]) {
  405. file = url_params["load"];
  406. return file;
  407. } else {
  408. report_app_error("Please specify a scene to load",
  409. "For more info visit",
  410. "https://www.blend4web.com/doc/en/web_player.html");
  411. return null;
  412. }
  413. }
  414. }
  415. function anim_logo(file) {
  416. /* m_app.css_animate(_logo_container, "opacity", 0, 1, LOGO_SHOW_DELAY, "", "", function() {
  417. //_preloader_caption.style.display = "block";
  418. m_app.css_animate(_preloader_caption, "opacity", 0, 1, CAPTION_SHOW_DELAY, "", "", function() {
  419. m_main.resume();
  420. m_data.load(file, loaded_callback, preloader_callback, false);
  421. });
  422. }) */
  423. m_main.resume();
  424. m_data.load(file, loaded_callback, preloader_callback, false);
  425. }
  426. function open_help() {
  427. if (is_anim_in_process())
  428. return;
  429. if (is_touch())
  430. _help_info_container.className = "touch";
  431. else
  432. _help_info_container.className = "";
  433. _help_info_container.style.display = "block";
  434. _help_button.style.display = "none";
  435. _is_help_menu_opened = true;
  436. }
  437. function close_help(is_cb) {
  438. if (!_is_help_menu_opened)
  439. return;
  440. _help_info_container.style.display = "none";
  441. _help_button.style.display = "block";
  442. _is_help_menu_opened = false;
  443. }
  444. function get_button_object_from_id(elem_id) {
  445. for (var i = 0; i < _player_buttons.length; i++)
  446. if (_player_buttons[i].id == elem_id)
  447. return _player_buttons[i];
  448. return null;
  449. }
  450. function add_hover_class_to_button(elem) {
  451. if (!elem)
  452. return;
  453. if (is_touch()) {
  454. elem.addEventListener("touchstart", function() {
  455. elem.classList.add("hover");
  456. clear_deferred_close();
  457. });
  458. elem.addEventListener("touchend", function() {
  459. elem.classList.remove("hover");
  460. deferred_close();
  461. });
  462. } else {
  463. elem.addEventListener("mouseenter", function() {
  464. elem.classList.add("hover");
  465. });
  466. elem.addEventListener("mouseout", function(e) {
  467. elem.classList.remove("hover");
  468. });
  469. }
  470. }
  471. function rotate_camera(e) {
  472. if (is_anim_in_process())
  473. return;
  474. if (e)
  475. var elem = e.target
  476. else
  477. var elem = document.querySelector("#auto_rotate_on_button");
  478. m_camera_anim.auto_rotate(CAMERA_AUTO_ROTATE_SPEED, function(){
  479. if (elem)
  480. update_button(elem);
  481. });
  482. if (elem)
  483. update_button(elem);
  484. if (m_main.is_paused()) {
  485. resume_engine();
  486. update_play_pause_button();
  487. }
  488. }
  489. function stop_camera(e) {
  490. if (is_anim_in_process())
  491. return;
  492. m_camera_anim.auto_rotate(CAMERA_AUTO_ROTATE_SPEED);
  493. if (e)
  494. update_button(e.target);
  495. }
  496. function play_sound(e) {
  497. if (is_anim_in_process())
  498. return;
  499. m_sfx.mute(null, false);
  500. update_button(e.target);
  501. }
  502. function stop_sound(e) {
  503. if (is_anim_in_process())
  504. return;
  505. m_sfx.mute(null, true);
  506. update_button(e.target);
  507. }
  508. function pause_engine(e) {
  509. if (is_anim_in_process())
  510. return;
  511. m_main.pause();
  512. if (e)
  513. update_button(e.target);
  514. if (m_camera_anim.is_auto_rotate()) {
  515. stop_camera();
  516. update_auto_rotate_button();
  517. }
  518. }
  519. function resume_engine(e) {
  520. if (is_anim_in_process())
  521. return;
  522. m_main.resume();
  523. if (e)
  524. update_button(e.target);
  525. }
  526. function enter_fullscreen(e) {
  527. if (is_anim_in_process())
  528. return;
  529. var hmd_device = m_input.get_device_by_type_element(m_input.DEVICE_HMD);
  530. if (hmd_device &&
  531. m_input.get_value_param(hmd_device, m_input.HMD_WEBVR_TYPE) ==
  532. m_input.HMD_WEBVR1)
  533. m_input.request_fullscreen_hmd();
  534. else
  535. m_app.request_fullscreen(document.body, fullscreen_cb, fullscreen_cb);
  536. }
  537. function exit_fullscreen() {
  538. if (is_anim_in_process())
  539. return;
  540. m_app.exit_fullscreen();
  541. }
  542. function fullscreen_cb(e) {
  543. if (!check_cursor_position("buttons_container") && _is_anim_left)
  544. deferred_close();
  545. var fullscreen_button = document.querySelector("#fullscreen_on_button") ||
  546. document.querySelector("#fullscreen_off_button");
  547. if (fullscreen_button)
  548. update_button(fullscreen_button);
  549. }
  550. function update_button(elem) {
  551. var old_elem_id = elem.id;
  552. var button = get_button_object_from_id(elem.id);
  553. var old_callback = button.callback;
  554. elem.id = button.id = button.replace_button_id;
  555. button.replace_button_id = old_elem_id;
  556. if (!check_cursor_position(elem.id))
  557. elem.classList.remove("hover");
  558. button.callback = button.replace_button_cb;
  559. button.replace_button_cb = old_callback;
  560. }
  561. function update_play_pause_button() {
  562. var elem = document.querySelector("#play_button") ||
  563. document.querySelector("#pause_button");
  564. if (elem)
  565. update_button(elem);
  566. }
  567. function update_auto_rotate_button() {
  568. var elem = document.querySelector("#auto_rotate_on_button") ||
  569. document.querySelector("#auto_rotate_off_button");
  570. if (elem)
  571. update_button(elem);
  572. }
  573. function check_cursor_position(elem_id) {
  574. var hover = false;
  575. if (document.querySelectorAll) {
  576. var elems = document.querySelectorAll( ":hover" );
  577. for (var i = 0; i < elems.length; i++) {
  578. if (elems[i].id == elem_id) {
  579. hover = true;
  580. break;
  581. }
  582. }
  583. }
  584. return hover;
  585. }
  586. function close_menu() {
  587. if (is_anim_in_process())
  588. return;
  589. _buttons_container.removeEventListener("mouseleave", deferred_close);
  590. _buttons_container.removeEventListener("mouseenter", clear_deferred_close);
  591. document.body.removeEventListener("touchmove", deferred_close);
  592. close_qual_menu();
  593. close_stereo_menu();
  594. var hor_elem = document.querySelector("#help_button");
  595. var vert_elem = document.querySelector("#vert_section_button").firstElementChild;
  596. var drop_left = function(elem) {
  597. _is_anim_left = true;
  598. m_app.css_animate(elem, "marginRight", 0, -45, ANIM_ELEM_DELAY, "", "px");
  599. m_app.css_animate(elem, "opacity", 1, 0, ANIM_ELEM_DELAY, "", "", function() {
  600. if (elem.previousElementSibling && elem.previousElementSibling.id != "opened_button")
  601. drop_left(elem.previousElementSibling);
  602. else {
  603. setTimeout(function() {
  604. _is_anim_left = false;
  605. _is_panel_open_left = false;
  606. check_anim_end();
  607. _hor_button_section.style.display = "";
  608. }, 100);
  609. return;
  610. }
  611. });
  612. }
  613. var drop_top = function(elem) {
  614. _is_anim_top = true;
  615. m_app.css_animate(elem, "marginBottom", 0, -45, ANIM_ELEM_DELAY, "", "px");
  616. m_app.css_animate(elem, "opacity", 1, 0, ANIM_ELEM_DELAY, "", "", function() {
  617. if (elem.nextElementSibling && elem.nextElementSibling.id != "opened_button")
  618. drop_top(elem.nextElementSibling);
  619. else {
  620. setTimeout(function() {
  621. _is_anim_top = false;
  622. _is_panel_open_top = false;
  623. check_anim_end();
  624. }, 100);
  625. return;
  626. }
  627. });
  628. }
  629. drop_left(hor_elem);
  630. if (!_no_social)
  631. drop_top(vert_elem);
  632. }
  633. function open_menu() {
  634. clear_deferred_close();
  635. if (is_anim_in_process())
  636. return;
  637. disable_opened_button();
  638. if (is_control_panel_opened()) {
  639. close_menu();
  640. return;
  641. }
  642. var hor_elem = document.querySelector("#fullscreen_on_button") ||
  643. document.querySelector("#fullscreen_off_button") ||
  644. document.querySelector("#quality_buttons_container");
  645. var vert_elem = document.querySelector("#vert_section_button").lastElementChild;
  646. var drop_left = function(elem) {
  647. _is_anim_left = true;
  648. elem.style.marginRight = "-45px";
  649. if ((elem.id == "help_button") &&
  650. _is_help_menu_opened) {
  651. setTimeout(function() {
  652. _is_anim_left = false;
  653. _is_panel_open_left = true;
  654. check_anim_end();
  655. }, 100);
  656. return;
  657. }
  658. elem.style.display = "block";
  659. m_app.css_animate(elem, "marginRight", -45, 0, ANIM_ELEM_DELAY, "", "px", function() {
  660. if (!elem.nextElementSibling) {
  661. setTimeout(function() {
  662. _is_anim_left = false;
  663. _is_panel_open_left = true;
  664. check_anim_end();
  665. }, 100);
  666. return;
  667. }
  668. drop_left(elem.nextElementSibling)
  669. });
  670. m_app.css_animate(elem, "opacity", 0, 1, ANIM_ELEM_DELAY, "", "");
  671. }
  672. var drop_top = function(elem) {
  673. _is_anim_top = true;
  674. elem.style.marginBottom = "-45px";
  675. elem.style.display = "block";
  676. m_app.css_animate(elem, "marginBottom", -45, 0, ANIM_ELEM_DELAY, "", "px", function() {
  677. if (!elem.previousElementSibling) {
  678. setTimeout(function() {
  679. _is_anim_top = false;
  680. _is_panel_open_top = true;
  681. check_anim_end();
  682. }, 100);
  683. return;
  684. }
  685. drop_top(elem.previousElementSibling)
  686. });
  687. m_app.css_animate(elem, "opacity", 0, 1, ANIM_ELEM_DELAY, "", "");
  688. }
  689. _hor_button_section.style.display = "block";
  690. drop_left(hor_elem);
  691. if (!_no_social)
  692. drop_top(vert_elem);
  693. if (is_touch())
  694. document.body.addEventListener("touchmove", deferred_close);
  695. else {
  696. _buttons_container.addEventListener("mouseleave", deferred_close);
  697. _buttons_container.addEventListener("mouseenter", clear_deferred_close);
  698. }
  699. }
  700. function check_anim_end() {
  701. if (!is_anim_in_process()) {
  702. enable_opened_button();
  703. if ((!check_cursor_position("buttons_container") &&
  704. is_control_panel_opened()) ||
  705. (is_touch() && is_control_panel_opened()))
  706. deferred_close();
  707. }
  708. }
  709. function is_touch() {
  710. return !!(("ontouchstart" in window && !isFinite(navigator.maxTouchPoints))
  711. || navigator.maxTouchPoints)
  712. }
  713. function is_anim_in_process() {
  714. return _is_anim_top || _is_anim_left;
  715. }
  716. function is_control_panel_opened() {
  717. return _is_panel_open_top || _is_panel_open_left;
  718. }
  719. function disable_opened_button() {
  720. if (is_touch())
  721. _opened_button.removeEventListener("touchend", open_menu);
  722. else
  723. _opened_button.removeEventListener("mouseup", open_menu);
  724. }
  725. function enable_opened_button() {
  726. if (is_touch())
  727. _opened_button.addEventListener("touchend", open_menu);
  728. else
  729. _opened_button.addEventListener("mouseup", open_menu);
  730. }
  731. function deferred_close(e) {
  732. if (is_anim_in_process())
  733. return;
  734. clear_deferred_close();
  735. _menu_close_func = setTimeout(close_menu, HIDE_MENU_DELAY);
  736. }
  737. function clear_deferred_close() {
  738. clearTimeout(_menu_close_func);
  739. }
  740. function close_qual_menu(e) {
  741. if (is_anim_in_process())
  742. return;
  743. if (!_is_qual_menu_opened)
  744. return;
  745. _is_qual_menu_opened = false;
  746. if (e) {
  747. e.stopPropagation();
  748. var active_elem = e.target;
  749. } else
  750. var active_elem = document.querySelectorAll(".active_elem_q")[0];
  751. _quality_buttons_container.style.marginRight = "0px";
  752. for (var i = 0, child = _quality_buttons_container.children; i < child.length; i++) {
  753. child[i].style.display = "none";
  754. child[i].style.opacity = 0;
  755. }
  756. _quality_buttons_container.className = "control_panel_button " + active_elem.id;
  757. }
  758. function close_stereo_menu(e) {
  759. if (is_anim_in_process())
  760. return;
  761. if (!_is_stereo_menu_opened)
  762. return;
  763. _is_stereo_menu_opened = false;
  764. if (e) {
  765. e.stopPropagation();
  766. var active_elem = e.target;
  767. } else
  768. var active_elem = document.querySelectorAll(".active_elem_s")[0];
  769. _stereo_buttons_container.style.marginRight = "0px";
  770. for (var i = 0, child = _stereo_buttons_container.children; i < child.length; i++) {
  771. child[i].style.display = "none";
  772. child[i].style.opacity = 0;
  773. }
  774. _stereo_buttons_container.className = "control_panel_button " + active_elem.id;
  775. }
  776. function open_qual_menu(e, button) {
  777. if (is_anim_in_process())
  778. return;
  779. close_stereo_menu();
  780. _is_qual_menu_opened = true;
  781. _quality_buttons_container.style.marginRight = "-30px";
  782. var child_id = button.child_buttons_array_id;
  783. var child_cb = button.child_buttons_array_cb;
  784. for (var i = 0; i < child_id.length; i++) {
  785. var child_elem = document.getElementById(child_id[i]);
  786. if (!_quality_buttons_container.classList.contains(child_id[i]))
  787. if (is_touch())
  788. child_elem.addEventListener("touchend", child_cb[i]);
  789. else
  790. child_elem.addEventListener("mouseup", child_cb[i]);
  791. else {
  792. child_elem.className = "active_elem_q";
  793. if (is_touch())
  794. child_elem.addEventListener("touchend", close_qual_menu);
  795. else
  796. child_elem.addEventListener("mouseup", close_qual_menu);
  797. }
  798. }
  799. _quality_buttons_container.className = "quality_buttons_container";
  800. for (var i = 0, child = _quality_buttons_container.children; i < child.length; i++) {
  801. child[i].style.display = "block";
  802. child[i].style.opacity = 1;
  803. }
  804. }
  805. function open_stereo_menu(e, button) {
  806. if (is_anim_in_process())
  807. return;
  808. close_qual_menu();
  809. _is_stereo_menu_opened = true;
  810. _stereo_buttons_container.style.marginRight = "-30px";
  811. var child_id = button.child_buttons_array_id;
  812. var child_cb = button.child_buttons_array_cb;
  813. for (var i = 0; i < child_id.length; i++) {
  814. var child_elem = document.getElementById(child_id[i]);
  815. if (!child_elem)
  816. continue;
  817. if (!_stereo_buttons_container.classList.contains(child_id[i]))
  818. if (is_touch())
  819. child_elem.addEventListener("touchend", child_cb[i]);
  820. else
  821. child_elem.addEventListener("mouseup", child_cb[i]);
  822. else {
  823. child_elem.className = "active_elem_s";
  824. if (is_touch())
  825. child_elem.addEventListener("touchend", close_stereo_menu);
  826. else
  827. child_elem.addEventListener("mouseup", close_stereo_menu);
  828. }
  829. }
  830. var no_hmd = "";
  831. if (!m_input.can_use_device(m_input.DEVICE_HMD))
  832. no_hmd = "no_hmd";
  833. _stereo_buttons_container.className = "stereo_buttons_container " + no_hmd;
  834. for (var i = 0, child = _stereo_buttons_container.children; i < child.length; i++) {
  835. child[i].style.display = "block";
  836. child[i].style.opacity = 1;
  837. }
  838. }
  839. function on_resize() {
  840. m_cont.resize_to_container();
  841. }
  842. function get_selected_object() {
  843. return _selected_object;
  844. }
  845. function set_selected_object(obj) {
  846. _selected_object = obj;
  847. }
  848. function mouse_cb() {
  849. if (!m_scs.can_select_objects())
  850. return;
  851. var canvas_elem = m_cont.get_canvas();
  852. var mdevice = m_input.get_device_by_type_element(m_input.DEVICE_MOUSE, canvas_elem);
  853. var loc = m_input.get_vector_param(mdevice, m_input.MOUSE_LOCATION, _vec2_tmp);
  854. main_canvas_clicked(loc[0], loc[1]);
  855. }
  856. function touch_cb(touches) {
  857. if (!m_scs.can_select_objects())
  858. return;
  859. for (var i = 0; i < touches.length; i++)
  860. main_canvas_clicked(touches[i].clientX, touches[i].clientY);
  861. }
  862. function register_canvas_click() {
  863. var canvas_elem = m_cont.get_canvas();
  864. var mdevice = m_input.get_device_by_type_element(m_input.DEVICE_MOUSE, canvas_elem);
  865. if (mdevice)
  866. m_input.attach_param_cb(mdevice, m_input.MOUSE_DOWN_WHICH, mouse_cb);
  867. var tdevice = m_input.get_device_by_type_element(m_input.DEVICE_TOUCH, canvas_elem);
  868. if (tdevice)
  869. m_input.attach_param_cb(tdevice, m_input.TOUCH_START, touch_cb);
  870. }
  871. function main_canvas_clicked(x, y) {
  872. var prev_obj = get_selected_object();
  873. if (prev_obj && m_scs.outlining_is_enabled(prev_obj))
  874. m_scs.clear_outline_anim(prev_obj);
  875. var obj = m_scs.pick_object(x, y);
  876. set_selected_object(obj);
  877. }
  878. function loaded_callback(data_id, success) {
  879. if (!success) {
  880. report_app_error("Could not load the scene",
  881. "For more info visit",
  882. "https://www.blend4web.com/doc/en/web_player.html");
  883. return;
  884. }
  885. register_canvas_click();
  886. check_autorotate();
  887. m_app.enable_camera_controls();
  888. m_main.set_render_callback(render_callback);
  889. on_resize();
  890. var mouse_move = m_ctl.create_mouse_move_sensor();
  891. var mouse_click = m_ctl.create_mouse_click_sensor();
  892. var canvas_cont = m_cont.get_container();
  893. function move_cb() {
  894. canvas_cont.className = "move";
  895. }
  896. function stop_cb(obj, id, pulse) {
  897. if (pulse == -1)
  898. canvas_cont.className = "";
  899. }
  900. m_ctl.create_sensor_manifold(null, "MOUSE_MOVE", m_ctl.CT_SHOT,
  901. [mouse_click, mouse_move], function(s) {return s[0] && s[1]}, move_cb);
  902. m_ctl.create_sensor_manifold(null, "MOUSE_STOP", m_ctl.CT_TRIGGER,
  903. [mouse_click], function(s) {return s[0]}, stop_cb);
  904. var url_params = m_app.get_url_params();
  905. if (url_params && "autorotate" in url_params)
  906. rotate_camera();
  907. var meta_tags = m_scs.get_meta_tags();
  908. if (meta_tags.title)
  909. document.title = meta_tags.title;
  910. // check_hmd();
  911. }
  912. function check_hmd() {
  913. var hmd_mode_button = document.querySelector("#hmd_mode_button");
  914. if (!m_input.can_use_device(m_input.DEVICE_HMD)) {
  915. hmd_mode_button.parentElement.removeChild(hmd_mode_button);
  916. return;
  917. }
  918. if (m_cfg.get("stereo") != "HMD")
  919. return;
  920. m_hmd.enable_hmd(m_hmd.HMD_ALL_AXES_MOUSE_YAW);
  921. }
  922. function preloader_callback(percentage, load_time) {
  923. /* _preloader_caption.innerHTML = percentage + "%";
  924. if (percentage < 33) {
  925. if (!_is_first_stage) {
  926. _is_first_stage = true
  927. _circle_container.style.display = "block";
  928. }
  929. _first_stage.style.width = percentage * 4.7 + "px";
  930. _circle_container.style.webkitTransform = 'rotate('+ (percentage * 3.6 - 503) + 'deg)';
  931. _circle_container.style.transform = 'rotate('+ (percentage * 3.6 - 503) + 'deg)';
  932. } else if (percentage < 66) {
  933. if (!_is_second_stage) {
  934. _is_second_stage = true
  935. _first_stage.style.width = 142 + "px";
  936. _second_stage.style.backgroundColor = "#000";
  937. _second_stage.style.marginTop = "135px";
  938. }
  939. if (135 - (percentage - 33) * 4.5 > 0)
  940. _second_stage.style.marginTop = 135 - (percentage - 33) * 3.5 + "px";
  941. _circle_container.style.webkitTransform = 'rotate('+ (percentage * 3.6 - 503) + 'deg)';
  942. _circle_container.style.transform = 'rotate('+ (percentage * 3.6 - 503) + 'deg)';
  943. } else if (percentage != 100) {
  944. if (!_is_third_stage) {
  945. _is_third_stage = true;
  946. _second_stage.style.marginTop = "0px";
  947. _third_stage.style.backgroundColor = "#000";
  948. _third_stage.style.height = "0px";
  949. }
  950. if (percentage > 75)
  951. _third_stage.style.height = (percentage * 0.1) + "px";
  952. _circle_container.style.webkitTransform = 'rotate('+ (percentage * 3.6 - 503) + 'deg)';
  953. _circle_container.style.transform = 'rotate('+ (percentage * 3.6 - 503) + 'deg)';
  954. } */
  955. if (percentage == 100) {
  956. _preloader_container.parentElement.removeChild(_preloader_container);
  957. }
  958. }
  959. function extend_objs_props(objs, common_obj) {
  960. for (var i = objs.length; i--;)
  961. for (var prop in common_obj)
  962. objs[i][prop] = common_obj[prop];
  963. }
  964. function render_callback(elapsed, current_time) {}
  965. function remove_built_in_scripts() {
  966. var scripts = document.getElementById(BUILT_IN_SCRIPTS_ID);
  967. scripts.parentElement.removeChild(scripts);
  968. }
  969. function change_quality(qual) {
  970. var cur_quality = m_cfg.get("quality");
  971. if (cur_quality == qual)
  972. return;
  973. switch (qual) {
  974. case m_cfg.P_LOW:
  975. var quality = "LOW";
  976. break;
  977. case m_cfg.P_HIGH:
  978. var quality = "HIGH";
  979. break;
  980. case m_cfg.P_ULTRA:
  981. var quality = "ULTRA";
  982. break;
  983. }
  984. m_storage.set("quality", quality);
  985. setTimeout(function() {
  986. window.location.reload();
  987. }, 100);
  988. }
  989. function change_stereo(stereo) {
  990. var cur_stereo = m_cfg.get("stereo");
  991. if (cur_stereo == stereo)
  992. return;
  993. m_storage.set("stereo", stereo);
  994. setTimeout(function() {
  995. window.location.reload();
  996. }, 100);
  997. }
  998. function set_quality_config() {
  999. var quality = m_storage.get("quality");
  1000. if (!quality || quality == "CUSTOM") {
  1001. quality = DEFAULT_QUALITY;
  1002. m_storage.set("quality", quality);
  1003. }
  1004. switch (quality) {
  1005. case "LOW":
  1006. var qual = m_cfg.P_LOW;
  1007. break;
  1008. case "HIGH":
  1009. var qual = m_cfg.P_HIGH;
  1010. break;
  1011. case "ULTRA":
  1012. var qual = m_cfg.P_ULTRA;
  1013. break;
  1014. }
  1015. m_cfg.set("quality", qual);
  1016. }
  1017. function set_stereo_config() {
  1018. var stereo = m_storage.get("stereo") || DEFAULT_STEREO;
  1019. m_cfg.set("stereo", stereo);
  1020. }
  1021. function report_app_error(text_message, link_message, link) {
  1022. var error_name = document.querySelector("#error_name");
  1023. var error_info = document.querySelector("#error_info");
  1024. var error_container = document.querySelector("#error_container");
  1025. //_circle_container.style.display = "none";
  1026. // error_name.innerHTML = text_message;
  1027. //error_info.innerHTML = link_message + " <a href=" + link + ">" + link.replace("https://www.", "") + "</a>";
  1028. // error_container.style.display = "block";
  1029. // _logo_container.style.opacity = 1;
  1030. // _logo_container.style.marginTop = "-90px";
  1031. }
  1032. });
  1033. // to allow early built-in module check
  1034. window.addEventListener("load", function() {b4w.require("embed_main").init();});