three-base 1.129.1 → 1.129.4
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/index.js +34 -0
- package/index.ts +5 -1
- package/lib/ApngTexture.d.ts +13 -0
- package/lib/{ApngTexture.ts → ApngTexture.js} +11 -41
- package/lib/ApngTextureManage.d.ts +18 -0
- package/lib/{ApngTextureManage.ts → ApngTextureManage.js} +13 -56
- package/lib/EventMesh.d.ts +18 -0
- package/lib/EventMesh.js +59 -0
- package/lib/ExtrudeMesh.d.ts +111 -0
- package/lib/{ExtrudeMesh.ts → ExtrudeMesh.js} +77 -284
- package/lib/FPScontrol.d.ts +44 -0
- package/lib/{FPScontrol.ts → FPScontrol.js} +25 -64
- package/lib/InstancedGroupMesh.d.ts +10 -0
- package/lib/InstancedGroupMesh.js +63 -0
- package/lib/KeyFrameAnimation.d.ts +25 -0
- package/lib/{KeyFrameAnimation.ts → KeyFrameAnimation.js} +19 -63
- package/lib/PlaneText.d.ts +37 -0
- package/lib/{PlaneText.ts → PlaneText.js} +5 -34
- package/lib/PointLight.d.ts +13 -0
- package/lib/{PointLight.ts → PointLight.js} +4 -18
- package/lib/Sky/Sky.d.ts +13 -0
- package/lib/Sky/{Sky.ts → Sky.js} +4 -12
- package/lib/Text3D/Text3D.d.ts +20 -0
- package/lib/Text3D/Text3D.js +60 -0
- package/lib/Text3D/fontController.d.ts +59 -0
- package/lib/Text3D/fontController.js +200 -0
- package/lib/Text3D/gentilis.json +811 -0
- package/lib/ThreeBase.d.ts +59 -0
- package/lib/{ThreeBase.ts → ThreeBase.js} +75 -131
- package/lib/ThreeMouse.d.ts +39 -0
- package/lib/{ThreeMouse.ts → ThreeMouse.js} +61 -168
- package/lib/Transition.d.ts +45 -0
- package/lib/{Transition.ts → Transition.js} +30 -101
- package/lib/index.d.ts +22 -0
- package/lib/keyContorls.d.ts +25 -0
- package/lib/{keyContorls.ts → keyContorls.js} +11 -40
- package/lib/planeModal1/PlaneModal1.d.ts +32 -0
- package/lib/planeModal1/{PlaneModal1.ts → PlaneModal1.js} +33 -77
- package/lib/shaders.d.ts +17 -0
- package/lib/{shaders.ts → shaders.js} +19 -38
- package/lib/spriteModal1/SpriteModal1.d.ts +31 -0
- package/lib/spriteModal1/{SpriteModal1.ts → SpriteModal1.js} +33 -80
- package/lib/threeLoader.d.ts +20 -0
- package/lib/{threeLoader.ts → threeLoader.js} +19 -45
- package/lib/threeUtils.d.ts +41 -0
- package/lib/{threeUtils.ts → threeUtils.js} +81 -82
- package/lib/type.d.ts +0 -0
- package/lib/{type.ts → type.js} +1 -4
- package/package.json +7 -6
- package/declare.d.ts +0 -5
- package/lib/EventMesh.ts +0 -79
- package/lib/InstancedGroupMesh.ts +0 -80
- package/lib/text/Text2D.ts +0 -41
- package/lib/text/Text3D.ts +0 -20
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { BufferGeometry, EventDispatcher, Object3D, PerspectiveCamera, Scene, Texture, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
2
|
+
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
3
|
+
import ThreeMouse from "./ThreeMouse";
|
|
4
|
+
import Transition from "./Transition";
|
|
5
|
+
export default class ThreeBase extends EventDispatcher {
|
|
6
|
+
constructor();
|
|
7
|
+
renderTarget: WebGLRenderTarget;
|
|
8
|
+
renderTarget2: WebGLRenderTarget;
|
|
9
|
+
tempVector2: Vector2;
|
|
10
|
+
tempVector3: Vector3;
|
|
11
|
+
size: Vector2;
|
|
12
|
+
renderer: WebGLRenderer;
|
|
13
|
+
camera: PerspectiveCamera;
|
|
14
|
+
scene: Scene;
|
|
15
|
+
threeMouse: ThreeMouse;
|
|
16
|
+
controls: OrbitControls;
|
|
17
|
+
isRendererContextLost: boolean;
|
|
18
|
+
setContainer(div: HTMLDivElement | null): Promise<void>;
|
|
19
|
+
resize(width: number, height: number): void;
|
|
20
|
+
controlsPosition: Transition;
|
|
21
|
+
controlsCenter: Transition;
|
|
22
|
+
init(): void;
|
|
23
|
+
resetLookAt({ position, center, }: {
|
|
24
|
+
position?: Vector3;
|
|
25
|
+
center?: Vector3;
|
|
26
|
+
}): void;
|
|
27
|
+
setLookAt({ position, center, duration }: {
|
|
28
|
+
position?: Vector3;
|
|
29
|
+
center?: Vector3;
|
|
30
|
+
duration?: number;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
getLookAt(): {
|
|
33
|
+
center: Vector3;
|
|
34
|
+
position: Vector3;
|
|
35
|
+
centerPosition: string;
|
|
36
|
+
};
|
|
37
|
+
v3tov2(v3: Vector3): Vector2;
|
|
38
|
+
controlType: "OrbitControls" | "MapControls";
|
|
39
|
+
originScreenSpacePanning: boolean;
|
|
40
|
+
setControlType(controlType: "OrbitControls" | "MapControls"): void;
|
|
41
|
+
autoRender: boolean;
|
|
42
|
+
needRender: boolean;
|
|
43
|
+
stopRender(): void;
|
|
44
|
+
render(): void;
|
|
45
|
+
renderBindThis: any;
|
|
46
|
+
download(fileName?: string): void;
|
|
47
|
+
private _preMesh;
|
|
48
|
+
private _preRT;
|
|
49
|
+
preloadTexture(src: string): Promise<void>;
|
|
50
|
+
preloadGeometry(geometry: BufferGeometry): Promise<void>;
|
|
51
|
+
clearRendererTargte(rendererTarget: WebGLRenderTarget | null): void;
|
|
52
|
+
copyTextureToRenderTarget(texture: Texture, rendererTarget: WebGLRenderTarget | null, alpha?: boolean, opactity?: number): void;
|
|
53
|
+
object3dToRendererTarget(obj: Object3D, rendererTarget: WebGLRenderTarget): void;
|
|
54
|
+
rendererTagetAddStroke(rendererTarget: WebGLRenderTarget, strockWidth: number, color: string, opacity: number): void;
|
|
55
|
+
renderObject3dStroke(obj: Object3D, strockWidth: number, color: string, opacity: number): void;
|
|
56
|
+
renderTargetgaussBlur(rendererTarget: WebGLRenderTarget, radius: number, opacity: number): void;
|
|
57
|
+
renderTargetAddGlow(renderTarget: WebGLRenderTarget, width: number, color: string): void;
|
|
58
|
+
renderRendererTarget(renderTarget: WebGLRenderTarget, alpha?: boolean): void;
|
|
59
|
+
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* @Author: xiaosihan
|
|
3
|
-
* @Date: 2021-12-20 13:38:22
|
|
2
|
+
* @Author: xiaosihan
|
|
3
|
+
* @Date: 2021-12-20 13:38:22
|
|
4
4
|
* @Last Modified by: xiaosihan
|
|
5
5
|
* @Last Modified time: 2023-03-30 11:00:20
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import elementResizeEvent from "element-resize-event";
|
|
9
8
|
import { round } from "lodash";
|
|
10
|
-
import { AxesHelper, EventDispatcher, GridHelper, LinearFilter, MOUSE, NoBlending, NormalBlending,
|
|
9
|
+
import { AxesHelper, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, TOUCH, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
11
10
|
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
12
11
|
import { generateUUID } from "three/src/math/MathUtils";
|
|
13
12
|
import { clearShader, coptyShader, fullScreenMesh, gaussBlurShader, strokeShader } from "./shaders";
|
|
@@ -15,41 +14,32 @@ import threeLoader from "./threeLoader";
|
|
|
15
14
|
import ThreeMouse from "./ThreeMouse";
|
|
16
15
|
import threeUtils from "./threeUtils";
|
|
17
16
|
import Transition from "./Transition";
|
|
18
|
-
|
|
19
17
|
// three.js 的基础对象
|
|
20
18
|
export default class ThreeBase extends EventDispatcher {
|
|
21
|
-
|
|
22
19
|
constructor() {
|
|
23
20
|
super();
|
|
24
21
|
this.init();
|
|
25
22
|
}
|
|
26
|
-
|
|
27
23
|
// 公用渲染目标1
|
|
28
24
|
renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
29
|
-
|
|
30
25
|
// 渲染目标2
|
|
31
26
|
renderTarget2 = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
32
|
-
|
|
33
27
|
// 公用二维向量
|
|
34
28
|
tempVector2 = new Vector2();
|
|
35
|
-
|
|
36
29
|
// 公用的三维向量
|
|
37
30
|
tempVector3 = new Vector3();
|
|
38
|
-
|
|
39
31
|
//渲染器的尺寸
|
|
40
32
|
size = new Vector2(0, 0);
|
|
41
|
-
|
|
42
33
|
// 渲染器对象
|
|
43
34
|
renderer = (() => {
|
|
44
35
|
const renderer = new WebGLRenderer({
|
|
45
|
-
alpha: true
|
|
46
|
-
antialias: true,
|
|
47
|
-
precision: "highp",
|
|
48
|
-
logarithmicDepthBuffer: true,
|
|
49
|
-
preserveDrawingBuffer: false,
|
|
36
|
+
alpha: true,
|
|
37
|
+
antialias: true,
|
|
38
|
+
precision: "highp",
|
|
39
|
+
logarithmicDepthBuffer: true,
|
|
40
|
+
preserveDrawingBuffer: false,
|
|
50
41
|
stencil: false, // 模版
|
|
51
42
|
});
|
|
52
|
-
|
|
53
43
|
renderer.domElement.id = generateUUID();
|
|
54
44
|
renderer.localClippingEnabled = true;
|
|
55
45
|
renderer.setPixelRatio(window.devicePixelRatio);
|
|
@@ -57,16 +47,12 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
57
47
|
threeLoader.setAnisotropy(renderer.capabilities.getMaxAnisotropy());
|
|
58
48
|
return renderer;
|
|
59
49
|
})();
|
|
60
|
-
|
|
61
50
|
//透视相机
|
|
62
51
|
camera = new PerspectiveCamera(45, 1, 0.0001, 10000);
|
|
63
|
-
|
|
64
52
|
// 场景对象
|
|
65
53
|
scene = new Scene();
|
|
66
|
-
|
|
67
54
|
///鼠标事件对象
|
|
68
55
|
threeMouse = new ThreeMouse(this.renderer, this.camera, this.scene);
|
|
69
|
-
|
|
70
56
|
// 轨道控制器
|
|
71
57
|
controls = (() => {
|
|
72
58
|
const controls = new OrbitControls(this.camera, this.renderer.domElement);
|
|
@@ -80,18 +66,16 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
80
66
|
controls.screenSpacePanning = true;
|
|
81
67
|
return controls;
|
|
82
68
|
})();
|
|
83
|
-
|
|
84
69
|
// 上下文是否被销毁了
|
|
85
70
|
isRendererContextLost = false;
|
|
86
|
-
|
|
87
71
|
// 设置 dom 容器
|
|
88
|
-
async setContainer(div
|
|
72
|
+
async setContainer(div) {
|
|
89
73
|
if (div) {
|
|
90
74
|
//删除这个容器里面的所有canvas
|
|
91
75
|
const canvas = div.getElementsByTagName("canvas");
|
|
92
|
-
for (let c of canvas)
|
|
76
|
+
for (let c of canvas)
|
|
77
|
+
c.remove();
|
|
93
78
|
div.append(this.renderer.domElement);
|
|
94
|
-
|
|
95
79
|
// 监听容器的尺寸的改变
|
|
96
80
|
elementResizeEvent(div, () => {
|
|
97
81
|
let rect = window.getComputedStyle(div);
|
|
@@ -99,7 +83,6 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
99
83
|
let height = parseInt(rect.height);
|
|
100
84
|
this.resize(width, height);
|
|
101
85
|
});
|
|
102
|
-
|
|
103
86
|
// 如果上下文被销毁了, 就恢复上下文
|
|
104
87
|
if (this.isRendererContextLost) {
|
|
105
88
|
//@ts-ignore
|
|
@@ -108,20 +91,17 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
108
91
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
109
92
|
this.renderer.domElement.style.opacity = "1";
|
|
110
93
|
}
|
|
111
|
-
|
|
112
94
|
let rect = window.getComputedStyle(div);
|
|
113
95
|
let width = parseInt(rect.width);
|
|
114
96
|
let height = parseInt(rect.height);
|
|
115
97
|
this.resize(width, height);
|
|
116
|
-
|
|
117
98
|
// 开启时时渲染
|
|
118
99
|
threeUtils.removeEventListener("requestAnimationFrame", this.renderBindThis);
|
|
119
100
|
threeUtils.addEventListener("requestAnimationFrame", this.renderBindThis);
|
|
120
101
|
}
|
|
121
102
|
}
|
|
122
|
-
|
|
123
103
|
// 修改尺寸
|
|
124
|
-
resize(width
|
|
104
|
+
resize(width, height) {
|
|
125
105
|
this.camera.aspect = width / height;
|
|
126
106
|
this.camera.updateProjectionMatrix();
|
|
127
107
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
@@ -131,7 +111,6 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
131
111
|
this.renderer.clear();
|
|
132
112
|
this.renderer.render(this.scene, this.camera);
|
|
133
113
|
}
|
|
134
|
-
|
|
135
114
|
// 控制器的位置缓动的计算的顶点对象
|
|
136
115
|
controlsPosition = (() => {
|
|
137
116
|
const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
|
|
@@ -143,7 +122,6 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
143
122
|
});
|
|
144
123
|
return controlsPosition;
|
|
145
124
|
})();
|
|
146
|
-
|
|
147
125
|
// 控制器的 朝向带缓动的计算的顶点对象
|
|
148
126
|
controlsCenter = (() => {
|
|
149
127
|
const controlsCenter = new Transition({ x: 0, y: 0, z: 0 });
|
|
@@ -155,7 +133,6 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
155
133
|
});
|
|
156
134
|
return controlsCenter;
|
|
157
135
|
})();
|
|
158
|
-
|
|
159
136
|
init() {
|
|
160
137
|
// 非开发模式添加网格辅助线
|
|
161
138
|
if (threeUtils.isDev) {
|
|
@@ -165,75 +142,51 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
165
142
|
const axesHelper = new AxesHelper(10000);
|
|
166
143
|
this.scene.add(axesHelper);
|
|
167
144
|
}
|
|
168
|
-
|
|
169
145
|
// 资源加载进度有更新时, 需要渲染
|
|
170
146
|
threeLoader.addEventListener("progress", () => {
|
|
171
147
|
this.needRender = true;
|
|
172
148
|
});
|
|
173
|
-
|
|
174
149
|
}
|
|
175
|
-
|
|
176
150
|
// 重置控制器的位置
|
|
177
|
-
resetLookAt({ position, center, }
|
|
178
|
-
|
|
151
|
+
resetLookAt({ position, center, }) {
|
|
179
152
|
// 停止控制器的惯性
|
|
180
153
|
this.controls.enableDamping = false;
|
|
181
154
|
this.controls.saveState();
|
|
182
155
|
this.controls.update();
|
|
183
156
|
this.controls.reset();
|
|
184
157
|
this.controls.enableDamping = true;
|
|
185
|
-
|
|
186
158
|
position && this.controlsPosition.reset({ x: position.x, y: position.y, z: position.z });
|
|
187
159
|
center && this.controlsCenter.reset({ x: center.x, y: center.y, z: center.z });
|
|
188
160
|
this.needRender = true;
|
|
189
161
|
}
|
|
190
|
-
|
|
191
162
|
// 设置控制器的位置 以动画的方式移动控制器
|
|
192
|
-
async setLookAt({ position, center, duration = 1000 }
|
|
193
|
-
|
|
163
|
+
async setLookAt({ position, center, duration = 1000 }) {
|
|
194
164
|
// 停止控制器的惯性
|
|
195
165
|
this.controls.enableDamping = false;
|
|
196
166
|
this.controls.saveState();
|
|
197
167
|
this.controls.update();
|
|
198
168
|
this.controls.reset();
|
|
199
169
|
this.controls.enableDamping = true;
|
|
200
|
-
|
|
201
170
|
let currentPosition = this.camera.position.clone();
|
|
202
171
|
let currentCenter = this.controls.target.clone();
|
|
203
|
-
|
|
204
|
-
if (position) {
|
|
205
|
-
this.controlsPosition
|
|
206
|
-
.setDuration(duration)
|
|
207
|
-
.reset({
|
|
208
|
-
x: currentPosition.x,
|
|
209
|
-
y: currentPosition.y,
|
|
210
|
-
z: currentPosition.z
|
|
211
|
-
})
|
|
212
|
-
.set({
|
|
213
|
-
x: position.x,
|
|
214
|
-
y: position.y,
|
|
215
|
-
z: position.z
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (center) {
|
|
220
|
-
this.controlsCenter
|
|
221
|
-
.setDuration(duration)
|
|
222
|
-
.reset({
|
|
223
|
-
x: currentCenter.x,
|
|
224
|
-
y: currentCenter.y,
|
|
225
|
-
z: currentCenter.z
|
|
226
|
-
}).set({
|
|
227
|
-
x: center.x,
|
|
228
|
-
y: center.y,
|
|
229
|
-
z: center.z
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
|
|
233
172
|
// 等待动画执行完成
|
|
234
|
-
await
|
|
173
|
+
await Promise.all([
|
|
174
|
+
new Promise(async (resolve, reject) => {
|
|
175
|
+
if (position) {
|
|
176
|
+
this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
|
|
177
|
+
await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
|
|
178
|
+
}
|
|
179
|
+
resolve();
|
|
180
|
+
}),
|
|
181
|
+
new Promise(async (resolve, reject) => {
|
|
182
|
+
if (center) {
|
|
183
|
+
this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
|
|
184
|
+
await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
|
|
185
|
+
}
|
|
186
|
+
resolve();
|
|
187
|
+
}),
|
|
188
|
+
]);
|
|
235
189
|
}
|
|
236
|
-
|
|
237
190
|
// 获取控制的位置和朝向 保留3位小数
|
|
238
191
|
getLookAt() {
|
|
239
192
|
const position = this.camera.position.toArray().map(v => round(v, 3));
|
|
@@ -242,30 +195,26 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
242
195
|
center: new Vector3(...center),
|
|
243
196
|
position: new Vector3(...position),
|
|
244
197
|
centerPosition: `center: new Vector3(${center.join(",")}),position: new Vector3(${position.join(",")})`
|
|
245
|
-
}
|
|
198
|
+
};
|
|
246
199
|
}
|
|
247
|
-
|
|
248
200
|
// 三维向量转化成屏幕上的2维向量
|
|
249
|
-
v3tov2(v3
|
|
201
|
+
v3tov2(v3) {
|
|
250
202
|
v3.project(this.camera);
|
|
251
203
|
const v2 = new Vector2((v3.x + 1) * this.size.x * 0.5, (-v3.y + 1) * this.size.y * 0.5);
|
|
252
204
|
return v2;
|
|
253
205
|
}
|
|
254
|
-
|
|
255
206
|
// 控制器类型
|
|
256
|
-
controlType
|
|
257
|
-
|
|
258
|
-
// 记录一下空间平移方式
|
|
207
|
+
controlType = "OrbitControls";
|
|
208
|
+
// 记录一下空间平移方式 在切换控制器的时候保留一下平移方式
|
|
259
209
|
originScreenSpacePanning = false;
|
|
260
|
-
|
|
261
210
|
//改变控制器的类型
|
|
262
|
-
setControlType(controlType
|
|
263
|
-
|
|
211
|
+
setControlType(controlType) {
|
|
264
212
|
if (controlType === "OrbitControls") {
|
|
265
213
|
this.controls.screenSpacePanning = this.originScreenSpacePanning;
|
|
266
214
|
this.controls.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };
|
|
267
215
|
this.controls.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };
|
|
268
|
-
}
|
|
216
|
+
}
|
|
217
|
+
else if (controlType === "MapControls") {
|
|
269
218
|
this.originScreenSpacePanning = this.controls.screenSpacePanning;
|
|
270
219
|
// pan orthogonal to world-space direction camera.up
|
|
271
220
|
this.controls.screenSpacePanning = false;
|
|
@@ -274,16 +223,11 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
274
223
|
this.controls.touches.ONE = TOUCH.PAN;
|
|
275
224
|
this.controls.touches.TWO = TOUCH.DOLLY_ROTATE;
|
|
276
225
|
}
|
|
277
|
-
|
|
278
226
|
}
|
|
279
|
-
|
|
280
227
|
// 是否自动渲染
|
|
281
228
|
autoRender = true;
|
|
282
|
-
|
|
283
229
|
//是否需要渲染, 当autoRender=false的时候就需要 手动触发渲染
|
|
284
230
|
needRender = false;
|
|
285
|
-
|
|
286
|
-
|
|
287
231
|
// 停止渲染
|
|
288
232
|
stopRender() {
|
|
289
233
|
threeUtils.removeEventListener("requestAnimationFrame", this.renderBindThis);
|
|
@@ -293,44 +237,34 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
293
237
|
this.resize(100, 100);
|
|
294
238
|
this.renderer.domElement.style.opacity = "0";
|
|
295
239
|
}
|
|
296
|
-
|
|
297
240
|
// 渲染场景
|
|
298
241
|
render() {
|
|
299
|
-
|
|
300
242
|
// 控制器在移动时鼠标不能操作
|
|
301
243
|
this.controls.enabled = (this.controlsPosition.isDone() || this.controlsCenter.isDone());
|
|
302
|
-
|
|
303
244
|
// canvas 没有在页面上面的话 就跳过渲染
|
|
304
245
|
if (!threeUtils.inDocument(this.renderer.domElement)) {
|
|
305
246
|
this.stopRender();
|
|
306
247
|
return;
|
|
307
248
|
}
|
|
308
|
-
|
|
309
249
|
// 分发鼠标事件
|
|
310
250
|
this.threeMouse.dispatchEvent();
|
|
311
|
-
|
|
312
251
|
// 在不自动渲染时, needRender=false 就跳过渲染
|
|
313
252
|
if (!this.autoRender && !this.needRender) {
|
|
314
253
|
return;
|
|
315
254
|
}
|
|
316
255
|
this.needRender = false;
|
|
317
|
-
|
|
318
256
|
if (this.controls.enabled) {
|
|
319
257
|
this.controls.update();
|
|
320
258
|
}
|
|
321
|
-
|
|
322
259
|
this.renderer.clear();
|
|
323
|
-
|
|
324
260
|
// 渲染场景
|
|
325
261
|
this.dispatchEvent({ type: "beforeRender" });
|
|
326
262
|
this.renderer.render(this.scene, this.camera);
|
|
327
263
|
this.dispatchEvent({ type: "afterRender" });
|
|
328
264
|
}
|
|
329
|
-
|
|
330
265
|
renderBindThis = this.render.bind(this);
|
|
331
|
-
|
|
332
266
|
// 下载渲染图
|
|
333
|
-
download(fileName
|
|
267
|
+
download(fileName = "download") {
|
|
334
268
|
this.render();
|
|
335
269
|
const base64 = this.renderer.domElement.toDataURL('image/png');
|
|
336
270
|
let saveLink = document.createElement("a");
|
|
@@ -339,9 +273,36 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
339
273
|
document.body.append(saveLink);
|
|
340
274
|
saveLink.click();
|
|
341
275
|
}
|
|
342
|
-
|
|
276
|
+
_preMesh = new Mesh();
|
|
277
|
+
_preRT = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
278
|
+
//预加载纹理图片
|
|
279
|
+
async preloadTexture(src) {
|
|
280
|
+
const texture = threeLoader.getTexture(src);
|
|
281
|
+
while (texture && !texture.image || !texture.image.complete) {
|
|
282
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
283
|
+
}
|
|
284
|
+
// 添加到计划任务中去
|
|
285
|
+
threeUtils.addWork(() => {
|
|
286
|
+
const originRenderTarget = this.renderer.getRenderTarget();
|
|
287
|
+
this.renderer.setRenderTarget(this._preRT);
|
|
288
|
+
this._preMesh.material.map = texture;
|
|
289
|
+
this.renderer.render(this._preMesh, this.camera);
|
|
290
|
+
this.renderer.setRenderTarget(originRenderTarget);
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
//预加载网格
|
|
294
|
+
async preloadGeometry(geometry) {
|
|
295
|
+
// 添加到计划任务中去
|
|
296
|
+
threeUtils.addWork(() => {
|
|
297
|
+
const originRenderTarget = this.renderer.getRenderTarget();
|
|
298
|
+
this.renderer.setRenderTarget(this._preRT);
|
|
299
|
+
this._preMesh.geometry = geometry;
|
|
300
|
+
this.renderer.render(this._preMesh, this.camera);
|
|
301
|
+
this.renderer.setRenderTarget(originRenderTarget);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
343
304
|
// 清理渲染目标
|
|
344
|
-
clearRendererTargte(rendererTarget
|
|
305
|
+
clearRendererTargte(rendererTarget) {
|
|
345
306
|
const originTarget = this.renderer.getRenderTarget();
|
|
346
307
|
this.renderer.setRenderTarget(rendererTarget);
|
|
347
308
|
fullScreenMesh.material = clearShader;
|
|
@@ -349,9 +310,8 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
349
310
|
this.renderer.clearDepth();
|
|
350
311
|
this.renderer.setRenderTarget(originTarget);
|
|
351
312
|
}
|
|
352
|
-
|
|
353
313
|
// 拷贝纹理到渲染目标
|
|
354
|
-
copyTextureToRenderTarget(texture
|
|
314
|
+
copyTextureToRenderTarget(texture, rendererTarget, alpha = false, opactity = 1) {
|
|
355
315
|
const originTarget = this.renderer.getRenderTarget();
|
|
356
316
|
if (rendererTarget) {
|
|
357
317
|
this.renderer.getSize(this.tempVector2);
|
|
@@ -365,9 +325,8 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
365
325
|
fullScreenMesh.render(this.renderer);
|
|
366
326
|
this.renderer.setRenderTarget(originTarget);
|
|
367
327
|
}
|
|
368
|
-
|
|
369
328
|
// 把对象绘制到渲染目标中
|
|
370
|
-
object3dToRendererTarget(obj
|
|
329
|
+
object3dToRendererTarget(obj, rendererTarget) {
|
|
371
330
|
this.clearRendererTargte(rendererTarget);
|
|
372
331
|
const originTarget = this.renderer.getRenderTarget();
|
|
373
332
|
this.renderer.setRenderTarget(rendererTarget);
|
|
@@ -376,15 +335,13 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
376
335
|
this.renderer.render(obj, this.camera);
|
|
377
336
|
this.renderer.setRenderTarget(originTarget);
|
|
378
337
|
}
|
|
379
|
-
|
|
380
338
|
// 给渲染目标的内容加描边
|
|
381
|
-
rendererTagetAddStroke(rendererTarget
|
|
339
|
+
rendererTagetAddStroke(rendererTarget, strockWidth, color, opacity) {
|
|
382
340
|
const originTarget = this.renderer.getRenderTarget();
|
|
383
341
|
this.clearRendererTargte(this.renderTarget2);
|
|
384
342
|
this.renderer.setRenderTarget(this.renderTarget2);
|
|
385
343
|
this.renderer.getSize(this.tempVector2);
|
|
386
344
|
this.renderTarget2.setSize(this.tempVector2.x, this.tempVector2.y);
|
|
387
|
-
|
|
388
345
|
fullScreenMesh.material = strokeShader;
|
|
389
346
|
strokeShader.uniforms.map.value = rendererTarget.texture;
|
|
390
347
|
strokeShader.uniforms.resolution.value.set(this.tempVector2.x, this.tempVector2.y);
|
|
@@ -392,59 +349,46 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
392
349
|
strokeShader.uniforms.strokeColor.value.set(color);
|
|
393
350
|
strokeShader.uniforms.opacity.value = opacity;
|
|
394
351
|
fullScreenMesh.render(this.renderer);
|
|
395
|
-
|
|
396
352
|
this.copyTextureToRenderTarget(this.renderTarget2.texture, rendererTarget, true);
|
|
397
|
-
|
|
398
353
|
this.renderer.setRenderTarget(originTarget);
|
|
399
354
|
}
|
|
400
|
-
|
|
401
355
|
// 渲染对象的描边
|
|
402
|
-
renderObject3dStroke(obj
|
|
356
|
+
renderObject3dStroke(obj, strockWidth, color, opacity) {
|
|
403
357
|
this.object3dToRendererTarget(obj, this.renderTarget);
|
|
404
358
|
this.rendererTagetAddStroke(this.renderTarget, strockWidth, color, opacity);
|
|
405
359
|
this.copyTextureToRenderTarget(this.renderTarget.texture, null);
|
|
406
360
|
}
|
|
407
|
-
|
|
408
361
|
//给渲染目标加上高斯模糊计算
|
|
409
|
-
renderTargetgaussBlur(rendererTarget
|
|
362
|
+
renderTargetgaussBlur(rendererTarget, radius, opacity) {
|
|
410
363
|
const originTarget = this.renderer.getRenderTarget();
|
|
411
|
-
|
|
412
364
|
this.clearRendererTargte(this.renderTarget2);
|
|
413
365
|
this.renderer.setRenderTarget(this.renderTarget2);
|
|
414
366
|
this.renderer.getSize(this.tempVector2);
|
|
415
367
|
this.renderTarget2.setSize(this.tempVector2.x, this.tempVector2.y);
|
|
416
|
-
|
|
417
368
|
fullScreenMesh.material = gaussBlurShader;
|
|
418
369
|
gaussBlurShader.uniforms.map.value = rendererTarget.texture;
|
|
419
370
|
gaussBlurShader.uniforms.radius.value = radius;
|
|
420
371
|
gaussBlurShader.uniforms.opacity.value = opacity;
|
|
421
372
|
gaussBlurShader.uniforms.resolution.value.set(this.tempVector2.x, this.tempVector2.y);
|
|
422
373
|
fullScreenMesh.render(this.renderer);
|
|
423
|
-
|
|
424
374
|
this.copyTextureToRenderTarget(this.renderTarget2.texture, rendererTarget, true);
|
|
425
|
-
|
|
426
375
|
this.renderer.setRenderTarget(originTarget);
|
|
427
376
|
}
|
|
428
|
-
|
|
429
377
|
// 渲染目标上的纹理添加辉光效果
|
|
430
|
-
renderTargetAddGlow(renderTarget
|
|
431
|
-
|
|
378
|
+
renderTargetAddGlow(renderTarget, width, color) {
|
|
432
379
|
this.rendererTagetAddStroke(renderTarget, 1 * width, color, 0.3);
|
|
433
380
|
this.rendererTagetAddStroke(renderTarget, 2 * width, color, 0.2);
|
|
434
381
|
this.rendererTagetAddStroke(renderTarget, 3 * width, color, 0.05);
|
|
435
|
-
|
|
436
382
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
437
383
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
438
384
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
439
385
|
}
|
|
440
|
-
|
|
441
386
|
// 渲染 渲染目标
|
|
442
|
-
renderRendererTarget(renderTarget
|
|
387
|
+
renderRendererTarget(renderTarget, alpha = false) {
|
|
443
388
|
coptyShader.uniforms.map.value = renderTarget.texture;
|
|
444
389
|
coptyShader.uniforms.opacity.value = 1.0;
|
|
445
390
|
fullScreenMesh.material = coptyShader;
|
|
446
391
|
coptyShader.blending = alpha ? NoBlending : NormalBlending;
|
|
447
392
|
fullScreenMesh.render(this.renderer);
|
|
448
393
|
}
|
|
449
|
-
|
|
450
|
-
}
|
|
394
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
import { Object3D, Scene } from "three";
|
|
3
|
+
import type { Intersection } from "three";
|
|
4
|
+
export interface ThreeMouseEvent extends Intersection {
|
|
5
|
+
renderer: THREE.Renderer;
|
|
6
|
+
camera: THREE.Camera;
|
|
7
|
+
type: string;
|
|
8
|
+
offsetX: number;
|
|
9
|
+
offsetY: number;
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* harp.gl 专用的鼠标拾取模型对象
|
|
15
|
+
*/
|
|
16
|
+
export default class ThreeMouse {
|
|
17
|
+
constructor(renderer: THREE.WebGLRenderer, camera: THREE.Camera, scene: THREE.Scene);
|
|
18
|
+
_renderer: THREE.WebGLRenderer;
|
|
19
|
+
_camera: THREE.Camera;
|
|
20
|
+
_scene: Scene;
|
|
21
|
+
_mosePosition: THREE.Vector2;
|
|
22
|
+
_mouseDownPosition: THREE.Vector2;
|
|
23
|
+
_mesh_on?: Object3D;
|
|
24
|
+
_mesh_Down?: Object3D;
|
|
25
|
+
_raycaster: THREE.Raycaster;
|
|
26
|
+
_frame: number;
|
|
27
|
+
_mouseInRenderer: boolean;
|
|
28
|
+
_mousemoveEvent?: MouseEvent;
|
|
29
|
+
_object3ds: Object3D[];
|
|
30
|
+
_click_num: number;
|
|
31
|
+
_getSelected(object3ds: Object3D[]): Intersection | undefined;
|
|
32
|
+
hasEvent(object?: Object3D, types?: Array<"leftclick" | "rightclick" | "click" | "dbclick" | "mouseenter" | "mouseleave" | "mousemove" | "mousedown" | "mouseup">): boolean;
|
|
33
|
+
hasCursor(object?: Object3D): boolean;
|
|
34
|
+
dispatchEvent(): void;
|
|
35
|
+
_mouseleave: (e: MouseEvent) => void;
|
|
36
|
+
_mousemove: (e: MouseEvent) => void;
|
|
37
|
+
_mousedown: (e: MouseEvent) => void;
|
|
38
|
+
_mouseup: import("lodash").DebouncedFunc<(e: PointerEvent) => Promise<void>>;
|
|
39
|
+
}
|