mx3d 0.0.32 → 0.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,251 @@
1
+ ## 获取对象
2
+
3
+ ```javascript
4
+ /// <summary>
5
+ /// 全局查询
6
+ /// </summary>
7
+ /// <param name="_id">对象标识</param>
8
+ /// <param name="type">对象类型</param>
9
+ /// <param name="current">是否当前楼层</param>
10
+ query(_id?: string, type?: ObjectType, current?: boolean)
11
+ ```
12
+
13
+ ## 基础属性
14
+
15
+ ```javascript
16
+ id: string;//唯一id
17
+ name: string;//名称
18
+ objectType: string;//对象类型
19
+ isMonitor: boolean;//是否监听
20
+ parent: IObject;//父物体
21
+ children: ArrayEx<IObject>;//子物体
22
+ visible: boolean;//是否显示
23
+ visualAngle:VisualAngle;//视场角度
24
+ childNodes:Dictionary<BaseNode>;//附带物体
25
+ delete();//删除
26
+ dispose();//销毁
27
+ transparent: boolean;//是否透明
28
+ showBoundingBox: boolean;//显示边缘
29
+ setFlash(level:number)//设置闪烁
30
+ addEventListener(type: string, callback: Function);//添加对象事件
31
+ removeEventListener(type: string)//删除对象事件
32
+ play(isloop: boolean);//播放对象动画
33
+ stop();//暂停对象动画
34
+ flyTo();//相机飞向对象
35
+ focus();//聚焦当前
36
+ switch();//切换到当前
37
+ ```
38
+
39
+ ## 特殊对象属性
40
+
41
+ ### 暖气片
42
+
43
+ ```javascript
44
+ airFlowDisplay((isDisplay: boolean = true)) //是否显示隐藏暖气片
45
+ ```
46
+
47
+ ## 事件
48
+
49
+ addEventListener() 方法为指定对象指定事件处理程序。
50
+
51
+ ### 语法
52
+
53
+ ```javascript
54
+ obj.addEventListener(event, function);
55
+ ```
56
+
57
+ 第一个参数是事件的类型(可选 "leftClick:左键点击" , "rightClick:右键点击" , "longPress:长按" , "doubleClick:双击" , "eover:经过" , "out:移出")。
58
+
59
+ 第二个参数是当事件发生时我们需要调用的函数。
60
+
61
+ ### 事件实例
62
+
63
+ 当用户左键点击某个对象时浏览器控制台输出此对象:
64
+
65
+ ```javascript
66
+ obj.addEventListener(Mviot.EventType.leftClick, function(e) {
67
+ console.log(e)
68
+ })
69
+ ```
70
+
71
+ ## 事件删除
72
+
73
+ removeEventListener() 方法
74
+
75
+ removeEventListener() 方法会删除已通过 addEventListener() 方法附加的事件处理程序:
76
+
77
+ ### 实例
78
+
79
+ ```javascript
80
+ obj.removeEventListener(Mviot.EventType.leftClick)
81
+ ```
82
+
83
+ ## 对象类型
84
+
85
+ ```javascript
86
+ //引用方式
87
+ Mviot.ObjectType.Cabinet
88
+ ```
89
+
90
+ ```javascript
91
+ /// <summary>
92
+ /// 园区
93
+ /// </summary>
94
+ Campus,
95
+ /// <summary>
96
+ /// 大楼
97
+ /// </summary>
98
+ Building,
99
+ /// <summary>
100
+ /// 楼层
101
+ /// </summary>
102
+ Scene,
103
+ /// <summary>
104
+ /// 温湿度
105
+ /// </summary>
106
+ Humiture,
107
+ /// <summary>
108
+ /// 电池
109
+ /// </summary>
110
+ Battery,
111
+ /// <summary>
112
+ /// 配电柜
113
+ /// </summary>
114
+ PowerCabinet,
115
+ /// <summary>
116
+ /// 机柜
117
+ /// </summary>
118
+ Cabinet,
119
+ /// <summary>
120
+ /// 空调
121
+ /// </summary>
122
+ AirCondition,
123
+ /// <summary>
124
+ /// UPS
125
+ /// </summary>
126
+ UPS,
127
+ /// <summary>
128
+ /// 摄像头
129
+ /// </summary>
130
+ Camera,
131
+ /// <summary>
132
+ /// 新风机
133
+ /// </summary>
134
+ NewWindMachine,
135
+ /// <summary>
136
+ /// 烟感
137
+ /// </summary>
138
+ SmokeDetector,
139
+ /// <summary>
140
+ /// 声光报警
141
+ /// </summary>
142
+ AudibleVisualAlarm,
143
+ /// <summary>
144
+ /// 漏水线
145
+ /// </summary>
146
+ LeakWater,
147
+ /// <summary>
148
+ /// 墙
149
+ /// </summary>
150
+ Wall,
151
+ /// <summary>
152
+ /// 地板
153
+ /// </summary>
154
+ Floor,
155
+ /// <summary>
156
+ /// 窗户
157
+ /// </summary>
158
+ Window,
159
+ /// <summary>
160
+ /// 门
161
+ /// </summary>
162
+ Door,
163
+ /// <summary>
164
+ /// 气流模拟
165
+ /// </summary>
166
+ AirFlow,
167
+ /// <summary>
168
+ /// 墙角
169
+ /// </summary>
170
+ Corner,
171
+ /// <summary>
172
+ /// 消防设备
173
+ /// </summary>
174
+ FireFighting,
175
+ /// <summary>
176
+ /// 照明设备
177
+ /// </summary>
178
+ Lighting,
179
+ /// <summary>
180
+ /// 电子围栏
181
+ /// </summary>
182
+ Enclosure,
183
+ /// <summary>
184
+ /// 车位
185
+ /// </summary>
186
+ ParkingLot,
187
+ /// <summary>
188
+ /// 电梯
189
+ /// </summary>
190
+ Elevator,
191
+ /// <summary>
192
+ /// 其他
193
+ /// </summary>
194
+ Other,
195
+ /// <summary>
196
+ /// 架式设备
197
+ /// </summary>
198
+ InrackAsset,
199
+ /// <summary>
200
+ /// 气体检测
201
+ /// </summary>
202
+ GasDetection,
203
+ /// <summary>
204
+ /// 安防设备
205
+ /// </summary>
206
+ Security,
207
+ /// <summary>
208
+ /// 外景
209
+ /// </summary>
210
+ OutDoorScene,
211
+ /// <summary>
212
+ /// 红外
213
+ /// </summary>
214
+ Infrared,
215
+ /// <summary>
216
+ /// 天空盒
217
+ /// </summary>
218
+ SkyBox,
219
+ /// <summary>
220
+ /// UI
221
+ /// </summary>
222
+ UI3D,
223
+ /// <summary>
224
+ /// 冷通道门
225
+ /// </summary>
226
+ ColdTongDoor,
227
+ /// <summary>
228
+ /// 虚拟盒子
229
+ /// </summary>
230
+ VirtualBox,
231
+ /// <summary>
232
+ /// 漫游盒子
233
+ /// </summary>
234
+ PathPint,
235
+ /// <summary>
236
+ /// 端口
237
+ /// </summary>
238
+ Port,
239
+ /// <summary>
240
+ /// 定位接收器
241
+ /// </summary>
242
+ Positioner,
243
+ /// <summary>
244
+ /// 自动动画
245
+ /// </summary>
246
+ AutoAnimation,
247
+ /// <summary>
248
+ /// 地图
249
+ /// </summary>
250
+ MapModel
251
+ ```
@@ -0,0 +1,73 @@
1
+ ## 加载场景
2
+
3
+ 如下代码所示
4
+
5
+ ```javascript
6
+ //加载内景
7
+ app
8
+ .create({
9
+ fileUrl: './mviotjs/Project.json', //场景文件 必须
10
+ libraryUrl: './mviotjs', //模型库路径 必须
11
+ rotation: null, //旋转 可选
12
+ parent: null, //父节点对象 可选(楼栋物体)
13
+ })
14
+ .then((_scenes: any) => {
15
+ _scenes[0].switch()
16
+ })
17
+ ```
18
+
19
+ ```javascript
20
+ //园区,内景集成加载
21
+ app
22
+ .create({
23
+ fileUrl: './mviotjs/campus.json',
24
+ libraryUrl: './mviotjs',
25
+ })
26
+ .then((_campus: any) => {
27
+ app
28
+ .create({
29
+ fileUrl: './mviotjs/Project.json',
30
+ libraryUrl: './mviotjs',
31
+ rotation: { x: 0, y: Math.PI / 2, z: 0 }, //为弧度制
32
+ parent: _campus[0].children[8], //某一栋大楼
33
+ })
34
+ .then((_scenes: any) => {
35
+ console.log(_scenes)
36
+ })
37
+ _campus[0].switch() //聚焦
38
+ })
39
+ ```
40
+
41
+ ## 场景层级树
42
+
43
+ 层级树如下图所示:
44
+
45
+ ![tree](./scenetree.jpg 'mviotjs-tree')
46
+
47
+ 默认场景层级为:园区》楼栋》楼层》房间》物体
48
+
49
+ 每层以 children 获取子物体,以 parent 获取父物体
50
+
51
+ ## 销毁场景
52
+
53
+ ```javascript
54
+ app.root.delete()
55
+ ```
56
+
57
+ ### 销毁自身
58
+
59
+ ```javascript
60
+ obj.delete()
61
+ ```
62
+
63
+ ## 切换层级
64
+
65
+ ```javascript
66
+ obj.focus()
67
+ ```
68
+
69
+ ## 层级回退
70
+
71
+ ```javascript
72
+ app.root.goBack()
73
+ ```
Binary file
@@ -0,0 +1,42 @@
1
+ 在使用以下代码创建场景实例后即可进行 3d 场景的环境配置
2
+
3
+ ```javascript
4
+ var app = new Mviot.App(container)
5
+ ```
6
+
7
+ ## 背景颜色
8
+
9
+ ```javascript
10
+ //rgba(0-1);
11
+ app.environment.color = { r: 0, g: 0.0588, b: 0.1176, a: 1 }
12
+ ```
13
+
14
+ ## 背景图片
15
+
16
+ ```javascript
17
+ app.environment.setBackground('./res/bg.png')
18
+ ```
19
+
20
+ ## 场景反射
21
+
22
+ ```javascript
23
+ app.environment.reflex('./res/environment.env', 0.5)
24
+ ```
25
+
26
+ ## 显示 fps(帧率)
27
+
28
+ ```javascript
29
+ //cssText(可选):样式字符串,默认为:"position: fixed;left: 5px;bottom: 5px;z-index:999999999; font-size: 10px;color: rgb(0, 255, 0);text-shadow:rgba(0, 0, 0, 0.2) 1px 1px 0;"
30
+ app.environment.showFps()
31
+ ```
32
+
33
+ ## 节点材质
34
+
35
+ ```javascript
36
+ const nodeMats = [
37
+ { id: 'B1', url: './mviotjs/ndoemats/B1.json' },
38
+ { id: 'hLine', url: './mviotjs/ndoemats/hLine.json' },
39
+ { id: 'vLine', url: './mviotjs/ndoemats/vLine.json' },
40
+ ]
41
+ await app.environment.loadNodeMats(nodeMats) //必须使用await强制同步加载,防止不生效
42
+ ```
@@ -0,0 +1,89 @@
1
+ # npm 安装
2
+
3
+ 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用。
4
+
5
+ ``` js
6
+ npm i mx3d
7
+ ```
8
+ 采用 nodejs 开发时,需配置 webpack 排除 mx3d 打包进工程代码
9
+
10
+ # CDN
11
+
12
+ 目前可以通过 [unpkg.com/mx3d](https://unpkg.com/mx3d/) 获取到最新版本的资源,在页面上引入 js文件即可开始使用。
13
+
14
+ ``` js
15
+ <!-- 引入组件库 -->
16
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.seat.min.js"></script>
17
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.kernel.min.js"></script>
18
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.loaders.min.js"></script>
19
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.dazzle.min.js"></script>
20
+ <script src="https://www.unpkg.com/mx3d/mx3d.min.js"></script>
21
+ ```
22
+
23
+ 我们建议使用 CDN 引入 mx3d 的用户在链接地址上锁定版本,以免将来 mx3d 升级时受到非兼容性更新的影响。锁定版本的方法请查看 [unpkg.com](https://unpkg.com/)。
24
+
25
+ # Hello mx3djs
26
+
27
+ 通过 CDN 的方式我们可以很容易地使用 mx3d 写出一个 Hello mx3djs 页面。[在线演示](http://docs.wodashijie.com/script?scrId=5939cb6568424d7d8821ece31420966b)
28
+
29
+ ``` html
30
+ <!DOCTYPE html>
31
+ <html lang="zh-CN" data-theme="dark">
32
+ <head>
33
+ <meta charset="utf-8">
34
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
35
+ <meta name="renderer" content="webkit">
36
+ <meta name="viewport" content="width=1920,user-scalable=no, viewport-fit=cover">
37
+ <style>
38
+ * {
39
+ margin: 0;
40
+ padding: 0;
41
+ }
42
+
43
+ html,
44
+ body {
45
+ width: 100%;
46
+ height: 100%;
47
+ margin: 0;
48
+ padding: 0;
49
+ overflow: hidden;
50
+ }
51
+
52
+ #container {
53
+ width: 100%;
54
+ height: 100%;
55
+ }
56
+ </style>
57
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.seat.min.js"></script>
58
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.kernel.min.js"></script>
59
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.loaders.min.js"></script>
60
+ <script src="https://www.unpkg.com/mx3d/core/mx3d.dazzle.min.js"></script>
61
+ <script src="https://www.unpkg.com/mx3d/mx3d.min.js"></script>
62
+ <title>Hello world</title>
63
+ </head>
64
+ <body>
65
+ <div id="container"></div>
66
+ <!-- built files will be auto injected -->
67
+ </body>
68
+ <script>
69
+ var container = document.getElementById("container");
70
+ var app = new MX3D.App(container);
71
+ app.showFps();
72
+ var _t = new Date().getTime();
73
+ app.create({
74
+ fileUrl: "http://h5.wodashijie.com/api/OpenScene/GetProject?id=nLfqWnZyD5zAdSg9", //场景文件
75
+ libraryUrl: null, //模型库路径
76
+ complete: null,
77
+ progress: (_x) => {
78
+ //加载进度
79
+ console.log(_x)
80
+ }
81
+ }).then((data) => {
82
+ app.Project.show();
83
+ console.log(parseInt(new Date().getTime() - _t) / 1000);
84
+ })
85
+ </script>
86
+ </html>
87
+ ```
88
+
89
+ 如果是通过 npm 安装,并希望配合 webpack 使用,请阅读下一节:快速上手。
package/mx3d.js CHANGED
@@ -10109,11 +10109,11 @@ class UI_UI {
10109
10109
  static createIcon(_id, _anchor, _size, _height) {
10110
10110
  let icon;
10111
10111
  _anchor.app.scene.blockfreeActiveMeshesAndRenderingGroups = true;
10112
- icon = new external_Dazzle_["Icon"](_id);
10112
+ icon = new external_Dazzle_["Icon"](_id, _anchor.app.scene);
10113
10113
  icon.size = _size;
10114
10114
  icon.height = _height;
10115
- icon.pint = new BABYLON.Mesh(_anchor[0].id + '_pint');
10116
- let pos = _anchor[0].instance.getAbsolutePosition();
10115
+ icon.pint = new BABYLON.Mesh(_id + '_pint');
10116
+ let pos = _anchor.instance.getAbsolutePosition();
10117
10117
  // if (_anchor[0].objectType == ObjectType.Floor) {
10118
10118
  // pos = _anchor[0].instance.getAbsolutePivotPoint();
10119
10119
  // }
package/mx3d.min.js CHANGED
@@ -22,4 +22,4 @@
22
22
  diffuseColor = res.rgb;
23
23
  alpha = res.a;
24
24
  }
25
- `),s.freeze()}return s}delete(e=!1){if(this.BOX&&this.BOX.dispose(),this.transparentBox&&this.transparentBox.dispose(!0,!0),this.BOX=null,this.transparentBox=null,e){for(const t in this.resources.map)this.resources.find(t).removeAllFromScene(),this.resources.remove(t);this.resources.clear()}}async GetWalls(e,t){let i=await BABYLON.SceneLoader.LoadAssetContainerAsync(e,t+".gltf",this.app.scene);if(i.meshes){var s=i.meshes[0].getChildMeshes();for(let e=0;e<s.length;e++)this.walls.add(s[e].id,s[e])}}}class R extends w{constructor(e,t){super(e),this.height=0,this.id=t.id,this.objectType=t.objectType,this.name=t.name,this.parentId=t.parentId,this.height=t.height,this.objectType==y.ParkModel&&(this.height=0),this.index=t.index}bind(n,i=!1){let o=new Array;for(let t=0;t<n.length;t++){let e=n[t];e.objectType==y.Wall&&(e.height||(e.height=3.1),e.ply||(e.ply=.09),o.push(e))}let r=new m;for(let e=0;e<n.length;e++){let i=n[e];i.objectType==y.Corner&&(r.add(i.id,i.corner),2<i.pints.length&&(i.height=3.1,i.walls.forEach(t=>{o.forEach(e=>{t==e.id&&parseFloat(e.height)<i.height&&(i.height=parseFloat(e.height))})})))}let t=new Array;for(let e=0;e<n.length;e++){var s=n[e];s.objectType==y.Corner&&t.push(s)}let e=new S(this.app);if(e.height=this.height,e.bind(t)?(e.parentId=this.id,this.app.project.objectDatas.add(e.id,e)):e=null,!i)for(let i=0;i<n.length;i++){let s=n[i];if(s.objectType==y.Floor){s.vectors=new Array;let e=n[i];e.pints.forEach(e=>{r.find(e)||console.log(e),s.vectors.push(r.find(e))}),s.buckles=new Array,e.holes&&e.holes.forEach(e=>{let t=new Array;e.forEach(e=>t.push(r.find(e))),s.buckles.push(t)}),e.middles&&e.middles.forEach(t=>{let i=Array();for(let e=0;e<n.length;e++)n[e].id==t&&n[e].pints.forEach(e=>{e=r.find(e);i.push(new BABYLON.Vector3(e.x,0,e.z))});s.buckles.push(i)});let t=new E(this.app);t.height=this.height,t.bind(s),this.app.project.objectDatas.add(t.id,t)}}r=null;for(let t=0;t<n.length;t++){var a=n[t];let e;if(a.objectType==y.Window)e=new T(this.app);else if(a.objectType==y.Door)e=new _(this.app);else if(a.objectType!=y.Cabinet||i)if(a.objectType!=y.LeakWater||i)if(a.objectType!=y.VirtualBox||i)if(a.objectType!=y.UI3D||i)if(a.objectType!=y.Conduit||i)if(a.objectType!=y.Building||i){if(a.objectType==y.Wall)continue;if(a.objectType==y.Corner)continue;if(a.objectType==y.Floor)continue;if(i)continue;e=new w(this.app)}else e=new I(this.app);else e=new x(this.app);else e=new L(this.app);else e=new C(this.app);else e=new O(this.app);else e=new k(this.app);e.bind(a),this.app.project.objectDatas.add(e.id,e)}let c=new m;c.add("body",{t:"",walls:new Array});for(let n=0;n<o.length;n++){let s=BABYLON.MeshBuilder.ExtrudePolygon(o[n].id,{shape:[H.Tools.ToVector3(o[n].wtop),H.Tools.ToVector3(o[n].wleft),H.Tools.ToVector3(o[n].wbottom),H.Tools.ToVector3(o[n].wright)],depth:parseFloat(o[n].height),sideOrientation:BABYLON.Mesh.FRONTSIDE},this.app.scene);s.setEnabled(!1),s.position.y=parseFloat(o[n].height),s.subMeshes=[];var h=s.getTotalVertices();s.subMeshes.push(new BABYLON.SubMesh(0,0,h,0,6,s)),s.subMeshes.push(new BABYLON.SubMesh(0,1,h,18,6,s)),s.subMeshes.push(new BABYLON.SubMesh(0,2,h,30,6,s));for(let i=0;i<o[n].wallwindows.length;i++){const u=BABYLON.CSG.FromMesh(s);let e=this.app.project.objectDatas.find(o[n].wallwindows[i]);var l=e.instance.getBoundingInfo(),p=BABYLON.MeshBuilder.CreateBox((new Date).getTime().toString(),{height:l.maximum.y-l.minimum.y,width:l.maximum.x-l.minimum.x,depth:2*parseFloat(o[n].ply)+.1},this.app.scene);p.position=e.instance.position.clone(),p.position.y=(l.maximum.y-l.minimum.y)/2+e.height,p.rotation=e.instance.rotation.clone();l=BABYLON.CSG.FromMesh(p);let t=u.subtract(l);p.dispose(),s.dispose(),s=t.toMesh(o[n].id,null,this.app.scene,!0),s.setEnabled(!1)}let t=c.find(o[n].leftMap.modelId);t||(t={t:o[n].leftMap,walls:new Array},c.add(o[n].leftMap.modelId,t));let i=c.find(o[n].rightMap.modelId);i||(i={t:o[n].rightMap,walls:new Array},c.add(o[n].rightMap.modelId,i));var d=H.Tools.DeconsTructMesh(s,parseFloat(o[n].height),this.app);for(let e=0;e<d.length;e++)(2==e||3==e?t:4==e||5==e?i:c.find("body")).walls.push(d[e])}for(const f in c.map)if(0<c.find(f).walls.length){let e=new M(this.app);e.parentId=this.id,e.height=this.height,e.bind(c.find(f)),this.app.project.objectDatas.add(e.id,e)}o=null,this.restVisualAngle()}focus(){this.app.scene.blockfreeActiveMeshesAndRenderingGroups=!0;for(const t in this.app.project.objectDatas.map){let e=this.app.project.objectDatas.find(t);e.parentId==this.id?e.setEnabled(!0):e.setEnabled(!1)}this.isEnabled=!0,this.app.scene.blockfreeActiveMeshesAndRenderingGroups=!1}setEnabled(e){}restVisualAngle(){var i,s;for(const e in this.app.project.objectDatas.map){let t=this.app.project.objectDatas.find(e);if(t.objectType!=y.ParkModel&&t.objectType!=y.Storey&&t.parentId==this.id){let e=t.instance.getBoundingInfo();i&&s||(i=s=e.boundingBox.center.clone()),i=BABYLON.Vector3.Minimize(i,e.minimum.add(t.instance.position)),s=BABYLON.Vector3.Maximize(s,e.maximum.add(t.instance.position))}}i&&s||(i=BABYLON.Vector3.Zero(),s=new BABYLON.Vector3(12,this.height,8)),this.visualAngle=u.getVisualAngle(new BABYLON.BoundingInfo(i,s),this.app),this.visualAngle.focus.y=this.height}}var F=i(3);class V{constructor(e,t){this.isOK=!1,this.app=t,this.ele=document.createElement("div"),this.ele.style.cssText="position: absolute;z-index:999999999; font-size: 10px;color: rgb(211, 211, 211);text-shadow:rgba(0, 0, 0, 0.2) 1px 1px 0; padding: 5px 8px;",e.appendChild(this.ele),this.close(),setInterval(()=>{var e;1e3<(new Date).getTime()-this.time&&this.isOK&&!this.text&&((e=this.app.project.objectDatas.find(this.id))&&(this.text=e.name))},100)}set text(e){this._text=e,(this.ele.innerText=e)&&(this.ele.style.display=null)}update(e){e.pickInfo.pickedMesh?e.pickInfo.pickedMesh.id!=this.id?(this.close(),this.id=e.pickInfo.pickedMesh.id,this.time=(new Date).getTime()):this.isOK=!0:this.close(),this.ele.style.top=e.event.offsetY+"px",this.ele.style.left=e.event.offsetX+20+"px"}close(){this.isOK=!1,this.time=(new Date).getTime(),this.ele.style.display="none",this.text=""}setBackground(e){this.url=e,this.ele.style.background="url("+this.url+") no-repeat",this.ele.style.backgroundSize="cover"}}var i={App:class{constructor(e,t){this.index=0,this.highQualityMode=!1;e=F.SceneLoader.create(e);this.canvas=e.canvas,this.engine=e.engine,this.scene=e.scene,this.rootUrl=t||"http://models.wodashijie.com/",this.Resources=new Y(this),this.camera=new o(this),this.highlightLayer=new BABYLON.HighlightLayer("highlightLayer",this.scene),this.container=BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI("screenUI"),this.Environment=new f(this),this.project=new P(this),H.EffectMgr=new A,this.engine.runRenderLoop(()=>{this.fps&&(this.fps.innerText=this.engine.getFps().toFixed()+" fps"),this.scene.render(),l.a.update()}),window.addEventListener("resize",()=>{this.engine.resize()}),this.scene.onPointerObservable.add(e=>{switch(e.type){case BABYLON.PointerEventTypes.POINTERMOVE:if(!this.tipsTool)return;e.pickInfo&&e.pickInfo.pickedPoint?this.tipsTool.update(e):this.tipsTool.close();break;case BABYLON.PointerEventTypes.POINTERWHEEL:var t;this.camera.isOverLook?this.camera._wheel(e.event):(t=1e3/(this.camera.camera.radius/20),this.camera.camera.panningSensibility=2e3<t?2e3:t<10?10:t)}}),this.scene.onKeyboardObservable.add(e=>{e.type===BABYLON.KeyboardEventTypes.KEYDOWN&&70===e.event.keyCode&&prompt("请复制输入框内的视角参数",JSON.stringify({alpha:this.camera.camera.alpha,focus:u.vector3ToJson(this.camera.camera.target),radius:this.camera.camera.radius,beta:this.camera.camera.beta}))})}create(f){return this.highQualityMode=f.highQualityMode,this.highQualityMode&&(this.Glow=new BABYLON.GlowLayer("glow",this.scene),this.Glow.addIncludedOnlyMesh(this.Resources.BOX)),f.libraryUrl&&(this.Resources.resourcePath=f.libraryUrl),new Promise(async(n,t)=>{try{var o=await class{static read(s,n){return new Promise(function(e,t){let i=new XMLHttpRequest;i.open(s,n),i.onload=function(){200<=this.status&&this.status<300?e(i.response):t({status:this.status,statusText:i.statusText})},i.onerror=function(){t({status:this.status,statusText:i.statusText})},i.send()})}}.read("GET",f.fileUrl),r=JSON.parse(B.de(o));this.project.id=r.id,this.Environment.color="#7A7A7A"==r.environmentSettings.backColor?new BABYLON.Color4(0,.0588,.1176,1):new BABYLON.Color4(...BABYLON.Color3.FromHexString(r.environmentSettings.backColor).asArray(),1),this.Environment.fogDistance=r.environmentSettings.fogDensity,this.Environment.setFlexIntensity(r.environmentSettings.reflexIntensity),this.Environment.setReflexEnabled(r.environmentSettings.reflexEnabled),this.Environment.loadLight(r.environmentSettings.lights),this.scene.blockfreeActiveMeshesAndRenderingGroups=!0,r.isOptimized&&await this.Resources.GetWalls(f.fileUrl.replace(r.id+".json",""),r.id);let t=new m;for(let e=0;e<r.scenes.length;e++){const p=r.scenes[e];!p.baseModel||".gltf"!=p.baseModel.extension||t.find(p.baseModel.modelId)||this.Resources.resources.find(p.baseModel.modelId)||(p.baseModel.objectType=p.objectType,t.add(p.baseModel.modelId,p.baseModel))}let e=0;for(const d in t.map)await this.Resources.loadModelMesh(t.find(d)),e++,f.progress&&f.progress(e/t.count()*.8);e=0,t=null;let i=new m,s=new m;for(let e=0;e<r.scenes.length;e++){var a,c=r.scenes[e];c.objectType==y.Storey||c.objectType==y.ParkModel?(a=new z(this,c),this.project.objectDatas.add(a.id,a),i.add(a.id,a),s.add(a.id,new Array),c.objectType==y.ParkModel&&(this.project.root=a)):c.objectType==y.Floor&&i.add(c.id,c)}for(let e=0;e<r.scenes.length;e++){var h,l=r.scenes[e];l.objectType!=y.Storey&&l.objectType!=y.ParkModel&&((h=i.find(l.parentId)).objectType==y.Floor?s.find(h.parentId):s.find(l.parentId)).push(l)}for(const u in s.map)await this.project.objectDatas.find(u).bind(s.find(u)),e++,f.progress&&f.progress(.8+e/r.scenes.length*.2);i=null,s=null,this.project.optimization(),this.scene.blockfreeActiveMeshesAndRenderingGroups=!1,n(null),f.complete&&f.complete()}catch(e){t(e)}})}optimized(g){return g.libraryUrl&&(this.Resources.resourcePath=g.libraryUrl),new Promise(async(o,t)=>{try{let i=JSON.parse(B.de(g.file));this.project.id=i.id,this.Environment.color="#7A7A7A"==i.environmentSettings.backColor?new BABYLON.Color4(0,.0588,.1176,1):new BABYLON.Color4(...BABYLON.Color3.FromHexString(i.environmentSettings.backColor).asArray(),1),this.Environment.fogDistance=i.environmentSettings.fogDensity,this.Environment.setFlexIntensity(i.environmentSettings.reflexIntensity),this.Environment.setReflexEnabled(i.environmentSettings.reflexEnabled),this.Environment.loadLight(i.environmentSettings.lights),this.scene.blockfreeActiveMeshesAndRenderingGroups=!0;let t=new m;for(let e=0;e<i.scenes.length;e++){const p=i.scenes[e];g._isOptimized&&"Window"!=p.objectType&&"Door"!=p.objectType||!p.baseModel||".gltf"!=p.baseModel.extension||t.find(p.baseModel.modelId)||this.Resources.resources.find(p.baseModel.modelId)||(p.baseModel.objectType=p.objectType,t.add(p.baseModel.modelId,p.baseModel))}let e=0;for(const d in t.map)await this.Resources.loadModelMesh(t.find(d)),e++,g.progress&&g.progress(e/t.count()*.8);e=0,t=null;let s=new m,n=new m;for(let e=0;e<i.scenes.length;e++){var r,a=i.scenes[e];a.objectType==y.Storey||a.objectType==y.ParkModel?(r=new R(this,a),this.project.objectDatas.add(r.id,r),s.add(r.id,r),n.add(r.id,new Array),a.objectType==y.ParkModel&&(this.project.root=r)):a.objectType==y.Floor&&s.add(a.id,a)}for(let e=0;e<i.scenes.length;e++){var c,h=i.scenes[e];h.objectType!=y.Storey&&h.objectType!=y.ParkModel&&((c=s.find(h.parentId)).objectType==y.Floor?n.find(c.parentId):n.find(h.parentId)).push(h)}for(const u in n.map)await this.project.objectDatas.find(u).bind(n.find(u),g._isOptimized),e++,g.progress&&g.progress(.8+e/i.scenes.length*.2);if(s=null,n=null,this.project.optimization(),this.scene.blockfreeActiveMeshesAndRenderingGroups=!1,g._isOptimized){let t=[];for(const f in this.project.objectDatas.map){var l=this.project.objectDatas.find(f);l.objectType!=y.Wall&&l.objectType!=y.Corner||t.push({id:l.id,parentId:l.parentId,objectType:"optimizedWall",baseModel:l.baseModel})}for(let e=0;e<i.scenes.length;e++)i.scenes[e].objectType!=y.Wall&&t.push(i.scenes[e]);i.isOptimized=!0,i.scenes=t}o(JSON.stringify(i)),g.complete&&g.complete()}catch(e){t(e)}})}outGltf(t){this.Resources.delete(!0);for(const i in this.project.objectDatas.map){let e=this.project.objectDatas.find(i);e.objectType!=y.Wall&&e.objectType!=y.Corner?(e.instance&&e.instance.dispose(),this.project.objectDatas.remove(i)):e.instance.material=null}return BABYLON.GLTF2Export.GLTFAsync(this.scene,this.project.id,{shouldExportNode:e=>{e=this.project.objectDatas.find(e.id);return e&&(e.objectType==y.Wall||e.objectType==y.Corner)}}).then(e=>{e.downloadFiles(),t&&t()})}showTips(){this.tipsTool=new V(this.canvas.parentElement,this)}showFps(e="position: absolute;left: 5px;bottom: 5px;z-index:999999999; font-size: 10px;color: rgb(0, 255, 0);text-shadow:rgba(0, 0, 0, 0.2) 1px 1px 0;"){this.fps||(this.fps=document.createElement("div"),this.canvas.parentElement.appendChild(this.fps)),this.fps.style.cssText=e}showMonitoringParameters(){var e=new BABYLON.EngineInstrumentation(this.engine);e.captureGPUFrameTime=!0,e.captureShaderCompilationTime=!0;let t=document.createElement("div");t.style.cssText="position: absolute;left: 5px;top: 5px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(t);let i=document.createElement("div");i.style.cssText="position: absolute;left: 5px;top: 25px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(i);let s=document.createElement("div");s.style.cssText="position: absolute;left: 5px;top: 45px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(s);let n=document.createElement("div");n.style.cssText="position: absolute;left: 5px;top: 65px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(n);let o=document.createElement("div");o.style.cssText="position: absolute;left: 5px;top: 85px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(o),this.scene.registerBeforeRender(()=>{t.innerText="current frame time (GPU): "+(1e-6*e.gpuFrameTimeCounter.current).toFixed(2)+"ms",i.innerText="average frame time (GPU): "+(1e-6*e.gpuFrameTimeCounter.average).toFixed(2)+"ms",s.innerText="total shader compilation time: "+e.shaderCompilationTimeCounter.total.toFixed(2)+"ms",n.innerText="average shader compilation time: "+e.shaderCompilationTimeCounter.average.toFixed(2)+"ms",o.innerText="compiler shaders count: "+e.shaderCompilationTimeCounter.count})}hideFps(){this.fps&&this.canvas.parentElement.removeChild(this.fps),this.fps=null}dispose(){this.fps&&this.canvas.parentElement.removeChild(this.fps),this.fps=null,this.project.delete(),this.Resources.delete(),this.engine.dispose()}showDebug(){this.scene.debugLayer.show()}},Tools:u,UI:class{static createIconFromMesh(e,t,i,s,n){return new F.IconFromMesh(e,t.instance,i,s,n,t.app.scene)}static createIcon(e,t,i,s){let n;t.app.scene.blockfreeActiveMeshesAndRenderingGroups=!0,n=new F.Icon(e),n.size=i,n.height=s,n.pint=new BABYLON.Mesh(t[0].id+"_pint");e=t[0].instance.getAbsolutePosition();return n.pint.position=e,n.pint.position.y+=s,n.rect=new BABYLON.GUI.Rectangle,n.rect.isPointerBlocker=!1,n.rect.width=i.width+"px",n.rect.height=i.height+"px",n.rect.thickness=0,t.app.container.addControl(n.rect),n.rect.linkWithMesh(n.pint),t.app.scene.blockfreeActiveMeshesAndRenderingGroups=!1,n}},ObjectType:y,EffectMgr:void 0,EffectType:g,EventType:v,EffectControls:class{static createCapacity(e,t,i,s="200px"){return F.Builder.createCapacity(e,t,i,s)}static createMatrixHeatMap(e,t){if(e.objectType==y.Floor)return F.Builder.createMatrixHeatMap({anchor:e.instance,rootUrl:e.app.rootUrl,FogTex:e.app.Resources.FogTex,container:e.app.container,config:t.config,displayValues:t.displayValues,height:t.height,isAlpha:t.isAlpha,isLevelRender:t.isLevelRender,isParticle:t.isParticle,radius:t.radius,range:t.range});console.error("矩阵云图对象必须为房间!")}static createColumnarHeatMap(e,t){return F.Builder.createColumnarHeatMap({anchor:e.instance,FogTex:e.app.Resources.FogTex,container:e.app.container,config:t.config,displayValues:t.displayValues,isAlpha:t.isAlpha,isLevelRender:t.isLevelRender,isParticle:t.isParticle,radius:t.radius,range:t.range})}},Dictionary:m},H=t.default=i}],p={},h.m=l,h.c=p,h.d=function(e,t,i){h.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},h.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},h.t=function(t,e){if(1&e&&(t=h(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(h.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)h.d(i,s,function(e){return t[e]}.bind(null,s));return i},h.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return h.d(t,"a",t),t},h.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},h.p="",h(h.s=44).default;function h(e){if(p[e])return p[e].exports;var t=p[e]={i:e,l:!1,exports:{}};return l[e].call(t.exports,t,t.exports,h),t.l=!0,t.exports}var l,p});
25
+ `),s.freeze()}return s}delete(e=!1){if(this.BOX&&this.BOX.dispose(),this.transparentBox&&this.transparentBox.dispose(!0,!0),this.BOX=null,this.transparentBox=null,e){for(const t in this.resources.map)this.resources.find(t).removeAllFromScene(),this.resources.remove(t);this.resources.clear()}}async GetWalls(e,t){let i=await BABYLON.SceneLoader.LoadAssetContainerAsync(e,t+".gltf",this.app.scene);if(i.meshes){var s=i.meshes[0].getChildMeshes();for(let e=0;e<s.length;e++)this.walls.add(s[e].id,s[e])}}}class R extends w{constructor(e,t){super(e),this.height=0,this.id=t.id,this.objectType=t.objectType,this.name=t.name,this.parentId=t.parentId,this.height=t.height,this.objectType==y.ParkModel&&(this.height=0),this.index=t.index}bind(n,i=!1){let o=new Array;for(let t=0;t<n.length;t++){let e=n[t];e.objectType==y.Wall&&(e.height||(e.height=3.1),e.ply||(e.ply=.09),o.push(e))}let r=new m;for(let e=0;e<n.length;e++){let i=n[e];i.objectType==y.Corner&&(r.add(i.id,i.corner),2<i.pints.length&&(i.height=3.1,i.walls.forEach(t=>{o.forEach(e=>{t==e.id&&parseFloat(e.height)<i.height&&(i.height=parseFloat(e.height))})})))}let t=new Array;for(let e=0;e<n.length;e++){var s=n[e];s.objectType==y.Corner&&t.push(s)}let e=new S(this.app);if(e.height=this.height,e.bind(t)?(e.parentId=this.id,this.app.project.objectDatas.add(e.id,e)):e=null,!i)for(let i=0;i<n.length;i++){let s=n[i];if(s.objectType==y.Floor){s.vectors=new Array;let e=n[i];e.pints.forEach(e=>{r.find(e)||console.log(e),s.vectors.push(r.find(e))}),s.buckles=new Array,e.holes&&e.holes.forEach(e=>{let t=new Array;e.forEach(e=>t.push(r.find(e))),s.buckles.push(t)}),e.middles&&e.middles.forEach(t=>{let i=Array();for(let e=0;e<n.length;e++)n[e].id==t&&n[e].pints.forEach(e=>{e=r.find(e);i.push(new BABYLON.Vector3(e.x,0,e.z))});s.buckles.push(i)});let t=new E(this.app);t.height=this.height,t.bind(s),this.app.project.objectDatas.add(t.id,t)}}r=null;for(let t=0;t<n.length;t++){var a=n[t];let e;if(a.objectType==y.Window)e=new T(this.app);else if(a.objectType==y.Door)e=new _(this.app);else if(a.objectType!=y.Cabinet||i)if(a.objectType!=y.LeakWater||i)if(a.objectType!=y.VirtualBox||i)if(a.objectType!=y.UI3D||i)if(a.objectType!=y.Conduit||i)if(a.objectType!=y.Building||i){if(a.objectType==y.Wall)continue;if(a.objectType==y.Corner)continue;if(a.objectType==y.Floor)continue;if(i)continue;e=new w(this.app)}else e=new I(this.app);else e=new x(this.app);else e=new L(this.app);else e=new C(this.app);else e=new O(this.app);else e=new k(this.app);e.bind(a),this.app.project.objectDatas.add(e.id,e)}let c=new m;c.add("body",{t:"",walls:new Array});for(let n=0;n<o.length;n++){let s=BABYLON.MeshBuilder.ExtrudePolygon(o[n].id,{shape:[H.Tools.ToVector3(o[n].wtop),H.Tools.ToVector3(o[n].wleft),H.Tools.ToVector3(o[n].wbottom),H.Tools.ToVector3(o[n].wright)],depth:parseFloat(o[n].height),sideOrientation:BABYLON.Mesh.FRONTSIDE},this.app.scene);s.setEnabled(!1),s.position.y=parseFloat(o[n].height),s.subMeshes=[];var h=s.getTotalVertices();s.subMeshes.push(new BABYLON.SubMesh(0,0,h,0,6,s)),s.subMeshes.push(new BABYLON.SubMesh(0,1,h,18,6,s)),s.subMeshes.push(new BABYLON.SubMesh(0,2,h,30,6,s));for(let i=0;i<o[n].wallwindows.length;i++){const u=BABYLON.CSG.FromMesh(s);let e=this.app.project.objectDatas.find(o[n].wallwindows[i]);var l=e.instance.getBoundingInfo(),p=BABYLON.MeshBuilder.CreateBox((new Date).getTime().toString(),{height:l.maximum.y-l.minimum.y,width:l.maximum.x-l.minimum.x,depth:2*parseFloat(o[n].ply)+.1},this.app.scene);p.position=e.instance.position.clone(),p.position.y=(l.maximum.y-l.minimum.y)/2+e.height,p.rotation=e.instance.rotation.clone();l=BABYLON.CSG.FromMesh(p);let t=u.subtract(l);p.dispose(),s.dispose(),s=t.toMesh(o[n].id,null,this.app.scene,!0),s.setEnabled(!1)}let t=c.find(o[n].leftMap.modelId);t||(t={t:o[n].leftMap,walls:new Array},c.add(o[n].leftMap.modelId,t));let i=c.find(o[n].rightMap.modelId);i||(i={t:o[n].rightMap,walls:new Array},c.add(o[n].rightMap.modelId,i));var d=H.Tools.DeconsTructMesh(s,parseFloat(o[n].height),this.app);for(let e=0;e<d.length;e++)(2==e||3==e?t:4==e||5==e?i:c.find("body")).walls.push(d[e])}for(const f in c.map)if(0<c.find(f).walls.length){let e=new M(this.app);e.parentId=this.id,e.height=this.height,e.bind(c.find(f)),this.app.project.objectDatas.add(e.id,e)}o=null,this.restVisualAngle()}focus(){this.app.scene.blockfreeActiveMeshesAndRenderingGroups=!0;for(const t in this.app.project.objectDatas.map){let e=this.app.project.objectDatas.find(t);e.parentId==this.id?e.setEnabled(!0):e.setEnabled(!1)}this.isEnabled=!0,this.app.scene.blockfreeActiveMeshesAndRenderingGroups=!1}setEnabled(e){}restVisualAngle(){var i,s;for(const e in this.app.project.objectDatas.map){let t=this.app.project.objectDatas.find(e);if(t.objectType!=y.ParkModel&&t.objectType!=y.Storey&&t.parentId==this.id){let e=t.instance.getBoundingInfo();i&&s||(i=s=e.boundingBox.center.clone()),i=BABYLON.Vector3.Minimize(i,e.minimum.add(t.instance.position)),s=BABYLON.Vector3.Maximize(s,e.maximum.add(t.instance.position))}}i&&s||(i=BABYLON.Vector3.Zero(),s=new BABYLON.Vector3(12,this.height,8)),this.visualAngle=u.getVisualAngle(new BABYLON.BoundingInfo(i,s),this.app),this.visualAngle.focus.y=this.height}}var F=i(3);class V{constructor(e,t){this.isOK=!1,this.app=t,this.ele=document.createElement("div"),this.ele.style.cssText="position: absolute;z-index:999999999; font-size: 10px;color: rgb(211, 211, 211);text-shadow:rgba(0, 0, 0, 0.2) 1px 1px 0; padding: 5px 8px;",e.appendChild(this.ele),this.close(),setInterval(()=>{var e;1e3<(new Date).getTime()-this.time&&this.isOK&&!this.text&&((e=this.app.project.objectDatas.find(this.id))&&(this.text=e.name))},100)}set text(e){this._text=e,(this.ele.innerText=e)&&(this.ele.style.display=null)}update(e){e.pickInfo.pickedMesh?e.pickInfo.pickedMesh.id!=this.id?(this.close(),this.id=e.pickInfo.pickedMesh.id,this.time=(new Date).getTime()):this.isOK=!0:this.close(),this.ele.style.top=e.event.offsetY+"px",this.ele.style.left=e.event.offsetX+20+"px"}close(){this.isOK=!1,this.time=(new Date).getTime(),this.ele.style.display="none",this.text=""}setBackground(e){this.url=e,this.ele.style.background="url("+this.url+") no-repeat",this.ele.style.backgroundSize="cover"}}var i={App:class{constructor(e,t){this.index=0,this.highQualityMode=!1;e=F.SceneLoader.create(e);this.canvas=e.canvas,this.engine=e.engine,this.scene=e.scene,this.rootUrl=t||"http://models.wodashijie.com/",this.Resources=new Y(this),this.camera=new o(this),this.highlightLayer=new BABYLON.HighlightLayer("highlightLayer",this.scene),this.container=BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI("screenUI"),this.Environment=new f(this),this.project=new P(this),H.EffectMgr=new A,this.engine.runRenderLoop(()=>{this.fps&&(this.fps.innerText=this.engine.getFps().toFixed()+" fps"),this.scene.render(),l.a.update()}),window.addEventListener("resize",()=>{this.engine.resize()}),this.scene.onPointerObservable.add(e=>{switch(e.type){case BABYLON.PointerEventTypes.POINTERMOVE:if(!this.tipsTool)return;e.pickInfo&&e.pickInfo.pickedPoint?this.tipsTool.update(e):this.tipsTool.close();break;case BABYLON.PointerEventTypes.POINTERWHEEL:var t;this.camera.isOverLook?this.camera._wheel(e.event):(t=1e3/(this.camera.camera.radius/20),this.camera.camera.panningSensibility=2e3<t?2e3:t<10?10:t)}}),this.scene.onKeyboardObservable.add(e=>{e.type===BABYLON.KeyboardEventTypes.KEYDOWN&&70===e.event.keyCode&&prompt("请复制输入框内的视角参数",JSON.stringify({alpha:this.camera.camera.alpha,focus:u.vector3ToJson(this.camera.camera.target),radius:this.camera.camera.radius,beta:this.camera.camera.beta}))})}create(f){return this.highQualityMode=f.highQualityMode,this.highQualityMode&&(this.Glow=new BABYLON.GlowLayer("glow",this.scene),this.Glow.addIncludedOnlyMesh(this.Resources.BOX)),f.libraryUrl&&(this.Resources.resourcePath=f.libraryUrl),new Promise(async(n,t)=>{try{var o=await class{static read(s,n){return new Promise(function(e,t){let i=new XMLHttpRequest;i.open(s,n),i.onload=function(){200<=this.status&&this.status<300?e(i.response):t({status:this.status,statusText:i.statusText})},i.onerror=function(){t({status:this.status,statusText:i.statusText})},i.send()})}}.read("GET",f.fileUrl),r=JSON.parse(B.de(o));this.project.id=r.id,this.Environment.color="#7A7A7A"==r.environmentSettings.backColor?new BABYLON.Color4(0,.0588,.1176,1):new BABYLON.Color4(...BABYLON.Color3.FromHexString(r.environmentSettings.backColor).asArray(),1),this.Environment.fogDistance=r.environmentSettings.fogDensity,this.Environment.setFlexIntensity(r.environmentSettings.reflexIntensity),this.Environment.setReflexEnabled(r.environmentSettings.reflexEnabled),this.Environment.loadLight(r.environmentSettings.lights),this.scene.blockfreeActiveMeshesAndRenderingGroups=!0,r.isOptimized&&await this.Resources.GetWalls(f.fileUrl.replace(r.id+".json",""),r.id);let t=new m;for(let e=0;e<r.scenes.length;e++){const p=r.scenes[e];!p.baseModel||".gltf"!=p.baseModel.extension||t.find(p.baseModel.modelId)||this.Resources.resources.find(p.baseModel.modelId)||(p.baseModel.objectType=p.objectType,t.add(p.baseModel.modelId,p.baseModel))}let e=0;for(const d in t.map)await this.Resources.loadModelMesh(t.find(d)),e++,f.progress&&f.progress(e/t.count()*.8);e=0,t=null;let i=new m,s=new m;for(let e=0;e<r.scenes.length;e++){var a,c=r.scenes[e];c.objectType==y.Storey||c.objectType==y.ParkModel?(a=new z(this,c),this.project.objectDatas.add(a.id,a),i.add(a.id,a),s.add(a.id,new Array),c.objectType==y.ParkModel&&(this.project.root=a)):c.objectType==y.Floor&&i.add(c.id,c)}for(let e=0;e<r.scenes.length;e++){var h,l=r.scenes[e];l.objectType!=y.Storey&&l.objectType!=y.ParkModel&&((h=i.find(l.parentId)).objectType==y.Floor?s.find(h.parentId):s.find(l.parentId)).push(l)}for(const u in s.map)await this.project.objectDatas.find(u).bind(s.find(u)),e++,f.progress&&f.progress(.8+e/r.scenes.length*.2);i=null,s=null,this.project.optimization(),this.scene.blockfreeActiveMeshesAndRenderingGroups=!1,n(null),f.complete&&f.complete()}catch(e){t(e)}})}optimized(g){return g.libraryUrl&&(this.Resources.resourcePath=g.libraryUrl),new Promise(async(o,t)=>{try{let i=JSON.parse(B.de(g.file));this.project.id=i.id,this.Environment.color="#7A7A7A"==i.environmentSettings.backColor?new BABYLON.Color4(0,.0588,.1176,1):new BABYLON.Color4(...BABYLON.Color3.FromHexString(i.environmentSettings.backColor).asArray(),1),this.Environment.fogDistance=i.environmentSettings.fogDensity,this.Environment.setFlexIntensity(i.environmentSettings.reflexIntensity),this.Environment.setReflexEnabled(i.environmentSettings.reflexEnabled),this.Environment.loadLight(i.environmentSettings.lights),this.scene.blockfreeActiveMeshesAndRenderingGroups=!0;let t=new m;for(let e=0;e<i.scenes.length;e++){const p=i.scenes[e];g._isOptimized&&"Window"!=p.objectType&&"Door"!=p.objectType||!p.baseModel||".gltf"!=p.baseModel.extension||t.find(p.baseModel.modelId)||this.Resources.resources.find(p.baseModel.modelId)||(p.baseModel.objectType=p.objectType,t.add(p.baseModel.modelId,p.baseModel))}let e=0;for(const d in t.map)await this.Resources.loadModelMesh(t.find(d)),e++,g.progress&&g.progress(e/t.count()*.8);e=0,t=null;let s=new m,n=new m;for(let e=0;e<i.scenes.length;e++){var r,a=i.scenes[e];a.objectType==y.Storey||a.objectType==y.ParkModel?(r=new R(this,a),this.project.objectDatas.add(r.id,r),s.add(r.id,r),n.add(r.id,new Array),a.objectType==y.ParkModel&&(this.project.root=r)):a.objectType==y.Floor&&s.add(a.id,a)}for(let e=0;e<i.scenes.length;e++){var c,h=i.scenes[e];h.objectType!=y.Storey&&h.objectType!=y.ParkModel&&((c=s.find(h.parentId)).objectType==y.Floor?n.find(c.parentId):n.find(h.parentId)).push(h)}for(const u in n.map)await this.project.objectDatas.find(u).bind(n.find(u),g._isOptimized),e++,g.progress&&g.progress(.8+e/i.scenes.length*.2);if(s=null,n=null,this.project.optimization(),this.scene.blockfreeActiveMeshesAndRenderingGroups=!1,g._isOptimized){let t=[];for(const f in this.project.objectDatas.map){var l=this.project.objectDatas.find(f);l.objectType!=y.Wall&&l.objectType!=y.Corner||t.push({id:l.id,parentId:l.parentId,objectType:"optimizedWall",baseModel:l.baseModel})}for(let e=0;e<i.scenes.length;e++)i.scenes[e].objectType!=y.Wall&&t.push(i.scenes[e]);i.isOptimized=!0,i.scenes=t}o(JSON.stringify(i)),g.complete&&g.complete()}catch(e){t(e)}})}outGltf(t){this.Resources.delete(!0);for(const i in this.project.objectDatas.map){let e=this.project.objectDatas.find(i);e.objectType!=y.Wall&&e.objectType!=y.Corner?(e.instance&&e.instance.dispose(),this.project.objectDatas.remove(i)):e.instance.material=null}return BABYLON.GLTF2Export.GLTFAsync(this.scene,this.project.id,{shouldExportNode:e=>{e=this.project.objectDatas.find(e.id);return e&&(e.objectType==y.Wall||e.objectType==y.Corner)}}).then(e=>{e.downloadFiles(),t&&t()})}showTips(){this.tipsTool=new V(this.canvas.parentElement,this)}showFps(e="position: absolute;left: 5px;bottom: 5px;z-index:999999999; font-size: 10px;color: rgb(0, 255, 0);text-shadow:rgba(0, 0, 0, 0.2) 1px 1px 0;"){this.fps||(this.fps=document.createElement("div"),this.canvas.parentElement.appendChild(this.fps)),this.fps.style.cssText=e}showMonitoringParameters(){var e=new BABYLON.EngineInstrumentation(this.engine);e.captureGPUFrameTime=!0,e.captureShaderCompilationTime=!0;let t=document.createElement("div");t.style.cssText="position: absolute;left: 5px;top: 5px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(t);let i=document.createElement("div");i.style.cssText="position: absolute;left: 5px;top: 25px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(i);let s=document.createElement("div");s.style.cssText="position: absolute;left: 5px;top: 45px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(s);let n=document.createElement("div");n.style.cssText="position: absolute;left: 5px;top: 65px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(n);let o=document.createElement("div");o.style.cssText="position: absolute;left: 5px;top: 85px;z-index:999999999;font-size: 10px;color: rgb(0, 255, 0);",this.canvas.parentElement.appendChild(o),this.scene.registerBeforeRender(()=>{t.innerText="current frame time (GPU): "+(1e-6*e.gpuFrameTimeCounter.current).toFixed(2)+"ms",i.innerText="average frame time (GPU): "+(1e-6*e.gpuFrameTimeCounter.average).toFixed(2)+"ms",s.innerText="total shader compilation time: "+e.shaderCompilationTimeCounter.total.toFixed(2)+"ms",n.innerText="average shader compilation time: "+e.shaderCompilationTimeCounter.average.toFixed(2)+"ms",o.innerText="compiler shaders count: "+e.shaderCompilationTimeCounter.count})}hideFps(){this.fps&&this.canvas.parentElement.removeChild(this.fps),this.fps=null}dispose(){this.fps&&this.canvas.parentElement.removeChild(this.fps),this.fps=null,this.project.delete(),this.Resources.delete(),this.engine.dispose()}showDebug(){this.scene.debugLayer.show()}},Tools:u,UI:class{static createIconFromMesh(e,t,i,s,n){return new F.IconFromMesh(e,t.instance,i,s,n,t.app.scene)}static createIcon(e,t,i,s){let n;t.app.scene.blockfreeActiveMeshesAndRenderingGroups=!0,n=new F.Icon(e,t.app.scene),n.size=i,n.height=s,n.pint=new BABYLON.Mesh(e+"_pint");e=t.instance.getAbsolutePosition();return n.pint.position=e,n.pint.position.y+=s,n.rect=new BABYLON.GUI.Rectangle,n.rect.isPointerBlocker=!1,n.rect.width=i.width+"px",n.rect.height=i.height+"px",n.rect.thickness=0,t.app.container.addControl(n.rect),n.rect.linkWithMesh(n.pint),t.app.scene.blockfreeActiveMeshesAndRenderingGroups=!1,n}},ObjectType:y,EffectMgr:void 0,EffectType:g,EventType:v,EffectControls:class{static createCapacity(e,t,i,s="200px"){return F.Builder.createCapacity(e,t,i,s)}static createMatrixHeatMap(e,t){if(e.objectType==y.Floor)return F.Builder.createMatrixHeatMap({anchor:e.instance,rootUrl:e.app.rootUrl,FogTex:e.app.Resources.FogTex,container:e.app.container,config:t.config,displayValues:t.displayValues,height:t.height,isAlpha:t.isAlpha,isLevelRender:t.isLevelRender,isParticle:t.isParticle,radius:t.radius,range:t.range});console.error("矩阵云图对象必须为房间!")}static createColumnarHeatMap(e,t){return F.Builder.createColumnarHeatMap({anchor:e.instance,FogTex:e.app.Resources.FogTex,container:e.app.container,config:t.config,displayValues:t.displayValues,isAlpha:t.isAlpha,isLevelRender:t.isLevelRender,isParticle:t.isParticle,radius:t.radius,range:t.range})}},Dictionary:m},H=t.default=i}],p={},h.m=l,h.c=p,h.d=function(e,t,i){h.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},h.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},h.t=function(t,e){if(1&e&&(t=h(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(h.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var s in t)h.d(i,s,function(e){return t[e]}.bind(null,s));return i},h.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return h.d(t,"a",t),t},h.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},h.p="",h(h.s=44).default;function h(e){if(p[e])return p[e].exports;var t=p[e]={i:e,l:!1,exports:{}};return l[e].call(t.exports,t,t.exports,h),t.l=!0,t.exports}var l,p});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mx3d",
3
- "version": "0.0.32",
3
+ "version": "0.0.33",
4
4
  "description": "",
5
5
  "main": "mx3d.js",
6
6
  "typings": "./dist/index.d.ts",