three-base 2.0.21 → 2.0.22
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/ThreeBase.js +20 -17
- package/ThreeBase.ts +20 -16
- package/package.json +1 -1
- package/lib/draco/draco_encoder.js +0 -33
package/ThreeBase.js
CHANGED
|
@@ -5,16 +5,16 @@
|
|
|
5
5
|
* @Last Modified time: 2023-05-23 23:54:13
|
|
6
6
|
*/
|
|
7
7
|
import { round } from "lodash";
|
|
8
|
-
import { AxesHelper, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
8
|
+
import { AxesHelper, DepthFormat, DepthTexture, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NoColorSpace, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
9
9
|
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
10
10
|
import { generateUUID } from "three/src/math/MathUtils";
|
|
11
|
+
import glow_pass from "./pass/glow_pass";
|
|
12
|
+
import stroke_pass from "./pass/stroke_pass";
|
|
11
13
|
import { clearShader, coptyShader, fullScreenMesh, gaussBlurShader, strokeShader } from "./shaders";
|
|
12
14
|
import threeLoader from "./threeLoader";
|
|
13
15
|
import ThreeMouse from "./ThreeMouse";
|
|
14
16
|
import threeUtils from "./threeUtils";
|
|
15
17
|
import Transition from "./Transition";
|
|
16
|
-
import stroke_pass from "./pass/stroke_pass";
|
|
17
|
-
import glow_pass from "./pass/glow_pass";
|
|
18
18
|
// three.js 的基础对象
|
|
19
19
|
export default class ThreeBase extends EventDispatcher {
|
|
20
20
|
constructor() {
|
|
@@ -64,6 +64,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
64
64
|
});
|
|
65
65
|
renderer.domElement.id = generateUUID();
|
|
66
66
|
renderer.localClippingEnabled = true;
|
|
67
|
+
renderer.outputColorSpace = NoColorSpace;
|
|
67
68
|
renderer.setPixelRatio(window.devicePixelRatio);
|
|
68
69
|
renderer.autoClear = false;
|
|
69
70
|
renderer.clear();
|
|
@@ -95,9 +96,6 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
95
96
|
div.style.overflow = "hidden";
|
|
96
97
|
div.innerHTML = "";
|
|
97
98
|
div.append(this.renderer.domElement);
|
|
98
|
-
// this.renderer.forceContextLoss();
|
|
99
|
-
// await new Promise(resolve => requestAnimationFrame(resolve));
|
|
100
|
-
// await new Promise(resolve => requestAnimationFrame(resolve));
|
|
101
99
|
this.renderer.forceContextRestore();
|
|
102
100
|
this.renderer.domElement.style.opacity = "1";
|
|
103
101
|
this.setSize(div.clientWidth, div.clientHeight);
|
|
@@ -114,7 +112,11 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
114
112
|
}
|
|
115
113
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
116
114
|
this.renderer.setSize(width, height);
|
|
115
|
+
// 设置帧缓存区的尺寸
|
|
117
116
|
this.baseRenderTarget.setSize(width * window.devicePixelRatio, height * window.devicePixelRatio);
|
|
117
|
+
// 设置深度纹理的尺寸
|
|
118
|
+
this.baseDepthTexture.image.width = width * window.devicePixelRatio;
|
|
119
|
+
this.baseDepthTexture.image.height = height * window.devicePixelRatio;
|
|
118
120
|
this.size.set(width, height);
|
|
119
121
|
// 渲染场景
|
|
120
122
|
// this.renderer.clear();
|
|
@@ -142,11 +144,11 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
142
144
|
const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
|
|
143
145
|
controlsPosition.setDuration(1000);
|
|
144
146
|
controlsPosition.onChange(({ x, y, z }) => {
|
|
145
|
-
const distance = this.controlsDistance.get("distance");
|
|
146
|
-
this.camera.position.set(x + 0.01, y, z + 0.01)
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
// const distance = this.controlsDistance.get("distance");
|
|
148
|
+
this.camera.position.set(x + 0.01, y, z + 0.01);
|
|
149
|
+
// .sub(this.controls.target)
|
|
150
|
+
// .setLength(distance)
|
|
151
|
+
// .add(this.controls.target);
|
|
150
152
|
// // 创建初始方向向量
|
|
151
153
|
// const directionVecA = new THREE.Vector3(1, 0, 0); // 需要旋转的初始方向向量
|
|
152
154
|
// const referenceVecB = new THREE.Vector3(0, 1, 0); // 参考方向向量,用于确定旋转轴
|
|
@@ -303,14 +305,15 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
303
305
|
}
|
|
304
306
|
// 渲染场景
|
|
305
307
|
this.dispatchEvent({ type: "beforeRender" });
|
|
306
|
-
//
|
|
308
|
+
// 把基础场景渲染到 帧缓冲区 在后期通道中会用到
|
|
309
|
+
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
307
310
|
this.renderer.clear();
|
|
308
311
|
this.renderer.render(this.scene, this.camera);
|
|
309
|
-
//
|
|
310
|
-
|
|
311
|
-
|
|
312
|
+
// 清空主画布
|
|
313
|
+
this.renderer.setRenderTarget(null);
|
|
314
|
+
this.renderer.clear();
|
|
312
315
|
// this.renderer.setScissorTest(false);
|
|
313
|
-
|
|
316
|
+
this.renderRendererTarget(this.baseRenderTarget);
|
|
314
317
|
// this.renderer.setScissorTest(true);
|
|
315
318
|
// this.renderer.setScissor(0, 0, 800, 1000);
|
|
316
319
|
// this.renderer.render(this.scene, this.camera);
|
|
@@ -442,7 +445,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
442
445
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
443
446
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
444
447
|
}
|
|
445
|
-
// 渲染 渲染目标
|
|
448
|
+
// TODO 需要做康锯齿处理 渲染 渲染目标
|
|
446
449
|
renderRendererTarget(renderTarget, alpha = false) {
|
|
447
450
|
coptyShader.uniforms.map.value = renderTarget.texture;
|
|
448
451
|
coptyShader.uniforms.opacity.value = 1.0;
|
package/ThreeBase.ts
CHANGED
|
@@ -6,16 +6,16 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { round } from "lodash";
|
|
9
|
-
import { AxesHelper, BufferGeometry, Camera, DepthFormat, DepthTexture, DisplayP3ColorSpace, EventDispatcher, GridHelper,
|
|
9
|
+
import { AxesHelper, BufferGeometry, Camera, DepthFormat, DepthTexture, DisplayP3ColorSpace, EventDispatcher, GridHelper, LinearDisplayP3ColorSpace, LinearFilter, LinearSRGBColorSpace, Mesh, MeshBasicMaterial, MOUSE, NoBlending, NoColorSpace, NormalBlending, Object3D, PerspectiveCamera, RGBAFormat, Scene, SRGBColorSpace, Texture, TOUCH, UnsignedShortType, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
10
10
|
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
11
11
|
import { generateUUID } from "three/src/math/MathUtils";
|
|
12
|
+
import glow_pass from "./pass/glow_pass";
|
|
13
|
+
import stroke_pass from "./pass/stroke_pass";
|
|
12
14
|
import { clearShader, coptyShader, fullScreenMesh, gaussBlurShader, strokeShader } from "./shaders";
|
|
13
15
|
import threeLoader from "./threeLoader";
|
|
14
16
|
import ThreeMouse from "./ThreeMouse";
|
|
15
17
|
import threeUtils from "./threeUtils";
|
|
16
18
|
import Transition from "./Transition";
|
|
17
|
-
import stroke_pass from "./pass/stroke_pass";
|
|
18
|
-
import glow_pass from "./pass/glow_pass";
|
|
19
19
|
|
|
20
20
|
// three.js 的基础对象
|
|
21
21
|
export default class ThreeBase extends EventDispatcher {
|
|
@@ -76,6 +76,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
76
76
|
|
|
77
77
|
renderer.domElement.id = generateUUID();
|
|
78
78
|
renderer.localClippingEnabled = true;
|
|
79
|
+
renderer.outputColorSpace = NoColorSpace;
|
|
79
80
|
renderer.setPixelRatio(window.devicePixelRatio);
|
|
80
81
|
renderer.autoClear = false;
|
|
81
82
|
renderer.clear();
|
|
@@ -113,9 +114,6 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
113
114
|
div.innerHTML = "";
|
|
114
115
|
div.append(this.renderer.domElement);
|
|
115
116
|
|
|
116
|
-
// this.renderer.forceContextLoss();
|
|
117
|
-
// await new Promise(resolve => requestAnimationFrame(resolve));
|
|
118
|
-
// await new Promise(resolve => requestAnimationFrame(resolve));
|
|
119
117
|
this.renderer.forceContextRestore();
|
|
120
118
|
this.renderer.domElement.style.opacity = "1";
|
|
121
119
|
|
|
@@ -137,8 +135,13 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
137
135
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
138
136
|
this.renderer.setSize(width, height);
|
|
139
137
|
|
|
138
|
+
// 设置帧缓存区的尺寸
|
|
140
139
|
this.baseRenderTarget.setSize(width * window.devicePixelRatio, height * window.devicePixelRatio);
|
|
141
140
|
|
|
141
|
+
// 设置深度纹理的尺寸
|
|
142
|
+
this.baseDepthTexture.image.width = width * window.devicePixelRatio;
|
|
143
|
+
this.baseDepthTexture.image.height = height * window.devicePixelRatio;
|
|
144
|
+
|
|
142
145
|
this.size.set(width, height);
|
|
143
146
|
// 渲染场景
|
|
144
147
|
// this.renderer.clear();
|
|
@@ -169,11 +172,11 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
169
172
|
const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
|
|
170
173
|
controlsPosition.setDuration(1000);
|
|
171
174
|
controlsPosition.onChange(({ x, y, z }) => {
|
|
172
|
-
const distance = this.controlsDistance.get("distance");
|
|
175
|
+
// const distance = this.controlsDistance.get("distance");
|
|
173
176
|
this.camera.position.set(x + 0.01, y, z + 0.01)
|
|
174
|
-
.sub(this.controls.target)
|
|
175
|
-
.setLength(distance)
|
|
176
|
-
.add(this.controls.target);
|
|
177
|
+
// .sub(this.controls.target)
|
|
178
|
+
// .setLength(distance)
|
|
179
|
+
// .add(this.controls.target);
|
|
177
180
|
|
|
178
181
|
// // 创建初始方向向量
|
|
179
182
|
// const directionVecA = new THREE.Vector3(1, 0, 0); // 需要旋转的初始方向向量
|
|
@@ -375,16 +378,17 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
375
378
|
// 渲染场景
|
|
376
379
|
this.dispatchEvent({ type: "beforeRender" } as never);
|
|
377
380
|
|
|
378
|
-
//
|
|
381
|
+
// 把基础场景渲染到 帧缓冲区 在后期通道中会用到
|
|
382
|
+
this.renderer.setRenderTarget(this.baseRenderTarget);
|
|
379
383
|
this.renderer.clear();
|
|
380
384
|
this.renderer.render(this.scene, this.camera);
|
|
381
385
|
|
|
382
|
-
//
|
|
383
|
-
|
|
386
|
+
// 清空主画布
|
|
387
|
+
this.renderer.setRenderTarget(null);
|
|
388
|
+
this.renderer.clear();
|
|
384
389
|
|
|
385
|
-
//TODO 渲染了2次, 还有优化空间
|
|
386
390
|
// this.renderer.setScissorTest(false);
|
|
387
|
-
|
|
391
|
+
this.renderRendererTarget(this.baseRenderTarget);
|
|
388
392
|
// this.renderer.setScissorTest(true);
|
|
389
393
|
// this.renderer.setScissor(0, 0, 800, 1000);
|
|
390
394
|
// this.renderer.render(this.scene, this.camera);
|
|
@@ -542,7 +546,7 @@ export default class ThreeBase extends EventDispatcher {
|
|
|
542
546
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
543
547
|
}
|
|
544
548
|
|
|
545
|
-
// 渲染 渲染目标
|
|
549
|
+
// TODO 需要做康锯齿处理 渲染 渲染目标
|
|
546
550
|
renderRendererTarget(renderTarget: WebGLRenderTarget, alpha: boolean = false) {
|
|
547
551
|
coptyShader.uniforms.map.value = renderTarget.texture;
|
|
548
552
|
coptyShader.uniforms.opacity.value = 1.0;
|