gl-draw 0.17.0-beta.4 → 0.17.0-beta.41

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 (50) hide show
  1. package/dist/cartographicToCartesian.js +1 -0
  2. package/dist/cartographicToCartesian.module.js +49 -0
  3. package/dist/constants.d.ts +0 -1
  4. package/dist/core/BaseObject/PointerEvent.d.ts +1 -0
  5. package/dist/core/BaseObject/index.d.ts +16 -4
  6. package/dist/core/CSSRenderer/CollisionManager.d.ts +98 -0
  7. package/dist/core/CSSRenderer/index.d.ts +18 -6
  8. package/dist/core/Composer.d.ts +5 -5
  9. package/dist/core/Helper.d.ts +4 -4
  10. package/dist/core/Lead/Pick.d.ts +35 -3
  11. package/dist/core/Lead/index.d.ts +5 -6
  12. package/dist/core/Pages/Pages.d.ts +1 -0
  13. package/dist/core/Pencil.d.ts +19 -5
  14. package/dist/core/pass/OutputPass.d.ts +1 -2
  15. package/dist/index.js +2 -2
  16. package/dist/index.module.js +708 -442
  17. package/dist/index.module2.js +1183 -0
  18. package/dist/index2.js +140 -0
  19. package/dist/objects/conicPolygon/geometry/index.d.ts +1 -2
  20. package/dist/objects/ellipsoid/createGeometry.d.ts +30 -0
  21. package/dist/objects/ellipsoid/index.d.ts +38 -0
  22. package/dist/objects/extrudePolygon/createGeometry.d.ts +2 -1
  23. package/dist/objects/group/index.d.ts +1 -0
  24. package/dist/objects/index.d.ts +1 -0
  25. package/dist/objects/index.js +1 -1
  26. package/dist/objects/index.module.js +691 -688
  27. package/dist/objects/node/index.d.ts +6 -2
  28. package/dist/objects/pie/index.d.ts +2 -1
  29. package/dist/plugins/Worker/getAttributes/conicLine.d.ts +1 -1
  30. package/dist/plugins/Worker/getAttributes/conicPolygon.d.ts +2 -3
  31. package/dist/plugins/Worker/getAttributes/extrudePolygon.d.ts +1 -1
  32. package/dist/plugins/Worker/getAttributes/getCoordinatesArr.d.ts +5 -1
  33. package/dist/plugins/Worker/getAttributes/line.d.ts +1 -1
  34. package/dist/plugins/Worker/getAttributes/line2.d.ts +1 -1
  35. package/dist/plugins/Worker/getAttributes/splitPolygonsByLongitudeDifference.d.ts +5 -2
  36. package/dist/plugins/Worker/index.d.ts +2 -3
  37. package/dist/plugins/index.js +1 -1
  38. package/dist/plugins/index.module.js +77 -70
  39. package/dist/utils/Sprite2Points.d.ts +1 -1
  40. package/dist/utils/cartographicToCartesian.d.ts +30 -0
  41. package/dist/utils/index.d.ts +1 -1
  42. package/dist/utils/index.js +1 -1
  43. package/dist/utils/index.module.js +15 -13
  44. package/dist/utils/proposedRaycast.d.ts +1 -0
  45. package/package.json +1 -1
  46. package/dist/WebGPULineSegments2.js +0 -140
  47. package/dist/WebGPULineSegments2.module.js +0 -1031
  48. package/dist/polar2Cartesian.js +0 -1
  49. package/dist/polar2Cartesian.module.js +0 -18
  50. package/dist/utils/polar2Cartesian.d.ts +0 -1
