Browse Source

Merge branch 'myrtc' of http://192.168.0.115:3000/xushiting/Metaverse into myrtc

xushiting 3 years ago
parent
commit
06f8072a7b
62 changed files with 3372 additions and 2604 deletions
  1. BIN
      dist/assets/avatar/YXTN.zip
  2. BIN
      dist/assets/avatar/YXTN/animations/Idle.glb
  3. BIN
      dist/assets/avatar/YXTN/animations/Walking.glb
  4. BIN
      dist/assets/avatar/YXTN/body - 副本 (2).glb
  5. BIN
      dist/assets/avatar/YXTN/body.glb
  6. BIN
      dist/assets/avatar/YXTN/body0.glb
  7. 24 0
      dist/assets/avatar/YXTN/component_list.json
  8. BIN
      dist/assets/avatar/man_YXL.zip
  9. BIN
      dist/assets/avatar/man_YXL/animations/Idle.glb
  10. BIN
      dist/assets/avatar/man_YXL/animations/Running.glb
  11. BIN
      dist/assets/avatar/man_YXL/animations/Walking.glb
  12. 29 0
      dist/assets/avatar/man_YXL/component_list.json
  13. BIN
      dist/assets/avatar/man_YXL/man_YXL - 副本 (2).glb
  14. BIN
      dist/assets/avatar/man_YXL/man_YXL - 副本.glb
  15. BIN
      dist/assets/avatar/man_YXL/man_YXL.glb
  16. BIN
      dist/assets/avatar/man_YXL/man_YXL0.glb
  17. 24 2272
      dist/assets/config.json
  18. 218 0
      dist/assets/config_YXTN.json
  19. 2466 0
      dist/assets/config_body_man.json
  20. 218 0
      dist/assets/config_man_YXL.json
  21. BIN
      dist/assets/xverse_tv_840x480_1K.mp4
  22. BIN
      dist/assets/yqtgTV_xverse.glb
  23. 18 2
      dist/index.html
  24. 1 1
      src/ActionsHandler.js
  25. 1 1
      src/BreathPoint.js
  26. 1 1
      src/Broadcast.js
  27. 9 12
      src/EngineProxy.js
  28. 4 4
      src/EventsManager.js
  29. 1 1
      src/Http.js
  30. 5 7
      src/Http1.js
  31. 3 3
      src/Http2.js
  32. 2 1
      src/Logger.js
  33. 9 14
      src/NetworkController.js
  34. 7 9
      src/Preload.js
  35. 2 4
      src/Rtcp.js
  36. 1 1
      src/Signal.js
  37. 6 9
      src/Socket.js
  38. 2 3
      src/Stats.js
  39. 16 11
      src/TV.js
  40. 16 0
      src/Tip.js
  41. 5 5
      src/Workers.js
  42. 13 9
      src/XAnimationController.js
  43. 1 1
      src/XAvatarBillboardComponent.js
  44. 16 9
      src/XAvatarComopnent.js
  45. 33 35
      src/XAvatarLoader.js
  46. 6 5
      src/XAvatarManager.js
  47. 1 1
      src/XBreathPointManager.js
  48. 1 1
      src/XDecal.js
  49. 2 2
      src/XLightManager.js
  50. 1 1
      src/XMaterialComponent.js
  51. 4 4
      src/XSceneManager.js
  52. 1 1
      src/XStateMachine.js
  53. 1 1
      src/XStaticMesh.js
  54. 1 1
      src/XStaticMeshComponent.js
  55. 1 1
      src/XStaticMeshFromOneGltf.js
  56. 129 100
      src/XTelevision.js
  57. 3 4
      src/Xverse.js
  58. 10 15
      src/XverseAvatar.js
  59. 7 11
      src/XverseAvatarManager.js
  60. 1 1
      src/XverseEffectManager.js
  61. 23 36
      src/Xverse_Room.js
  62. 29 4
      src/main.js

BIN
dist/assets/avatar/YXTN.zip


BIN
dist/assets/avatar/YXTN/animations/Idle.glb


BIN
dist/assets/avatar/YXTN/animations/Walking.glb


BIN
dist/assets/avatar/YXTN/body - 副本 (2).glb


BIN
dist/assets/avatar/YXTN/body.glb


BIN
dist/assets/avatar/YXTN/body0.glb


+ 24 - 0
dist/assets/avatar/YXTN/component_list.json

@@ -0,0 +1,24 @@
+{
+    "components": {
+        "thumbnail": "",
+        "url": "body.glb",
+        "url_lod2": "body.glb",
+        "url_lod4": "body.glb"
+    },
+    "animations": [
+        {
+            "thumbnail": "",
+            "id": "1",
+            "name": "Idle",
+            "sex": "man",
+            "url": "animations/Idle.glb"
+        },
+        {
+            "thumbnail": "",
+            "id": "2",
+            "name": "Walking",
+            "sex": "man",
+            "url": "animations/Walking.glb"
+        }
+    ]
+}

BIN
dist/assets/avatar/man_YXL.zip


BIN
dist/assets/avatar/man_YXL/animations/Idle.glb


BIN
dist/assets/avatar/man_YXL/animations/Running.glb


BIN
dist/assets/avatar/man_YXL/animations/Walking.glb


+ 29 - 0
dist/assets/avatar/man_YXL/component_list.json

@@ -0,0 +1,29 @@
+{
+    "components": {
+        "thumbnail": "",
+        "url": "man_YXL.glb"
+    },
+    "animations": [
+        {
+            "thumbnail": "",
+            "id": "1",
+            "name": "Idle",
+            "sex": "man",
+            "url": "animations/Idle.glb"
+        },
+        {
+            "thumbnail": "",
+            "id": "2",
+            "name": "Walking",
+            "sex": "man",
+            "url": "animations/Walking.glb"
+        },
+        {
+            "thumbnail": "",
+            "id": "3",
+            "name": "Running",
+            "sex": "man",
+            "url": "animations/Running.glb"
+        }
+    ]
+}

BIN
dist/assets/avatar/man_YXL/man_YXL - 副本 (2).glb


BIN
dist/assets/avatar/man_YXL/man_YXL - 副本.glb


BIN
dist/assets/avatar/man_YXL/man_YXL.glb


BIN
dist/assets/avatar/man_YXL/man_YXL0.glb


File diff suppressed because it is too large
+ 24 - 2272
dist/assets/config.json


+ 218 - 0
dist/assets/config_YXTN.json

