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.
- package/InstancedMeshBase.d.ts +1 -1
- package/ThreeBase.js +7 -2
- package/keyContorls.d.ts +1 -1
- package/package.json +1 -1
- package/pass/bloom_pass.d.ts +2 -0
- package/pass/bloom_pass.js +33 -0
- package/pass/cover_pass.js +30 -22
- package/threeUtils.d.ts +1 -1
- package/threeUtils.js +2 -2
- package/pass/bool_pass.d.ts +0 -0
- package/pass/bool_pass.js +0 -7
package/InstancedMeshBase.d.ts
CHANGED
|
@@ -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").
|
|
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
|
-
|
|
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").
|
|
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
|
@@ -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
|
+
}
|
package/pass/cover_pass.js
CHANGED
|
@@ -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,
|
|
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(
|
|
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("#
|
|
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(
|
|
74
|
-
|
|
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
|
-
|
|
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,
|
|
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(
|
|
110
|
-
renderer.
|
|
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.
|
|
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:
|
|
205
|
+
maxTextureSize: maxTextureSize,
|
|
206
206
|
});
|
|
207
207
|
}
|
|
208
208
|
//导出usdz
|
package/pass/bool_pass.d.ts
DELETED
|
File without changes
|