@@ -0,0 +1 @@
1
+ "use strict";var U=Math.pow;const o=require("three"),R=t=>t instanceof o.Vector3?t:new o.Vector3(...t),w=t=>t instanceof o.Vector2?t:new o.Vector2(...t),e={a:6378137,b:6356752314245179e-9,f:1/298.257223563};function x(t,p,u=0,n=1/e.a,h=!1){const s=o.MathUtils.degToRad(t),r=o.MathUtils.degToRad(p),c=Math.cos(r),i=Math.sin(r),d=Math.cos(s),T=Math.sin(s);let q,M,l;if(h){const a=(e.a+u)*n;q=a*c*T,M=a*i,l=a*c*d}else{const g=e.a,a=e.b,V=g*g,S=a*a,b=(V-S)/V,f=g/Math.sqrt(1-b*i*i);q=(f+u)*c*T*n,M=(f*(1-b)+u)*i*n,l=(f+u)*c*d*n}return new o.Vector3(q,M,l)}function y(t,p=1/e.a,u=!1){const n=t.x/p,h=t.y/p,s=t.z/p;if(u){const f=Math.sqrt(n*n+h*h+s*s),L=Math.atan2(n,s),C=Math.asin(h/f),D=f-e.a;return{longitude:o.MathUtils.radToDeg(L),latitude:o.MathUtils.radToDeg(C),height:D}}const r=e.a,c=e.b,i=r*r,d=c*c,T=(i-d)/i,q=(i-d)/d,M=Math.sqrt(n*n+s*s),l=Math.atan2(h*r,M*c),g=Math.atan2(n,s),a=Math.atan2(h+q*c*U(Math.sin(l),3),M-T*r*U(Math.cos(l),3)),V=Math.sin(a),S=r/Math.sqrt(1-T*V*V),b=M/Math.cos(a)-S;return{longitude:o.MathUtils.radToDeg(g),latitude:o.MathUtils.radToDeg(a),height:b}}exports.WGS84=e;exports.cartesianToCartographic=y;exports.cartographicToCartesian=x;exports.parseVector2=w;exports.parseVector3=R;
@@ -0,0 +1,49 @@
1
+ var x = Math.pow;
2
+ import { Vector3 as D, Vector2 as R, MathUtils as l } from "three";
3
+ const C = (t) => t instanceof D ? t : new D(...t), N = (t) => t instanceof R ? t : new R(...t), r = {
4
+ a: 6378137,
5
+ // 赤道半径
6
+ b: 6356752314245179e-9,
7
+ // 极半径
8
+ f: 1 / 298.257223563
9
+ // 扁率
10
+ };
11
+ function W(t, p, d = 0, n = 1 / r.a, i = !1) {
12
+ const a = l.degToRad(t), c = l.degToRad(p), s = Math.cos(c), e = Math.sin(c), M = Math.cos(a), b = Math.sin(a);
13
+ let q, h, u;
14
+ if (i) {
15
+ const o = (r.a + d) * n;
16
+ q = o * s * b, h = o * e, u = o * s * M;
17
+ } else {
18
+ const f = r.a, o = r.b, T = f * f, S = o * o, L = (T - S) / T, g = f / Math.sqrt(1 - L * e * e);
19
+ q = (g + d) * s * b * n, h = (g * (1 - L) + d) * e * n, u = (g + d) * s * M * n;
20
+ }
21
+ return new D(q, h, u);
22
+ }
23
+ function G(t, p = 1 / r.a, d = !1) {
24
+ const n = t.x / p, i = t.y / p, a = t.z / p;
25
+ if (d) {
26
+ const g = Math.sqrt(n * n + i * i + a * a), V = Math.atan2(n, a), w = Math.asin(i / g), y = g - r.a;
27
+ return {
28
+ longitude: l.radToDeg(V),
29
+ latitude: l.radToDeg(w),
30
+ height: y
31
+ };
32
+ }
33
+ const c = r.a, s = r.b, e = c * c, M = s * s, b = (e - M) / e, q = (e - M) / M, h = Math.sqrt(n * n + a * a), u = Math.atan2(i * c, h * s), f = Math.atan2(n, a), o = Math.atan2(
34
+ i + q * s * x(Math.sin(u), 3),
35
+ h - b * c * x(Math.cos(u), 3)
36
+ ), T = Math.sin(o), S = c / Math.sqrt(1 - b * T * T), L = h / Math.cos(o) - S;
37
+ return {
38
+ longitude: l.radToDeg(f),
39
+ latitude: l.radToDeg(o),
40
+ height: L
41
+ };
42
+ }
43
+ export {
44
+ r as W,
45
+ N as a,
46
+ G as b,
47
+ W as c,
48
+ C as p
49
+ };
@@ -1,4 +1,3 @@
1
1
  export declare const ENTIRE_SCENE = 0;
2
2
  export declare const BLOOM_SCENE = 1;
