three-base 2.0.106 → 2.0.108

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.
@@ -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").DebouncedFuncLeading<() => void>;
21
+ computeBoundingSphere: import("lodash").DebouncedFunc<() => 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/ThreeBase.js CHANGED
@@ -5,7 +5,7 @@
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";
@@ -16,6 +16,7 @@ import { baseTextureToRenderShader, clearShader, copyShader, fullScreenMesh, gau
16
16
  import threeLoader from "./threeLoader";
17
17
  import threeUtils from "./threeUtils";
18
18
  import cover_pass from "./pass/cover_pass";
19
+ import bloom_pass from "./pass/bloom_pass";
19
20
  // three.js 的基础对象
20
21
  export default class ThreeBase extends EventDispatcher {
21
22
  constructor() {
@@ -100,7 +101,9 @@ export default class ThreeBase extends EventDispatcher {
100
101
  renderer.setPixelRatio(window.devicePixelRatio);
101
102
  renderer.autoClear = false;
102
103
  renderer.clear();
103
- // renderer.outputColorSpace = SRGBColorSpace;
104
+ renderer.outputColorSpace = SRGBColorSpace;
105
+ // 缓解过暗或者过亮
106
+ renderer.toneMapping = ReinhardToneMapping;
104
107
  threeLoader.setAnisotropy(renderer.capabilities.getMaxAnisotropy());
105
108
  return renderer;
106
109
  })();
@@ -490,6 +493,8 @@ export default class ThreeBase extends EventDispatcher {
490
493
  glow_pass(this.renderer, camera, obj, this.baseDepthTexture);
491
494
  cover_pass(this.renderer, camera, obj, this.baseDepthTexture);
492
495
  });
496
+ //后处理发光特效
497
+ bloom_pass(this.renderer, camera, this.scene, this.baseDepthTexture);
493
498
  this.dispatchEvent({ type: "afterRender" });
494
499
  }
