three-base 2.0.104 → 2.0.106

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.
@@ -48,7 +48,7 @@ export default class FireMaterial extends ShaderMaterial {
48
48
  gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );
49
49
  gl_PointSize = ( heightOfNearPlane * size ) / gl_Position.w;
50
50
 
51
- vOpacity = min( influence * 4.0, 1.0 ) * progressNeg;
51
+ vOpacity = min( influence * 100.0, 1.0 ) * progressNeg;
52
52
  vSprite = sprite;
53
53
  ${ShaderChunk.logdepthbuf_vertex}
54
54
  }
@@ -18,7 +18,7 @@ export default class InstancedMeshBase extends MeshBase {
18
18
  instanceColor: InstancedBufferAttribute;
19
19
  reset(...object: Object3D[]): this;
20
20
  loadModel(url: string | File | Array<File>, filename?: string): Promise<void>;
21
- computeBoundingSphere: import("lodash").DebouncedFunc<() => void>;
21
+ computeBoundingSphere: import("lodash").DebouncedFuncLeading<() => void>;
22
22
  setCount(count?: number): Promise<void>;
23
23
  setMatrixAt(index: number, matrix?: Matrix4): Promise<void>;
24
24
  setTRS(index: number, { position, rotation, scale, }: {
package/MeshBase.js CHANGED
@@ -29,6 +29,7 @@ export default class MeshBase extends Group {
29
29
  }
30
30
  // 重置子元素
31
31
  reset(...object) {
32
+ threeUtils.dipose(this);
32
33
  super.clear();
33
34
  super.add(...object);
34
35
  return this;
package/PlaneText.d.ts CHANGED
@@ -22,10 +22,10 @@ export default class PlaneText extends Mesh {
22
22
  spriteText: SpriteText;
23
23
  material: MeshBasicMaterial;
24
24
  set(parame: Props): void;
25
- get(prop: keyof SpriteText): string | number | boolean | Vector3 | import("three").Object3D<import("three").Object3DEventMap> | import("three").BufferGeometry<import("three").NormalBufferAttributes> | ((force?: boolean) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | import("three").Object3D<import("three").Object3DEventMap>[] | import("three").Euler | import("three").Material | import("three").Quaternion | import("three").Matrix4 | import("three").Matrix3 | import("three").Layers | import("three").AnimationClip[] | Record<string, any> | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((matrix: import("three").Matrix4) => void) | ((axis: Vector3, angle: number) => void) | ((euler: import("three").Euler) => void) | ((m: import("three").Matrix4) => void) | ((q: import("three").Quaternion) => void) | ((vector: Vector3) => Vector3) | ((vector: Vector3) => Vector3) | {
25
+ get(prop: keyof SpriteText): string | number | boolean | Vector3 | import("three").Object3D<import("three").Object3DEventMap> | import("three").BufferGeometry<import("three").NormalBufferAttributes> | ((force?: boolean) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | import("three").Object3D<import("three").Object3DEventMap>[] | import("three").Material | Record<string, any> | import("three").Euler | import("three").Quaternion | import("three").Matrix4 | import("three").Matrix3 | import("three").Layers | import("three").AnimationClip[] | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, depthMaterial: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((renderer: import("three").WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry<import("three").NormalBufferAttributes>, material: import("three").Material, group: import("three").Group<import("three").Object3DEventMap>) => void) | ((matrix: import("three").Matrix4) => void) | ((axis: Vector3, angle: number) => void) | ((euler: import("three").Euler) => void) | ((m: import("three").Matrix4) => void) | ((q: import("three").Quaternion) => void) | ((vector: Vector3) => Vector3) | ((vector: Vector3) => Vector3) | {
26
26
  (vector: Vector3): void;
27
27
  (x: number, y: number, z: number): void;
28
- } | ((id: number) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any, optionalTarget?: import("three").Object3D<import("three").Object3DEventMap>[]) => import("three").Object3D<import("three").Object3DEventMap>[]) | ((target: Vector3) => Vector3) | ((target: import("three").Quaternion) => import("three").Quaternion) | ((target: Vector3) => Vector3) | ((target: Vector3) => Vector3) | ((raycaster: import("three").Raycaster, intersects: import("three").Intersection<import("three").Object3D<import("three").Object3DEventMap>>[]) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | (() => void) | ((updateParents: boolean, updateChildren: boolean) => void) | ((meta?: import("three").JSONMeta) => import("three").Object3DJSON) | (<T extends keyof import("three").Object3DEventMap>(event: import("three").BaseEvent<T> & import("three").Object3DEventMap[T]) => void) | HTMLCanvasElement | import("three").Vector2 | import("three").SpriteMaterial | ((object: import("three").Object3D<import("three").Object3DEventMap>, recursive?: boolean) => SpriteText) | ((recursive?: boolean) => SpriteText) | {
28
+ } | ((id: number) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any) => import("three").Object3D<import("three").Object3DEventMap>) | ((name: string, value: any, optionalTarget?: import("three").Object3D<import("three").Object3DEventMap>[]) => import("three").Object3D<import("three").Object3DEventMap>[]) | ((target: Vector3) => Vector3) | ((target: import("three").Quaternion) => import("three").Quaternion) | ((target: Vector3) => Vector3) | ((target: Vector3) => Vector3) | ((raycaster: import("three").Raycaster, intersects: import("three").Intersection<import("three").Object3D<import("three").Object3DEventMap>>[]) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | ((callback: (object: import("three").Object3D<import("three").Object3DEventMap>) => any) => void) | (() => void) | ((updateParents: boolean, updateChildren: boolean) => void) | ((meta?: import("three").JSONMeta) => import("three").Object3DJSON) | (<T extends keyof import("three").Object3DEventMap>(event: import("three").BaseEvent<T> & import("three").Object3DEventMap[T]) => void) | HTMLCanvasElement | import("three").Vector2 | import("three").SpriteMaterial | ((recursive?: boolean) => SpriteText) | ((object: import("three").Object3D<import("three").Object3DEventMap>, recursive?: boolean) => SpriteText) | {
29
29
  <T_1 extends keyof import("three").Object3DEventMap>(type: T_1, listener: import("three").EventListener<import("three").Object3DEventMap[T_1], T_1, SpriteText>): void;
30
30
  <T_2 extends string>(type: T_2, listener: import("three").EventListener<{}, T_2, SpriteText>): void;
31
31
  } | {
package/ThreeBase.d.ts CHANGED
@@ -69,7 +69,6 @@ export default class ThreeBase extends EventDispatcher {
69
69
  autoRender: boolean;
70
70
  needRender: boolean;
71
71
  stopRender(): void;
72
- hasPass(): boolean;
73
72
  render(): void;
74
73
  private renderBindThis;
75
74
  getThumbBlob(): Promise<Blob>;
@@ -87,6 +86,6 @@ export default class ThreeBase extends EventDispatcher {
87
86
  renderObject3dStroke(obj: Object3D, strockWidth: number, color: string, opacity: number): void;
88
87
  renderTargetgaussBlur(rendererTarget: WebGLRenderTarget, radius: number, opacity: number): void;
89
88
  renderTargetAddGlow(renderTarget: WebGLRenderTarget, width: number, color: string): void;
90
- renderRendererTarget(renderTarget: WebGLRenderTarget, alpha?: boolean): void;
89
+ renderRendererTarget(renderTarget: WebGLRenderTarget): void;
91
90
  renderTexture(texture: Texture, alpha?: boolean): void;
92
91
  }
package/ThreeBase.js CHANGED
@@ -12,8 +12,7 @@ import ThreeMouse from "./ThreeMouse";
12
12
  import Transition from "./Transition";
13
13
  import glow_pass from "./pass/glow_pass";
14
14
  import stroke_pass from "./pass/stroke_pass";
15
- import { clearShader, coptyShader, fullScreenMesh, gaussBlurShader, strokeShader, } from "./shaders";
16
- import FXAAShaderMaterial from "./shaders/FXAAShaderMaterial";
15
+ import { baseTextureToRenderShader, clearShader, copyShader, fullScreenMesh, gaussBlurShader, strokeShader, } from "./shaders";
17
16
  import threeLoader from "./threeLoader";
18
17
  import threeUtils from "./threeUtils";
19
18
  import cover_pass from "./pass/cover_pass";
@@ -53,7 +52,9 @@ export default class ThreeBase extends EventDispatcher {
53
52
  stencilBuffer: false,
54
53
  depthTexture: this.baseDepthTexture,
55
54
  anisotropy: 16,
55
+ colorSpace: SRGBColorSpace,
56
56
  });
57
+ baseRenderTarget.texture.colorSpace = SRGBColorSpace;
57
58
  return baseRenderTarget;
58
59
  })();
59
60
  // 公用渲染目标1
@@ -99,7 +100,7 @@ export default class ThreeBase extends EventDispatcher {
99
100
  renderer.setPixelRatio(window.devicePixelRatio);
100
101
  renderer.autoClear = false;
101
102
  renderer.clear();
102
- renderer.outputColorSpace = SRGBColorSpace;
103
+ // renderer.outputColorSpace = SRGBColorSpace;
103
104
  threeLoader.setAnisotropy(renderer.capabilities.getMaxAnisotropy());
104
105
  return renderer;
105
106
  })();
@@ -424,21 +425,6 @@ export default class ThreeBase extends EventDispatcher {
424
425
  this.renderer.domElement.style.opacity = "0";
425
426
  }
426
427
  }
427
- // 判断是否有 发光和描边等对象 以便判断是否需要 渲染深度纹理
428
- hasPass() {
429
- let hasPass = false;
430
- this.scene.traverse((obj) => {
431
- const { stroke_enable = false, stroke_width = 1, glow_enable = false, glow_width = 1, cover_enable = false, //颜色覆盖
432
- cover_opacity = 0, //透明度
433
- } = obj.userData;
434
- if ((stroke_enable && stroke_width > 0) ||
435
- (glow_enable && glow_width > 0) ||
436
- (cover_enable && cover_opacity > 0)) {
437
- hasPass = true;
438
- }
439
- });
440
- return hasPass;
441
- }
442
428
  // 渲染场景
443
429
  render() {
444
430
  // canvas 没有在页面上面的话 就停止渲染
@@ -491,25 +477,19 @@ export default class ThreeBase extends EventDispatcher {
491
477
  }
492
478
  // 渲染场景
493
479
  this.dispatchEvent({ type: "beforeRender" });
494
- const hasPass = this.hasPass();
495
- if (hasPass) {
496
- // 把基础场景渲染到 帧缓冲区 在后期通道中会用到
497
- this.renderer.setRenderTarget(this.baseRenderTarget);
498
- this.renderer.clear();
499
- this.renderer.render(this.scene, camera);
500
- this.renderer.setRenderTarget(null);
501
- }
502
- // 清空主画布
480
+ // 把基础场景渲染到 帧缓冲区 在后期通道中会用到
481
+ this.renderer.setRenderTarget(this.baseRenderTarget);
503
482
  this.renderer.clear();
504
483
  this.renderer.render(this.scene, camera);
505
- if (hasPass) {
506
- // 查找需要绘制描边的对象,并且绘制描边
507
- this.scene.traverseVisible((obj) => {
508
- stroke_pass(this.renderer, camera, obj, this.baseDepthTexture);
509
- glow_pass(this.renderer, camera, obj, this.baseDepthTexture);
510
- cover_pass(this.renderer, camera, obj, this.baseDepthTexture);
511
- });
512
- }
484
+ this.renderer.setRenderTarget(null);
485
+ this.renderer.clear();
486
+ this.renderRendererTarget(this.baseRenderTarget);
487
+ // 后处理特效渲染(描边,发光,颜色覆盖,磨砂玻璃,bloom)
488
+ this.scene.traverseVisible((obj) => {
489
+ stroke_pass(this.renderer, camera, obj, this.baseDepthTexture);
490
+ glow_pass(this.renderer, camera, obj, this.baseDepthTexture);
491
+ cover_pass(this.renderer, camera, obj, this.baseDepthTexture);
492
+ });
513
493
  this.dispatchEvent({ type: "afterRender" });
514
494
  }
515
495
  renderBindThis = this.render.bind(this);
@@ -595,10 +575,10 @@ export default class ThreeBase extends EventDispatcher {
595
575
  rendererTarget.setSize(this.tempVector2.x, this.tempVector2.y);
596
576
  }
597
577
  this.renderer.setRenderTarget(rendererTarget);
598
- fullScreenMesh.material = coptyShader;
599
- coptyShader.uniforms.map.value = texture;
600
- coptyShader.uniforms.opacity.value = opactity;
601
- coptyShader.blending = alpha ? NoBlending : NormalBlending;
578
+ fullScreenMesh.material = copyShader;
579
+ copyShader.uniforms.map.value = texture;
580
+ copyShader.uniforms.opacity.value = opactity;
581
+ copyShader.blending = alpha ? NoBlending : NormalBlending;
602
582
  fullScreenMesh.render(this.renderer);
603
583
  this.renderer.setRenderTarget(originTarget);
604
584
  }
@@ -661,28 +641,18 @@ export default class ThreeBase extends EventDispatcher {
661
641
  this.renderTargetgaussBlur(renderTarget, 1, 1);
662
642
  }
663
643
  // 需要做抗锯齿处理 渲染 渲染目标
664
- renderRendererTarget(renderTarget, alpha = false) {
665
- FXAAShaderMaterial.uniforms.tDiffuse.value = renderTarget.texture;
666
- FXAAShaderMaterial.uniforms.resolution.value.set(1 / this.size.x, 1 / this.size.y);
667
- fullScreenMesh.material = FXAAShaderMaterial;
644
+ renderRendererTarget(renderTarget) {
645
+ baseTextureToRenderShader.uniforms.map.value = renderTarget.texture;
646
+ baseTextureToRenderShader.uniforms.opacity.value = 1.0;
647
+ fullScreenMesh.material = baseTextureToRenderShader;
668
648
  fullScreenMesh.render(this.renderer);
669
- // const FXAAShaderMaterial = new ShaderMaterial({
670
- // uniforms: {
671
- // tDiffuse: { value: null }, // 贴图纹理
672
- // resolution: { value: new Vector2(1 / 1024, 1 / 1024) }
673
- // },
674
- // coptyShader.uniforms.map.value = renderTarget.texture;
675
- // coptyShader.uniforms.opacity.value = 1.0;
676
- // fullScreenMesh.material = coptyShader;
677
- // coptyShader.blending = alpha ? NoBlending : NormalBlending;
678
- // fullScreenMesh.render(this.renderer);
679
649
  }
680
650
  // 渲染纹理
681
651
  renderTexture(texture, alpha = false) {
682
- coptyShader.uniforms.map.value = texture;
683
- coptyShader.uniforms.opacity.value = 1.0;
684
- fullScreenMesh.material = coptyShader;
685
- coptyShader.blending = alpha ? NoBlending : NormalBlending;
652
+ copyShader.uniforms.map.value = texture;
653
+ copyShader.uniforms.opacity.value = 1.0;
654
+ fullScreenMesh.material = copyShader;
655
+ copyShader.blending = alpha ? NoBlending : NormalBlending;
686
656
  fullScreenMesh.render(this.renderer);
687
657
  }
688
658
  }
package/keyContorls.d.ts CHANGED
@@ -16,7 +16,7 @@ declare class KeyContorls extends EventDispatcher {
16
16
  _listeners?: {
17
17
  [key: string]: Array<any>;
18
18
  };
19
- removeEvent: import("lodash").DebouncedFunc<(type: string) => void>;
19
+ removeEvent: import("lodash").DebouncedFuncLeading<(type: string) => void>;
20
20
  addEventListener<T extends string>(type: T, listener: EventListener<{}, T, this>): void;
21
21
  addEvent(): void;
22
22
  dispose(): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "three-base",
3
- "version": "2.0.104",
3
+ "version": "2.0.106",
4
4
  "description": "three 3d three-base",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -73,6 +73,9 @@ const depthTestShader = new ShaderMaterial({
73
73
  if(texture2D(baseDepth, vUv).r + 0.0001 < texture2D(selectDepth, vUv).r){
74
74
  discard;
75
75
  }
76
+ if(texture2D(baseDepth, vUv).r == 1.0){
77
+ discard;
78
+ }
76
79
  gl_FragColor = vec4(color, 1.0);
77
80
  ${ShaderChunk.logdepthbuf_fragment}
78
81
  }
package/pass/glow_pass.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2024-09-23 22:00:48
6
6
  */
7
- import { Color, DepthFormat, DepthTexture, LinearFilter, NoBlending, NormalBlending, RGBAFormat, RawShaderMaterial, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget } from "three";
7
+ import { Color, DepthFormat, DepthTexture, LinearFilter, NoBlending, NormalBlending, RGBAFormat, RawShaderMaterial, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget, } from "three";
8
8
  import FullScreenQuad from "./FullScreenQuad";
9
9
  // 选中对象的深度纹理
10
10
  const selectDepthTexture = (() => {
@@ -29,10 +29,18 @@ const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
29
29
  format: RGBAFormat,
30
30
  anisotropy: 16,
31
31
  });
32
- // 由于不能同时读写自己的纹理
33
- const blur1TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
32
+ // 由于不能同时读写自己的纹理
33
+ const blur1TextureTarget = new WebGLRenderTarget(512, 512, {
34
+ minFilter: LinearFilter,
35
+ magFilter: LinearFilter,
36
+ format: RGBAFormat,
37
+ });
34
38
  // 所以需要用2个模糊纹理相互读写
35
- const blur2TextureTarget = new WebGLRenderTarget(512, 512, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
39
+ const blur2TextureTarget = new WebGLRenderTarget(512, 512, {
40
+ minFilter: LinearFilter,
41
+ magFilter: LinearFilter,
42
+ format: RGBAFormat,
43
+ });
36
44
  const size = new Vector2();
37
45
  // 创建一个渲染工具 用于处理纹理
38
46
  const fsQuad = new FullScreenQuad(); // 渲染辅助器
@@ -49,8 +57,6 @@ const depthTestShader = new ShaderMaterial({
49
57
  varying vec2 vUv;
50
58
  void main() {
51
59
  vUv = uv;
52
- // gl_Position = vec4(position, 1.0);
53
- // gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);
54
60
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
55
61
  ${ShaderChunk.logdepthbuf_vertex}
56
62
  }
@@ -65,6 +71,9 @@ const depthTestShader = new ShaderMaterial({
65
71
  if(texture2D(baseDepth, vUv).r < texture2D(selectDepth, vUv).r){
66
72
  discard;
67
73
  }
74
+ if(texture2D(baseDepth, vUv).r == 1.0){
75
+ discard;
76
+ }
68
77
  gl_FragColor = texture2D(map, vUv);
69
78
  ${ShaderChunk.logdepthbuf_fragment}
70
79
  }
@@ -72,13 +81,13 @@ const depthTestShader = new ShaderMaterial({
72
81
  blending: NoBlending,
73
82
  depthTest: true,
74
83
  depthWrite: true,
75
- transparent: true
84
+ transparent: true,
76
85
  });
77
86
  // 抗锯齿着色器
78
87
  const FXAAShaderMaterial = new ShaderMaterial({
79
88
  uniforms: {
80
89
  tDiffuse: { value: null },
81
- resolution: { value: new Vector2(1 / 1024, 1 / 1024) }
90
+ resolution: { value: new Vector2(1 / 1024, 1 / 1024) },
82
91
  },
83
92
  vertexShader: `
84
93
  ${ShaderChunk.common}
@@ -308,7 +317,7 @@ const FXAAShaderMaterial = new ShaderMaterial({
308
317
  blending: NoBlending,
309
318
  depthTest: false,
310
319
  depthWrite: false,
311
- transparent: true
320
+ transparent: true,
312
321
  });
313
322
  // 描边着色器
314
323
  const blurShader = new RawShaderMaterial({
@@ -320,32 +329,32 @@ const blurShader = new RawShaderMaterial({
320
329
  resolution: { value: new Vector2(1 / 512, 1 / 512) },
321
330
  offset: {
322
331
  value: [
323
- new Vector2(0.000, 1.000),
332
+ new Vector2(0.0, 1.0),
324
333
  new Vector2(0.259, 0.966),
325
- new Vector2(0.500, 0.866),
334
+ new Vector2(0.5, 0.866),
326
335
  new Vector2(0.707, 0.707),
327
- new Vector2(0.866, 0.500),
336
+ new Vector2(0.866, 0.5),
328
337
  new Vector2(0.966, 0.259),
329
- new Vector2(1.000, 0.000),
338
+ new Vector2(1.0, 0.0),
330
339
  new Vector2(0.966, -0.259),
331
- new Vector2(0.866, -0.500),
340
+ new Vector2(0.866, -0.5),
332
341
  new Vector2(0.707, -0.707),
333
- new Vector2(0.500, -0.866),
342
+ new Vector2(0.5, -0.866),
334
343
  new Vector2(0.259, -0.966),
335
- new Vector2(0.000, -1.000),
344
+ new Vector2(0.0, -1.0),
336
345
  new Vector2(-0.259, -0.966),
337
- new Vector2(-0.500, -0.866),
346
+ new Vector2(-0.5, -0.866),
338
347
  new Vector2(-0.707, -0.707),
339
- new Vector2(-0.866, -0.500),
348
+ new Vector2(-0.866, -0.5),
340
349
  new Vector2(-0.966, -0.259),
341
- new Vector2(-1.000, -0.000),
350
+ new Vector2(-1.0, -0.0),
342
351
  new Vector2(-0.966, 0.259),
343
- new Vector2(-0.866, 0.500),
352
+ new Vector2(-0.866, 0.5),
344
353
  new Vector2(-0.707, 0.707),
345
- new Vector2(-0.500, 0.866),
346
- new Vector2(-0.259, 0.966)
347
- ]
348
- }
354
+ new Vector2(-0.5, 0.866),
355
+ new Vector2(-0.259, 0.966),
356
+ ],
357
+ },
349
358
  },
350
359
  vertexShader: `
351
360
  attribute vec3 position;
@@ -395,7 +404,7 @@ const blurShader = new RawShaderMaterial({
395
404
  blending: NoBlending,
396
405
  depthTest: false,
397
406
  depthWrite: false,
398
- transparent: true
407
+ transparent: true,
399
408
  });
400
409
  // 过滤着色器
401
410
  const filterSelectShader = new RawShaderMaterial({
@@ -431,7 +440,7 @@ const filterSelectShader = new RawShaderMaterial({
431
440
  blending: NoBlending,
432
441
  depthTest: false,
433
442
  depthWrite: false,
434
- transparent: true
443
+ transparent: true,
435
444
  });
436
445
  const copyShader = new ShaderMaterial({
437
446
  uniforms: {
@@ -460,13 +469,13 @@ const copyShader = new ShaderMaterial({
460
469
  `,
461
470
  depthTest: true,
462
471
  depthWrite: true,
463
- transparent: true
472
+ transparent: true,
464
473
  });
465
474
  // 场景对象
466
475
  const scene = new Scene();
467
476
  // 对象发光
468
477
  export default function glow_pass(renderer, camera, object3d, baseDepthTexture) {
469
- const { glow_enable = false, glow_color = "#04fa12", glow_width = 1, glow_opacity = 1 } = object3d.userData;
478
+ const { glow_enable = false, glow_color = "#04fa12", glow_width = 1, glow_opacity = 1, } = object3d.userData;
470
479
  if (!glow_enable || glow_width === 0) {
471
480
  return;
472
481
  }
@@ -553,7 +562,8 @@ export default function glow_pass(renderer, camera, object3d, baseDepthTexture)
553
562
  fsQuad.render(renderer, FXAAShaderMaterial);
554
563
  // 还原帧缓冲区 减去原始纹理保留描边
555
564
  renderer.setRenderTarget(originRenderTarget);
556
- filterSelectShader.uniforms.selectTexture.value = selectDethpTestTextureTarget.texture;
565
+ filterSelectShader.uniforms.selectTexture.value =
566
+ selectDethpTestTextureTarget.texture;
557
567
  filterSelectShader.uniforms.blurTexture.value = blur1TextureTarget.texture;
558
568
  filterSelectShader.uniforms.opacity.value = glow_opacity;
559
569
  filterSelectShader.blending = NormalBlending; // 与有的纹理融合计算 保留前面通道传递下来的纹理
@@ -561,7 +571,7 @@ export default function glow_pass(renderer, camera, object3d, baseDepthTexture)
561
571
  // 调试代码
562
572
  // renderer.setRenderTarget(null);
563
573
  // renderer.clearDepth();
564
- // copyShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
574
+ // copyShader.uniforms.map.value = blur2TextureTarget.texture;
565
575
  // fsQuad.render(renderer, copyShader);
566
576
  // return;
567
577
  }
@@ -65,6 +65,9 @@ const depthTestShader = new ShaderMaterial({
65
65
  if(texture2D(baseDepth, vUv).r < texture2D(selectDepth, vUv).r){
66
66
  discard;
67
67
  }
68
+ if(texture2D(baseDepth, vUv).r == 1.0){
69
+ discard;
70
+ }
68
71
  gl_FragColor = texture2D(map, vUv);
69
72
  ${ShaderChunk.logdepthbuf_fragment}
70
73
  }
package/shaders.d.ts CHANGED
@@ -11,7 +11,8 @@ export declare const fullScreenMesh: FullScreenQuad;
11
11
  export declare const orthographicCamera: OrthographicCamera;
12
12
  export declare const clearShader: ShaderMaterial;
13
13
  export declare const intersectionShader: ShaderMaterial;
14
- export declare const coptyShader: ShaderMaterial;
14
+ export declare const copyShader: ShaderMaterial;
15
+ export declare const baseTextureToRenderShader: ShaderMaterial;
15
16
  export declare const strokeShader: ShaderMaterial;
16
17
  export declare const gaussBlurShader: ShaderMaterial;
17
18
  export {};
package/shaders.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2022-04-02 18:28:38
6
6
  */
7
- import { BufferGeometry, Color, Float32BufferAttribute, Mesh, NoBlending, OrthographicCamera, ShaderChunk, ShaderMaterial, Vector2 } from "three";
7
+ import { BufferGeometry, Color, Float32BufferAttribute, Mesh, NoBlending, OrthographicCamera, ShaderChunk, ShaderMaterial, Vector2, } from "three";
8
8
  // https://github.com/mrdoob/three.js/pull/21358
9
9
  const _geometry = new BufferGeometry();
10
10
  _geometry.setAttribute("position", new Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3));
@@ -48,7 +48,7 @@ export const clearShader = new ShaderMaterial({
48
48
  blending: NoBlending,
49
49
  depthTest: false,
50
50
  depthWrite: false,
51
- transparent: true
51
+ transparent: true,
52
52
  });
53
53
  // 交集着色器提取相同的像素点
54
54
  export const intersectionShader = new ShaderMaterial({
@@ -83,32 +83,74 @@ export const intersectionShader = new ShaderMaterial({
83
83
  blending: NoBlending,
84
84
  depthTest: true,
85
85
  depthWrite: true,
86
- transparent: true
86
+ transparent: true,
87
87
  });
88
88
  // 拷贝着色器
89
- export const coptyShader = new ShaderMaterial({
89
+ export const copyShader = new ShaderMaterial({
90
90
  uniforms: {
91
91
  map: { value: null },
92
92
  opacity: { value: 1.0 } // 透明度
93
93
  },
94
94
  vertexShader: `
95
+ ${ShaderChunk.common}
96
+ ${ShaderChunk.logdepthbuf_pars_vertex}
95
97
  varying vec2 vUv;
96
98
  void main() {
97
99
  vUv = uv;
98
100
  gl_Position = vec4(position, 1.0);
101
+ ${ShaderChunk.logdepthbuf_vertex}
99
102
  }
100
103
  `,
101
104
  fragmentShader: `
105
+ ${ShaderChunk.logdepthbuf_pars_fragment}
102
106
  uniform sampler2D map;
103
107
  uniform float opacity;
108
+ uniform bool linear_to_srgb;
104
109
  varying vec2 vUv;
105
110
  void main() {
106
-
107
- gl_FragColor = texture2D(map, vUv) * opacity;
108
-
111
+ vec4 diffuseColor = texture(map, vUv);
112
+ gl_FragColor = diffuseColor * opacity;
113
+ ${ShaderChunk.logdepthbuf_fragment}
114
+ }
115
+ `,
116
+ depthTest: true,
117
+ depthWrite: true,
118
+ transparent: true,
119
+ });
120
+ // 渲染目标绘制到渲染器着色器
121
+ export const baseTextureToRenderShader = new ShaderMaterial({
122
+ uniforms: {
123
+ map: { value: null },
124
+ opacity: { value: 1.0 }, // 透明度
125
+ },
126
+ vertexShader: `
127
+ ${ShaderChunk.common}
128
+ ${ShaderChunk.logdepthbuf_pars_vertex}
129
+ varying vec2 vUv;
130
+ void main() {
131
+ vUv = uv;
132
+ gl_Position = vec4(position, 1.0);
133
+ ${ShaderChunk.logdepthbuf_vertex}
109
134
  }
110
135
  `,
111
- // blending: NoBlending, // 渲染时不与背景融合计算 直接替换
136
+ fragmentShader: `
137
+ ${ShaderChunk.logdepthbuf_pars_fragment}
138
+ uniform sampler2D map;
139
+ uniform float opacity;
140
+ uniform bool linear_to_srgb;
141
+ varying vec2 vUv;
142
+ float linearToSrgb(float v) {
143
+ return pow(v, 1.0 / 2.2);
144
+ }
145
+ void main() {
146
+ vec4 diffuseColor = texture(map, vUv);
147
+ diffuseColor.r = linearToSrgb(diffuseColor.r);
148
+ diffuseColor.g = linearToSrgb(diffuseColor.g);
149
+ diffuseColor.b = linearToSrgb(diffuseColor.b);
150
+ gl_FragColor = diffuseColor * opacity;
151
+ ${ShaderChunk.logdepthbuf_fragment}
152
+ }
153
+ `,
112
154
  depthTest: true,
113
155
  depthWrite: true,
114
156
  transparent: true,
@@ -120,7 +162,7 @@ export const strokeShader = new ShaderMaterial({
120
162
  resolution: { value: new Vector2(512, 512) },
121
163
  strokeWidth: { value: 1.0 },
122
164
  strokeColor: { value: new Color("#B2F2FF") },
123
- opacity: { value: 1.0 } // 透明度
165
+ opacity: { value: 1.0 }, // 透明度
124
166
  },
125
167
  vertexShader: `
126
168
  varying vec2 vUv;
@@ -175,7 +217,7 @@ export const strokeShader = new ShaderMaterial({
175
217
  blending: NoBlending,
176
218
  depthTest: true,
177
219
  depthWrite: true,
178
- transparent: true
220
+ transparent: true,
179
221
  });
180
222
  // 高斯模糊着色器 让颜色过渡更自然
181
223
  export const gaussBlurShader = new ShaderMaterial({
@@ -241,5 +283,5 @@ export const gaussBlurShader = new ShaderMaterial({
241
283
  blending: NoBlending,
242
284
  depthTest: false,
243
285
  depthWrite: false,
244
- transparent: true
286
+ transparent: true,
245
287
  });
package/threeLoader.js CHANGED
@@ -359,7 +359,7 @@ class ThreeLoader extends EventDispatcher {
359
359
  return await this.loadModel(stl);
360
360
  }
361
361
  //如果有zip文件就加载zip文件
362
- let zipFile = Object.keys(zip.files).find((filename) => /\.stl$/.test(filename));
362
+ let zipFile = Object.keys(zip.files).find((filename) => /\.zip$/.test(filename));
363
363
  if (zipFile) {
364
364
  return await this.loadModel(zipFile);
365
365
  }
package/threeUtils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Box3, BufferGeometry, Clock, EventDispatcher, Object3D, Vector3 } from "three";
1
+ import { Box3, BufferGeometry, Clock, EventDispatcher, Material, Object3D, Vector3 } from "three";
2
2
  declare class ThreeUtils extends EventDispatcher {
3
3
  constructor();
4
4
  isProd: boolean;
@@ -45,6 +45,8 @@ declare class ThreeUtils extends EventDispatcher {
45
45
  getSuffix(filename: string): string;
46
46
  getFilename(url: string): string;
47
47
  fileToBloburl(file: File): Promise<string>;
48
+ toMeshBasicMaterial<P extends Material | Material[]>(material: P): P;
49
+ toMeshLambertMaterial<P extends Material | Material[]>(material: P): P;
48
50
  }
49
51
  declare const threeUtils: ThreeUtils;
50
52
  export default threeUtils;
package/threeUtils.js CHANGED
@@ -4,7 +4,7 @@
4
4
  * @Last Modified by: xiaosihan
5
5
  * @Last Modified time: 2023-05-03 00:36:18
6
6
  */
7
- import { Box3, Clock, EventDispatcher, Material, Vector3, } from "three";
7
+ import { Box3, Clock, EventDispatcher, Material, MeshBasicMaterial, MeshLambertMaterial, Vector3, } from "three";
8
8
  import { GLTFExporter } from "three/examples/jsm/exporters/GLTFExporter";
9
9
  class ThreeUtils extends EventDispatcher {
10
10
  constructor() {
@@ -289,6 +289,42 @@ class ThreeUtils extends EventDispatcher {
289
289
  reader.readAsArrayBuffer(file);
290
290
  });
291
291
  }
292
+ //材质转为基础材质
293
+ toMeshBasicMaterial(material) {
294
+ if (material instanceof Array) {
295
+ return material.map((m) => this.toMeshBasicMaterial(m));
296
+ }
297
+ else {
298
+ const meshBasicMaterial = new MeshBasicMaterial();
299
+ for (let i in meshBasicMaterial) {
300
+ if (!["type"].includes(i) &&
301
+ meshBasicMaterial.hasOwnProperty(i) &&
302
+ material.hasOwnProperty(i)) {
303
+ //@ts-ignore
304
+ meshBasicMaterial[i] = material[i];
305
+ }
306
+ }
307
+ return meshBasicMaterial;
308
+ }
309
+ }
310
+ toMeshLambertMaterial(material) {
311
+ //@ts-ignore
312
+ if (material instanceof Array) {
313
+ //@ts-ignore
314
+ return material.map((m) => toMeshLambertMaterial(m));
315
+ }
316
+ else {
317
+ const meshLambertMaterial = new MeshLambertMaterial();
318
+ for (let i in meshLambertMaterial) {
319
+ if (!["type"].includes(i) &&
320
+ meshLambertMaterial.hasOwnProperty(i) &&
321
+ material.hasOwnProperty(i)) {
322
+ meshLambertMaterial[i] = material[i];
323
+ }
324
+ }
325
+ return meshLambertMaterial;
326
+ }
327
+ }
292
328
  }
293
329
  const threeUtils = new ThreeUtils();
294
330
  export default threeUtils;