3
- export declare const HIDE_SCENE = 2;
4
3
  export declare const IS_DEV: boolean;
@@ -6,6 +6,7 @@ export default class PointerEvent {
6
6
  onPointerEvent(type: PickFunctionsItem['type'], cb: PickFunctionsItem['cb']): void;
7
7
  onClick(cb: PickFunctionsItem['cb']): void;
8
8
  onPointerEnter(cb: PickFunctionsItem['cb']): void;
9
+ onPointerEnterOnStop(cb: PickFunctionsItem['cb']): void;
9
10
  onPointerLeave(cb: PickFunctionsItem['cb']): void;
10
11
  onPointerMove(cb: PickFunctionsItem['cb']): void;
11
12
  onPointerDown(cb: PickFunctionsItem['cb']): void;
@@ -1,4 +1,4 @@
1
- import { Material, Mesh, type Object3D, Points, type SpriteMaterial, Vector3 } from 'three';
1
+ import { type Material, Mesh, type Object3D, Points, type SpriteMaterial, Vector3 } from 'three';
2
2
  import type Lead from "../Lead/Lead";
3
3
  import type MList from "../MList/MList";
4
4
  import type Pencil from "../Pencil";
@@ -30,13 +30,24 @@ export default class BaseObject extends UseMaterial {
30
30
  add(...object: Object3D[]): void;
31
31
  remove(...object: Object3D[]): void;
32
32
  get visible(): boolean;
33
- get visibleWithAncestors(): boolean;
33
+ /**
34
+ * 检查是否实际可见(自己和所有祖先都 visible)
35
+ */
36
+ isActuallyVisible(): boolean;
34
37
  create(): void;
35
38
  render(): void;
36
39
  update(_delta: number, _elapsed: number): void;
37
40
  resize(_width: number, _height: number): void;
38
41
  show(): this;
39
42
  hide(): this;
43
+ /**
44
+ * 递归禁用 layers(不管子级自己的 visible 状态,全部 disable)
45
+ */
46
+ protected _disableLayersRecursive(): void;
47
+ /**
48
+ * 递归启用 layers(只有自己 visible=true 时才 enable 并继续递归)
49
+ */
50
+ protected _enableLayersRecursive(): void;
40
51
  createGroup(): this;
41
52
  createMesh(...args: ConstructorParameters<typeof Mesh>): this;
42
53
  createPoints(...args: ConstructorParameters<typeof Points>): this;
@@ -67,9 +78,10 @@ export default class BaseObject extends UseMaterial {
67
78
  }): Promise<this>;
68
79
  erase(): void;
69
80
  handleMaterialChange(mat: Material | null): void;
70
- enableBloom(): void;
71
- disableBloom(): void;
81
+ enableBloom(traverse?: boolean): void;
82
+ disableBloom(traverse?: boolean): void;
72
83
  disposeTrack: boolean;
84
+ private isDispose;
73
85
  dispose(): void;
74
86
  }