@@ -0,0 +1,218 @@
+{
+    "code": 0,
+    "msg": "",
+    "data": {
+        "config": {
+            "avatars": [
+                {
+                    "id": "My_Actor",
+                    "name": "My_Actor",
+                    "url": "./assets/avatar/YXTN.zip",
+                    "gender": "man",
+                    "components": [],
+                    "animations": [
+                        {
+                            "name": "Walking",
+                            "url": "./assets/avatar/YXTN/animations/Walking.glb"
+                        },
+                        {
+                            "name": "Idle",
+                            "url": "./assets/avatar/YXTN/animations/Idle.glb"
+                        }
+                    ]
+                }
+            ],
+            "skins": [
+                {
+                    "id": "0000000001",
+                    "name": "梁启超_Cookonlymaps",
+                    "versionId": "00008",
+                    "isEnable": false,
+                    "fov": "90",
+                    "resolution": {
+                        "width": 1728,
+                        "height": 720
+                    },
+                    "assetList": [
+                        {
+                            "typeName": "MODEL",
+                            "className": "粗模",
+                            "assetId": "",
+                            "name": "ground_LQC_xverse.glb",
+                            "url": "./assets/level_L01.glb",
+                            "thumbnailUrl": ""
+                        },
+                        {
+                          "typeName": "MODEL",
+                          "className": "TV",
+                          "assetId": "",
+                          "name": "yqtgTV_xverse.glb",
+                          "url": "https://app-mgt-resource-1258211750.file.myqcloud.com/model/fefa5e668b634bc283feb5d6769f95ad/yqtgTV_xverse.glb",
+                          "thumbnailUrl": ""
+                        },
+                        {
+                            "typeName": "CONFIG",
+                            "className": "环境光",
+                            "assetId": "",
+                            "name": "environment_musicfesti.env",
+                            "url": "./assets/environment_musicfesti.env",
+                            "thumbnailUrl": ""
+                        }
+                    ],
+                    "pointList": [],
+                    "routeList": [
+                        {
+                            "id": "thirdwalk",
+                            "birthPointList": [
+                                {
+                                    "player": {
+                                        "position": {
+                                            "x": "-727.49",
+                                            "y": "-1441.18",
+                                            "z": "-32.25"
+                                        },
+                                        "rotation": {
+                                            "pitch": "0.00",
+                                            "yaw": "0.00",
+                                            "roll": "0.00"
+                                        }
+                                    },
+                                    "camera": {
+                                        "position": {
+                                            "x": "-1047.49",
+                                            "y": "-1441.18",
+                                            "z": "87.75"
+                                        },
+                                        "rotation": {
+                                            "pitch": "0.00",
+                                            "yaw": "0.00",
+                                            "roll": "0.00"
+                                        }
+                                    }
+                                }
+                            ],
+                            "areaName": "LQC",
+                            "pathName": "thirdwalk",
+                            "attitude": "walk",
+                            "step": 5
+                        }
+                    ],
+                    "visibleRules": [],
+                    "animationList": [
+                        {
+                            "avatarId": "My_Actor",
+                            "animations": [
+                                "Walking",
+                                "Idle"
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        "preload": {
+            "version": "20220318183823",
+            "assetTotalSize": 24248947,
+            "assetUrls": [
+                {
+                    "url": "./assets/avatar/YXTN/component_list.json",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 14294
+                },
+                {
+                    "url": "./assets/avatar/YXTN/body.glb",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 137548
+                },
+                {
+                    "url": "./assets/avatar/YXTN/animations/Walking.glb",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 99844
+                },
+                {
+                    "url": "./assets/avatar/YXTN/animations/Idle.glb",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 208772
+                },
+                {
+                    "url": "./assets/level_L01.glb",
+                    "packName": "",
+                    "typeName": "MODEL",
+                    "className": "粗模",
+                    "skinId": "0000000001",
+                    "size": 3638904
+                },
+                {
+                    "url": "./assets/environment_musicfesti.env",
+                    "packName": "",
+                    "typeName": "CONFIG",
+                    "className": "环境光",
+                    "skinId": "0000000001",
+                    "size": 2723658
+                },
+                {
+                    "url": "./assets/textures/Point_Light.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 8463
+                },
+                {
+                    "url": "./assets/textures/Light_tex0.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 7478
+                },
+                {
+                    "url": "./assets/textures/Light_tex1.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 26724
+                },
+                {
+                    "url": "./assets/textures/Light_tex2.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 28517
+                },
+                {
+                    "url": "./assets/textures/VS_Disco.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 8842
+                },
+                {
+                    "url": "./assets/textures/NM_Door.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 271090
+                }
+            ],
+            "baseUrls": [],
+            "observeUrls": []
+        }
+    }
+}

File diff suppressed because it is too large
+ 2466 - 0
dist/assets/config_body_man.json


+ 218 - 0
dist/assets/config_man_YXL.json

@@ -0,0 +1,218 @@
+{
+    "code": 0,
+    "msg": "",
+    "data": {
+        "config": {
+            "avatars": [
+                {
+                    "id": "My_Actor",
+                    "name": "My_Actor",
+                    "url": "./assets/avatar/man_YXL.zip",
+                    "gender": "man",
+                    "components": [],
+                    "animations": [
+                        {
+                            "name": "Walking",
+                            "url": "./assets/avatar/man_YXL/animations/Walking.glb"
+                        },
+                        {
+                            "name": "Idle",
+                            "url": "./assets/avatar/man_YXL/animations/Idle.glb"
+                        }
+                    ]
+                }
+            ],
+            "skins": [
+                {
+                    "id": "0000000001",
+                    "name": "梁启超_Cookonlymaps",
+                    "versionId": "00008",
+                    "isEnable": false,
+                    "fov": "90",
+                    "resolution": {
+                        "width": 1728,
+                        "height": 720
+                    },
+                    "assetList": [
+                        {
+                            "typeName": "MODEL",
+                            "className": "粗模",
+                            "assetId": "",
+                            "name": "ground_LQC_xverse.glb",
+                            "url": "./assets/level_L01.glb",
+                            "thumbnailUrl": ""
+                        },
+                        {
+                          "typeName": "MODEL",
+                          "className": "TV",
+                          "assetId": "",
+                          "name": "yqtgTV_xverse.glb",
+                          "url": "https://app-mgt-resource-1258211750.file.myqcloud.com/model/fefa5e668b634bc283feb5d6769f95ad/yqtgTV_xverse.glb",
+                          "thumbnailUrl": ""
+                        },
+                        {
+                            "typeName": "CONFIG",
+                            "className": "环境光",
+                            "assetId": "",
+                            "name": "environment_musicfesti.env",
+                            "url": "./assets/environment_musicfesti.env",
+                            "thumbnailUrl": ""
+                        }
+                    ],
+                    "pointList": [],
+                    "routeList": [
+                        {
+                            "id": "thirdwalk",
+                            "birthPointList": [
+                                {
+                                    "player": {
+                                        "position": {
+                                            "x": "-727.49",
+                                            "y": "-1441.18",
+                                            "z": "-32.25"
+                                        },
+                                        "rotation": {
+                                            "pitch": "0.00",
+                                            "yaw": "0.00",
+                                            "roll": "0.00"
+                                        }
+                                    },
+                                    "camera": {
+                                        "position": {
+                                            "x": "-1047.49",
+                                            "y": "-1441.18",
+                                            "z": "87.75"
+                                        },
+                                        "rotation": {
+                                            "pitch": "0.00",
+                                            "yaw": "0.00",
+                                            "roll": "0.00"
+                                        }
+                                    }
+                                }
+                            ],
+                            "areaName": "LQC",
+                            "pathName": "thirdwalk",
+                            "attitude": "walk",
+                            "step": 5
+                        }
+                    ],
+                    "visibleRules": [],
+                    "animationList": [
+                        {
+                            "avatarId": "My_Actor",
+                            "animations": [
+                                "Walking",
+                                "Idle"
+                            ]
+                        }
+                    ]
+                }
+            ]
+        },
+        "preload": {
+            "version": "20220318183823",
+            "assetTotalSize": 24248947,
+            "assetUrls": [
+                {
+                    "url": "./assets/avatar/man_YXL/component_list.json",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 14294
+                },
+                {
+                    "url": "./assets/avatar/man_YXL/man_YXL.glb",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 137548
+                },
+                {
+                    "url": "./assets/avatar/man_YXL/animations/Walking.glb",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 99844
+                },
+                {
+                    "url": "./assets/avatar/man_YXL/animations/Idle.glb",
+                    "packName": "",
+                    "typeName": "avatar",
+                    "className": "",
+                    "skinId": "",
+                    "size": 208772
+                },
+                {
+                    "url": "./assets/level_L01.glb",
+                    "packName": "",
+                    "typeName": "MODEL",
+                    "className": "粗模",
+                    "skinId": "0000000001",
+                    "size": 3638904
+                },
+                {
+                    "url": "./assets/environment_musicfesti.env",
+                    "packName": "",
+                    "typeName": "CONFIG",
+                    "className": "环境光",
+                    "skinId": "0000000001",
+                    "size": 2723658
+                },
+                {
+                    "url": "./assets/textures/Point_Light.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 8463
+                },
+                {
+                    "url": "./assets/textures/Light_tex0.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 7478
+                },
+                {
+                    "url": "./assets/textures/Light_tex1.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 26724
+                },
+                {
+                    "url": "./assets/textures/Light_tex2.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 28517
+                },
+                {
+                    "url": "./assets/textures/VS_Disco.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 8842
+                },
+                {
+                    "url": "./assets/textures/NM_Door.png",
+                    "packName": "",
+                    "typeName": "TEXTURES",
+                    "className": "贴图",
+                    "skinId": "",
+                    "size": 271090
+                }
+            ],
+            "baseUrls": [],
+            "observeUrls": []
+        }
+    }
+}

BIN
dist/assets/xverse_tv_840x480_1K.mp4


BIN
dist/assets/yqtgTV_xverse.glb


+ 18 - 2
dist/index.html

@@ -17,6 +17,19 @@
             background-repeat: no-repeat;
             background-size: 600px 600px;
         }
+        .tip {
+            position: absolute;
+            top: 2rem;
+            left: 50%;
+            transform: translateX(-50%);
+            padding: 1rem 1.6rem;
+            background-color: #5bc1d1;
+            color: white;
+            z-index: 9999;
+            border-radius: 0.2rem;
+            opacity: 1;
+            transition: opacity .2s;
+        }
     </style>
 </head>
 <body>
@@ -79,8 +92,10 @@
   
     const COMPONENT_LIST_PREFIX = "/component_list.json";
 
+    const debugMode = location.href.indexOf("debug") > -1  // true
     
 
+    // 角色相关设置
     const avatarSetting = {
         fileType: ".glb",
         lodType: "_lod",
@@ -101,7 +116,7 @@
             dist: 7500
         }],
         isRayCastEnable: !0,
-        maxAvatarNum: 40,
+        maxAvatarNum: 40,       // 角色数量上限
         maxBillBoardDist: 7500,
         body: "body",
         head: "head",
@@ -795,7 +810,8 @@
             // toast("\u5F00\u59CB\u5F55\u5236");
         }
 
-
+        // 只在调试时显示control面板
+        debugMode || (document.querySelector(".debug_control_btns").style.display = "none")
     </script>
 
     <script src="js/index.js"></script>

+ 1 - 1
src/ActionsHandler.js

@@ -8,7 +8,7 @@ import MessageHandleType from "./enum/MessageHandleType.js"
 import FrequencyLimitError from "./error/FrequencyLimitError.js"
 import ParamError from "./error/ParamError.js"
 
-const logger = new Logger('actions-handler')
+const logger = new Logger('Action')
 const QueueActions = [Actions.Transfer, Actions.ChangeSkin, Actions.GetOnVehicle, Actions.GetOffVehicle];
 
 export default class ActionsHandler {

+ 1 - 1
src/BreathPoint.js

@@ -20,7 +20,7 @@ export default class BreathPoint {
         this._skinInfo = skinInfo;
         this._isInScene = !0;
 
-        if(location.href.indexOf("debug") > -1) {
+        if(debugMode) {
             var textureBPNum = new BABYLON.DynamicTexture("dynamic texture", {width:350, height:300}, this._scene);  
             textureBPNum.drawText(id, 0, 200, "bold 200px monospace", "red", "white", true, true); 
             var materialBPNum = new BABYLON.StandardMaterial("MatBPNum", this._scene);

+ 1 - 1
src/Broadcast.js

@@ -1,7 +1,7 @@
 import MessageHandleType from "./enum/MessageHandleType.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('xverse-broadcast')
+const logger = new Logger('Broadcast')
 
 export default class Broadcast{
     constructor(xverseRoom, t) {

+ 9 - 12
src/EngineProxy.js

@@ -10,8 +10,9 @@ import XBillboardManager from "./XBillboardManager.js"
 import ModelManager from "./ModelManager.js"
 import InitEngineTimeoutError from "./error/InitEngineTimeoutError.js"
 import Logger from "./Logger.js"
+import TV from "./TV.js"
 
-const logger = new Logger('xverse-bus')
+const logger = new Logger('Bus')
 const http = new Http
 const blobToDataURI = async i=>new Promise((resolve,reject)=>{
     const fileReader = new FileReader;
@@ -160,10 +161,9 @@ export default class EngineProxy{
 
                         logger.infoAndReportMeasurement({
                             value: 0,
-                            startTime: Date.now(),
-                            metric: "renderError",
+                            type: "renderError",
                             error: new Error("[SDK] Scene not ready, skip render and reload."),
-                            reportOptions: {
+                            options: {
                                 sampleRate: .1
                             }
                         })
@@ -180,10 +180,9 @@ export default class EngineProxy{
                         }),
                         logger.infoAndReportMeasurement({
                             value: 0,
-                            startTime: Date.now(),
-                            metric: "renderError",
+                            type: "renderError",
                             error,
-                            reportOptions: {
+                            options: {
                                 sampleRate: .1
                             }
                         })
@@ -385,12 +384,10 @@ export default class EngineProxy{
         const startTime = Date.now();
         return this._loadAssets(e, t)._timeout(r, new InitEngineTimeoutError(`loadAssets timeout(${r}ms)`)).then(o=>(logger.infoAndReportMeasurement({
             tag: "loadAssets",
-            startTime: startTime,
-            metric: "loadAssets"
+            type: "loadAssets"
         }),o)).catch(err=>(logger.infoAndReportMeasurement({
             tag: "loadAssets",
-            startTime: startTime,
-            metric: "loadAssets",
+            type: "loadAssets",
             error: err
         }),
         Promise.reject(err)))
@@ -459,7 +456,7 @@ export default class EngineProxy{
         let s = EFitMode.cover;
         skinId == "10048" && (s = EFitMode.contain)
         Array.isArray(n) && n.forEach((f,d)=>{
-            this._tvs.push(new TV("squareTv" + d,f.modelUrl,this.room,{
+            this._tvs.push(new TV("squareTv"+d, f.modelUrl, this.room, {
                 fitMode: s
             }))
         }

+ 4 - 4
src/EventsManager.js

@@ -4,7 +4,7 @@ import util from "./util.js"
 import Logger from "./Logger.js"
 import ActionResponseTimeoutError from "./error/ActionResponseTimeoutError.js"
 
-const logger = new Logger('events')
+const logger = new Logger('EventsManager')
 export default class EventsManager extends EventEmitter {
     constructor() {
         super(...arguments);
@@ -63,7 +63,7 @@ export default class EventsManager extends EventEmitter {
                 if (code === Codes.Success)
                     resolve(data),
                     this.off(traceId),
-                    logger.infoAndReportMeasurement({ metric: s, tag, extra: e.extra, startTime, traceId });
+                    logger.infoAndReportMeasurement({ type: s, traceId, tag, extraData: e.extra });
                 else {
                     if (code === Codes.ActionMaybeDelay) return;
                     if (code === Codes.DoActionBlocked && e.event === Actions.Rotation) {
@@ -75,7 +75,7 @@ export default class EventsManager extends EventEmitter {
                     this.off(traceId),
                     reject(error),
                     this.emit("actionResponseError", { error, event: e, tag }),
-                    logger.infoAndReportMeasurement({ metric: s, tag, extra: e.extra, error, startTime, traceId })
+                    logger.infoAndReportMeasurement({ type: s, traceId, tag, error, extraData: e.extra })
                 }
             });
 
@@ -90,7 +90,7 @@ export default class EventsManager extends EventEmitter {
                 reject(error),
                 this.events.delete(traceId),
                 this.off(traceId),
-                logger.infoAndReportMeasurement({ metric: s, tag, extra: e.extra, error, startTime, traceId })
+                logger.infoAndReportMeasurement({ type: s, traceId, tag, error, extraData: e.extra })
             }, time)
         })
     }

+ 1 - 1
src/Http.js

@@ -2,7 +2,7 @@ import Xverse from "./Xverse.js"
 import {modelTable} from "./ModelTable.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('http')
+const logger = new Logger('Http')
 const isIndexedDbSupported = ()=>(window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB) !== void 0
 const dataURItoBlob = i=>{
     let e;

+ 5 - 7
src/Http1.js

@@ -2,7 +2,7 @@ import AxiosCanceler from "./AxiosCanceler"
 
 import Logger from "./Logger.js"
 
-const logger = new Logger('http')
+const logger = new Logger('Http')
 class Http1 extends EventEmitter {
     constructor() {
         super()
@@ -52,9 +52,8 @@ class Http1 extends EventEmitter {
         }, d));
         const _ = Date.now()
           , g = ()=>this.instatnce.request(d).then(m=>(o && logger.infoAndReportMeasurement({
-            metric: "http",
-            startTime: _,
-            extra: t,
+            type: "http",
+            extraData: t,
             group: "http",
             tag: o
         }),
@@ -64,10 +63,9 @@ class Http1 extends EventEmitter {
             return u > 0 && !v ? (u--,
             logger.warn(`request ${t} retry, left retry count`, u),
             g()) : (logger.infoAndReportMeasurement({
-                metric: "http",
-                startTime: _,
+                type: "http",
                 error: m,
-                extra: {
+                extraData: {
                     url: t,
                     isCanceled: v
                 },

+ 3 - 3
src/Http2.js

@@ -1,7 +1,7 @@
 import {modelTable} from "./ModelTable.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('http')
+const logger = new Logger('Http')
 class Http2 extends EventEmitter {
     async get({url: e, useIndexedDb: t=!1, timeout: r=1e4, key: n}) {
         if (t)
@@ -19,7 +19,7 @@ class Http2 extends EventEmitter {
                 const l = `${a && a.model ? "found" : "notFound"} data by search ${e} `;
                 if (logger.debug(l),
                 reporter$1.report("measurement", {
-                    metric: "indexedDB",
+                    type: "indexedDB",
                     value: s - o,
                     extra: l
                 }),
@@ -78,7 +78,7 @@ class Http2 extends EventEmitter {
                         const u = window.performance.now();
                         return logger.debug(`download ${e} takes:${u - s}ms`),
                         reporter$1.report("measurement", {
-                            metric: "http",
+                            type: "http",
                             value: u - s,
                             extra: e
                         }),

+ 2 - 1
src/Logger.js

@@ -77,7 +77,8 @@ export default class Logger{
     error(...e) {
         return this.print("error", 4, ...e)
     }
+    // console前缀
     prefix(e) {
-        return `[${this.module}][${e}] ${util.getFormattedDate(new Date)}:`
+        return `[${this.module}] [${util.getFormattedDate(new Date)}]`
     }
 };

+ 9 - 14
src/NetworkController.js

@@ -61,13 +61,11 @@ export default class NetworkController extends EventEmitter {
                 var n, o;
                 r ? ((o = this.room.stats) == null || o.disable(),
                 logger.infoAndReportMeasurement({
-                    metric: "pageHide",
-                    startTime: Date.now()
+                    type: "pageHide"
                 })) : ((n = this.room.stats) == null || n.enable(),
                 logger.infoAndReportMeasurement({
-                    metric: "pageShow",
-                    startTime: Date.now(),
-                    extra: {
+                    type: "pageShow",
+                    extraData: {
                         state: this._state
                     }
                 }),
@@ -151,6 +149,7 @@ export default class NetworkController extends EventEmitter {
         )
     }
     reconnect() {
+        // webrtc的IceConnectionState为disconnected时,前端连接断开并尝试重连
         if (this.room.viewMode === "observer")
             return;
         const e = Date.now();
@@ -166,14 +165,12 @@ export default class NetworkController extends EventEmitter {
         return logger.info("start reconnect, count:", this.reconnectCount),
         this._reconnect().then(()=>{
             logger.infoAndReportMeasurement({
-                startTime: e,
-                metric: "reconnect"
+                type: "reconnect"
             })
         }
         ).catch(t=>{
             if (logger.infoAndReportMeasurement({
-                startTime: e,
-                metric: "reconnect",
+                type: "reconnect",
                 error: t
             }),
             t.code === Codes.RepeatLogin) {
@@ -262,10 +259,9 @@ export default class NetworkController extends EventEmitter {
         const e = Date.now();
         if (this.pingOthers("https://www.baidu.com", function(t, r) {
             logger.infoAndReportMeasurement({
-                metric: "baiduRtt",
+                type: "baiduRtt",
                 group: "http",
-                value: r,
-                startTime: e
+                value: r
             })
         }),
         !worker) {
@@ -275,9 +271,8 @@ export default class NetworkController extends EventEmitter {
             worker = new Worker(URL.createObjectURL(t)),
             worker.onmessage = function(r) {
                 logger.infoAndReportMeasurement({
-                    metric: "workerRtt",
+                    type: "workerRtt",
                     group: "http",
-                    startTime: e,
                     value: r.data
                 })
             }

+ 7 - 9
src/Preload.js

@@ -112,9 +112,8 @@ export default class Preload {
             await this._preload(e, f, t);
             logger.infoAndReportMeasurement({
                 tag: e,
-                startTime: n,
-                metric: "assetsPreload",
-                extra: {
+                type: "assetsPreload",
+                extraData: {
                     total: o
                 }
             });
@@ -124,14 +123,13 @@ export default class Preload {
             return (this.requests[e].stopped || axios.isCancel(a)) && (s = new PreloadCanceledError),
             logger.infoAndReportMeasurement({
                 tag: e,
-                startTime: n,
-                metric: "assetsPreload",
-                extra: {
-                    total: o
-                },
+                type: "assetsPreload",
                 error: s,
-                reportOptions: {
+                options: {
                     immediate: !0
+                },
+                extraData: {
+                    total: o
                 }
             }),
             Promise.reject(s)

+ 2 - 4
src/Rtcp.js

@@ -163,13 +163,11 @@ export default class Rtcp extends EventEmitter {
                 this.inputReady = !0,
                 this.emit("rtcConnected"),
                 this.network.room.currentNetworkOptions.reconnect || (logger.infoAndReportMeasurement({
-                    metric: "datachannelOpenedAt",
-                    startTime: this.network.room._startTime,
+                    type: "datachannelOpenedAt",
                     group: "joinRoom"
                 }),
                 logger.infoAndReportMeasurement({
-                    metric: "datachannelOpenedCost",
-                    startTime: e,
+                    type: "datachannelOpenedCost",
                     group: "joinRoom"
                 }))
                 console.log('this.inputChannel',this.inputChannel)

+ 1 - 1
src/Signal.js

@@ -6,7 +6,7 @@ import PointType from "./enum/PointType.js"
 import Logger from "./Logger.js"
 import SecondArray from "./SecondArray.js"
 
-const logger = new Logger('xverse-signal')
+const logger = new Logger('signal')
 export default class Signal {
     constructor(e) {
         this.signalHandleActived = !0

+ 6 - 9
src/Socket.js

@@ -96,9 +96,8 @@ export default class Socket extends EventEmitter {
       const mt = JSON.parse(x.data);
       delete mt.token;
       logger.infoAndReportMeasurement({
-        metric: "startGame",
-        extra: mt,
-        startTime: Date.now(),
+        type: "startGame",
+        extraData: mt
       });
     });
     (this.network = e),
@@ -149,14 +148,12 @@ export default class Socket extends EventEmitter {
           this.heartbeat.start(),
           this.network.room.currentNetworkOptions.reconnect ||
             (logger.infoAndReportMeasurement({
-              metric: "wsOpenedAt",
-              group: "joinRoom",
-              startTime: this.network.room._startTime,
+              type: "wsOpenedAt",
+              group: "joinRoom"
             }),
             logger.infoAndReportMeasurement({
-              metric: "wsOpenedCost",
-              group: "joinRoom",
-              startTime: t,
+              type: "wsOpenedCost",
+              group: "joinRoom"
             }));
       }),
       this.handleWSEvent();

+ 2 - 3
src/Stats.js

@@ -96,9 +96,8 @@ export default class Stats extends EventEmitter {
         (h >= d || f >= d) && (e = !0);
         const _ = this.room.viewMode === "observer" || this.room.viewMode === "serverless";
         e && !_ && (logger.infoAndReportMeasurement({
-            metric: "weakNetwork",
-            startTime: Date.now(),
-            extra: {
+            type: "weakNetwork",
+            extraData: {
                 msg: this._networkSamples.slice(20),
                 netDelayRTTValues: u,
                 netDelayHBValues: c

+ 16 - 11
src/TV.js

@@ -1,17 +1,18 @@
 import XDecalManager from "./XDecalManager.js"
+import XTelevision from "./XTelevision.js";
 
 export default class TV extends XTelevision {
-    constructor(e, t, r, n) {
-        super(r.scene, t, r.sceneManager, n);
+    constructor(id, meshUrl, room, options) {
+        super(room.scene, meshUrl, room.sceneManager, options);
         E(this, "decal");
         E(this, "id");
         E(this, "imageUrl");
         E(this, "mode", "video");
         E(this, "room");
-        E(this, "setVideo", (e,t=!1,r=!0)=>super.setVideo(e, t, r).then(()=>this));
-        this.id = e,
-        this.room = r,
-        this.decal = new XDecalManager(r.sceneManager)
+        E(this, "setVideo", (e, t=!1, r=!0)=>super.setVideo(e, t, r).then(()=>this));
+        this.id = id,
+        this.room = room,
+        this.decal = new XDecalManager(room.sceneManager)
     }
     show() {
         this.mode === "video" ? this.toggle(!0) : this.mode === "poster" && this.showPoster()
@@ -63,11 +64,15 @@ export default class TV extends XTelevision {
             url: t,
             bLoop: r,
             bMuted: n
-        }).then(()=>(this.videoElement && (this.videoElement.crossOrigin = "anonymous",
-        this.videoElement.playsInline = !0,
-        this.videoElement.load()),
-        this.mode = "video",
-        this)) : Promise.reject("tv url is required")
+        }).then(()=>(
+            this.videoElement && (
+                this.videoElement.crossOrigin = "anonymous",
+                this.videoElement.playsInline = !0,
+                this.videoElement.load()
+            ),
+            this.mode = "video",
+            this
+        )) : Promise.reject("tv url is required")
     }
     mirrorFrom(e) {
         const t = e.getVideoMat();

+ 16 - 0
src/Tip.js

@@ -0,0 +1,16 @@
+export default class Tip {
+    constructor(message) {
+        let msgDiv = document.createElement("div")
+        msgDiv.className = "tip"
+        msgDiv.innerHTML = message
+        document.querySelector("#root").appendChild(msgDiv)
+
+        setTimeout(() => {
+            msgDiv.style.opacity = 0
+        }, 4000)
+
+        setTimeout(() => {
+            document.querySelector("#root").removeChild(msgDiv)
+        }, 5000)
+    }
+}

+ 5 - 5
src/Workers.js

@@ -480,14 +480,14 @@ export default class Workers {
       this.firstYUVDecoded = e.data.yuv_ts;
       const k = this.firstYUVDecoded - this.rtcp.network.room._startTime;
       defaultLogger.infoAndReportMeasurement({
-        metric: "firstYUVDecodedAt",
+        type: "firstYUVDecodedAt",
         value: k,
         group: "joinRoom",
       });
       this.firstRender = Date.now();
       const j = this.firstYUVDecoded - this.rtcp.network.room._startTime;
       defaultLogger.infoAndReportMeasurement({
-        metric: "firstRenderAt",
+        type: "firstRenderAt",
         value: j,
         group: "joinRoom",
       });
@@ -807,7 +807,7 @@ export default class Workers {
         const $ =
           ((i = this.cachedStreams[e]) == null ? void 0 : i.byteLength) || 0;
         defaultLogger.infoAndReportMeasurement({
-          metric: "firstUpdateStreamLength",
+          type: "firstUpdateStreamLength",
           value: $,
           group: "joinRoom",
         });
@@ -1206,7 +1206,7 @@ export default class Workers {
         const Ct = this.firstMediaArrival - this.rtcp.network.room._startTime;
 
         defaultLogger.infoAndReportMeasurement({
-          metric: "firstMediaArravalAt",
+          type: "firstMediaArravalAt",
           value: Ct,
           group: "joinRoom",
         });
@@ -1364,7 +1364,7 @@ export default class Workers {
             const Dt =
               this.firstMediaArrival - this.rtcp.network.room._startTime;
             defaultLogger.infoAndReportMeasurement({
-              metric: "firstMediaArravalAt",
+              type: "firstMediaArravalAt",
               value: Dt,
               group: "joinRoom",
             });

+ 13 - 9
src/XAnimationController.js

@@ -270,16 +270,20 @@ export default class XAnimationController {
         )
     }
     _playAnimation(aniType=0) {
-        return aniType == 0 && this.iBodyAnim && this.iBodyAnim.animGroup ? (
+        if(aniType == 0 && this.iBodyAnim && this.iBodyAnim.animGroup) {
             // 身体动画
-            this.onPlayObservable.notifyObservers(this._scene),
-            this.iBodyAnim.animGroup.start(this.loop, this.iBodyAnim.playSpeed, this.iBodyAnim.startFrame, this.iBodyAnim.endFrame, !1),
-            !0
-        ) : aniType == 1 && this.iFaceAnim && this.iFaceAnim.animGroup ? (
-                // 脸部动画
-                this.iFaceAnim.animGroup.start(this.loop, this.iFaceAnim.playSpeed, this.iFaceAnim.startFrame, this.iFaceAnim.endFrame, !1),
-                !0
-            ) : !1
+            this.onPlayObservable.notifyObservers(this._scene)
+            // todo 这里报错
+            try {
+                this.iBodyAnim.animGroup.start(this.loop, this.iBodyAnim.playSpeed, this.iBodyAnim.startFrame, this.iBodyAnim.endFrame, !1)
+            } catch(e) {}
+            return true
+        } else if(aniType == 1 && this.iFaceAnim && this.iFaceAnim.animGroup) {
+            // 脸部动画
+            this.iFaceAnim.animGroup.start(this.loop, this.iFaceAnim.playSpeed, this.iFaceAnim.startFrame, this.iFaceAnim.endFrame, !1)
+            return true
+        } else 
+            return false
     }
     _postprocess(e) {
         var o, s;

+ 1 - 1
src/XAvatarBillboardComponent.js

@@ -2,7 +2,7 @@ import EMeshType from "./enum/EMeshType.js"
 import BillboardStatus from "./enum/BillboardStatus.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('XAvatarBillboardComponent')
+const logger = new Logger('CharacterBillboardComponent')
 
 export default class XAvatarBillboardComponent {
     constructor(e) {

+ 16 - 9
src/XAvatarComopnent.js

@@ -1,7 +1,7 @@
 import EMeshType from "./enum/EMeshType.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('XAvatarComopnent')
+const logger = new Logger('CharacterComopnent')
 
 export default class XAvatarComopnent {
     constructor() {
@@ -13,14 +13,21 @@ export default class XAvatarComopnent {
         this.accessories = new Map
     }
     addBodyComp(e, i) {
-        return !e.rootNode || i.root.getChildMeshes().length === 0 ? (i.isRender = !1,
-        !1) : (this.body = i,
-        this.body.root.parent = e.rootNode,
-        i.isRender = !0,
-        this.body.root.getChildMeshes()[0] && (this.body.root.getChildMeshes()[0].xtype = EMeshType.XAvatar,
-        this.body.root.getChildMeshes()[0].xid = e.id),
-        this.skeleton = i.skeleton,
-        !0)
+        return !e.rootNode || i.root.getChildMeshes().length === 0 
+        ? (
+            i.isRender = !1,
+            !1
+        ) : (
+            this.body = i,
+            this.body.root.parent = e.rootNode,
+            i.isRender = !0,
+            this.body.root.getChildMeshes()[0] && (
+                this.body.root.getChildMeshes()[0].xtype = EMeshType.XAvatar,
+                this.body.root.getChildMeshes()[0].xid = e.id
+            ),
+            this.skeleton = i.skeleton,
+            !0
+        )
     }
     addClothesComp(e, i) {
         return !e.rootNode || !this.skeleton || !i.root ? (i.isRender = !1,

+ 33 - 35
src/XAvatarLoader.js

@@ -1,6 +1,6 @@
 import Logger from "./Logger.js"
 
-const logger = new Logger('XAvatarLoader')
+const logger = new Logger('CharacterLoader')
 
 export default class XAvatarLoader {
     constructor() {
@@ -243,51 +243,49 @@ export default class XAvatarLoader {
     }
     _loadGlbFromBlob(sceneManager, i, aniModelPath) {
         return sceneManager.urlTransformer(aniModelPath)
-        .then(path=>BABYLON.SceneLoader.LoadAssetContainerAsync("", path, sceneManager.Scene, null, ".glb")
-        .then(model => {
+        .then(path=>BABYLON.SceneLoader.LoadAssetContainerAsync("", path, sceneManager.Scene, null, ".glb").then(model => {
             if (model) {
                 if (this.containers.get(aniModelPath))
                     return model.dispose(),
                     this.containers.get(aniModelPath);
-                if (model.addAllToScene(),
-                this.enableShareTexture && model.textures.length > 0) {
+                model.addAllToScene()
+                if (this.enableShareTexture && model.textures.length > 0) {
                     const d = [];
-                    let _ = !1;
-                    model.meshes.forEach(b=>{
-                        if (b.material) {
-                            const k = b.material._albedoTexture;
-                            if (k) {
-                                let j = k.name;
-                                j = j.replace(" (Base Color)", "").split(".")[0];
-                                const $ = this._sharedTex.get(j);
-                                $ ? (
-                                    _ = !0,
-                                    b.material._albedoTexture = $,
-                                    d.push($),
-                                    $._parentContainer = model,
-                                    $.xReferenceCount++
+                    let hasSameTex = false;
+                    model.meshes.forEach(mesh=>{
+                        if (mesh.material) {
+                            const albedoTexture = mesh.material._albedoTexture;
+                            if (albedoTexture) {
+                                let albedoTexName = albedoTexture.name;
+                                albedoTexName = albedoTexName.replace(" (Base Color)", "").split(".")[0];
+                                const oldTex = this._sharedTex.get(albedoTexName);
+                                oldTex ? (
+                                    hasSameTex = true,
+                                    mesh.material._albedoTexture = oldTex,
+                                    d.push(oldTex),
+                                    oldTex._parentContainer = model,
+                                    oldTex.xReferenceCount++
                                 ) : (
-                                    this._sharedTex.set(j, k),
+                                    this._sharedTex.set(albedoTexName, albedoTexture),
                                     model.textures[0].xReferenceCount = 1
                                 )
                             }
                         }
-                    }
-                    ),
-                    _ && (model.textures.forEach(b=>{
-                        sceneManager.Scene.removeTexture(b),
-                        b.dispose()
-                    }
-                    ),
-                    model.textures = d)
-                }
-                return model.xReferenceCount = 0,
-                model.meshes.forEach(d=>{
-                    d.setEnabled(!1)
+                    })
+                    hasSameTex && (
+                        model.textures.forEach(tex=>{
+                            sceneManager.Scene.removeTexture(tex)
+                            // tex.dispose()      // zeg 这个加上会导致贴图丢失
+                        }),
+                        model.textures = d
+                    )
                 }
-                ),
-                this.containers.set(aniModelPath, model),
-                Promise.resolve(model)
+                model.xReferenceCount = 0
+                model.meshes.forEach(mesh=>{
+                    mesh.setEnabled(false)
+                })
+                this.containers.set(aniModelPath, model)
+                return Promise.resolve(model)
             } else
                 return Promise.reject("glb file load failed")
         }

+ 6 - 5
src/XAvatarManager.js

@@ -9,7 +9,7 @@ import AvatarAssetLoadingError from "./Error/AvatarAssetLoadingError"
 import ContainerLoadingFailedError from "./Error/ContainerLoadingFailedError"
 import AvatarAnimationError from "./error/AvatarAnimationError"
 
-const logger = new Logger('AvatarManager')
+const logger = new Logger('CharacterManager')
 export default class XAvatarManager {
     constructor(sceneManager) {
         this.characterMap = new Map
@@ -172,7 +172,7 @@ export default class XAvatarManager {
             if (this.getAvatarById(id))
                 return reject(new DuplicateAvatarIDError(`[Engine] cannot init avatar with the same id = ${e}`));
             if (this.getAvatarNums() > this.maxAvatarNum)
-                //超出最大角色限 ${this.maxAvatarNum}
+                // 超出角色个数上限 ${this.maxAvatarNum}
                 return reject(new ExceedMaxAvatarNumError(`[Engine] \u8D85\u51FA\u6700\u5927\u89D2\u8272\u9650\u5236 ${this.maxAvatarNum}`));
 
             const avatar = new XAvatar({ id, avatarType, priority, avatarManager, assets, status });
@@ -543,6 +543,7 @@ export default class XAvatarManager {
             if (a) {
                 const s = a.instantiateModelsToScene();
                 // zeg 此时body_man缩放已经0.01
+                s.rootNodes[0]._children[0]._scaling.setAll(0.013)
                 console.log("body_man缩放", s.rootNodes[0]._children[0]._scaling)
                 a.xReferenceCount++;
                 const l = {
@@ -601,9 +602,9 @@ export default class XAvatarManager {
                 }
                 // zeg 装饰模型scale矫正
                 s.scaling = new BABYLON.Vector3(-0.01, 0.01, -0.01)
-                // 改变头发和衣服的贴图
-                s.name != "head" && s.material.albedoTexture.updateURL("./assets/111.jpeg")
-                s.name.indexOf("hair") > -1 && s.material.albedoTexture.updateURL("./assets/000.jpeg")
+                // // 改变头发和衣服的贴图
+                // s.name != "head" && s.material.albedoTexture.updateURL("./assets/111.jpeg")
+                // s.name.indexOf("hair") > -1 && s.material.albedoTexture.updateURL("./assets/000.jpeg")
                 const l = {
                     isRender: !1,
                     uId: Math.random(),

+ 1 - 1
src/XBreathPointManager.js

@@ -4,7 +4,7 @@ import BreathPoint from "./BreathPoint.js"
 import Logger from "./Logger.js"
 import XBreathPointError from "./Error/XBreathPointError.js"
 
-const logger = new Logger('XBreathPointManager')
+const logger = new Logger('BreathPointManager')
 export default class XBreathPointManager {
     constructor(e) {
         E(this, "_scene");

+ 1 - 1
src/XDecal.js

@@ -2,7 +2,7 @@ import EMeshType from "./enum/EMeshType.js"
 import XDecalTextureError from "./error/XDecalTextureError.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('XDecalManager')
+const logger = new Logger('DecalManager')
 
 export default class XDecal {
     constructor(e) {

+ 2 - 2
src/XLightManager.js

@@ -1,6 +1,6 @@
 import Logger from "./Logger.js"
 
-const logger = new Logger('XLightManager')
+const logger = new Logger('LightManager')
 
 export default class XLightManager {
     constructor(e) {
@@ -25,7 +25,7 @@ export default class XLightManager {
         this._avatarShadowMeshMap = new Map,
         this._cullingShadowObservers = new Map
 
-        if(location.href.indexOf("debug") > -1) {
+        if(debugMode) {
             this.bpNumlight = new BABYLON.HemisphericLight("BreathPointNumLight", new BABYLON.Vector3(0, 1, 0), this._scene);
         }
     }

+ 1 - 1
src/XMaterialComponent.js

@@ -2,7 +2,7 @@ import XVideoRawYUV from "./XVideoRawYUV";
 import Logger from "./Logger.js";
 import XMaterialError from "./Error/XMaterialError";
 
-const logger = new Logger("XMaterial");
+const logger = new Logger("Material");
 export default class XMaterialComponent {
   constructor(sceneManager, t) {
     this.yuvInfo

+ 4 - 4
src/XSceneManager.js

@@ -12,7 +12,7 @@ import EShaderMode from "./enum/EShaderMode.js"
 import defaultLog from "./defaultLog.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('XSceneManager')
+const logger = new Logger('SceneManager')
 
 const getAlphaWidthMap = (i,e)=>{
     const t = new BABYLON.DynamicTexture("test",3,e)
@@ -59,7 +59,7 @@ export default class XSceneManager {
         this.engine.doNotHandleContextLost = !0,
         this.scene.clearCachedVertexData(),
         this.scene.cleanCachedTextureBuffer(),
-        location.href.indexOf("debug") > -1 && this.scene.debugLayer.show({ embedMode: true, }),    // BABYLON调试工具栏
+        debugMode && this.scene.debugLayer.show({ embedMode: true, }),    // BABYLON调试工具栏
 
         this.urlTransformer = options.urlTransformer || (s=>Promise.resolve(s)),
         options.logger && defaultLog.setLogger(options.logger),
@@ -135,8 +135,8 @@ export default class XSceneManager {
             webgl: t.version,
             os: t.os
         };
-        logger.warn(JSON.stringify(e)),
-        logger.warn(JSON.stringify(r))
+        logger.warn(JSON.parse(JSON.stringify(e))),
+        logger.warn(JSON.parse(JSON.stringify(r)))
     }
 
     addNewLowPolyMesh = async(e,t)=>(

+ 1 - 1
src/XStateMachine.js

@@ -1,6 +1,6 @@
 import Logger from "./Logger.js"
 
-const logger = new Logger('XStateMachine')
+const logger = new Logger('StateMachine')
 export default class XStateMachine {
     constructor(scene) {
         this.state

+ 1 - 1
src/XStaticMesh.js

@@ -1,7 +1,7 @@
 import EMeshType from "./enum/EMeshType.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('XStaticMesh')
+const logger = new Logger('StaticMesh')
 export default class XStaticMesh {
     constructor({id: e, mesh: t, group: r="default", lod: n=0, xtype: o=EMeshType.XStaticMesh, skinInfo: a="default", url: s=""}) {
         E(this, "_mesh");

+ 1 - 1
src/XStaticMeshComponent.js

@@ -5,7 +5,7 @@ import XLowpolyModelError from "./error/XLowpolyModelError.js"
 import Logger from "./Logger.js"
 import XLowpolyJsonError from "./Error/XLowpolyJsonError.js"
 
-const logger = new Logger('XStaticMeshComponent')
+const logger = new Logger('StaticMeshComponent')
 export default class XStaticMeshComponent{
     constructor(scenemanager) {
         this._CgPlane

+ 1 - 1
src/XStaticMeshFromOneGltf.js

@@ -4,7 +4,7 @@ import util from "./util.js"
 import EMeshType from "./enum/EMeshType.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('XStaticMeshComponent')
+const logger = new Logger('StaticMeshComponent')
 export default class XStaticMeshFromOneGltf {
     
     constructor(scene, options) {

+ 129 - 100
src/XTelevision.js

@@ -1,10 +1,11 @@
 import XStaticMesh from "./XStaticMesh.js"
 import EMeshType from "./enum/EMeshType.js"
 import Logger from "./Logger.js"
+import Stream from "./Stream.js";
 
-const logger = new Logger('XTelevision')
+const logger = new Logger('Television')
 export default class XTelevision {
-    constructor(e, t, r, n) {
+    constructor(scene, meshUrl, scenemanager, option) {
         E(this, "videoElement");
         E(this, "meshPath");
         E(this, "scene");
@@ -15,14 +16,15 @@ export default class XTelevision {
         E(this, "widthHeightScale");
         E(this, "fitMode");
         E(this, "_scenemanager");
-        if (this.scene = e,
-        this.meshPath = t,
-        this._scenemanager = r,
-        n != null) {
-            const {vAng: o=0, widthHeightScale: a=-1, fitMode: s="fill"} = n;
-            this.vAng = o,
-            this.widthHeightScale = a,
-            this.fitMode = s
+
+        this.scene = scene
+        this.meshPath = meshUrl
+        this._scenemanager = scenemanager
+        if (option != null) {
+            const {vAng=0, widthHeightScale=-1, fitMode="fill"} = option;
+            this.vAng = vAng,
+            this.widthHeightScale = widthHeightScale,
+            this.fitMode = fitMode
         }
     }
     set tvWidthHeightscale(e) {
@@ -51,39 +53,38 @@ export default class XTelevision {
         n
     }
     async setUrl(e) {
-        const {url: t, isLive: r=!1, poster: n=null, bLoop: o=!1, bMuted: a=!0} = e || {};
-        if (typeof t != "string")
-            return logger.error("[Engine] Tv setUrl Error, url must be string: ", t),
+        const {url, isLive: r=!1, poster: n=null, bLoop: o=!1, bMuted: a=!0} = e || {};
+
+        if (typeof url != "string")
+            return logger.error("[Engine] Tv setUrl Error, url must be string: ", url),
             Promise.reject(new XTvMediaUrlError("[Engine] url must be string"));
+
         if (this.videoElement) {
-            this.videoElement.src = t,
+            this.videoElement.src = url,
             n != null && n.length > 0 && (this.videoElement.poster = n);
             const l = this.play();
             return "bMuted"in e && l !== void 0 && l.then(()=>{
                 this.videoElement.muted = a
-            }
-            ),
+            }),
             this.videoElement.addEventListener("loadedmetadata", u=>{
-                this.videoElement.videoWidth > 0 ? this.videoMat.setFloat("mvWidthHeightScale", this.videoElement.videoWidth / this.videoElement.videoHeight) : this.videoMat.setFloat("mvWidthHeightScale", 16 / 9)
-            }
-            ),
+                this.videoElement.videoWidth > 0 
+                ? this.videoMat.setFloat("mvWidthHeightScale", this.videoElement.videoWidth / this.videoElement.videoHeight) 
+                : this.videoMat.setFloat("mvWidthHeightScale", 16 / 9)
+            }),
             Promise.resolve(this)
         }
-        const s = this.createElement(t, o);
-        return n != null && n.length > 0 && (s.poster = n),
-        this.setVideo(s, r).then(()=>{
-            var u;
-            const l = (u = this.videoElement) == null ? void 0 : u.play();
+
+        const s = this.createElement(url, o);
+        n != null && n.length > 0 && (s.poster = n)
+        return this.setVideo(s, r).then(()=>{
+            const l = this.videoElement && this.videoElement.play();
             "bMuted"in e && l !== void 0 && l.then(()=>{
                 this.videoElement.muted = a
-            }
-            )
-        }
-        ).catch(l=>{
+            })
+        }).catch(l=>{
             logger.error("[Engine] setUrl  error! " + l),
             new XTvMediaUrlError("[Engine] setUrl  error! " + l)
-        }
-        )
+        })
     }
     setCurrentTime(e) {
         if (!this.videoElement) {
@@ -136,76 +137,104 @@ export default class XTelevision {
         this.videoMat.setFloat("tvWidthHeightScale", this.widthHeightScale),
         this.videoMat.setFloat("bforceforceKeepContent", -1)) : this.videoMat.setFloat("tvWidthHeightScale", -1)
     }
-    async setVideo(e, t=!1, r=!0) {
-        return this.tvMeshs.length != 0 ? (logger.warn(`[Engine] Set Video. length!=0, mesh: ${this.meshPath}, src: ${e.src}`),
-        new Promise((n,o)=>{
-            if (!(e instanceof HTMLVideoElement))
-                return logger.error("[Engine] Error, param of setVideo must be a HTMLVideoElement"),
-                o(new XTvVideoElementError("[Engine] param of setVideo must be a HTMLVideoElement"));
-            this.videoElement = e,
-            r == !1 && (t == !1 || checkOS().isIOS) && e.crossOrigin !== "anonymous" && (e.crossOrigin = "anonymous",
-            e.load()),
-            this.videoElement.addEventListener("loadedmetadata", a=>{
-                this.videoElement.videoWidth > 0 ? this.videoMat.setFloat("mvWidthHeightScale", this.videoElement.videoWidth / this.videoElement.videoHeight) : this.videoMat.setFloat("mvWidthHeightScale", 16 / 9)
-            }
-            ),
-            this.videoTexture.updateURL(this.videoElement.src),
-            n(this)
-        }
-        )) : (logger.warn(`[Engine] Set Video. length==0, mesh: ${this.meshPath}, src: ${e.src}`),
-        this.meshPath == "" ? (logger.error("[Engine] Error, television meshPath is empty."),
-        Promise.reject(new XTvVideoElementError("[Engine] Error, television meshPath is empty."))) : this._scenemanager.urlTransformer(this.meshPath).then(n=>new Promise((o,a)=>e instanceof HTMLVideoElement ? (this.videoElement = e,
-        r == !1 && (t == !1 || checkOS().isIOS) && e.crossOrigin !== "anonymous" && (e.crossOrigin = "anonymous",
-        e.load()),
-        BABYLON.SceneLoader.LoadAssetContainerAsync("", n, this.scene, null, ".glb").then(s=>{
-            for (let u = s.materials.length - 1; u >= 0; --u)
-                s.materials[u].dispose();
-            const l = [];
-            this.videoTexture = new VideoTexture("videoTex_" + Date.now(),e,this.scene,!1,!0,void 0,{
-                autoPlay: !0,
-                autoUpdateTexture: !0,
-                muted: !0
-            }),
-            this.videoTexture.vAng = this.vAng,
-            this.videoMat = new ShaderMaterial("videoMat_" + Date.now(),this.scene,{
-                vertexSource: tvVertex,
-                fragmentSource: tvFragment
-            },{
-                attributes: ["uv", "position"],
-                uniforms: ["view", "projection", "worldViewProjection", "world"]
-            }),
-            this.videoMat.setTexture("texture_video", this.videoTexture),
-            this.videoMat.setFloat("tvWidthHeightScale", -1),
-            this.videoMat.setFloat("mvWidthHeightScale", 16 / 9),
-            this.videoMat.setFloat("bforceforceKeepContent", -1),
-            this.videoMat.backFaceCulling = !1,
-            this.videoMat.sideOrientation = BABYLON.Mesh.FRONTSIDE,
-            this.videoElement.addEventListener("loadedmetadata", u=>{
-                this.videoElement.videoWidth > 0 ? this.videoMat.setFloat("mvWidthHeightScale", this.videoElement.videoWidth / this.videoElement.videoHeight) : this.videoMat.setFloat("mvWidthHeightScale", 16 / 9)
-            }
-            );
-            for (let u = 0; u < s.meshes.length; ++u)
-                s.meshes[u].visibility = 1,
-                s.meshes[u].isPickable = !0,
-                s.meshes[u].checkCollisions = !1,
-                s.meshes[u].material = this.videoMat,
-                "hasVertexAlpha"in s.meshes[u] && (s.meshes[u].hasVertexAlpha = !1),
-                this.scene.addMesh(s.meshes[u]),
-                l.push(new XStaticMesh({
-                    id: s.meshes[u].id,
-                    mesh: s.meshes[u],
-                    xtype: EMeshType.Tv
-                }));
-            this.changeTvFitMode(),
-            this.tvMeshs = l,
-            this.toggle(!0),
-            o(this)
-        }
-        ).catch(s=>{
-            logger.error("[Engine] setVideo: create Tv by input mesh error! " + s),
-            a(new XTvModelError("[Engine] setVideo: create Tv by input mesh error! " + s))
-        }
-        )) : a(new XTvVideoElementError("[Engine] param of setVideo must be a HTMLVideoElement")))))
+    async setVideo(e, t=!1, r=!0) 
+    {
+        return this.tvMeshs.length != 0 ? (
+            logger.warn(`[Engine] Set Video. length!=0, mesh: ${this.meshPath}, src: ${e.src}`),
+
+            new Promise((n,o)=>
+            {
+                if (!(e instanceof HTMLVideoElement))
+                    return logger.error("[Engine] Error, param of setVideo must be a HTMLVideoElement"),
+                    o(new XTvVideoElementError("[Engine] param of setVideo must be a HTMLVideoElement"));
+
+                this.videoElement = e,
+                
+                r == !1 
+                && (t == !1 || checkOS().isIOS) 
+                && e.crossOrigin !== "anonymous" 
+                && (e.crossOrigin = "anonymous", e.load()),
+
+                this.videoElement.addEventListener("loadedmetadata", a=>{
+                    this.videoElement.videoWidth > 0 ? this.videoMat.setFloat("mvWidthHeightScale", this.videoElement.videoWidth / this.videoElement.videoHeight) : this.videoMat.setFloat("mvWidthHeightScale", 16 / 9)
+                }),
+                this.videoTexture.updateURL(this.videoElement.src),
+
+                n(this)
+            })
+        ) : (
+            logger.warn(`[Engine] Set Video. length==0, mesh: ${this.meshPath}, src: ${e.src}`),
+
+            this.meshPath == "" 
+            ? (
+                logger.error("[Engine] Error, television meshPath is empty."),
+                Promise.reject(new XTvVideoElementError("[Engine] Error, television meshPath is empty."))
+            ) 
+            : this._scenemanager.urlTransformer(this.meshPath).then(n => new Promise((o,a) =>
+                e instanceof HTMLVideoElement 
+                ? (
+                    this.videoElement = e,
+
+                    r == !1 
+                    && (t == !1 || checkOS().isIOS) 
+                    && e.crossOrigin !== "anonymous"
+                    && (e.crossOrigin = "anonymous", e.load()),
+
+                    BABYLON.SceneLoader.LoadAssetContainerAsync("", n, this.scene, null, ".glb").then(s=>{
+                        for (let u = s.materials.length - 1; u >= 0; --u) s.materials[u].dispose();
+
+                        this.videoTexture = new BABYLON.VideoTexture("videoTex_" + Date.now(),e,this.scene,!1,!0,void 0,{
+                            autoPlay: !0,
+                            autoUpdateTexture: !0,
+                            muted: !0
+                        }),
+                        this.videoTexture.vAng = this.vAng,
+                        this.videoMat = new BABYLON.ShaderMaterial("videoMat_" + Date.now(),this.scene,{
+                            vertexSource: tvVertex,
+                            fragmentSource: tvFragment
+                        },{
+                            attributes: ["uv", "position"],
+                            uniforms: ["view", "projection", "worldViewProjection", "world"]
+                        }),
+                        this.videoMat.setTexture("texture_video", this.videoTexture),
+                        this.videoMat.setFloat("tvWidthHeightScale", -1),
+                        this.videoMat.setFloat("mvWidthHeightScale", 16 / 9),
+                        this.videoMat.setFloat("bforceforceKeepContent", -1),
+                        this.videoMat.backFaceCulling = !1,
+                        this.videoMat.sideOrientation = BABYLON.Mesh.FRONTSIDE,
+
+                        this.videoElement.addEventListener("loadedmetadata", u=>{
+                            this.videoElement.videoWidth > 0 
+                            ? this.videoMat.setFloat("mvWidthHeightScale", this.videoElement.videoWidth / this.videoElement.videoHeight) 
+                            : this.videoMat.setFloat("mvWidthHeightScale", 16 / 9)
+                        });
+
+                        const tvMeshs = [];
+                        for (let u = 0; u < s.meshes.length; ++u)
+                            s.meshes[u].visibility = 1,
+                            s.meshes[u].isPickable = !0,
+                            s.meshes[u].checkCollisions = !1,
+                            s.meshes[u].material = this.videoMat,
+                            "hasVertexAlpha"in s.meshes[u] && (s.meshes[u].hasVertexAlpha = !1),
+                            this.scene.addMesh(s.meshes[u]),
+                            tvMeshs.push(new XStaticMesh({
+                                id: s.meshes[u].id,
+                                mesh: s.meshes[u],
+                                xtype: EMeshType.Tv
+                            }));
+
+                        this.changeTvFitMode(),
+                        this.tvMeshs = tvMeshs,
+                        this.toggle(!0),
+                        o(this)
+                    }).catch(s=>{
+                        logger.error("[Engine] setVideo: create Tv by input mesh error! " + s),
+                        a(new XTvModelError("[Engine] setVideo: create Tv by input mesh error! " + s))
+                    })
+                )
+                : a(new XTvVideoElementError("[Engine] param of setVideo must be a HTMLVideoElement"))
+            ))
+        )
     }
     async setSameVideo(e, t="") {
         return e == null || e == null ? (logger.error("[Engine] setSameVideo: input material is null or undefined "),

+ 3 - 4
src/Xverse.js

@@ -8,7 +8,7 @@ import Person from "./enum/Person.js"
 import LoggerLevels from "./enum/LoggerLevels.js"
 import Logger from "./Logger.js"
 
-const logger = new Logger('xverse')
+const logger = new Logger('4DMVS')
 export default class Xverse{
     constructor(e) {
         e || (e = {});
@@ -30,9 +30,8 @@ export default class Xverse{
         })
 
         logger.infoAndReportMeasurement({
-            metric: "sdkInit",
-            startTime: Date.now(),
-            extra: {
+            type: "sdkInit",
+            extraData: {
                 version: a,
                 enviroment: r,
                 pageSession: s

+ 10 - 15
src/XverseAvatar.js

@@ -7,7 +7,7 @@ import Queue from "./Queue.js"
 import Logger from "./Logger.js"
 import CoreBroadcastType from "./enum/CoreBroadcastType.js"
 
-const logger = new Logger('xverse-avatar')
+const logger = new Logger('4DMVS_Character')
 export default class XverseAvatar extends EventEmitter {
     constructor({userId, isHost, room, avatarId, isSelf, group=AvatarGroup.Npc}) {
         super();
@@ -69,9 +69,8 @@ export default class XverseAvatar extends EventEmitter {
             this.isSelf && setTimeout(()=>{
                 logger.infoAndReportMeasurement({
                     tag: animationName,
-                    startTime,
                     value: 0,
-                    metric: "playAnimationStart"
+                    type: "playAnimationStart"
                 })
             });
 
@@ -84,20 +83,18 @@ export default class XverseAvatar extends EventEmitter {
             ),
             this.isSelf && logger.infoAndReportMeasurement({
                 tag: animationName,
-                startTime,
-                extra: {
+                extraData: {
                     loop: isLoop
                 },
-                metric: "playAnimationEnd"
+                type: "playAnimationEnd"
             })
         } catch (err) {
             return logger.error(`[avatar: ${this.userId}] Play animation failed: ${animationName}`, err),
             this.isSelf && logger.infoAndReportMeasurement({
                 tag: animationName,
-                startTime,
-                metric: "playAnimationEnd",
+                type: "playAnimationEnd",
                 error: err,
-                extra: {
+                extraData: {
                     loop: isLoop
                 }
             }),
@@ -144,9 +141,8 @@ export default class XverseAvatar extends EventEmitter {
             })
             this.isSelf && logger.infoAndReportMeasurement({
                 tag: "changeComponents",
-                startTime,
-                metric: "changeComponents",
-                extra: {
+                type: "changeComponents",
+                extraData: {
                     inputComponents: avatarComponents,
                     finalComponents: this.avatarComponents,
                     mode: ChangeComponentsMode[mode]
@@ -157,10 +153,9 @@ export default class XverseAvatar extends EventEmitter {
         } catch (error) {
             this.isSelf && logger.infoAndReportMeasurement({
                 tag: "changeComponents",
-                startTime,
-                metric: "changeComponents",
+                type: "changeComponents",
                 error,
-                extra: {
+                extraData: {
                     inputComponents: avatarComponents,
                     finalComponents: this.avatarComponents,
                     mode: ChangeComponentsMode[mode]

+ 7 - 11
src/XverseAvatarManager.js

@@ -12,7 +12,7 @@ import TimeoutError from "./error/TimeoutError.js"
 import Logger from "./Logger.js"
 import QueueType from "./enum/QueueType.js"
 
-const logger = new Logger('xverse-avatar-manager')
+const logger = new Logger('4DMVS_CharacterManager')
 export default class XverseAvatarManager extends EventEmitter {
     constructor(room) {
         super();
@@ -301,13 +301,11 @@ export default class XverseAvatarManager extends EventEmitter {
 
             userId === this._room.userId && (
                 logger.infoAndReportMeasurement({
-                    metric: "avatarLoadDuration",
-                    startTime,
+                    type: "avatarLoadDuration",
                     group: "costs"
                 }),
                 logger.infoAndReportMeasurement({
-                    metric: "avatarLoadAt",
-                    startTime: this._room._startTime,
+                    type: "avatarLoadAt",
                     group: "costs"
                 })
             )
@@ -354,10 +352,9 @@ export default class XverseAvatarManager extends EventEmitter {
                 o.motionType === MotionType.Run && (a = "Running")),
                 o._playAnimation(a, !0, !0),
                 logger.infoAndReportMeasurement({
-                    startTime: Date.now(),
                     value: 0,
-                    metric: n ? "userAvatarStartRotating" : "userAvatarStopRotating",
-                    extra: {
+                    type: n ? "userAvatarStartRotating" : "userAvatarStopRotating",
+                    extraData: {
                         motionType: o.motionType,
                         moveToExtra: this._room.moveToExtra
                     }
@@ -379,10 +376,9 @@ export default class XverseAvatarManager extends EventEmitter {
                 })),
                 o._playAnimation(a, !0, !0),
                 logger.infoAndReportMeasurement({
-                    startTime: Date.now(),
                     value: 0,
-                    metric: r ? "userAvatarStartMoving" : "userAvatarStopMoving",
-                    extra: {
+                    type: r ? "userAvatarStartMoving" : "userAvatarStopMoving",
+                    extraData: {
                         motionType: o.motionType,
                         moveToExtra: this._room.moveToExtra
                     }

+ 1 - 1
src/XverseEffectManager.js

@@ -1,6 +1,6 @@
 import Logger from "./Logger.js"
 
-const logger = new Logger('xverse-effect-manager')
+const logger = new Logger('4DMVS_EffectManager')
 export default class XverseEffectManager extends EventEmitter {
     constructor(e) {
         super();

+ 23 - 36
src/Xverse_Room.js

@@ -26,7 +26,7 @@ import Debug from "./Debug.js";
 import Logger from "./Logger.js";
 import NewUserStateType from "./enum/NewUserStateType.js";
 
-const logger = new Logger("xverse-room");
+const logger = new Logger("4DMVS_Room");
 export default class Xverse_Room extends EventEmitter {
   constructor(options) {
     super();
@@ -77,11 +77,10 @@ export default class Xverse_Room extends EventEmitter {
       r = Oe(n, ["canvas"]);
 
     logger.infoAndReportMeasurement({
-      metric: "startJoinRoomAt",
-      startTime: Date.now(),
+      type: "startJoinRoomAt",
       group: "joinRoom",
-      extra: r,
       value: 0,
+      extraData: r
     });
   }
 
@@ -98,10 +97,9 @@ export default class Xverse_Room extends EventEmitter {
       const workers = this.networkController.rtcp.workers;
 
       workers.registerFunction("signal", data => {
-        // data.signal.newUserStates && data.signal.newUserStates[0].playerState.camera 
-        // && console.error(data.signal.actionResponses, data.signal.newUserStates[0].playerState.camera.position)
+        // data && data.signal &&
+        // console.error(data.signal.code, data.signal.actionResponses, data.signal.newUserStates)
         // 更新坐标数据
-        // data.signal.newUserStates && data.signal.newUserStates[0] && (data.signal.newUserStates[0].userId = this.userId)  // todo 写死数据纠正
         this.signal.handleSignal(data, reject)
         
         // data.signal.newUserStates 
@@ -269,15 +267,16 @@ export default class Xverse_Room extends EventEmitter {
       this.beforeJoinRoomResolveHook();
   }
   afterJoinRoom() {
+    // 去掉首屏loading
     document.querySelector(".loading").style.zIndex = -9999;
+
     (this.joined = !0),
       this.viewMode === "observer" && this.setViewModeToObserver(),
       logger.infoAndReportMeasurement({
         tag: this.viewMode,
         value: this.firstFrameTimestamp || Date.now() - this._startTime,
-        startTime: Date.now(),
-        metric: "joinRoom",
-        reportOptions: {
+        type: "joinRoom",
+        options: {
           immediate: !0,
         },
       }),
@@ -326,20 +325,17 @@ export default class Xverse_Room extends EventEmitter {
         .connect()
         ._timeout(8e3, new InitNetworkTimeoutError()),
         logger.infoAndReportMeasurement({
-          metric: "networkInitAt",
-          startTime: this._startTime,
+          type: "networkInitAt",
           group: "joinRoom",
         }),
         logger.infoAndReportMeasurement({
-          metric: "networkInitCost",
-          startTime: e,
+          type: "networkInitCost",
           group: "joinRoom",
         });
     } catch (t) {
       throw (
         (logger.infoAndReportMeasurement({
-          metric: "networkInitAt",
-          startTime: e,
+          type: "networkInitAt",
           group: "joinRoom",
           error: t,
         }),
@@ -354,20 +350,17 @@ export default class Xverse_Room extends EventEmitter {
         .getApplicationConfig()
         ._timeout(8e3, new InitConfigTimeoutError()),
         logger.infoAndReportMeasurement({
-          metric: "configInitAt",
-          startTime: this._startTime,
+          type: "configInitAt",
           group: "joinRoom",
         }),
         logger.infoAndReportMeasurement({
-          metric: "configInitCost",
-          startTime: e,
+          type: "configInitCost",
           group: "joinRoom",
         });
     } catch (t) {
       throw (
         (logger.infoAndReportMeasurement({
-          metric: "configInitAt",
-          startTime: e,
+          type: "configInitAt",
           group: "joinRoom",
           error: t,
         }),
@@ -381,13 +374,11 @@ export default class Xverse_Room extends EventEmitter {
       (this.engineProxy = new EngineProxy(this)),
         await this.engineProxy.initEngine(e),
         logger.infoAndReportMeasurement({
-          metric: "webglInitAt",
-          startTime: this._startTime,
+          type: "webglInitAt",
           group: "joinRoom",
         }),
         logger.infoAndReportMeasurement({
-          metric: "webglInitCost",
-          startTime: t,
+          type: "webglInitCost",
           group: "joinRoom",
         });
       return;
@@ -398,8 +389,7 @@ export default class Xverse_Room extends EventEmitter {
         r.code !== Codes.InitEngineTimeout && (n = new InitEngineError()),
         logger.error(r),
         logger.infoAndReportMeasurement({
-          metric: "webglInitAt",
-          startTime: t,
+          type: "webglInitAt",
           group: "joinRoom",
           error: n,
         }),
@@ -429,14 +419,12 @@ export default class Xverse_Room extends EventEmitter {
           });
         }),
         logger.infoAndReportMeasurement({
-          metric: "wasmInitAt",
-          group: "joinRoom",
-          startTime: this._startTime,
+          type: "wasmInitAt",
+          group: "joinRoom"
         }),
         logger.infoAndReportMeasurement({
-          metric: "wasmInitCost",
-          group: "joinRoom",
-          startTime: i,
+          type: "wasmInitCost",
+          group: "joinRoom"
         }),
         eventsManager.on("traceId", (o) => {
           this.networkController.rtcp.workers.onTraceId(o);
@@ -444,9 +432,8 @@ export default class Xverse_Room extends EventEmitter {
     } catch (o) {
       throw (
         (logger.infoAndReportMeasurement({
-          metric: "wasmInitAt",
+          type: "wasmInitAt",
           group: "joinRoom",
-          startTime: i,
           error: o,
         }),
           o)

+ 29 - 4
src/main.js

@@ -1,5 +1,6 @@
 import Xverse from "./Xverse.js"
 import Codes from "./enum/Codes.js"
+import Tip from "./Tip.js";
 
 const xverse = new Xverse({
     env: "DEV",
@@ -30,9 +31,9 @@ const l = async()=>{
  
         let room = await xverse.joinRoom({
             canvas: document.getElementById('canvas'),
-            skinId: '10089',
-            avatarId: 'KGe_Boy',
-            roomId: 'e629ef3e-022d-4e64-8654-703bb96410eb',
+            skinId: '0000000001',
+            avatarId: 'My_Actor',
+            roomId: 'aea5406a-3099-48db-b428-30917872e58a',
             userId: nickname,
             //wsServerUrl: 'wss://uat-eks.xverse.cn/ws',
             // wsServerUrl: "ws://localhost:6688/ws",
@@ -57,11 +58,13 @@ const l = async()=>{
 
         u();
         c();
+        // f();
         
         //e(!1);
     } catch (M) {
+        M = String(M).split(",")[1]
         console.error(M);
-        alert(M);
+        new Tip(M)  // alert(M);
         return
     }
 }
@@ -97,4 +100,26 @@ const c = ()=>{
         })
     })
 }
+
+const f = async ()=>{
+    const T = (await room.modelManager.findAssetList(String(room.skinId))).filter(E=>E.typeName === "MEDIA").map(E=>E.url);
+    // a(T),
+    room.tv && room.tv.setUrl({
+        url: "./assets/xverse_tv_840x480_1K.mp4",
+        loop: !0
+    }).then(async()=>{
+        try {
+            if(room.tv.videoElement) {
+                // room.tv.videoElement.muted = false
+                await room.tv.videoElement.play()
+                console.log("\u64AD\u653E\u6210\u529F")     // 播放成功
+            }
+        } catch (S) {
+            console.log("\u64AD\u653E\u5931\u8D25\uFF1A", S)    // 播放失败
+        }
+    }).catch(E=>{
+        console.error(E)
+    })
+}
+
 l();