three-base 2.0.104 → 2.0.107

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
@@ -5,15 +5,14 @@
5
5
  * @Last Modified time: 2024-09-23 21:20:32
6
6
  */
7
7
  import { round } from "lodash";
8
- import { AxesHelper, Box3, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, MOUSE, Mesh, NoBlending, NormalBlending, OrthographicCamera, PerspectiveCamera, RGBAFormat, SRGBColorSpace, Scene, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer, } from "three";
8
+ import { AxesHelper, Box3, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, MOUSE, Mesh, NoBlending, NormalBlending, OrthographicCamera, PerspectiveCamera, RGBAFormat, ReinhardToneMapping, SRGBColorSpace, Scene, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer, } from "three";
9
9
  import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
10
10
  import { degToRad, generateUUID } from "three/src/math/MathUtils";
11
11
  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
@@ -100,6 +101,8 @@ export default class ThreeBase extends EventDispatcher {
100
101
  renderer.autoClear = false;
101
102
  renderer.clear();
102
103
  renderer.outputColorSpace = SRGBColorSpace;
104
+ // 缓解过暗或者过亮
105
+ renderer.toneMapping = ReinhardToneMapping;
103
106
  threeLoader.setAnisotropy(renderer.capabilities.getMaxAnisotropy());
104
107
  return renderer;
105
108
  })();
@@ -424,21 +427,6 @@ export default class ThreeBase extends EventDispatcher {
424
427
  this.renderer.domElement.style.opacity = "0";
425
428
  }
426
429
  }
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
430
  // 渲染场景
443
431
  render() {
444
432
  // canvas 没有在页面上面的话 就停止渲染
@@ -491,25 +479,19 @@ export default class ThreeBase extends EventDispatcher {
491
479
  }
492
480
  // 渲染场景
493
481
  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
- // 清空主画布
482
+ // 把基础场景渲染到 帧缓冲区 在后期通道中会用到
483
+ this.renderer.setRenderTarget(this.baseRenderTarget);
503
484
  this.renderer.clear();
504
485
  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
- }
486
+ this.renderer.setRenderTarget(null);
487
+ this.renderer.clear();
488
+ this.renderRendererTarget(this.baseRenderTarget);
489
+ // 后处理特效渲染(描边,发光,颜色覆盖,磨砂玻璃,bloom)
490
+ this.scene.traverseVisible((obj) => {
491
+ stroke_pass(this.renderer, camera, obj, this.baseDepthTexture);
492
+ glow_pass(this.renderer, camera, obj, this.baseDepthTexture);
493
+ cover_pass(this.renderer, camera, obj, this.baseDepthTexture);
494
+ });
513
495
  this.dispatchEvent({ type: "afterRender" });
514
496
  }
515
497
  renderBindThis = this.render.bind(this);
@@ -595,10 +577,10 @@ export default class ThreeBase extends EventDispatcher {
595
577
  rendererTarget.setSize(this.tempVector2.x, this.tempVector2.y);
596
578
  }
597
579
  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;
580
+ fullScreenMesh.material = copyShader;
581
+ copyShader.uniforms.map.value = texture;
582
+ copyShader.uniforms.opacity.value = opactity;
583
+ copyShader.blending = alpha ? NoBlending : NormalBlending;
602
584
  fullScreenMesh.render(this.renderer);
603
585
  this.renderer.setRenderTarget(originTarget);
604
586
  }
@@ -661,28 +643,18 @@ export default class ThreeBase extends EventDispatcher {
661
643
  this.renderTargetgaussBlur(renderTarget, 1, 1);
662
644
  }
663
645
  // 需要做抗锯齿处理 渲染 渲染目标
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;
646
+ renderRendererTarget(renderTarget) {
647
+ baseTextureToRenderShader.uniforms.map.value = renderTarget.texture;
648
+ baseTextureToRenderShader.uniforms.opacity.value = 1.0;
649
+ fullScreenMesh.material = baseTextureToRenderShader;
668
650
  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
651
  }
680
652
  // 渲染纹理
681
653
  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;
654
+ copyShader.uniforms.map.value = texture;
655
+ copyShader.uniforms.opacity.value = 1.0;
656
+ fullScreenMesh.material = copyShader;
657
+ copyShader.blending = alpha ? NoBlending : NormalBlending;
686
658
  fullScreenMesh.render(this.renderer);
687
659
  }
688
660
  }
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.107",
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;
@@ -37,7 +37,7 @@ declare class ThreeUtils extends EventDispatcher {
37
37
  center(object3d: Object3D | BufferGeometry): void;
38
38
  scaleTo(object3d: Object3D | BufferGeometry, size?: number, key?: Array<"x" | "y" | "z">): void;
39
39
  applyAllTranstion(object3d: Object3D): void;
40
- exportGLB(input: Object3D, fileName?: string): void;
40
+ exportGLB(input: Object3D, fileName?: string, maxTextureSize?: number): void;
41
41
  exportUsdz(): void;
42
42
  getVolume(geometry: BufferGeometry): number;
43
43
  signedVolumeOfTriangle(p1: Vector3, p2: Vector3, p3: Vector3): number;
@@ -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() {
@@ -187,7 +187,7 @@ class ThreeUtils extends EventDispatcher {
187
187
  });
188
188
  }
189
189
  // 导出 glb
190
- exportGLB(input, fileName = "threeUtils.exportGLB") {
190
+ exportGLB(input, fileName = "threeUtils.exportGLB", maxTextureSize = 4096) {
191
191
  const gltfExporter = new GLTFExporter();
192
192
  gltfExporter.parse(input, (result) => {
193
193
  if (result instanceof ArrayBuffer) {
@@ -202,7 +202,7 @@ class ThreeUtils extends EventDispatcher {
202
202
  trs: true,
203
203
  onlyVisible: true,
204
204
  binary: true,
205
- maxTextureSize: 4096,
205
+ maxTextureSize: maxTextureSize,
206
206
  });
207
207
  }
208
208
  //导出usdz
@@ -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;