495
500
  renderBindThis = this.render.bind(this);
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").DebouncedFuncLeading<(type: string) => void>;
19
+ removeEvent: import("lodash").DebouncedFunc<(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.106",
3
+ "version": "2.0.108",
4
4
  "description": "three 3d three-base",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -0,0 +1,2 @@
1
+ import { WebGLRenderer, Camera, DepthTexture, Scene } from "three";
2
+ export default function bloom_pass(renderer: WebGLRenderer, camera: Camera, scene: Scene, baseDepthTexture: DepthTexture): void;
@@ -0,0 +1,33 @@
1
+ /*
2
+ * @Author: xiaosihan
3
+ * @Date: 2024-09-23 21:51:29
4
+ * @Last Modified by: xiaosihan
5
+ * @Last Modified time: 2024-09-23 21:51:29
6
+ */
7
+ import { DepthTexture, DepthFormat, LinearFilter, RGBAFormat, UnsignedShortType, WebGLRenderTarget, } from "three";
8
+ // 选中对象的深度纹理
9
+ const selectDepthTexture = (() => {
10
+ const baseDepthTexture = new DepthTexture(4096, 4096);
11
+ baseDepthTexture.format = DepthFormat;
12
+ baseDepthTexture.type = UnsignedShortType;
13
+ baseDepthTexture.anisotropy = 16;
14
+ return baseDepthTexture;
15
+ })();
16
+ // 选中对象的纹理
17
+ const selectTextureTarget = new WebGLRenderTarget(512, 512, {
18
+ minFilter: LinearFilter,
19
+ magFilter: LinearFilter,
20
+ format: RGBAFormat,
21
+ depthTexture: selectDepthTexture,
22
+ anisotropy: 16,
23
+ });
24
+ // 深度测试后的选中纹理
25
+ const selectDethpTestTextureTarget = new WebGLRenderTarget(512, 512, {
26
+ minFilter: LinearFilter,
27
+ magFilter: LinearFilter,
28
+ format: RGBAFormat,
29
+ anisotropy: 16,
30
+ });
31
+ // 发光后期通道
32
+ export default function bloom_pass(renderer, camera, scene, baseDepthTexture) {
33
+ }
@@ -10,12 +10,11 @@
10
10
  * @Last Modified by: xiaosihan
11
11
  * @Last Modified time: 2023-05-09 02:33:28
12
12
  */
13
- import { Color, DepthFormat, DepthTexture, LinearFilter, NoBlending, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget } from "three";
14
- import copyShader from "../shaders/copyShader";
13
+ import { Color, DepthFormat, DepthTexture, LinearFilter, RGBAFormat, Scene, ShaderChunk, ShaderMaterial, UnsignedShortType, Vector2, WebGLRenderTarget, } from "three";
15
14
  import FullScreenQuad from "./FullScreenQuad";
16
15
  // 选中对象的深度纹理
17
16
  const selectDepthTexture = (() => {
18
- const baseDepthTexture = new DepthTexture(4096, 4096);
17
+ const baseDepthTexture = new DepthTexture(1024, 1024);
19
18
  baseDepthTexture.format = DepthFormat;
20
19
  baseDepthTexture.type = UnsignedShortType;
21
20
  baseDepthTexture.anisotropy = 16;
@@ -47,7 +46,9 @@ const fsQuad = new FullScreenQuad(); // 渲染辅助器
47
46
  //深度比对纹理
48
47
  const depthTestShader = new ShaderMaterial({
49
48
  uniforms: {
50
- color: { value: new Color("#000000") },
49
+ color: { value: new Color("#440000") },
50
+ opacity: { value: 1 },
51
+ depthTest: { value: true },
51
52
  baseDepth: { value: null },
52
53
  selectDepth: { value: null }, // 选中的对象深度纹理
53
54
  },
@@ -66,21 +67,31 @@ const depthTestShader = new ShaderMaterial({
66
67
  fragmentShader: `
67
68
  ${ShaderChunk.logdepthbuf_pars_fragment}
68
69
  uniform vec3 color;
70
+ uniform float opacity;
71
+ uniform bool depthTest;
69
72
  uniform sampler2D baseDepth;
70
73
  uniform sampler2D selectDepth;
71
74
  varying vec2 vUv;
72
75
  void main() {
73
- if(texture2D(baseDepth, vUv).r + 0.0001 < texture2D(selectDepth, vUv).r){
74
- discard;
76
+ if( depthTest ){
77
+ if(texture2D(baseDepth, vUv).r + 0.0001 < texture2D(selectDepth, vUv).r){
78
+ discard;
79
+ }
80
+ if(texture2D(baseDepth, vUv).r == 1.0){
81
+ discard;
82
+ }
83
+ gl_FragColor = vec4(color, opacity);
84
+ }else{
85
+ if(texture2D(selectDepth, vUv).r < 1.0){
86
+ gl_FragColor = vec4(color, opacity);
87
+ }else{
88
+ discard;
89
+ }
75
90
  }
76
- if(texture2D(baseDepth, vUv).r == 1.0){
77
- discard;
78
- }
79
- gl_FragColor = vec4(color, 1.0);
91
+
80
92
  ${ShaderChunk.logdepthbuf_fragment}
81
93
  }
82
94
  `,
83
- blending: NoBlending,
84
95
  depthTest: true,
85
96
  depthWrite: true,
86
97
  transparent: true,
@@ -89,7 +100,8 @@ const depthTestShader = new ShaderMaterial({
89
100
  const scene = new Scene();
90
101
  // 给模型覆盖一层颜色 后处理通道
91
102
  export default function cover_pass(renderer, camera, object3d, baseDepthTexture) {
92
- const { cover_enable = false, cover_color = "#04fa12", cover_opacity = 1, } = object3d.userData;
103
+ const { cover_enable = false, cover_color = "#04fa12", cover_opacity = 1, cover_depth_test = true, // 颜色叠加是否开启深度测试
104
+ } = object3d.userData;
93
105
  if (!cover_enable || cover_opacity === 0) {
94
106
  return;
95
107
  }
@@ -105,23 +117,19 @@ export default function cover_pass(renderer, camera, object3d, baseDepthTexture)
105
117
  scene.children = [object3d];
106
118
  renderer.clear();
107
119
  renderer.render(scene, camera);
108
- //深度测试
109
- renderer.setRenderTarget(selectDethpTestTextureTarget);
110
- renderer.clear();
120
+ //更具深度测试绘制叠加颜色
121
+ renderer.setRenderTarget(originRenderTarget);
122
+ renderer.clearDepth();
111
123
  depthTestShader.uniforms.color.value.set(cover_color);
124
+ depthTestShader.uniforms.opacity.value = cover_opacity;
125
+ depthTestShader.uniforms.depthTest.value = cover_depth_test;
112
126
  depthTestShader.uniforms.baseDepth.value = baseDepthTexture;
113
127
  depthTestShader.uniforms.selectDepth.value = selectDepthTexture;
114
128
  fsQuad.render(renderer, depthTestShader);
115
- // 颜色覆盖绘制到着色器
116
- renderer.setRenderTarget(originRenderTarget);
117
- renderer.clearDepth();
118
- copyShader.uniforms.map.value = selectDethpTestTextureTarget.texture;
119
- copyShader.uniforms.opacity.value = cover_opacity;
120
- fsQuad.render(renderer, copyShader);
121
129
  // 调试代码
122
130
  // renderer.setRenderTarget(null);
123
131
  // renderer.clearDepth();
124
- // copyShader.uniforms.tDiffuse.value = blur2TextureTarget.texture;
132
+ // copyShader.uniforms.map.value = blur2TextureTarget.texture;
125
133
  // fsQuad.render(renderer, copyShader);
126
134
  // return;
127
135
  }
package/threeUtils.d.ts CHANGED
@@ -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;
package/threeUtils.js CHANGED
@@ -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
File without changes
package/pass/bool_pass.js DELETED
@@ -1,7 +0,0 @@
1
- /*
2
- * @Author: xiaosihan
3
- * @Date: 2024-09-23 21:51:29
4
- * @Last Modified by: xiaosihan
5
- * @Last Modified time: 2024-09-23 21:51:29
6
- */
7
- // 发光后期通道