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.
- package/Fire/FireMaterial.js +1 -1
- package/InstancedMeshBase.d.ts +1 -1
- package/MeshBase.js +1 -0
- package/PlaneText.d.ts +2 -2
- package/ThreeBase.d.ts +1 -2
- package/ThreeBase.js +27 -57
- package/keyContorls.d.ts +1 -1
- package/package.json +1 -1
- package/pass/cover_pass.js +3 -0
- package/pass/glow_pass.js +40 -30
- package/pass/stroke_pass.js +3 -0
- package/shaders.d.ts +2 -1
- package/shaders.js +53 -11
- package/threeLoader.js +1 -1
- package/threeUtils.d.ts +3 -1
- package/threeUtils.js +37 -1
package/Fire/FireMaterial.js
CHANGED
|
@@ -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 *
|
|
51
|
+
vOpacity = min( influence * 100.0, 1.0 ) * progressNeg;
|
|
52
52
|
vSprite = sprite;
|
|
53
53
|
${ShaderChunk.logdepthbuf_vertex}
|
|
54
54
|
}
|
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").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
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").
|
|
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) |
|
|
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
|
|
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,
|
|
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
|
-
|
|
495
|
-
|
|
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
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
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 =
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
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
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
fullScreenMesh.material =
|
|
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
|
-
|
|
683
|
-
|
|
684
|
-
fullScreenMesh.material =
|
|
685
|
-
|
|
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").
|
|
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
package/pass/cover_pass.js
CHANGED
|
@@ -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, {
|
|
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, {
|
|
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.
|
|
332
|
+
new Vector2(0.0, 1.0),
|
|
324
333
|
new Vector2(0.259, 0.966),
|
|
325
|
-
new Vector2(0.
|
|
334
|
+
new Vector2(0.5, 0.866),
|
|
326
335
|
new Vector2(0.707, 0.707),
|
|
327
|
-
new Vector2(0.866, 0.
|
|
336
|
+
new Vector2(0.866, 0.5),
|
|
328
337
|
new Vector2(0.966, 0.259),
|
|
329
|
-
new Vector2(1.
|
|
338
|
+
new Vector2(1.0, 0.0),
|
|
330
339
|
new Vector2(0.966, -0.259),
|
|
331
|
-
new Vector2(0.866, -0.
|
|
340
|
+
new Vector2(0.866, -0.5),
|
|
332
341
|
new Vector2(0.707, -0.707),
|
|
333
|
-
new Vector2(0.
|
|
342
|
+
new Vector2(0.5, -0.866),
|
|
334
343
|
new Vector2(0.259, -0.966),
|
|
335
|
-
new Vector2(0.
|
|
344
|
+
new Vector2(0.0, -1.0),
|
|
336
345
|
new Vector2(-0.259, -0.966),
|
|
337
|
-
new Vector2(-0.
|
|
346
|
+
new Vector2(-0.5, -0.866),
|
|
338
347
|
new Vector2(-0.707, -0.707),
|
|
339
|
-
new Vector2(-0.866, -0.
|
|
348
|
+
new Vector2(-0.866, -0.5),
|
|
340
349
|
new Vector2(-0.966, -0.259),
|
|
341
|
-
new Vector2(-1.
|
|
350
|
+
new Vector2(-1.0, -0.0),
|
|
342
351
|
new Vector2(-0.966, 0.259),
|
|
343
|
-
new Vector2(-0.866, 0.
|
|
352
|
+
new Vector2(-0.866, 0.5),
|
|
344
353
|
new Vector2(-0.707, 0.707),
|
|
345
|
-
new Vector2(-0.
|
|
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 =
|
|
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.
|
|
574
|
+
// copyShader.uniforms.map.value = blur2TextureTarget.texture;
|
|
565
575
|
// fsQuad.render(renderer, copyShader);
|
|
566
576
|
// return;
|
|
567
577
|
}
|
package/pass/stroke_pass.js
CHANGED
|
@@ -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
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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) => /\.
|
|
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;
|