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.
- package/core/mx3d.dazzle.min.js +1 -1
- package/docs/.nojekyll +0 -0
- package/docs/README.md +24 -0
- package/docs/_sidebar.md +18 -0
- package/docs/camera.md +24 -0
- package/docs/css/dark.css +979 -0
- package/docs/css/local.google.fonts.css +295 -0
- package/docs/css/vue.css +1025 -0
- package/docs/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 +0 -0
- package/docs/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 +0 -0
- package/docs/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 +0 -0
- package/docs/gui/2D.md +53 -0
- package/docs/gui/3D.md +46 -0
- package/docs/gui/test1.png +0 -0
- package/docs/gui/test2.png +0 -0
- package/docs/gui/test3.png +0 -0
- package/docs/heatMap/heatMap.md +115 -0
- package/docs/heatMap/test1.png +0 -0
- package/docs/heatMap/test2.png +0 -0
- package/docs/index.html +50 -0
- package/docs/js/docsify@4.min.js +1 -0
- package/docs/models/modelmgr.md +251 -0
- package/docs/project/projectmgr.md +73 -0
- package/docs/project/scenetree.jpg +0 -0
- package/docs/started/environment.md +42 -0
- package/docs/started/quickstart.md +89 -0
- package/mx3d.js +3 -3
- package/mx3d.min.js +1 -1
- package/package.json +1 -1
|
@@ -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
|
+

|
|
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(
|
|
10116
|
-
let pos = _anchor
|
|
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});
|