index.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <!-- <link rel="stylesheet" href="./index.css" /> -->
  9. <link rel="stylesheet" href="./css/toastify.min.css" />
  10. </head>
  11. <body>
  12. <!-- Babylon.js -->
  13. <script src="./libs/jquery-1.10.2.min.js"></script>
  14. <script src="./libs/dat.gui.min.js"></script>
  15. <script src="./libs/ammo.js"></script>
  16. <script src="./libs/cannon.js"></script>
  17. <script src="./libs/Oimo.js"></script>
  18. <script src="./libs/earcut.min.js"></script>
  19. <script src="./libs/recast.js"></script>
  20. <script src="./libs/babylon.js"></script>
  21. <script src="./libs/babylonjs.materials.min.js"></script>
  22. <script src="./libs/babylonjs.proceduralTextures.min.js"></script>
  23. <script src="./libs/babylonjs.postProcess.min.js"></script>
  24. <script src="./libs/babylonjs.loaders.js"></script>
  25. <script src="./libs/babylonjs.serializers.min.js"></script>
  26. <script src="./libs/babylon.gui.min.js"></script>
  27. <script src="./libs/babylon.inspector.bundle.js"></script>
  28. <script src="./libs/socket.2.3.js"></script>
  29. <script src="./libs/events.js"></script>
  30. <script src="./libs/axios.min.js"></script>
  31. <script src="./libs/VisibilityChangeHandler.js"></script>
  32. <script src="./libs/decoder.js"></script>
  33. <script src="./libs/nipplejs.min.js"></script>
  34. <script src="./shader.js"></script>
  35. <!-- <script src="./webrtc//adapter-7.4.0.min.js"></script>
  36. <script src="./webrtc/srs.sdk.js"></script> -->
  37. <link rel="stylesheet" href="./css/index.cb1a6e05.css" />
  38. <script>
  39. const SERVER_URLS = {
  40. DEV: "wss://sit-eks.xverse.cn/ws",
  41. PROD: "wss://eks.xverse.cn/ws"
  42. }
  43. , REPORT_URL = {
  44. DEV: "https://xa.xverse.cn:6680/collect1",
  45. PROD: "https://xa.xverse.cn/collect1"
  46. }
  47. , MAX_RECONNECT_COUNT = 3
  48. , DEFAULT_JOINROOM_TIMEOUT = 15e3
  49. , DEFAULT_MAIN_CAMERA_FOV = 50
  50. , DEFAULT_AVATAR_SCALE = 1
  51. , REPORT_NUM_PER_REQUEST = 20
  52. , DEFAULT_OPEN_TIMEOUT_MS = 6e3
  53. , WS_CLOSE_NORMAL = 1e3
  54. , WS_CLOSE_RECONNECT = 3008
  55. , PING_INTERVAL_MS = 1e3
  56. , TEXTURE_URL = "https://static.xverse.cn/qqktv/texture.png"
  57. , REPORT_MODULE_TYPE = "xverse-js"
  58. , authenticationErrorCodes = [3001, 3002, 3003, 3005]
  59. , RTT_MAX_VALUE = 200
  60. , HB_MAX_VALUE = 500
  61. , DURATION = 10
  62. , NET_INTERVAL = 1;
  63. const VERSION$1 = "1.0.75"
  64. , ENV = "production";
  65. const COMPONENT_LIST_PREFIX = "/component_list.json";
  66. const avatarSetting = {
  67. fileType: ".glb",
  68. lodType: "_lod",
  69. lod: [{
  70. level: "lod0",
  71. fileName: ".glb",
  72. quota: 5,
  73. dist: 1e3
  74. }, {
  75. level: "lod1",
  76. fileName: "_lod2.glb",
  77. quota: 5,
  78. dist: 2e3
  79. }, {
  80. level: "lod2",
  81. fileName: "_lod4.glb",
  82. quota: 0,
  83. dist: 7500
  84. }],
  85. isRayCastEnable: !0,
  86. maxAvatarNum: 40,
  87. maxBillBoardDist: 7500,
  88. body: "body",
  89. head: "head",
  90. hair: "hair",
  91. suit: "suit",
  92. pants: "pants",
  93. shoes: "shoes",
  94. clothes: "clothes",
  95. animations: "animations",
  96. defaultIdle: "Idle",
  97. cullingDistance: 200,
  98. defaultMove: "Walking"
  99. }
  100. , avatarResources = {
  101. ygb: {
  102. name: "ygb",
  103. mat: "NM_ygb",
  104. mesh: "ygb"
  105. }
  106. }
  107. , action = {
  108. GiftClap: {
  109. animName: "GiftClap",
  110. keyTime: 1760
  111. },
  112. Cheering: {
  113. animName: "Cheering",
  114. attachPair: [{
  115. bone: "mixamorig_MiddleFinger2_R",
  116. obj: "ygb",
  117. offset: {
  118. x: 0,
  119. y: 0,
  120. z: 0
  121. },
  122. rotate: {
  123. x: 0,
  124. y: 3.84,
  125. z: 0
  126. },
  127. scale: {
  128. x: 1,
  129. y: 1,
  130. z: 1
  131. }
  132. }, {
  133. bone: "mixamorig_MiddleFinger2_L",
  134. obj: "ygb",
  135. offset: {
  136. x: 0,
  137. y: 0,
  138. z: 0
  139. },
  140. rotate: {
  141. x: 0,
  142. y: 3.49,
  143. z: 0
  144. },
  145. scale: {
  146. x: 1,
  147. y: 1,
  148. z: 1
  149. }
  150. }]
  151. }
  152. }
  153. const WASM_Version = "h264"
  154. , DECODER_VERSION = "v0.9.3"
  155. , WASM_URLS = {
  156. h264: "https://static.xverse.cn/wasm/v15/lib_ff264dec_no_idb_with_wasm_tbundle.js?tbundle=tmeland_base",
  157. xv265: "https://static.xverse.cn/wasm/codec-release/h265-dec-sw-wasm/v-0-9-1/libxv265dec.js",
  158. h265: ""
  159. }
  160. , STUCK_STAGE_GOOD = 45
  161. , STUCK_STAGE_WELL = 85
  162. , STUCK_STAGE_FAIR = 125
  163. , STUCK_STAGE_BAD = 165
  164. , DECODER_PASSIVE_JITTER = 0;
  165. /**
  166. * 公共方法
  167. **/
  168. const isFunction = i=>typeof i == "function";
  169. const isSuit = i=>i === "suit"
  170. // 随机获取数组内某一元素,或字符串内某一字符
  171. const getRandomItem = (i) =>i.length === 0 ? null : i[Math.floor(Math.random() * i.length)]
  172. const getAnimationKey = (i,e)=>e + "_" + i
  173. const blobToDataURI = async i=>new Promise((e,t)=>{
  174. const r = new FileReader;
  175. r.readAsDataURL(i),
  176. r.onload = function(n) {
  177. var o;
  178. e((o = n.target) == null ? void 0 : o.result)
  179. }
  180. ,
  181. r.onerror = function(n) {
  182. t(n)
  183. }
  184. });
  185. // 系统检测
  186. const checkOS = ()=>{
  187. const i = navigator.userAgent
  188. , e = /(?:Windows Phone)/.test(i)
  189. , t = /(?:SymbianOS)/.test(i) || e
  190. , r = /(?:Android)/.test(i)
  191. , n = /(?:Firefox)/.test(i);
  192. /(?:Chrome|CriOS)/.test(i);
  193. const o = /(?:iPad|PlayBook)/.test(i) || r && !/(?:Mobile)/.test(i) || n && /(?:Tablet)/.test(i)
  194. , a = /(?:iPhone|ipad|ipod)/.test(i) && !o
  195. , s = !a && !r && !t;
  196. return {
  197. isTablet: o,
  198. isPhone: a,
  199. isIOS: /iPhone|iPod|iPad/.test(navigator.userAgent),
  200. isAndroid: r,
  201. isPc: s
  202. }
  203. }
  204. var De = Object.defineProperty
  205. , Ne = Object.defineProperties;
  206. var we = Object.getOwnPropertyDescriptors;
  207. var be = Object.getOwnPropertySymbols;
  208. var Me = Object.prototype.hasOwnProperty
  209. , Ie = Object.prototype.propertyIsEnumerable;
  210. var Se = (obj, key, value) =>
  211. key in obj ? Object.defineProperty(obj, key, {
  212. enumerable: true,
  213. configurable: true,
  214. writable: true,
  215. value: value
  216. }) : obj[key] = value
  217. , oe = (obj, propsObj)=>{
  218. for (var t in propsObj || (propsObj = {}))
  219. Me.call(propsObj, t) && Se(obj, t, propsObj[t]);
  220. if (Object.getOwnPropertySymbols) {
  221. for (var t of Object.getOwnPropertySymbols(propsObj))
  222. Ie.call(propsObj, t) && Se(obj, t, propsObj[t]);
  223. }
  224. return obj
  225. }
  226. // 将propsObj的所有属性拷贝到obj
  227. , le = (obj, propsObj) => Object.defineProperties(obj, Object.getOwnPropertyDescriptors(propsObj));
  228. var Oe = (i,e)=>{
  229. var t = {};
  230. for (var r in i)
  231. Me.call(i, r) && e.indexOf(r) < 0 && (t[r] = i[r]);
  232. if (i != null && be)
  233. for (var r of be(i))
  234. e.indexOf(r) < 0 && Ie.call(i, r) && (t[r] = i[r]);
  235. return t
  236. };
  237. var E = (i,e,t)=>(Se(i, typeof e != "symbol" ? e + "" : e, t),t);
  238. // 自定义Promise超时
  239. Promise.prototype._timeout = function(timeLimit, e) {
  240. let handle;
  241. return new Promise((resolve, reject) => (
  242. handle = window.setTimeout(()=>{
  243. reject(e)
  244. }, timeLimit),
  245. this.then(
  246. o=>{
  247. clearTimeout(handle),
  248. resolve(o)
  249. },
  250. o=>{
  251. clearTimeout(handle),
  252. reject(o)
  253. }
  254. )
  255. ))
  256. };
  257. function toast(i, e) {
  258. const {onClick: t, duration: r} = e || {};
  259. return window.Toastify({
  260. text: i,
  261. duration: r || 3e3,
  262. position: "center",
  263. onClick: function() {
  264. t && t()
  265. }
  266. }).showToast()
  267. }
  268. // 将原json里的值全部转成float,并返回一个新json
  269. const objectParseFloat = (i) => {
  270. const e = {};
  271. i && Object.keys(i).forEach((t) => {
  272. e[t] = parseFloat(i[t]);
  273. })
  274. return e;
  275. }
  276. const safelyJsonParse = i=> {
  277. let e = {};
  278. try {
  279. e = JSON.parse(i)
  280. } catch {}
  281. return e
  282. }
  283. const safeParseComponents = i=>{
  284. let e = [];
  285. try {
  286. e = JSON.parse(i || "[]")
  287. } catch {
  288. e = [],
  289. log$2.error(`avatarComponents parse error: ${i}`)
  290. }
  291. return e
  292. }
  293. const safeDecodeURIComponent = i=>{
  294. let e = "";
  295. try {
  296. e = decodeURIComponent(i)
  297. } catch {
  298. e = i
  299. }
  300. return e
  301. }
  302. // 坐标和旋转数值保护,保留2位小数
  303. const positionPrecisionProtect = i=>{
  304. const {x: e, y: t, z: r} = i;
  305. return {
  306. x: +e.toFixed(2),
  307. y: +t.toFixed(2),
  308. z: +r.toFixed(2)
  309. }
  310. }
  311. const rotationPrecisionProtect = i=>{
  312. const {pitch: e, yaw: t, roll: r} = i;
  313. return {
  314. pitch: +e.toFixed(2),
  315. yaw: +t.toFixed(2),
  316. roll: +r.toFixed(2)
  317. }
  318. }
  319. const avatarComponentsModify = (i,e)=>new Promise((t,r)=>{
  320. var l;
  321. let n = [];
  322. const o = []
  323. , a = [];
  324. let s = e.some(u=>isSuit(u.type));
  325. if ((l = i == null ? void 0 : i.components) == null || l.forEach(u=>{
  326. var f;
  327. const c = e.find(d=>d.type === u.type)
  328. , h = c && ((f = i == null ? void 0 : i.components) == null ? void 0 : f.find(d=>d.type === c.type && d.units.some(_=>_.id === c.id))) !== void 0;
  329. if (c)
  330. if (h)
  331. n.push(c);
  332. else {
  333. const d = u.units.find(_=>_.isDefault) || u.units[0];
  334. d ? n.push({
  335. type: u.type,
  336. id: d.id
  337. }) : o.push(`component with type: ${u.type} without default and available unit`)
  338. }
  339. else if (isSuit(u.type)) {
  340. const d = u.units.find(_=>_.isDefault);
  341. d && n.push({
  342. type: u.type,
  343. id: d.id
  344. })
  345. } else {
  346. const d = u.units.find(_=>_.isDefault) || u.units[0];
  347. d ? n.push({
  348. type: u.type,
  349. id: d.id
  350. }) : o.push(`component with type: ${u.type} without default and available unit`)
  351. }
  352. }
  353. ),
  354. s = n.some(u=>isSuit(u.type)),
  355. s) {
  356. const u = i == null ? void 0 : i.components.find(c=>isSuit(c.type));
  357. n = n.filter(c=>(u == null ? void 0 : u.suitComb.indexOf(c.type)) === -1)
  358. }
  359. o.length > 0 && (log$2.error(o.join(", ")),
  360. r(o.join(", "))),
  361. a.length > 0 && log$2.warn(a.join(", ")),
  362. t(n)
  363. })
  364. const avatarComponentsParser = async(i=null,e,t=[])=>new Promise(async(r,n)=>{
  365. var u, c;
  366. if (e.find(h=>isSuit(h.type))) {
  367. const h = (c = (u = i == null ? void 0 : i.components) == null ? void 0 : u.find(f=>isSuit(f.type))) == null ? void 0 : c.suitComb;
  368. e = e.filter(f=>(h == null ? void 0 : h.indexOf(f.type)) === -1)
  369. }
  370. const a = e.filter(h=>!t.some(f=>f.id === h.id));
  371. a.length === 0 && r([]);
  372. const s = [];
  373. a.forEach(async h=>{
  374. var _;
  375. let f = (_ = i == null ? void 0 : i.components) == null ? void 0 : _.find(g=>g.type === h.type);
  376. if (!f) {
  377. const g = `changeComponents, no such component with type: ${h.type}`;
  378. log$2.error(g),
  379. n(g)
  380. }
  381. f = JSON.parse(JSON.stringify(f));
  382. let d = f == null ? void 0 : f.units.find(g=>g.id === h.id);
  383. d || (log$2.warn(`changeComponents, no unit with type: ${h.type}, id: ${h.id}`),
  384. d = f == null ? void 0 : f.units.find(g=>g.isDefault),
  385. !d && log$2.warn(`changeComponents, no default unit with type: ${h.type}`)),
  386. d && s.push({
  387. id: d.id,
  388. url: d.url,
  389. suitComb: (f == null ? void 0 : f.suitComb) || [],
  390. type: h.type
  391. })
  392. });
  393. const l = [];
  394. Promise.all(l).then(h=>{
  395. s.forEach((f,d)=>{
  396. var _, g;
  397. if (!isSuit(f.type)) {
  398. const m = ((g = (_ = i == null ? void 0 : i.components) == null ? void 0 : _.find(v=>isSuit(v.type))) == null ? void 0 : g.suitComb) || [];
  399. m.length > 0 && (m == null ? void 0 : m.indexOf(f.type)) !== -1 && (f.suitComb = ["suit"])
  400. }
  401. f.url = h[d]
  402. }
  403. ),
  404. r(s)
  405. }).catch(h=>{
  406. n(h)
  407. })
  408. })
  409. /**
  410. * 坐标转换相关
  411. **/
  412. // UE4 to Xverse
  413. const ue4Rotation2Xverse = i=>isRotationCorrect() ? (
  414. i.pitch >= 89.5 ? i.pitch = 89.5 : i.pitch <= -89.5 && (i.pitch = -89.5),
  415. new BABYLON.Vector3(-1 * Math.PI * i.pitch / 180,Math.PI * i.yaw / 180 - Math.PI * 27 / 18,Math.PI * i.roll / 180 < .001 ? 0 : Math.PI * i.roll / 180)
  416. ) : null
  417. const ue4Rotation2Xverse_mesh = i=>isRotationCorrect() ? new BABYLON.Vector3(Math.PI * i.pitch / 180,Math.PI * i.yaw / 180,Math.abs(Math.PI * i.roll) / 180 < .001 ? 0 : -1 * (Math.PI * i.roll) / 180) : null
  418. const scaleFromUE4toXverse = 100;
  419. const ue4Scaling2Xverse = i=>isScalingCorrect() ? new BABYLON.Vector3(i.x,i.z,-1 * i.y) : null
  420. const ue4Position2Xverse = i=>isPositionCorrect() ? new BABYLON.Vector3(i.x * .01,i.z * .01,-1 * i.y * .01) : null
  421. // Xverse to Ue4
  422. const xversePosition2Ue4 = i=>isPositionCorrect() ? {
  423. x: i.x * 100,
  424. y: -1 * i.z * 100,
  425. z: i.y * 100
  426. } : null
  427. const xverseRotation2Ue4 = i=>{
  428. if (isPositionCorrect()) {
  429. let e = 0;
  430. return i.z == 0 ? e = 0 : e = 180 * i.z / Math.PI,
  431. {
  432. pitch: 180 * i.x * -1 / Math.PI,
  433. yaw: (i.y + Math.PI * 27 / 18) * 180 / Math.PI,
  434. roll: e
  435. }
  436. } else
  437. return null
  438. }
  439. // 计算两个向量间的距离或角度
  440. const calcDistance3D = (i,e)=>Math.sqrt((i.x - e.x) * (i.x - e.x) + (i.y - e.y) * (i.y - e.y) + (i.z - e.z) * (i.z - e.z))
  441. const calcDistance3DVector = (i,e)=>Math.sqrt((i.x - e.x) * (i.x - e.x) + (i.y - e.y) * (i.y - e.y) + (i.z - e.z) * (i.z - e.z))
  442. const calcDistance3DAngle = (i,e)=>Math.sqrt((i.roll - e.roll) * (i.roll - e.roll) + (i.pitch - e.pitch) * (i.pitch - e.pitch) + (i.yaw - e.yaw) * (i.yaw - e.yaw))
  443. const isPositionCorrect = i=>!0
  444. const isScalingCorrect = i=>!0
  445. const isRotationCorrect = i=>!0
  446. const getStringBoundaries = (i,e,t=new Map)=>{
  447. let r = 0
  448. , n = ""
  449. , o = -1
  450. , a = 0;
  451. const s = [0];
  452. for (let l = 0; l < i.length; l++) {
  453. const u = i.codePointAt(l);
  454. let c = t.get(u);
  455. if (c)
  456. r += c,
  457. n += i[l],
  458. u > 64 && u < 91 || u > 96 && u < 123 ? (o == -1 && (o = l),
  459. a += c) : (o = -1,
  460. a = 0);
  461. else if (u < 975 || u > 1024 && u < 1920)
  462. c = 1,
  463. r++,
  464. n += i[l],
  465. u > 64 && u < 91 || u > 96 && u < 123 ? (o == -1 && (o = l),
  466. a += c) : (o = -1,
  467. a = 0);
  468. else if (u > 4499 && u < 4600 || u > 8207 && u < 8232 || u > 8238 && u < 8287 || u > 8238 && u < 8287 || u > 8304 && u < 8384 || u > 8447 && u < 9211 || u > 11263 && u < 11624 || u > 11646 && u < 11671 || u > 11679 && u < 11845 || u > 11903 && u < 12020 || u > 12031 && u < 12246 || u > 12287 && u < 12544 || u > 12548 && u < 12728 || u > 12735 && u < 12772 || u > 12783 && u < 19894 || u > 19967 && u < 40918 || u > 42191 && u < 42240 || u > 44031 && u < 55204 || u > 59276 && u < 59287 || u > 59412 && u < 59493 || u > 63743 && u < 64207 || u > 65039 && u < 65050 || u > 65071 && u < 65510)
  469. c = 2,
  470. r += 2,
  471. o = -1,
  472. a = 0,
  473. n += i[l];
  474. else if (u > 9311 && u < 11158) {
  475. c = 2,
  476. r += 2,
  477. o = -1,
  478. a = 0,
  479. n += i[l];
  480. const h = i.codePointAt(l + 1);
  481. h > 65023 && h < 65040 && (n += i[l + 1],
  482. l++)
  483. } else
  484. u > 126979 && u < 129783 && (c = 2,
  485. r += 2,
  486. o = -1,
  487. a = 0,
  488. l++,
  489. n += String.fromCodePoint(u));
  490. if (l == s[s.length - 1] + 1 && o > 0 ? (s[s.length - 1] = o,
  491. r = 0 + a) : r > e && (s.push(l),
  492. a >= r && (a = 0 + c,
  493. o = 0),
  494. r = 0 + c),
  495. l >= i.length - 1)
  496. break
  497. }
  498. return s[s.length - 1] != i.length && s.push(i.length),
  499. [n, s]
  500. }
  501. var Observer = function() {
  502. function i(e, t, r) {
  503. r === void 0 && (r = null),
  504. this.callback = e,
  505. this.mask = t,
  506. this.scope = r,
  507. this._willBeUnregistered = !1,
  508. this.unregisterOnNextCall = !1
  509. }
  510. return i
  511. }()
  512. var Observable = function() {
  513. function i(e) {
  514. this._observers = new Array,
  515. this._eventState = new BABYLON.EventState(0),
  516. e && (this._onObserverAdded = e)
  517. }
  518. i.FromPromise = function(e, t) {
  519. var r = new i;
  520. return e.then(function(n) {
  521. r.notifyObservers(n)
  522. }).catch(function(n) {
  523. if (t)
  524. t.notifyObservers(n);
  525. else
  526. throw n
  527. }),
  528. r
  529. }
  530. ,
  531. Object.defineProperty(i.prototype, "observers", {
  532. get: function() {
  533. return this._observers
  534. },
  535. enumerable: !1,
  536. configurable: !0
  537. }),
  538. i.prototype.add = function(e, t, r, n, o) {
  539. if (t === void 0 && (t = -1),
  540. r === void 0 && (r = !1),
  541. n === void 0 && (n = null),
  542. o === void 0 && (o = !1),
  543. !e)
  544. return null;
  545. var a = new Observer(e,t,n);
  546. return a.unregisterOnNextCall = o,
  547. r ? this._observers.unshift(a) : this._observers.push(a),
  548. this._onObserverAdded && this._onObserverAdded(a),
  549. a
  550. }
  551. ,
  552. i.prototype.addOnce = function(e) {
  553. return this.add(e, void 0, void 0, void 0, !0)
  554. }
  555. ,
  556. i.prototype.remove = function(e) {
  557. if (!e)
  558. return !1;
  559. var t = this._observers.indexOf(e);
  560. return t !== -1 ? (this._deferUnregister(e),
  561. !0) : !1
  562. }
  563. ,
  564. i.prototype.removeCallback = function(e, t) {
  565. for (var r = 0; r < this._observers.length; r++) {
  566. var n = this._observers[r];
  567. if (!n._willBeUnregistered && n.callback === e && (!t || t === n.scope))
  568. return this._deferUnregister(n),
  569. !0
  570. }
  571. return !1
  572. }
  573. ,
  574. i.prototype._deferUnregister = function(e) {
  575. var t = this;
  576. e.unregisterOnNextCall = !1,
  577. e._willBeUnregistered = !0,
  578. setTimeout(function() {
  579. t._remove(e)
  580. }, 0)
  581. }
  582. ,
  583. i.prototype._remove = function(e) {
  584. if (!e)
  585. return !1;
  586. var t = this._observers.indexOf(e);
  587. return t !== -1 ? (this._observers.splice(t, 1),
  588. !0) : !1
  589. }
  590. ,
  591. i.prototype.makeObserverTopPriority = function(e) {
  592. this._remove(e),
  593. this._observers.unshift(e)
  594. }
  595. ,
  596. i.prototype.makeObserverBottomPriority = function(e) {
  597. this._remove(e),
  598. this._observers.push(e)
  599. }
  600. ,
  601. i.prototype.notifyObservers = function(e, t, r, n, o) {
  602. if (t === void 0 && (t = -1),
  603. !this._observers.length)
  604. return !0;
  605. var a = this._eventState;
  606. a.mask = t,
  607. a.target = r,
  608. a.currentTarget = n,
  609. a.skipNextObservers = !1,
  610. a.lastReturnValue = e,
  611. a.userInfo = o;
  612. for (var s = 0, l = this._observers; s < l.length; s++) {
  613. var u = l[s];
  614. if (!u._willBeUnregistered && (u.mask & t && (u.scope ? a.lastReturnValue = u.callback.apply(u.scope, [e, a]) : a.lastReturnValue = u.callback(e, a),
  615. u.unregisterOnNextCall && this._deferUnregister(u)),
  616. a.skipNextObservers))
  617. return !1
  618. }
  619. return !0
  620. }
  621. ,
  622. i.prototype.notifyObserversWithPromise = function(e, t, r, n, o) {
  623. var a = this;
  624. t === void 0 && (t = -1);
  625. var s = Promise.resolve(e);
  626. if (!this._observers.length)
  627. return s;
  628. var l = this._eventState;
  629. return l.mask = t,
  630. l.target = r,
  631. l.currentTarget = n,
  632. l.skipNextObservers = !1,
  633. l.userInfo = o,
  634. this._observers.forEach(function(u) {
  635. l.skipNextObservers || u._willBeUnregistered || u.mask & t && (u.scope ? s = s.then(function(c) {
  636. return l.lastReturnValue = c,
  637. u.callback.apply(u.scope, [e, l])
  638. }) : s = s.then(function(c) {
  639. return l.lastReturnValue = c,
  640. u.callback(e, l)
  641. }),
  642. u.unregisterOnNextCall && a._deferUnregister(u))
  643. }),
  644. s.then(function() {
  645. return e
  646. })
  647. }
  648. ,
  649. i.prototype.notifyObserver = function(e, t, r) {
  650. if (r === void 0 && (r = -1),
  651. !e._willBeUnregistered) {
  652. var n = this._eventState;
  653. n.mask = r,
  654. n.skipNextObservers = !1,
  655. e.callback(t, n),
  656. e.unregisterOnNextCall && this._deferUnregister(e)
  657. }
  658. }
  659. ,
  660. i.prototype.hasObservers = function() {
  661. return this._observers.length > 0
  662. }
  663. ,
  664. i.prototype.clear = function() {
  665. this._observers = new Array,
  666. this._onObserverAdded = null
  667. }
  668. ,
  669. i.prototype.clone = function() {
  670. var e = new i;
  671. return e._observers = this._observers.slice(0),
  672. e
  673. }
  674. ,
  675. i.prototype.hasSpecificMask = function(e) {
  676. e === void 0 && (e = -1);
  677. for (var t = 0, r = this._observers; t < r.length; t++) {
  678. var n = r[t];
  679. if (n.mask & e || n.mask === e)
  680. return !0
  681. }
  682. return !1
  683. }
  684. return i
  685. }();
  686. </script>
  687. <div id="root">
  688. <div class = "App">
  689. <canvas id = "canvas" class = "stream unselect">
  690. </canvas>
  691. </div>
  692. <div class="debug_control_btns">
  693. <button class="debugger1">Toggle Stats</button>
  694. <button class="debugger2">取消低模着色</button>
  695. <button class="debugger3">画质:高</button>
  696. <button class="font-size-small debugger4" onclick="room.debug.toggleNearbyBreathPoint">Toggle周边呼吸点</button>
  697. <button class="font-size-small debugger5" onclick="room.debug.toggleTapBreathPoint">Toggle点击呼吸点</button>
  698. <button class="font-size-small debugger6" >录制码流(10s)</button>
  699. </div>
  700. </div>
  701. <script type="module">
  702. document.querySelector('.debugger1').onclick = ()=>{
  703. var y, b;
  704. (y = room.stats) != null && y.isShow
  705. ? room.stats.hide()
  706. : (b = room.stats) == null || b.show();
  707. }
  708. document.querySelector('.debugger2').onclick = ()=>{
  709. room.debug.toggleSceneshading(), r(room.debug.isSceneShading);
  710. }
  711. document.querySelector('.debugger3').onclick = ()=>{
  712. let y = "average";
  713. n === "high"
  714. ? (y = "average")
  715. : n === "average"
  716. ? (y = "low")
  717. : n === "low"
  718. ? (y = "high")
  719. : (y = "average"),
  720. o(y),
  721. room.setPictureQualityLevel(y);
  722. }
  723. document.querySelector('.debugger4').onclick = ()=>{
  724. room.debug.toggleNearbyBreathPoint();
  725. }
  726. document.querySelector('.debugger5').onclick = ()=>{
  727. room.debug.toggleTapBreathPoint();
  728. }
  729. document.querySelector('.debugger6').onclick = ()=>{
  730. room.debug.dumpStream(() => {
  731. // toast("\u5F55\u5236\u5B8C\u6210");
  732. });
  733. // toast("\u5F00\u59CB\u5F55\u5236");
  734. }
  735. </script>
  736. <script src="js/index.js"></script>
  737. </body>
  738. </html>