babyeditor-tool 0.0.7 → 0.0.10
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/dist/babyeditor.tool.cjs.js +1 -1
- package/dist/babyeditor.tool.cjs.js.map +1 -1
- package/dist/babyeditor.tool.es.js +937 -14
- package/dist/babyeditor.tool.es.js.map +1 -1
- package/dist/babyeditor.tool.umd.js +1 -1
- package/dist/babyeditor.tool.umd.js.map +1 -1
- package/package.json +5 -5
- package/types/interfaces/MetaData.interface.d.ts +54 -0
- package/types/interfaces/MetaData.interface.d.ts.map +1 -1
- package/types/tool/CustomSystem.d.ts +26 -3
- package/types/tool/CustomSystem.d.ts.map +1 -1
- package/types/tool/CustomSystem.js +105 -6
- package/types/tool/SceneLoader.d.ts +100 -4
- package/types/tool/SceneLoader.d.ts.map +1 -1
- package/types/tool/SceneLoader.js +251 -8
- package/types/tool/map/Layer.d.ts +37 -0
- package/types/tool/map/Layer.d.ts.map +1 -0
- package/types/tool/map/Layer.js +49 -0
- package/types/tool/map/MapViewer.d.ts +68 -0
- package/types/tool/map/MapViewer.d.ts.map +1 -0
- package/types/tool/map/MapViewer.js +105 -0
- package/types/tool/map/Projection.d.ts +40 -0
- package/types/tool/map/Projection.d.ts.map +1 -0
- package/types/tool/map/Projection.js +75 -0
- package/types/tool/map/tile/TileLayer.d.ts +9 -0
- package/types/tool/map/tile/TileLayer.d.ts.map +1 -0
- package/types/tool/map/tile/TileLayer.js +22 -0
- package/types/tool/map/tile/TileLayerRenderer.d.ts +145 -0
- package/types/tool/map/tile/TileLayerRenderer.d.ts.map +1 -0
- package/types/tool/map/tile/TileLayerRenderer.js +329 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetaData.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/MetaData.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"MetaData.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/MetaData.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,31 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MetaData } from "../interfaces/MetaData.interface";
|
|
2
|
+
import { Scene, TransformNode, Camera } from "@babylonjs/core";
|
|
3
|
+
import { IScript } from "./SceneLoader";
|
|
4
|
+
import { MapViewer } from "./map/MapViewer";
|
|
2
5
|
export declare class CustomSystem {
|
|
3
6
|
scene: Scene;
|
|
4
|
-
|
|
5
|
-
|
|
7
|
+
private scriptInstanceList;
|
|
8
|
+
mapViewers: MapViewer[];
|
|
9
|
+
constructor(scene: Scene, scriptInstanceList?: IScript[], environment?: string);
|
|
10
|
+
load(environment?: string): void;
|
|
11
|
+
applyCameraBehavior(camera: Camera): void;
|
|
12
|
+
/**
|
|
13
|
+
* 加载外部资源模型
|
|
14
|
+
* @param parentNode 父对象
|
|
15
|
+
* @param url 模型地址
|
|
16
|
+
* @param scene 场景
|
|
17
|
+
*/
|
|
6
18
|
static LoadAssetModel(parentNode: TransformNode, url: string, scene: Scene): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* 创建地图查看器
|
|
21
|
+
* @param parentNode 父对象
|
|
22
|
+
* @param metaData 元数据
|
|
23
|
+
*/
|
|
24
|
+
createMapViewer(parentNode: TransformNode, metaData: MetaData): MapViewer;
|
|
25
|
+
/**
|
|
26
|
+
* 根据ID获取地图查看器
|
|
27
|
+
* @param id 地图查看器ID
|
|
28
|
+
*/
|
|
29
|
+
getMapViewerById(id: string): MapViewer | undefined;
|
|
7
30
|
}
|
|
8
31
|
//# sourceMappingURL=CustomSystem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomSystem.d.ts","sourceRoot":"","sources":["../../../src/tool/CustomSystem.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CustomSystem.d.ts","sourceRoot":"","sources":["../../../src/tool/CustomSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAmB,KAAK,EAAE,aAAa,EAAuH,MAAM,EAAkB,MAAM,iBAAiB,CAAC;AACrN,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,qBAAa,YAAY;IAEH,KAAK,EAAE,KAAK;IAAE,OAAO,CAAC,kBAAkB;IAD5D,UAAU,EAAE,SAAS,EAAE,CAAK;gBACR,KAAK,EAAE,KAAK,EAAU,kBAAkB,GAAE,OAAO,EAAO,EAAE,WAAW,CAAC,EAAE,MAAM;IAIlG,IAAI,CAAE,WAAW,CAAC,EAAE,MAAM;IA4C1B,mBAAmB,CAAE,MAAM,EAAE,MAAM;IA2CnC;;;;;OAKG;WACU,cAAc,CAAE,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAiBjF;;;;OAIG;IACH,eAAe,CAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ;IAoB9D;;;OAGG;IACH,gBAAgB,CAAE,EAAE,EAAE,MAAM;CAG7B"}
|
|
@@ -1,27 +1,100 @@
|
|
|
1
|
-
import { ImportMeshAsync, Node,
|
|
1
|
+
import { ImportMeshAsync, Node, AbstractMesh, ArcRotateCamera, HDRCubeTexture } from "@babylonjs/core";
|
|
2
|
+
import { MapViewer } from "./map/MapViewer";
|
|
2
3
|
export class CustomSystem {
|
|
3
|
-
constructor(scene) {
|
|
4
|
+
constructor(scene, scriptInstanceList = [], environment) {
|
|
4
5
|
this.scene = scene;
|
|
5
|
-
this.
|
|
6
|
+
this.scriptInstanceList = scriptInstanceList;
|
|
7
|
+
this.mapViewers = [];
|
|
8
|
+
this.load(environment);
|
|
6
9
|
}
|
|
7
|
-
load() {
|
|
10
|
+
load(environment) {
|
|
8
11
|
const transNodes = this.scene.transformNodes;
|
|
9
12
|
for (let i = 0; i < transNodes.length; i++) {
|
|
10
13
|
const transNode = transNodes[i];
|
|
11
14
|
if (transNode.metadata) {
|
|
12
15
|
const metaData = transNode.metadata;
|
|
16
|
+
// 当对象是外部资源模型时
|
|
13
17
|
if (metaData.meshBuilderType === 'assetModel' && metaData.assetModelBuilderOptions?.url) {
|
|
14
|
-
CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene)
|
|
18
|
+
CustomSystem.LoadAssetModel(transNode, metaData.assetModelBuilderOptions.url, this.scene).then(() => {
|
|
19
|
+
const findInstance = this.scriptInstanceList.find(instance => instance.node === transNode);
|
|
20
|
+
if (findInstance && typeof findInstance.ready === 'function') {
|
|
21
|
+
findInstance.ready();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else if (metaData.meshBuilderType === 'mapViewer' && metaData.mapViewerBuilderOptions) {
|
|
26
|
+
this.createMapViewer(transNode, metaData);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const cameras = this.scene.cameras;
|
|
31
|
+
for (let i = 0; i < cameras.length; i++) {
|
|
32
|
+
const camera = cameras[i];
|
|
33
|
+
if (camera.metadata && environment !== 'editor') {
|
|
34
|
+
this.applyCameraBehavior(camera);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (this.scene.environmentTexture) {
|
|
38
|
+
const url = this.scene.environmentTexture.url;
|
|
39
|
+
this.scene.environmentTexture = null;
|
|
40
|
+
setTimeout(() => {
|
|
41
|
+
try {
|
|
42
|
+
this.scene.environmentTexture = new HDRCubeTexture(url, this.scene, 256);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('加载环境纹理时出错', error);
|
|
46
|
+
}
|
|
47
|
+
}, 1000);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
applyCameraBehavior(camera) {
|
|
51
|
+
const metaData = camera.metadata;
|
|
52
|
+
if (camera instanceof ArcRotateCamera && metaData) {
|
|
53
|
+
// 自动旋转行为
|
|
54
|
+
if (metaData.useAutoRotationBehavior && metaData.autoRotationBehavior) {
|
|
55
|
+
camera.useAutoRotationBehavior = true;
|
|
56
|
+
const autoRotationBehavior = camera.autoRotationBehavior;
|
|
57
|
+
if (autoRotationBehavior) {
|
|
58
|
+
autoRotationBehavior.zoomStopsAnimation = metaData.autoRotationBehavior.zoomStopsAnimation;
|
|
59
|
+
autoRotationBehavior.idleRotationSpeed = metaData.autoRotationBehavior.idleRotationSpeed;
|
|
60
|
+
autoRotationBehavior.idleRotationWaitTime = metaData.autoRotationBehavior.idleRotationWaitTime;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// 自动抬回视角行为
|
|
64
|
+
if (metaData.useFramingBehavior && metaData.framingBehavior) {
|
|
65
|
+
camera.useFramingBehavior = true;
|
|
66
|
+
const framingBehavior = camera.framingBehavior;
|
|
67
|
+
if (framingBehavior) {
|
|
68
|
+
framingBehavior.zoomStopsAnimation = metaData.framingBehavior.zoomStopsAnimation;
|
|
69
|
+
framingBehavior.defaultElevation = metaData.framingBehavior.defaultElevation;
|
|
70
|
+
framingBehavior.elevationReturnTime = metaData.framingBehavior.elevationReturnTime;
|
|
71
|
+
framingBehavior.elevationReturnWaitTime = metaData.framingBehavior.elevationReturnWaitTime;
|
|
72
|
+
framingBehavior.framingTime = metaData.framingBehavior.framingTime;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// 视野反弹行为
|
|
76
|
+
if (metaData.useBouncingBehavior && metaData.bouncingBehavior) {
|
|
77
|
+
camera.useBouncingBehavior = true;
|
|
78
|
+
if (camera.bouncingBehavior) {
|
|
79
|
+
camera.bouncingBehavior.autoTransitionRange = metaData.bouncingBehavior.autoTransitionRange || false;
|
|
80
|
+
camera.bouncingBehavior.lowerRadiusTransitionRange = metaData.bouncingBehavior.lowerRadiusTransitionRange || 2;
|
|
81
|
+
camera.bouncingBehavior.upperRadiusTransitionRange = metaData.bouncingBehavior.upperRadiusTransitionRange || -2;
|
|
15
82
|
}
|
|
16
83
|
}
|
|
17
84
|
}
|
|
18
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* 加载外部资源模型
|
|
88
|
+
* @param parentNode 父对象
|
|
89
|
+
* @param url 模型地址
|
|
90
|
+
* @param scene 场景
|
|
91
|
+
*/
|
|
19
92
|
static async LoadAssetModel(parentNode, url, scene) {
|
|
20
93
|
const applyMetaData = (node) => {
|
|
21
94
|
if (node instanceof Node && !node.parent) {
|
|
22
95
|
node.parent = parentNode;
|
|
23
96
|
}
|
|
24
|
-
if (node instanceof
|
|
97
|
+
if (node instanceof AbstractMesh && node.material) {
|
|
25
98
|
node.material.doNotSerialize = true;
|
|
26
99
|
}
|
|
27
100
|
node.doNotSerialize = true;
|
|
@@ -32,4 +105,30 @@ export class CustomSystem {
|
|
|
32
105
|
lights.forEach(node => applyMetaData(node));
|
|
33
106
|
skeletons.forEach(node => applyMetaData(node));
|
|
34
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* 创建地图查看器
|
|
110
|
+
* @param parentNode 父对象
|
|
111
|
+
* @param metaData 元数据
|
|
112
|
+
*/
|
|
113
|
+
createMapViewer(parentNode, metaData) {
|
|
114
|
+
const mapViewer = new MapViewer({
|
|
115
|
+
id: metaData.mapViewerBuilderOptions?.id,
|
|
116
|
+
viewWidth: metaData.mapViewerBuilderOptions?.viewWidth,
|
|
117
|
+
bbox: [metaData.mapViewerBuilderOptions?.minX || -180, metaData.mapViewerBuilderOptions?.minY || -90, metaData.mapViewerBuilderOptions?.maxX || 180, metaData.mapViewerBuilderOptions?.maxY || 90],
|
|
118
|
+
}, this.scene);
|
|
119
|
+
parentNode.onDisposeObservable.addOnce(() => {
|
|
120
|
+
mapViewer.dispose();
|
|
121
|
+
this.mapViewers = this.mapViewers.filter(item => item !== mapViewer);
|
|
122
|
+
});
|
|
123
|
+
mapViewer.rootNode.parent = parentNode;
|
|
124
|
+
this.mapViewers.push(mapViewer);
|
|
125
|
+
return mapViewer;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 根据ID获取地图查看器
|
|
129
|
+
* @param id 地图查看器ID
|
|
130
|
+
*/
|
|
131
|
+
getMapViewerById(id) {
|
|
132
|
+
return this.mapViewers.find(item => item.id === id);
|
|
133
|
+
}
|
|
35
134
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Engine, Scene } from "@babylonjs/core";
|
|
1
|
+
import { Engine, Scene, Nullable, Node, Observable, Camera } from "@babylonjs/core";
|
|
2
2
|
import '@babylonjs/materials';
|
|
3
3
|
import '@babylonjs/loaders';
|
|
4
4
|
import '@babylonjs/post-processes';
|
|
5
5
|
import '@babylonjs/procedural-textures';
|
|
6
|
+
import { CameraAnchor } from "../interfaces/MetaData.interface";
|
|
6
7
|
/**
|
|
7
8
|
* 脚本接口
|
|
8
9
|
*/
|
|
@@ -25,6 +26,11 @@ export interface BehaviorScript {
|
|
|
25
26
|
key: string;
|
|
26
27
|
values: IStringDictionary<any>;
|
|
27
28
|
}
|
|
29
|
+
export interface SceneLoaderOption {
|
|
30
|
+
showLoadingUI?: boolean;
|
|
31
|
+
environment?: string;
|
|
32
|
+
}
|
|
33
|
+
export type EventType = 'click' | 'dblclick' | 'pointerdown' | 'pointerup' | 'pointermove';
|
|
28
34
|
/**
|
|
29
35
|
* 运行场景加载的核心类
|
|
30
36
|
* @description 在这里创建初始化场景所需要的一切的东西
|
|
@@ -53,18 +59,36 @@ export declare class SceneLoader {
|
|
|
53
59
|
/**
|
|
54
60
|
* 脚本代码列表
|
|
55
61
|
*/
|
|
56
|
-
|
|
62
|
+
scriptsMap: ScriptsMap;
|
|
63
|
+
/**
|
|
64
|
+
* 场景加载完成观察者
|
|
65
|
+
*/
|
|
66
|
+
onLoadObservable: Observable<Scene>;
|
|
67
|
+
/**
|
|
68
|
+
* 场景加载选项
|
|
69
|
+
*/
|
|
70
|
+
option: SceneLoaderOption;
|
|
57
71
|
/**
|
|
58
72
|
* 脚本实例列表
|
|
59
73
|
*/
|
|
60
74
|
private scriptInstanceList;
|
|
75
|
+
/**
|
|
76
|
+
* 事件系统
|
|
77
|
+
*/
|
|
78
|
+
private eventsSystem;
|
|
61
79
|
/**
|
|
62
80
|
* 构造函数
|
|
63
81
|
* @param container 容器
|
|
64
82
|
* @param sceneData 场景数据
|
|
65
83
|
* @param scriptsMap 脚本代码列表
|
|
66
84
|
*/
|
|
67
|
-
constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap);
|
|
85
|
+
constructor(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap, option?: SceneLoaderOption);
|
|
86
|
+
/**
|
|
87
|
+
* 初始化事件系统
|
|
88
|
+
*/
|
|
89
|
+
private initEvents;
|
|
90
|
+
on(eventName: EventType, callback: (event: any) => void): void;
|
|
91
|
+
off(eventName: EventType, callback: (event: any) => void): void;
|
|
68
92
|
/**
|
|
69
93
|
* 加载场景
|
|
70
94
|
* @param sceneData 场景数据数据
|
|
@@ -87,6 +111,53 @@ export declare class SceneLoader {
|
|
|
87
111
|
* 开始渲染循环
|
|
88
112
|
*/
|
|
89
113
|
private render;
|
|
114
|
+
/**
|
|
115
|
+
* 根据名称获取节点
|
|
116
|
+
* @param name
|
|
117
|
+
* @returns
|
|
118
|
+
*/
|
|
119
|
+
getNodeByName(name: string): Nullable<Node>;
|
|
120
|
+
getMeshByName(name: string): Nullable<import("@babylonjs/core").AbstractMesh>;
|
|
121
|
+
getLightByName(name: string): Nullable<import("@babylonjs/core").Light>;
|
|
122
|
+
getTransformNodeByName(name: string): Nullable<import("@babylonjs/core").TransformNode>;
|
|
123
|
+
getCameraByName(name: string): Nullable<Camera>;
|
|
124
|
+
/**
|
|
125
|
+
* 摄影机飞行到设置的位置锚点
|
|
126
|
+
* @param anchor 目标节点
|
|
127
|
+
* @param duration 飞行时间毫秒,ms
|
|
128
|
+
*/
|
|
129
|
+
flyTo(anchor: CameraAnchor, duration?: number): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* 摄影机直接定位到设置的位置锚点
|
|
132
|
+
* @param anchor 目标节点
|
|
133
|
+
* @param camera 指定查看摄影机
|
|
134
|
+
*/
|
|
135
|
+
viewTo(anchor: CameraAnchor): void;
|
|
136
|
+
/**
|
|
137
|
+
* 根据名称摄影机飞行到设置的锚点
|
|
138
|
+
* @param name 摄影机锚点名称
|
|
139
|
+
* @param duration 飞行时间毫秒,ms
|
|
140
|
+
*/
|
|
141
|
+
flyToAnchorByName(name: string, duration?: number): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* 根据名称摄影机飞行到设置的锚点
|
|
144
|
+
* @param name 摄影机锚点名称
|
|
145
|
+
* @param duration 飞行时间毫秒,ms
|
|
146
|
+
*/
|
|
147
|
+
flyToAnchorByIndex(index: number, duration?: number): Promise<void>;
|
|
148
|
+
/**
|
|
149
|
+
* 摄影机飞行到
|
|
150
|
+
* @param anchor 目标节点
|
|
151
|
+
* @param duration 飞行时间毫秒,ms
|
|
152
|
+
* @param camera 指定飞行摄影机
|
|
153
|
+
*/
|
|
154
|
+
static FlyTo(camera: Camera, anchor: CameraAnchor, duration?: number): Promise<void>;
|
|
155
|
+
/**
|
|
156
|
+
* 摄影机定位到
|
|
157
|
+
* @param anchor 目标节点
|
|
158
|
+
* @param camera 指定查看摄影机
|
|
159
|
+
*/
|
|
160
|
+
static ViewTo(camera: Camera, anchor: CameraAnchor): void;
|
|
90
161
|
/**
|
|
91
162
|
* 重置canvas变形后的系统尺寸
|
|
92
163
|
*/
|
|
@@ -97,10 +168,35 @@ export declare class SceneLoader {
|
|
|
97
168
|
*/
|
|
98
169
|
static LoadCustomSystem(): void;
|
|
99
170
|
}
|
|
100
|
-
export declare function loadScene(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap): SceneLoader;
|
|
171
|
+
export declare function loadScene(container: HTMLDivElement, sceneData: string, scriptsMap?: ScriptsMap, option?: SceneLoaderOption): SceneLoader;
|
|
172
|
+
/**
|
|
173
|
+
* 脚本代码结构
|
|
174
|
+
*/
|
|
101
175
|
export type IScript = {
|
|
176
|
+
/**
|
|
177
|
+
* 脚执行时注入的场景对象
|
|
178
|
+
*/
|
|
179
|
+
scene: Scene;
|
|
180
|
+
/**
|
|
181
|
+
* 当前实例化脚本绑定的对象
|
|
182
|
+
*/
|
|
183
|
+
node: Node | Scene;
|
|
184
|
+
/**
|
|
185
|
+
* 脚本初始化执行的钩子函数
|
|
186
|
+
*/
|
|
102
187
|
start?: () => void;
|
|
188
|
+
/**
|
|
189
|
+
* 当有异步动作初始化完成时的钩子函数
|
|
190
|
+
*/
|
|
191
|
+
ready?: () => void;
|
|
192
|
+
/**
|
|
193
|
+
* 当没帧渲染是执行函数
|
|
194
|
+
* @param deltaTime 间隔时间
|
|
195
|
+
*/
|
|
103
196
|
update?: (deltaTime: number) => void;
|
|
197
|
+
/**
|
|
198
|
+
* 当对象被销毁时执行的函数
|
|
199
|
+
*/
|
|
104
200
|
dispose?: () => void;
|
|
105
201
|
};
|
|
106
202
|
//# sourceMappingURL=SceneLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneLoader.d.ts","sourceRoot":"","sources":["../../../src/tool/SceneLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"SceneLoader.d.ts","sourceRoot":"","sources":["../../../src/tool/SceneLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Engine, Scene, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync } from "@babylonjs/core";
|
|
1
|
+
import { Engine, Scene, FreeCamera, Vector3, HavokPlugin, AppendSceneAsync, Observable, EasingFunction, QuadraticEase, ArcRotateCamera, TargetCamera, PointerEventTypes } from "@babylonjs/core";
|
|
2
2
|
import '@babylonjs/materials';
|
|
3
3
|
import '@babylonjs/loaders';
|
|
4
4
|
import '@babylonjs/post-processes';
|
|
@@ -16,7 +16,7 @@ export class SceneLoader {
|
|
|
16
16
|
* @param sceneData 场景数据
|
|
17
17
|
* @param scriptsMap 脚本代码列表
|
|
18
18
|
*/
|
|
19
|
-
constructor(container, sceneData, scriptsMap) {
|
|
19
|
+
constructor(container, sceneData, scriptsMap, option = {}) {
|
|
20
20
|
/**
|
|
21
21
|
* 场景数据
|
|
22
22
|
*/
|
|
@@ -24,21 +24,93 @@ export class SceneLoader {
|
|
|
24
24
|
/**
|
|
25
25
|
* 脚本代码列表
|
|
26
26
|
*/
|
|
27
|
-
this.
|
|
27
|
+
this.scriptsMap = {};
|
|
28
|
+
/**
|
|
29
|
+
* 场景加载完成观察者
|
|
30
|
+
*/
|
|
31
|
+
this.onLoadObservable = new Observable();
|
|
32
|
+
/**
|
|
33
|
+
* 场景加载选项
|
|
34
|
+
*/
|
|
35
|
+
this.option = {};
|
|
28
36
|
/**
|
|
29
37
|
* 脚本实例列表
|
|
30
38
|
*/
|
|
31
39
|
this.scriptInstanceList = [];
|
|
40
|
+
/**
|
|
41
|
+
* 事件系统
|
|
42
|
+
*/
|
|
43
|
+
this.eventsSystem = {
|
|
44
|
+
click: [],
|
|
45
|
+
dblclick: [],
|
|
46
|
+
pointerdown: [],
|
|
47
|
+
pointerup: [],
|
|
48
|
+
pointermove: [],
|
|
49
|
+
};
|
|
32
50
|
this.container = container;
|
|
33
51
|
this.canvas = document.createElement('canvas');
|
|
34
52
|
this.canvas.className = 'main-display-canvas';
|
|
35
53
|
this.canvas.width = container.clientWidth;
|
|
36
54
|
this.canvas.height = container.clientHeight;
|
|
37
55
|
this.container.appendChild(this.canvas);
|
|
38
|
-
this.engine = new Engine(this.canvas, true
|
|
56
|
+
this.engine = new Engine(this.canvas, true, {
|
|
57
|
+
adaptToDeviceRatio: true,
|
|
58
|
+
antialias: true,
|
|
59
|
+
stencil: true,
|
|
60
|
+
preserveDrawingBuffer: true,
|
|
61
|
+
alpha: false
|
|
62
|
+
});
|
|
39
63
|
this.scene = new Scene(this.engine);
|
|
64
|
+
this.option = {
|
|
65
|
+
showLoadingUI: true,
|
|
66
|
+
...option
|
|
67
|
+
};
|
|
68
|
+
// 监听容器尺寸变化
|
|
69
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
70
|
+
this.canvas.width = container.clientWidth;
|
|
71
|
+
this.canvas.height = container.clientHeight;
|
|
72
|
+
this.engine.resize();
|
|
73
|
+
});
|
|
74
|
+
resizeObserver.observe(container);
|
|
40
75
|
this.load(sceneData, scriptsMap);
|
|
41
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* 初始化事件系统
|
|
79
|
+
*/
|
|
80
|
+
initEvents() {
|
|
81
|
+
let lastClickTime = 0;
|
|
82
|
+
this.scene.onPointerObservable.add((pointerInfo) => {
|
|
83
|
+
switch (pointerInfo.type) {
|
|
84
|
+
case PointerEventTypes.POINTERDOWN: // POINTERDOWN
|
|
85
|
+
const clickTime = Date.now();
|
|
86
|
+
if (clickTime - lastClickTime < 300) {
|
|
87
|
+
this.eventsSystem.dblclick.forEach(callback => callback(pointerInfo));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
lastClickTime = clickTime;
|
|
91
|
+
this.eventsSystem.click.forEach(callback => callback(pointerInfo));
|
|
92
|
+
}
|
|
93
|
+
this.eventsSystem.pointerdown.forEach(callback => callback(pointerInfo));
|
|
94
|
+
break;
|
|
95
|
+
case PointerEventTypes.POINTERUP: // POINTERUP
|
|
96
|
+
this.eventsSystem.pointerup.forEach(callback => callback(pointerInfo));
|
|
97
|
+
break;
|
|
98
|
+
case PointerEventTypes.POINTERMOVE: // POINTERMOVE
|
|
99
|
+
this.eventsSystem.pointermove.forEach(callback => callback(pointerInfo));
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// 绑定事件
|
|
105
|
+
on(eventName, callback) {
|
|
106
|
+
if (this.eventsSystem[eventName])
|
|
107
|
+
this.eventsSystem[eventName].push(callback);
|
|
108
|
+
}
|
|
109
|
+
// 解绑事件
|
|
110
|
+
off(eventName, callback) {
|
|
111
|
+
if (this.eventsSystem[eventName])
|
|
112
|
+
this.eventsSystem[eventName] = this.eventsSystem[eventName].filter(item => item !== callback);
|
|
113
|
+
}
|
|
42
114
|
/**
|
|
43
115
|
* 加载场景
|
|
44
116
|
* @param sceneData 场景数据数据
|
|
@@ -49,10 +121,11 @@ export class SceneLoader {
|
|
|
49
121
|
this.scene.dispose();
|
|
50
122
|
}
|
|
51
123
|
if (scriptsMap)
|
|
52
|
-
this.
|
|
124
|
+
this.scriptsMap = scriptsMap;
|
|
53
125
|
this.scene = new Scene(this.engine);
|
|
54
126
|
this.sceneData = sceneData;
|
|
55
127
|
this.scriptInstanceList = [];
|
|
128
|
+
this.initEvents();
|
|
56
129
|
// 执行更新代码
|
|
57
130
|
this.scene.onBeforeRenderObservable.add(() => {
|
|
58
131
|
if (this.scriptInstanceList) {
|
|
@@ -68,6 +141,8 @@ export class SceneLoader {
|
|
|
68
141
|
const havokModule = await HavokPhysics();
|
|
69
142
|
this.scene.enablePhysics(new Vector3(0, -9.81, 0), new HavokPlugin(true, havokModule));
|
|
70
143
|
await AppendSceneAsync('data:' + sceneData, this.scene);
|
|
144
|
+
if (!this.option.showLoadingUI)
|
|
145
|
+
this.engine.hideLoadingUI();
|
|
71
146
|
let camera;
|
|
72
147
|
if (this.scene.cameras.length === 0) {
|
|
73
148
|
camera = new FreeCamera('摄影机', new Vector3(50, 50, 50), this.scene, true);
|
|
@@ -78,11 +153,12 @@ export class SceneLoader {
|
|
|
78
153
|
console.log('解析并使用场景摄影机');
|
|
79
154
|
}
|
|
80
155
|
camera.attachControl(this.canvas);
|
|
81
|
-
new CustomSystem(this.scene);
|
|
82
156
|
if (scriptsMap)
|
|
83
157
|
this.initScripts(scriptsMap);
|
|
84
158
|
console.log('完成场景初始化');
|
|
159
|
+
new CustomSystem(this.scene, this.scriptInstanceList, this.option.environment);
|
|
85
160
|
this.render();
|
|
161
|
+
this.onLoadObservable.notifyObservers(this.scene);
|
|
86
162
|
}
|
|
87
163
|
/**
|
|
88
164
|
* 初始化脚本
|
|
@@ -144,6 +220,173 @@ export class SceneLoader {
|
|
|
144
220
|
scene.render();
|
|
145
221
|
});
|
|
146
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* 根据名称获取节点
|
|
225
|
+
* @param name
|
|
226
|
+
* @returns
|
|
227
|
+
*/
|
|
228
|
+
getNodeByName(name) {
|
|
229
|
+
return this.scene.getNodeByName(name);
|
|
230
|
+
}
|
|
231
|
+
getMeshByName(name) {
|
|
232
|
+
return this.scene.getMeshByName(name);
|
|
233
|
+
}
|
|
234
|
+
getLightByName(name) {
|
|
235
|
+
return this.scene.getLightByName(name);
|
|
236
|
+
}
|
|
237
|
+
getTransformNodeByName(name) {
|
|
238
|
+
return this.scene.getTransformNodeByName(name);
|
|
239
|
+
}
|
|
240
|
+
getCameraByName(name) {
|
|
241
|
+
return this.scene.getCameraByName(name);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* 摄影机飞行到设置的位置锚点
|
|
245
|
+
* @param anchor 目标节点
|
|
246
|
+
* @param duration 飞行时间毫秒,ms
|
|
247
|
+
*/
|
|
248
|
+
flyTo(anchor, duration = 2000) {
|
|
249
|
+
if (this.scene.activeCamera) {
|
|
250
|
+
return SceneLoader.FlyTo(this.scene.activeCamera, anchor, duration);
|
|
251
|
+
}
|
|
252
|
+
return Promise.resolve();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 摄影机直接定位到设置的位置锚点
|
|
256
|
+
* @param anchor 目标节点
|
|
257
|
+
* @param camera 指定查看摄影机
|
|
258
|
+
*/
|
|
259
|
+
viewTo(anchor) {
|
|
260
|
+
if (this.scene.activeCamera) {
|
|
261
|
+
SceneLoader.ViewTo(this.scene.activeCamera, anchor);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* 根据名称摄影机飞行到设置的锚点
|
|
266
|
+
* @param name 摄影机锚点名称
|
|
267
|
+
* @param duration 飞行时间毫秒,ms
|
|
268
|
+
*/
|
|
269
|
+
flyToAnchorByName(name, duration = 2000) {
|
|
270
|
+
const camera = this.scene.activeCamera;
|
|
271
|
+
if (camera) {
|
|
272
|
+
const anchorList = camera.metadata?.cameraAnchorList || [];
|
|
273
|
+
const anchor = anchorList.find(item => item.name === name);
|
|
274
|
+
if (anchor) {
|
|
275
|
+
return SceneLoader.FlyTo(camera, anchor, duration);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return Promise.resolve();
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 根据名称摄影机飞行到设置的锚点
|
|
282
|
+
* @param name 摄影机锚点名称
|
|
283
|
+
* @param duration 飞行时间毫秒,ms
|
|
284
|
+
*/
|
|
285
|
+
flyToAnchorByIndex(index, duration = 2000) {
|
|
286
|
+
const camera = this.scene.activeCamera;
|
|
287
|
+
if (camera) {
|
|
288
|
+
const anchorList = camera.metadata?.cameraAnchorList || [];
|
|
289
|
+
const anchor = anchorList[index];
|
|
290
|
+
if (anchor) {
|
|
291
|
+
return SceneLoader.FlyTo(camera, anchor, duration);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return Promise.resolve();
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* 摄影机飞行到
|
|
298
|
+
* @param anchor 目标节点
|
|
299
|
+
* @param duration 飞行时间毫秒,ms
|
|
300
|
+
* @param camera 指定飞行摄影机
|
|
301
|
+
*/
|
|
302
|
+
static FlyTo(camera, anchor, duration = 2000) {
|
|
303
|
+
return new Promise((resolve, reject) => {
|
|
304
|
+
const easeFunction = new QuadraticEase();
|
|
305
|
+
easeFunction.setEasingMode(EasingFunction.EASINGMODE_EASEOUT);
|
|
306
|
+
const startTime = Date.now();
|
|
307
|
+
const currentAnchor = {
|
|
308
|
+
name: '锚点3',
|
|
309
|
+
position: camera.position.asArray(),
|
|
310
|
+
target: [0, 0, 0],
|
|
311
|
+
radius: 0,
|
|
312
|
+
alpha: 0,
|
|
313
|
+
beta: 0
|
|
314
|
+
};
|
|
315
|
+
if (camera instanceof ArcRotateCamera) {
|
|
316
|
+
currentAnchor.radius = camera.radius;
|
|
317
|
+
currentAnchor.alpha = camera.alpha % (2 * Math.PI);
|
|
318
|
+
currentAnchor.beta = camera.beta % (Math.PI);
|
|
319
|
+
currentAnchor.target = camera.target.asArray();
|
|
320
|
+
if (Math.abs(currentAnchor.alpha - anchor.alpha) > Math.PI) {
|
|
321
|
+
if (anchor.alpha > currentAnchor.alpha) {
|
|
322
|
+
anchor.alpha -= 2 * Math.PI;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
anchor.alpha += 2 * Math.PI;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
if (camera instanceof TargetCamera) {
|
|
330
|
+
currentAnchor.target = camera.target.asArray();
|
|
331
|
+
}
|
|
332
|
+
const getLinearValue = (start, end, val) => {
|
|
333
|
+
return start + (end - start) * val;
|
|
334
|
+
};
|
|
335
|
+
const animate = () => {
|
|
336
|
+
const elapsedTime = Date.now() - startTime;
|
|
337
|
+
const val = easeFunction.ease(elapsedTime / duration);
|
|
338
|
+
if (elapsedTime < duration) {
|
|
339
|
+
requestAnimationFrame(animate);
|
|
340
|
+
}
|
|
341
|
+
if (camera instanceof ArcRotateCamera) {
|
|
342
|
+
camera.radius = getLinearValue(currentAnchor.radius, anchor.radius, val);
|
|
343
|
+
camera.alpha = getLinearValue(currentAnchor.alpha, anchor.alpha, val);
|
|
344
|
+
camera.beta = getLinearValue(currentAnchor.beta, anchor.beta, val);
|
|
345
|
+
const x = getLinearValue(currentAnchor.target[0], anchor.target[0], val);
|
|
346
|
+
const y = getLinearValue(currentAnchor.target[1], anchor.target[1], val);
|
|
347
|
+
const z = getLinearValue(currentAnchor.target[2], anchor.target[2], val);
|
|
348
|
+
camera.target.x = x;
|
|
349
|
+
camera.target.y = y;
|
|
350
|
+
camera.target.z = z;
|
|
351
|
+
}
|
|
352
|
+
else if (camera instanceof TargetCamera) {
|
|
353
|
+
const px = getLinearValue(currentAnchor.position[0], anchor.position[0], val);
|
|
354
|
+
const py = getLinearValue(currentAnchor.position[1], anchor.position[1], val);
|
|
355
|
+
const pz = getLinearValue(currentAnchor.position[2], anchor.position[2], val);
|
|
356
|
+
camera.position = new Vector3(px, py, pz);
|
|
357
|
+
const x = getLinearValue(currentAnchor.target[0], anchor.target[0], val);
|
|
358
|
+
const y = getLinearValue(currentAnchor.target[1], anchor.target[1], val);
|
|
359
|
+
const z = getLinearValue(currentAnchor.target[2], anchor.target[2], val);
|
|
360
|
+
camera.target.x = x;
|
|
361
|
+
camera.target.y = y;
|
|
362
|
+
camera.target.z = z;
|
|
363
|
+
}
|
|
364
|
+
if (elapsedTime >= duration) {
|
|
365
|
+
resolve();
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
animate();
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* 摄影机定位到
|
|
373
|
+
* @param anchor 目标节点
|
|
374
|
+
* @param camera 指定查看摄影机
|
|
375
|
+
*/
|
|
376
|
+
static ViewTo(camera, anchor) {
|
|
377
|
+
let activeCamera = camera;
|
|
378
|
+
if (activeCamera) {
|
|
379
|
+
activeCamera.position = new Vector3(anchor.position[0], anchor.position[1], anchor.position[2]);
|
|
380
|
+
if (activeCamera instanceof ArcRotateCamera) {
|
|
381
|
+
activeCamera.radius = anchor.radius;
|
|
382
|
+
activeCamera.alpha = anchor.alpha;
|
|
383
|
+
activeCamera.beta = anchor.beta;
|
|
384
|
+
}
|
|
385
|
+
else if (activeCamera instanceof TargetCamera) {
|
|
386
|
+
activeCamera.setTarget(new Vector3(anchor.target[0], anchor.target[1], anchor.target[2]));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
147
390
|
/**
|
|
148
391
|
* 重置canvas变形后的系统尺寸
|
|
149
392
|
*/
|
|
@@ -159,7 +402,7 @@ export class SceneLoader {
|
|
|
159
402
|
*/
|
|
160
403
|
static LoadCustomSystem() { }
|
|
161
404
|
}
|
|
162
|
-
export function loadScene(container, sceneData, scriptsMap = {}) {
|
|
163
|
-
const sceneLoader = new SceneLoader(container, sceneData, scriptsMap);
|
|
405
|
+
export function loadScene(container, sceneData, scriptsMap = {}, option) {
|
|
406
|
+
const sceneLoader = new SceneLoader(container, sceneData, scriptsMap, option);
|
|
164
407
|
return sceneLoader;
|
|
165
408
|
}
|