75
87
  export interface IBaseObject extends BaseObject {
@@ -0,0 +1,98 @@
1
+ import type { Camera } from 'three';
2
+ import type Node from "../../objects/node";
3
+ interface CollisionManagerOptions {
4
+ /** 标签之间的最小间距(像素) */
5
+ padding?: number;
6
+ /** 是否启用碰撞检测 */
7
+ enabled?: boolean;
8
+ /** 更新节流时间(毫秒) */
9
+ throttleTime?: number;
10
+ /** 视口边距,标签超出视口多少像素后隐藏 */
11
+ viewportMargin?: number;
12
+ }
13
+ /**
14
+ * 标签碰撞检测管理器
15
+ * 参考 Mapbox symbol-placement 实现
16
+ *
17
+ * 使用方式:
18
+ * ```ts
19
+ * const manager = new CollisionManager({ padding: 4 });
20
+ * manager.add(node, { priority: 10 });
21
+ * manager.update(camera); // 在渲染循环中调用
22
+ * ```
23
+ */
24
+ export declare class CollisionManager {
25
+ private labels;
26
+ private options;
27
+ private lastUpdateTime;
28
+ private camera?;
29
+ private animationFrameId?;
30
+ private isUpdating;
31
+ constructor(options?: CollisionManagerOptions);
32
+ /**
33
+ * 添加标签到碰撞检测系统
34
+ * @param node Node 实例
35
+ * @param options 配置项,priority 越大越优先显示,不传则使用 node.options.priority
36
+ */
37
+ add(node: Node, options?: {
38
+ priority?: number;
39
+ }): void;
40
+ /**
41
+ * 移除标签
42
+ */
43
+ remove(node: Node): void;
44
+ /**
45
+ * 更新标签优先级
46
+ */
47
+ setPriority(node: Node, priority: number): void;
48
+ /**
49
+ * 批量添加标签
50
+ */
51
+ addBatch(nodes: Node[], priorityFn?: (node: Node, index: number) => number): void;
52
+ /**
53
+ * 启用/禁用碰撞检测
54
+ */
55
+ setEnabled(enabled: boolean): void;
56
+ /**
57
+ * 更新碰撞检测(在渲染循环中调用)
58
+ */
59
+ update(camera: Camera): void;
60
+ /**
61
+ * 强制立即更新
62
+ */
63
+ forceUpdate(): void;
64
+ private performCollisionDetection;
65
+ /**
66
+ * 检测矩形是否与已占用区域碰撞
67
+ */
68
+ private checkCollision;
69
+ /**
70
+ * 检测两个矩形是否相交(包含 padding)
71
+ */
72
+ private rectsIntersect;
73
+ /**
74
+ * 设置节点可见性
75
+ */
76
+ private setNodeVisibility;
77
+ /**
78
+ * 获取当前可见的标签数量
79
+ */
80
+ getVisibleCount(): number;
81
+ /**
82
+ * 获取所有标签数量
83
+ */
84
+ getTotalCount(): number;
85
+ /**
86
+ * 调试执行碰撞检测(带详细日志)
87
+ */
88
+ debugRun(): void;
89
+ /**
90
+ * 清空所有标签
91
+ */
92
+ clear(): void;
93
+ /**
94
+ * 销毁管理器
95
+ */
96
+ dispose(): void;
97
+ }
98
+ export default CollisionManager;
@@ -1,19 +1,31 @@
1
1
  import { CSS2DRenderer } from 'three@latest/examples/jsm/renderers/CSS2DRenderer';
2
2
  import { CSS3DRenderer } from 'three@latest/examples/jsm/renderers/CSS3DRenderer';
3
3
  import type { PerspectiveCamera, Scene } from 'three';
4
+ import { CollisionManager } from './CollisionManager';
4
5
  export interface CSSRendererParams {
5
- zIndex: string;
6
+ zIndex?: string;
6
7
  container?: HTMLElement;
8
+ /** 碰撞检测配置 */
9
+ collision?: {
10
+ /** 是否启用碰撞检测,默认 true */
11
+ enabled?: boolean;
12
+ /** 标签之间的最小间距(像素),默认 4 */
13
+ padding?: number;
14
+ /** 更新节流时间(毫秒),默认 16 */
15
+ throttleTime?: number;
16
+ /** 视口边距,默认 50 */
17
+ viewportMargin?: number;
18
+ };
7
19
  }
8
- export declare const defaultCSSRendererParams: {
9
- zIndex: string;
10
- };
20
+ export declare const defaultCSSRendererParams: CSSRendererParams;
11
21
  export default class {
12
22
  css2Drenderer?: CSS2DRenderer;
13
23
  css3Drenderer?: CSS3DRenderer;
14
24
  container: HTMLElement;
15
- constructor(container: HTMLElement);
16
- addRenderer(type: 'css2d' | 'css3d', cssRendererParams: CSSRendererParams): void;
25
+ /** 标签碰撞检测管理器 */
26
+ collisionManager: CollisionManager;
27
+ constructor(container: HTMLElement, options?: CSSRendererParams);
28
+ addRenderer(type: 'css2d' | 'css3d', options?: CSSRendererParams): void;
17
29
  setSize(width: number, height: number): void;
18
30
  render(scene: Scene, camera: PerspectiveCamera): void;
19
31
  dispose(): void;
@@ -1,14 +1,14 @@
1
- import { Camera, Layers, Material, Scene, Vector2, WebGLRenderer } from 'three';
1
+ import { type Camera, Layers, type Material, type Scene, Vector2, type WebGLRenderer } from 'three';
2
2
  import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer';
3
3
  import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass';
4
4
  import { SSAOPass } from 'three/examples/jsm/postprocessing/SSAOPass';
5
5
  import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass';
6
6
  import type { IBaseObject } from './BaseObject';
7
- import CameraController from './Camera';
7
+ import type CameraController from './Camera';
8
8
  import getMixPass from './pass/MixPass';
9
9
  import { OutputPass } from './pass/OutputPass';
10
- import RendererController from './Renderer';
11
- import SceneController from './Scene';
10
+ import type RendererController from './Renderer';
11
+ import type SceneController from './Scene';
12
12
  export interface BloomParams {
13
13
  threshold: number;
14
14
  strength: number;
@@ -70,7 +70,7 @@ export default class {
70
70
  bloomLayer: Layers;
71
71
  bloomMaterials: Record<string, Material | Material[]>;
72
72
  bloomVisible: Record<string, boolean>;
73
- setBloomSelection(baseObject: IBaseObject, state: boolean): void;
73
+ checkBloomComposerActive(): void;
74
74
  enable(): void;
75
75
  disable(): void;
76
76
  setSize(width: number, height: number): void;
@@ -1,8 +1,8 @@
1
- import { Vector3, WebGLRenderer } from 'three';
1
+ import { type Vector3, type WebGLRenderer } from 'three';
2
2
  import { ViewHelper } from 'three/examples/jsm/helpers/ViewHelper';
3
- import ControlsController from "./Controls";
4
- import SceneController from './Scene';
5
- import CameraController from './Camera';
3
+ import type ControlsController from "./Controls";
4
+ import type CameraController from './Camera';
5
+ import type SceneController from './Scene';
6
6
  interface Options {
7
7
  sceneController: SceneController;
8
8
  cameraController: CameraController;
@@ -1,8 +1,8 @@
1
- import { IBaseObject } from "../BaseObject";
2
- import Pencil from "../Pencil";
1
+ import type { IBaseObject } from "../BaseObject";
2
+ import type Pencil from "../Pencil";
3
3
  export type PickFunctionsItem = {
4
4
  objArr: IBaseObject[] | (() => IBaseObject[]);
5
- type: 'move' | 'enter' | 'leave' | 'down' | 'click' | 'downOutside';
5
+ type: 'move' | 'enter' | 'leave' | 'down' | 'click' | 'downOutside' | 'enterOnStop';
6
6
  cb: (data: {
7
7
  baseObject: IBaseObject;
8
8
  realBaseObject?: IBaseObject;
@@ -23,6 +23,19 @@ export default class Pick {
23
23
  private prevActiveObjects;
24
24
  private objCallbackMap;
25
25
  private pickListener;
26
+ /** 是否有 enterOnStop 事件注册 */
27
+ private hasEnterOnStopEvent;
28
+ /** 需要检测 cursor 的物体 Map<obj, cursorStyle> */
29
+ private cursorObjects;
30
+ private cursorListenerAdded;
31
+ /** 用于检测鼠标停止移动 */
32
+ private moveStopTimer;
33
+ private moveStopDelay;
34
+ private lastMoveEvent;
35
+ private lastMoveActiveObjects;
36
+ private lastMoveRealActiveObject;
37
+ /** 已经触发过 enterOnStop 的物体,用于防止重复触发 */
38
+ private triggeredEnterOnStopObjects;
26
39
  private domElement;
27
40
  constructor(pencil: Pencil);
28
41
  private addPickListener;
@@ -30,6 +43,25 @@ export default class Pick {
30
43
  private processObjectHierarchy;
31
44
  private handleLeaveEvents;
32
45
  private handleDownOutside;
46
+ /** 处理鼠标停止移动事件 */
47
+ private handleMoveStop;
48
+ /** 触发 enterOnStop 事件 */
49
+ private triggerEnterOnStop;
50
+ /** 重置鼠标样式 */
51
+ private resetCursor;
52
+ /** 添加 cursor 检测监听器 */
53
+ private addCursorListener;
54
+ /**
55
+ * 启用物体的 cursor 检测
56
+ * @param obj 要检测的 BaseObject
57
+ * @param cursor 鼠标样式,默认 'pointer'
58
+ */
59
+ enableCursor(obj: IBaseObject, cursor?: string): void;
60
+ /**
61
+ * 禁用物体的 cursor 检测
62
+ * @param obj 要移除的 BaseObject
63
+ */
64
+ disableCursor(obj: IBaseObject): void;
33
65
  handlePick(objArr: PickFunctionsItem['objArr'], t: PickFunctionsItem['type'], cb: PickFunctionsItem['cb']): number;
34
66
  removePick(key: number): void;
35
67
  handlePickNode(objArr: PickFunctionsItem['objArr'], t: PickFunctionsItem['type'], cb: PickFunctionsItem['cb']): number;
@@ -1,10 +1,9 @@
1
- import { Scene } from 'three';
2
- import Lead from './Lead';
3
- import Pencil from "../Pencil";
4
- import Pages from "../Pages";
1
+ import type { Scene } from 'three';
5
2
  import type MList from "../MList/MList";
6
- export interface LeadParams {
7
- }
3
+ import Pages from "../Pages";
4
+ import type Pencil from "../Pencil";
5
+ import Lead from './Lead';
6
+ export type LeadParams = {};
8
7
  export declare const defaultDrawParams: {};
9
8
  interface Options {
10
9
  leadParams?: LeadParams;
@@ -8,5 +8,6 @@ declare class Pages {
8
8
  disable(layer: number): void;
9
9
  disableAll(): void;
10
10
  isEnabled(layer: number): boolean;
11
+ getMinDisabledLayer(): number | null;
11
12
  }
12
13
  export { Pages };
@@ -1,6 +1,6 @@
1
1
  import { EventEmitter } from 'events';
2
2
  import Stats from 'stats-gl';
3
- import { type Object3D, type PerspectiveCamera, Timer, Vector3 } from 'three';
3
+ import { type Object3D, type PerspectiveCamera, Raycaster, Timer, Vector3 } from 'three';
4
4
  import CameraController, { type CameraParams } from "./Camera";
5
5
  import ComposerController, { type BloomParams, type ComposerParams, type SSAOParams } from "./Composer";
6
6
  import ControlsController, { type ControlsParams } from "./Controls";
@@ -58,7 +58,7 @@ export default class Pencil {
58
58
  mListController: MListController;
59
59
  stats?: Stats;
60
60
  private resizeObserver;
61
- private raycaster;
61
+ raycaster: Raycaster;
62
62
  private maxBackufferArea;
63
63
  installPlugins: Map<string, any>;
64
64
  getPlugin(name: 'worker'): Wk;
@@ -126,11 +126,25 @@ export default class Pencil {
126
126
  };
127
127
  css2DRenderer: boolean;
128
128
  css2DRendererParams: {
129
- zIndex: string;
129
+ zIndex?: string;
130
+ container?: HTMLElement;
131
+ collision?: {
132
+ enabled?: boolean;
133
+ padding?: number;
134
+ throttleTime?: number;
135
+ viewportMargin?: number;
136
+ };
130
137
  };
131
138
  css3DRenderer: boolean;
132
139
  css3DRendererParams: {
133
- zIndex: string;
140
+ zIndex?: string;
141
+ container?: HTMLElement;
142
+ collision?: {
143
+ enabled?: boolean;
144
+ padding?: number;
145
+ throttleTime?: number;
146
+ viewportMargin?: number;
147
+ };
134
148
  };
135
149
  };
136
150
  private TweenRaf;
@@ -144,7 +158,7 @@ export default class Pencil {
144
158
  removePage(index: number): void;
145
159
  showPage(index: number): void;
146
160
  private pageActiveIndex;
147
- private pageCountIndex;
161
+ private pages;
148
162
  private init;
149
163
  private initComposer;
150
164
  private initCSSRenderer;
@@ -11,9 +11,8 @@ declare class OutputPassFix extends OutputPass {
11
11
  value: number;
12
12
  };
13
13
  };
14
- material: RawShaderMaterial;
14
+ fsQuad: FullScreenQuad | undefined;
15
15
  _fsQuad: FullScreenQuad | undefined;
16
16
  }
17
17
  import { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass';
18
- import { RawShaderMaterial } from 'three';
19
18
  import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass';