three-base 2.0.1 → 2.0.3

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