three-base 1.0.82 → 1.0.84
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/index.js +1 -1
- package/index.ts +1 -1
- package/lib/ApngTexture.js +40 -107
- package/lib/ApngTextureManage.js +51 -100
- package/lib/EventMesh.js +22 -42
- package/lib/ExtrudeMesh.js +147 -178
- package/lib/FPScontrol.js +116 -133
- package/lib/InstancedGroupMesh.js +25 -45
- package/lib/KeyFrameAnimation.js +37 -54
- package/lib/PlaneText.d.ts +2 -2
- package/lib/PlaneText.js +16 -36
- package/lib/PlaneText.ts +2 -3
- package/lib/PlaneWithHtml.js +48 -126
- package/lib/PointLight/PointLight.d.ts +2 -2
- package/lib/PointLight/PointLight.js +47 -67
- package/lib/PointLight/PointLight.ts +3 -3
- package/lib/Sky/Sky.js +11 -30
- package/lib/SpriteText.d.ts +45 -0
- package/lib/SpriteText.js +162 -0
- package/lib/SpriteText.ts +189 -0
- package/lib/SpriteText2.d.ts +4 -4
- package/lib/SpriteText2.js +90 -166
- package/lib/Text3D/Text3D.js +40 -61
- package/lib/Text3D/fontController.js +149 -284
- package/lib/ThreeBase.js +204 -341
- package/lib/ThreeMouse.js +244 -203
- package/lib/Transition.js +95 -161
- package/lib/keyContorls.js +74 -102
- package/lib/planeModal1/PlaneModal1.js +90 -162
- package/lib/shaders.js +178 -36
- package/lib/spriteModal1/SpriteModal1.js +93 -165
- package/lib/threeLoader.js +66 -89
- package/lib/threeUtils.js +61 -85
- package/lib/threeUtils.ts +2 -1
- package/package.json +3 -5
package/lib/ThreeBase.js
CHANGED
|
@@ -4,66 +4,6 @@
|
|
|
4
4
|
* @Last Modified by: xiaosihan
|
|
5
5
|
* @Last Modified time: 2023-03-16 14:31:32
|
|
6
6
|
*/
|
|
7
|
-
var __extends = (this && this.__extends) || (function () {
|
|
8
|
-
var extendStatics = function (d, b) {
|
|
9
|
-
extendStatics = Object.setPrototypeOf ||
|
|
10
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
11
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
12
|
-
return extendStatics(d, b);
|
|
13
|
-
};
|
|
14
|
-
return function (d, b) {
|
|
15
|
-
if (typeof b !== "function" && b !== null)
|
|
16
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
17
|
-
extendStatics(d, b);
|
|
18
|
-
function __() { this.constructor = d; }
|
|
19
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
20
|
-
};
|
|
21
|
-
})();
|
|
22
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
23
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
24
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
25
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
26
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
27
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
28
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
29
|
-
});
|
|
30
|
-
};
|
|
31
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
32
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
33
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
34
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
35
|
-
function step(op) {
|
|
36
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
37
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
38
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
39
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
40
|
-
switch (op[0]) {
|
|
41
|
-
case 0: case 1: t = op; break;
|
|
42
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
43
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
44
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
45
|
-
default:
|
|
46
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
47
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
48
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
49
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
50
|
-
if (t[2]) _.ops.pop();
|
|
51
|
-
_.trys.pop(); continue;
|
|
52
|
-
}
|
|
53
|
-
op = body.call(thisArg, _);
|
|
54
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
55
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
59
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
60
|
-
if (ar || !(i in from)) {
|
|
61
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
62
|
-
ar[i] = from[i];
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
66
|
-
};
|
|
67
7
|
import { round } from "lodash";
|
|
68
8
|
import { AxesHelper, EventDispatcher, GridHelper, LinearFilter, Mesh, MOUSE, NoBlending, NormalBlending, PerspectiveCamera, RGBAFormat, Scene, TOUCH, Vector2, Vector3, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
69
9
|
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
|
|
@@ -74,128 +14,79 @@ import ThreeMouse from "./ThreeMouse";
|
|
|
74
14
|
import threeUtils from "./threeUtils";
|
|
75
15
|
import Transition from "./Transition";
|
|
76
16
|
// three.js 的基础对象
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
// 公用渲染目标1
|
|
82
|
-
_this.renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
83
|
-
// 渲染目标2
|
|
84
|
-
_this.renderTarget2 = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
85
|
-
// 公用二维向量
|
|
86
|
-
_this.tempVector2 = new Vector2();
|
|
87
|
-
// 公用的三维向量
|
|
88
|
-
_this.tempVector3 = new Vector3();
|
|
89
|
-
//渲染器的尺寸
|
|
90
|
-
_this.size = new Vector2(0, 0);
|
|
91
|
-
// 渲染器对象
|
|
92
|
-
_this.renderer = (function () {
|
|
93
|
-
var renderer = new WebGLRenderer({
|
|
94
|
-
alpha: true,
|
|
95
|
-
antialias: true,
|
|
96
|
-
precision: "highp",
|
|
97
|
-
logarithmicDepthBuffer: true,
|
|
98
|
-
preserveDrawingBuffer: false,
|
|
99
|
-
stencil: false, // 模版
|
|
100
|
-
});
|
|
101
|
-
renderer.domElement.id = generateUUID();
|
|
102
|
-
renderer.localClippingEnabled = true;
|
|
103
|
-
renderer.setPixelRatio(window.devicePixelRatio);
|
|
104
|
-
renderer.autoClear = false;
|
|
105
|
-
threeLoader.setAnisotropy(renderer.capabilities.getMaxAnisotropy());
|
|
106
|
-
return renderer;
|
|
107
|
-
})();
|
|
108
|
-
//透视相机
|
|
109
|
-
_this.camera = new PerspectiveCamera(45, 1, 0.0001, 10000);
|
|
110
|
-
// 场景对象
|
|
111
|
-
_this.scene = new Scene();
|
|
112
|
-
///鼠标事件对象
|
|
113
|
-
_this.threeMouse = new ThreeMouse(_this.renderer, _this.camera, _this.scene);
|
|
114
|
-
// 轨道控制器
|
|
115
|
-
_this.controls = (function () {
|
|
116
|
-
var controls = new OrbitControls(_this.camera, _this.renderer.domElement);
|
|
117
|
-
controls.addEventListener("change", function () {
|
|
118
|
-
_this.needRender = true;
|
|
119
|
-
});
|
|
120
|
-
controls.rotateSpeed = 0.2;
|
|
121
|
-
controls.maxPolarAngle = Math.PI;
|
|
122
|
-
controls.enableDamping = true;
|
|
123
|
-
controls.dampingFactor = 0.1;
|
|
124
|
-
controls.screenSpacePanning = true;
|
|
125
|
-
return controls;
|
|
126
|
-
})();
|
|
127
|
-
// 上下文是否被销毁了
|
|
128
|
-
_this.isRendererContextLost = false;
|
|
129
|
-
// 控制器的位置缓动的计算的顶点对象
|
|
130
|
-
_this.controlsPosition = (function () {
|
|
131
|
-
var controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
|
|
132
|
-
controlsPosition.setDuration(1000);
|
|
133
|
-
controlsPosition.onChange(function (_a) {
|
|
134
|
-
var x = _a.x, y = _a.y, z = _a.z;
|
|
135
|
-
_this.camera.position.set(x, y, z);
|
|
136
|
-
_this.camera.lookAt(_this.controls.target);
|
|
137
|
-
_this.needRender = true;
|
|
138
|
-
});
|
|
139
|
-
return controlsPosition;
|
|
140
|
-
})();
|
|
141
|
-
// 控制器的 朝向带缓动的计算的顶点对象
|
|
142
|
-
_this.controlsCenter = (function () {
|
|
143
|
-
var controlsCenter = new Transition({ x: 0, y: 0, z: 0 });
|
|
144
|
-
controlsCenter.setDuration(1000);
|
|
145
|
-
controlsCenter.onChange(function (_a) {
|
|
146
|
-
var x = _a.x, y = _a.y, z = _a.z;
|
|
147
|
-
_this.controls.target.set(x, y, z);
|
|
148
|
-
_this.camera.lookAt(_this.controls.target);
|
|
149
|
-
_this.needRender = true;
|
|
150
|
-
});
|
|
151
|
-
return controlsCenter;
|
|
152
|
-
})();
|
|
153
|
-
// 控制器类型
|
|
154
|
-
_this.controlType = "OrbitControls";
|
|
155
|
-
// 记录一下空间平移方式 在切换控制器的时候保留一下平移方式
|
|
156
|
-
_this.originScreenSpacePanning = false;
|
|
157
|
-
// 是否自动渲染
|
|
158
|
-
_this.autoRender = true;
|
|
159
|
-
//是否需要渲染, 当autoRender=false的时候就需要 手动触发渲染
|
|
160
|
-
_this.needRender = false;
|
|
161
|
-
_this.renderBindThis = _this.render.bind(_this);
|
|
162
|
-
_this._preMesh = new Mesh();
|
|
163
|
-
_this._preRT = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
164
|
-
_this.init();
|
|
165
|
-
return _this;
|
|
17
|
+
export default class ThreeBase extends EventDispatcher {
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
this.init();
|
|
166
21
|
}
|
|
167
|
-
//
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
case 3:
|
|
187
|
-
this.setsize(div.clientWidth, div.clientHeight);
|
|
188
|
-
// 开启时时渲染
|
|
189
|
-
threeUtils.removeEventListener("requestAnimationFrame", this.renderBindThis);
|
|
190
|
-
threeUtils.addEventListener("requestAnimationFrame", this.renderBindThis);
|
|
191
|
-
_a.label = 4;
|
|
192
|
-
case 4: return [2 /*return*/];
|
|
193
|
-
}
|
|
194
|
-
});
|
|
22
|
+
// 公用渲染目标1
|
|
23
|
+
renderTarget = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
24
|
+
// 渲染目标2
|
|
25
|
+
renderTarget2 = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
26
|
+
// 公用二维向量
|
|
27
|
+
tempVector2 = new Vector2();
|
|
28
|
+
// 公用的三维向量
|
|
29
|
+
tempVector3 = new Vector3();
|
|
30
|
+
//渲染器的尺寸
|
|
31
|
+
size = new Vector2(0, 0);
|
|
32
|
+
// 渲染器对象
|
|
33
|
+
renderer = (() => {
|
|
34
|
+
const renderer = new WebGLRenderer({
|
|
35
|
+
alpha: true,
|
|
36
|
+
antialias: true,
|
|
37
|
+
precision: "highp",
|
|
38
|
+
logarithmicDepthBuffer: true,
|
|
39
|
+
preserveDrawingBuffer: false,
|
|
40
|
+
stencil: false, // 模版
|
|
195
41
|
});
|
|
196
|
-
|
|
42
|
+
renderer.domElement.id = generateUUID();
|
|
43
|
+
renderer.localClippingEnabled = true;
|
|
44
|
+
renderer.setPixelRatio(window.devicePixelRatio);
|
|
45
|
+
renderer.autoClear = false;
|
|
46
|
+
threeLoader.setAnisotropy(renderer.capabilities.getMaxAnisotropy());
|
|
47
|
+
return renderer;
|
|
48
|
+
})();
|
|
49
|
+
//透视相机
|
|
50
|
+
camera = new PerspectiveCamera(45, 1, 0.0001, 10000);
|
|
51
|
+
// 场景对象
|
|
52
|
+
scene = new Scene();
|
|
53
|
+
///鼠标事件对象
|
|
54
|
+
threeMouse = new ThreeMouse(this.renderer, this.camera, this.scene);
|
|
55
|
+
// 轨道控制器
|
|
56
|
+
controls = (() => {
|
|
57
|
+
const controls = new OrbitControls(this.camera, this.renderer.domElement);
|
|
58
|
+
controls.addEventListener("change", () => {
|
|
59
|
+
this.needRender = true;
|
|
60
|
+
});
|
|
61
|
+
controls.rotateSpeed = 0.2;
|
|
62
|
+
controls.maxPolarAngle = Math.PI;
|
|
63
|
+
controls.enableDamping = true;
|
|
64
|
+
controls.dampingFactor = 0.1;
|
|
65
|
+
controls.screenSpacePanning = true;
|
|
66
|
+
return controls;
|
|
67
|
+
})();
|
|
68
|
+
// 上下文是否被销毁了
|
|
69
|
+
isRendererContextLost = false;
|
|
70
|
+
// 设置 dom 容器
|
|
71
|
+
async setContainer(div) {
|
|
72
|
+
if (div) {
|
|
73
|
+
div.innerHTML = "";
|
|
74
|
+
div.append(this.renderer.domElement);
|
|
75
|
+
// 如果上下文被销毁了, 就恢复上下文
|
|
76
|
+
if (this.isRendererContextLost) {
|
|
77
|
+
this.renderer.forceContextRestore();
|
|
78
|
+
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
79
|
+
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
80
|
+
this.renderer.domElement.style.opacity = "1";
|
|
81
|
+
}
|
|
82
|
+
this.setsize(div.clientWidth, div.clientHeight);
|
|
83
|
+
// 开启时时渲染
|
|
84
|
+
threeUtils.removeEventListener("requestAnimationFrame", this.renderBindThis);
|
|
85
|
+
threeUtils.addEventListener("requestAnimationFrame", this.renderBindThis);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
197
88
|
// 修改尺寸
|
|
198
|
-
|
|
89
|
+
setsize(width, height) {
|
|
199
90
|
if (this.camera instanceof PerspectiveCamera) {
|
|
200
91
|
this.camera.aspect = width / height;
|
|
201
92
|
this.camera.updateProjectionMatrix();
|
|
@@ -206,25 +97,45 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
206
97
|
// 渲染场景
|
|
207
98
|
this.renderer.clear();
|
|
208
99
|
this.renderer.render(this.scene, this.camera);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
100
|
+
}
|
|
101
|
+
// 控制器的位置缓动的计算的顶点对象
|
|
102
|
+
controlsPosition = (() => {
|
|
103
|
+
const controlsPosition = new Transition({ x: 100, y: 100, z: 100 });
|
|
104
|
+
controlsPosition.setDuration(1000);
|
|
105
|
+
controlsPosition.onChange(({ x, y, z }) => {
|
|
106
|
+
this.camera.position.set(x, y, z);
|
|
107
|
+
this.camera.lookAt(this.controls.target);
|
|
108
|
+
this.needRender = true;
|
|
109
|
+
});
|
|
110
|
+
return controlsPosition;
|
|
111
|
+
})();
|
|
112
|
+
// 控制器的 朝向带缓动的计算的顶点对象
|
|
113
|
+
controlsCenter = (() => {
|
|
114
|
+
const controlsCenter = new Transition({ x: 0, y: 0, z: 0 });
|
|
115
|
+
controlsCenter.setDuration(1000);
|
|
116
|
+
controlsCenter.onChange(({ x, y, z }) => {
|
|
117
|
+
this.controls.target.set(x, y, z);
|
|
118
|
+
this.camera.lookAt(this.controls.target);
|
|
119
|
+
this.needRender = true;
|
|
120
|
+
});
|
|
121
|
+
return controlsCenter;
|
|
122
|
+
})();
|
|
123
|
+
init() {
|
|
212
124
|
// 非开发模式添加网格辅助线
|
|
213
125
|
if (threeUtils.isDev) {
|
|
214
|
-
|
|
126
|
+
const gridHelper = new GridHelper(1000, 100, 0x303030, 0x303030);
|
|
215
127
|
gridHelper.position.set(0, -0.001, 0);
|
|
216
128
|
this.scene.add(gridHelper);
|
|
217
|
-
|
|
129
|
+
const axesHelper = new AxesHelper(10000);
|
|
218
130
|
this.scene.add(axesHelper);
|
|
219
131
|
}
|
|
220
132
|
// 资源加载进度有更新时, 需要渲染
|
|
221
|
-
threeLoader.addEventListener("progress",
|
|
222
|
-
|
|
133
|
+
threeLoader.addEventListener("progress", () => {
|
|
134
|
+
this.needRender = true;
|
|
223
135
|
});
|
|
224
|
-
}
|
|
136
|
+
}
|
|
225
137
|
// 重置控制器的位置
|
|
226
|
-
|
|
227
|
-
var position = _a.position, center = _a.center;
|
|
138
|
+
resetLookAt({ position, center, }) {
|
|
228
139
|
// 停止控制器的惯性
|
|
229
140
|
this.controls.enableDamping = false;
|
|
230
141
|
this.controls.saveState();
|
|
@@ -234,85 +145,57 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
234
145
|
position && this.controlsPosition.reset({ x: position.x, y: position.y, z: position.z });
|
|
235
146
|
center && this.controlsCenter.reset({ x: center.x, y: center.y, z: center.z });
|
|
236
147
|
this.needRender = true;
|
|
237
|
-
}
|
|
148
|
+
}
|
|
238
149
|
// 设置控制器的位置 以动画的方式移动控制器
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
currentCenter = this.controls.target.clone();
|
|
255
|
-
// 等待动画执行完成
|
|
256
|
-
return [4 /*yield*/, Promise.all([
|
|
257
|
-
new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
258
|
-
return __generator(this, function (_a) {
|
|
259
|
-
switch (_a.label) {
|
|
260
|
-
case 0:
|
|
261
|
-
if (!position) return [3 /*break*/, 2];
|
|
262
|
-
this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
|
|
263
|
-
return [4 /*yield*/, this.controlsPosition.set({ x: position.x, y: position.y, z: position.z })];
|
|
264
|
-
case 1:
|
|
265
|
-
_a.sent();
|
|
266
|
-
_a.label = 2;
|
|
267
|
-
case 2:
|
|
268
|
-
resolve();
|
|
269
|
-
return [2 /*return*/];
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
}); }),
|
|
273
|
-
new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
|
|
274
|
-
return __generator(this, function (_a) {
|
|
275
|
-
switch (_a.label) {
|
|
276
|
-
case 0:
|
|
277
|
-
if (!center) return [3 /*break*/, 2];
|
|
278
|
-
this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
|
|
279
|
-
return [4 /*yield*/, this.controlsCenter.set({ x: center.x, y: center.y, z: center.z })];
|
|
280
|
-
case 1:
|
|
281
|
-
_a.sent();
|
|
282
|
-
_a.label = 2;
|
|
283
|
-
case 2:
|
|
284
|
-
resolve();
|
|
285
|
-
return [2 /*return*/];
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
}); }),
|
|
289
|
-
])];
|
|
290
|
-
case 1:
|
|
291
|
-
// 等待动画执行完成
|
|
292
|
-
_c.sent();
|
|
293
|
-
return [2 /*return*/];
|
|
150
|
+
async setLookAt({ position, center, duration = 1000 }) {
|
|
151
|
+
// 停止控制器的惯性
|
|
152
|
+
this.controls.enableDamping = false;
|
|
153
|
+
this.controls.saveState();
|
|
154
|
+
this.controls.update();
|
|
155
|
+
this.controls.reset();
|
|
156
|
+
this.controls.enableDamping = true;
|
|
157
|
+
let currentPosition = this.camera.position.clone();
|
|
158
|
+
let currentCenter = this.controls.target.clone();
|
|
159
|
+
// 等待动画执行完成
|
|
160
|
+
await Promise.all([
|
|
161
|
+
new Promise(async (resolve, reject) => {
|
|
162
|
+
if (position) {
|
|
163
|
+
this.controlsPosition.setDuration(duration).reset({ x: currentPosition.x, y: currentPosition.y, z: currentPosition.z });
|
|
164
|
+
await this.controlsPosition.set({ x: position.x, y: position.y, z: position.z });
|
|
294
165
|
}
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
166
|
+
resolve();
|
|
167
|
+
}),
|
|
168
|
+
new Promise(async (resolve, reject) => {
|
|
169
|
+
if (center) {
|
|
170
|
+
this.controlsCenter.setDuration(duration).reset({ x: currentCenter.x, y: currentCenter.y, z: currentCenter.z });
|
|
171
|
+
await this.controlsCenter.set({ x: center.x, y: center.y, z: center.z });
|
|
172
|
+
}
|
|
173
|
+
resolve();
|
|
174
|
+
}),
|
|
175
|
+
]);
|
|
176
|
+
}
|
|
298
177
|
// 获取控制的位置和朝向 保留3位小数
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
178
|
+
getLookAt() {
|
|
179
|
+
const position = this.camera.position.toArray().map(v => round(v, 3));
|
|
180
|
+
const center = this.controls.target.toArray().map(v => round(v, 3));
|
|
302
181
|
return {
|
|
303
|
-
center: new
|
|
304
|
-
position: new
|
|
305
|
-
centerPosition:
|
|
182
|
+
center: new Vector3(...center),
|
|
183
|
+
position: new Vector3(...position),
|
|
184
|
+
centerPosition: `center: new Vector3(${center.join(",")}),position: new Vector3(${position.join(",")})`
|
|
306
185
|
};
|
|
307
|
-
}
|
|
186
|
+
}
|
|
308
187
|
// 三维向量转化成屏幕上的2维向量
|
|
309
|
-
|
|
188
|
+
v3tov2(v3) {
|
|
310
189
|
v3.project(this.camera);
|
|
311
|
-
|
|
190
|
+
const v2 = new Vector2((v3.x + 1) * this.size.x * 0.5, (-v3.y + 1) * this.size.y * 0.5);
|
|
312
191
|
return v2;
|
|
313
|
-
}
|
|
192
|
+
}
|
|
193
|
+
// 控制器类型
|
|
194
|
+
controlType = "OrbitControls";
|
|
195
|
+
// 记录一下空间平移方式 在切换控制器的时候保留一下平移方式
|
|
196
|
+
originScreenSpacePanning = false;
|
|
314
197
|
//改变控制器的类型
|
|
315
|
-
|
|
198
|
+
setControlType(controlType) {
|
|
316
199
|
if (controlType === "OrbitControls") {
|
|
317
200
|
this.controls.screenSpacePanning = this.originScreenSpacePanning;
|
|
318
201
|
this.controls.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };
|
|
@@ -327,18 +210,22 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
327
210
|
this.controls.touches.ONE = TOUCH.PAN;
|
|
328
211
|
this.controls.touches.TWO = TOUCH.DOLLY_ROTATE;
|
|
329
212
|
}
|
|
330
|
-
}
|
|
213
|
+
}
|
|
214
|
+
// 是否自动渲染
|
|
215
|
+
autoRender = true;
|
|
216
|
+
//是否需要渲染, 当autoRender=false的时候就需要 手动触发渲染
|
|
217
|
+
needRender = false;
|
|
331
218
|
// 停止渲染
|
|
332
|
-
|
|
219
|
+
stopRender() {
|
|
333
220
|
threeUtils.removeEventListener("requestAnimationFrame", this.renderBindThis);
|
|
334
221
|
this.renderer.forceContextLoss();
|
|
335
222
|
// 标记上下文被销毁了
|
|
336
223
|
this.isRendererContextLost = true;
|
|
337
224
|
this.setsize(100, 100);
|
|
338
225
|
this.renderer.domElement.style.opacity = "0";
|
|
339
|
-
}
|
|
226
|
+
}
|
|
340
227
|
// 渲染场景
|
|
341
|
-
|
|
228
|
+
render() {
|
|
342
229
|
// 控制器在移动时鼠标不能操作
|
|
343
230
|
this.controls.enabled = (this.controlsPosition.isDone() || this.controlsCenter.isDone());
|
|
344
231
|
// canvas 没有在页面上面的话 就跳过渲染
|
|
@@ -347,7 +234,7 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
347
234
|
return;
|
|
348
235
|
}
|
|
349
236
|
//判断尺寸发生改变时重置尺寸
|
|
350
|
-
|
|
237
|
+
const parentNode = this.renderer.domElement.parentNode;
|
|
351
238
|
if (parentNode.clientWidth !== this.size.x || parentNode.clientHeight !== this.size.y) {
|
|
352
239
|
this.setsize(parentNode.clientWidth, parentNode.clientHeight);
|
|
353
240
|
}
|
|
@@ -366,79 +253,58 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
366
253
|
this.dispatchEvent({ type: "beforeRender" });
|
|
367
254
|
this.renderer.render(this.scene, this.camera);
|
|
368
255
|
this.dispatchEvent({ type: "afterRender" });
|
|
369
|
-
}
|
|
256
|
+
}
|
|
257
|
+
renderBindThis = this.render.bind(this);
|
|
370
258
|
// 下载渲染图
|
|
371
|
-
|
|
372
|
-
if (fileName === void 0) { fileName = "download"; }
|
|
259
|
+
download(fileName = "download") {
|
|
373
260
|
this.render();
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
saveLink.download =
|
|
261
|
+
const base64 = this.renderer.domElement.toDataURL('image/png');
|
|
262
|
+
let saveLink = document.createElement("a");
|
|
263
|
+
saveLink.download = `${fileName}.png`;
|
|
377
264
|
saveLink.href = base64;
|
|
378
265
|
document.body.append(saveLink);
|
|
379
266
|
saveLink.click();
|
|
380
|
-
}
|
|
267
|
+
}
|
|
268
|
+
_preMesh = new Mesh();
|
|
269
|
+
_preRT = new WebGLRenderTarget(128, 128, { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat });
|
|
381
270
|
//预加载纹理图片
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
case 2:
|
|
395
|
-
_a.sent();
|
|
396
|
-
return [3 /*break*/, 1];
|
|
397
|
-
case 3:
|
|
398
|
-
// 添加到计划任务中去
|
|
399
|
-
threeUtils.addWork(function () {
|
|
400
|
-
var originRenderTarget = _this.renderer.getRenderTarget();
|
|
401
|
-
_this.renderer.setRenderTarget(_this._preRT);
|
|
402
|
-
_this._preMesh.material.map = texture;
|
|
403
|
-
_this.renderer.render(_this._preMesh, _this.camera);
|
|
404
|
-
_this.renderer.setRenderTarget(originRenderTarget);
|
|
405
|
-
});
|
|
406
|
-
return [2 /*return*/];
|
|
407
|
-
}
|
|
408
|
-
});
|
|
271
|
+
async preloadTexture(src) {
|
|
272
|
+
const texture = threeLoader.getTexture(src);
|
|
273
|
+
while (texture && !texture.image || !texture.image.complete) {
|
|
274
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
275
|
+
}
|
|
276
|
+
// 添加到计划任务中去
|
|
277
|
+
threeUtils.addWork(() => {
|
|
278
|
+
const originRenderTarget = this.renderer.getRenderTarget();
|
|
279
|
+
this.renderer.setRenderTarget(this._preRT);
|
|
280
|
+
this._preMesh.material.map = texture;
|
|
281
|
+
this.renderer.render(this._preMesh, this.camera);
|
|
282
|
+
this.renderer.setRenderTarget(originRenderTarget);
|
|
409
283
|
});
|
|
410
|
-
}
|
|
284
|
+
}
|
|
411
285
|
//预加载网格
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
_this._preMesh.geometry = geometry;
|
|
421
|
-
_this.renderer.render(_this._preMesh, _this.camera);
|
|
422
|
-
_this.renderer.setRenderTarget(originRenderTarget);
|
|
423
|
-
});
|
|
424
|
-
return [2 /*return*/];
|
|
425
|
-
});
|
|
286
|
+
async preloadGeometry(geometry) {
|
|
287
|
+
// 添加到计划任务中去
|
|
288
|
+
threeUtils.addWork(() => {
|
|
289
|
+
const originRenderTarget = this.renderer.getRenderTarget();
|
|
290
|
+
this.renderer.setRenderTarget(this._preRT);
|
|
291
|
+
this._preMesh.geometry = geometry;
|
|
292
|
+
this.renderer.render(this._preMesh, this.camera);
|
|
293
|
+
this.renderer.setRenderTarget(originRenderTarget);
|
|
426
294
|
});
|
|
427
|
-
}
|
|
295
|
+
}
|
|
428
296
|
// 清理渲染目标
|
|
429
|
-
|
|
430
|
-
|
|
297
|
+
clearRendererTargte(rendererTarget) {
|
|
298
|
+
const originTarget = this.renderer.getRenderTarget();
|
|
431
299
|
this.renderer.setRenderTarget(rendererTarget);
|
|
432
300
|
fullScreenMesh.material = clearShader;
|
|
433
301
|
fullScreenMesh.render(this.renderer);
|
|
434
302
|
this.renderer.clearDepth();
|
|
435
303
|
this.renderer.setRenderTarget(originTarget);
|
|
436
|
-
}
|
|
304
|
+
}
|
|
437
305
|
// 拷贝纹理到渲染目标
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
if (opactity === void 0) { opactity = 1; }
|
|
441
|
-
var originTarget = this.renderer.getRenderTarget();
|
|
306
|
+
copyTextureToRenderTarget(texture, rendererTarget, alpha = false, opactity = 1) {
|
|
307
|
+
const originTarget = this.renderer.getRenderTarget();
|
|
442
308
|
if (rendererTarget) {
|
|
443
309
|
this.renderer.getSize(this.tempVector2);
|
|
444
310
|
rendererTarget.setSize(this.tempVector2.x, this.tempVector2.y);
|
|
@@ -450,20 +316,20 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
450
316
|
coptyShader.blending = alpha ? NoBlending : NormalBlending;
|
|
451
317
|
fullScreenMesh.render(this.renderer);
|
|
452
318
|
this.renderer.setRenderTarget(originTarget);
|
|
453
|
-
}
|
|
319
|
+
}
|
|
454
320
|
// 把对象绘制到渲染目标中
|
|
455
|
-
|
|
321
|
+
object3dToRendererTarget(obj, rendererTarget) {
|
|
456
322
|
this.clearRendererTargte(rendererTarget);
|
|
457
|
-
|
|
323
|
+
const originTarget = this.renderer.getRenderTarget();
|
|
458
324
|
this.renderer.setRenderTarget(rendererTarget);
|
|
459
325
|
this.renderer.getSize(this.tempVector2);
|
|
460
326
|
rendererTarget.setSize(this.tempVector2.x, this.tempVector2.y);
|
|
461
327
|
this.renderer.render(obj, this.camera);
|
|
462
328
|
this.renderer.setRenderTarget(originTarget);
|
|
463
|
-
}
|
|
329
|
+
}
|
|
464
330
|
// 给渲染目标的内容加描边
|
|
465
|
-
|
|
466
|
-
|
|
331
|
+
rendererTagetAddStroke(rendererTarget, strockWidth, color, opacity) {
|
|
332
|
+
const originTarget = this.renderer.getRenderTarget();
|
|
467
333
|
this.clearRendererTargte(this.renderTarget2);
|
|
468
334
|
this.renderer.setRenderTarget(this.renderTarget2);
|
|
469
335
|
this.renderer.getSize(this.tempVector2);
|
|
@@ -477,16 +343,16 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
477
343
|
fullScreenMesh.render(this.renderer);
|
|
478
344
|
this.copyTextureToRenderTarget(this.renderTarget2.texture, rendererTarget, true);
|
|
479
345
|
this.renderer.setRenderTarget(originTarget);
|
|
480
|
-
}
|
|
346
|
+
}
|
|
481
347
|
// 渲染对象的描边
|
|
482
|
-
|
|
348
|
+
renderObject3dStroke(obj, strockWidth, color, opacity) {
|
|
483
349
|
this.object3dToRendererTarget(obj, this.renderTarget);
|
|
484
350
|
this.rendererTagetAddStroke(this.renderTarget, strockWidth, color, opacity);
|
|
485
351
|
this.copyTextureToRenderTarget(this.renderTarget.texture, null);
|
|
486
|
-
}
|
|
352
|
+
}
|
|
487
353
|
//给渲染目标加上高斯模糊计算
|
|
488
|
-
|
|
489
|
-
|
|
354
|
+
renderTargetgaussBlur(rendererTarget, radius, opacity) {
|
|
355
|
+
const originTarget = this.renderer.getRenderTarget();
|
|
490
356
|
this.clearRendererTargte(this.renderTarget2);
|
|
491
357
|
this.renderer.setRenderTarget(this.renderTarget2);
|
|
492
358
|
this.renderer.getSize(this.tempVector2);
|
|
@@ -499,25 +365,22 @@ var ThreeBase = /** @class */ (function (_super) {
|
|
|
499
365
|
fullScreenMesh.render(this.renderer);
|
|
500
366
|
this.copyTextureToRenderTarget(this.renderTarget2.texture, rendererTarget, true);
|
|
501
367
|
this.renderer.setRenderTarget(originTarget);
|
|
502
|
-
}
|
|
368
|
+
}
|
|
503
369
|
// 渲染目标上的纹理添加辉光效果
|
|
504
|
-
|
|
370
|
+
renderTargetAddGlow(renderTarget, width, color) {
|
|
505
371
|
this.rendererTagetAddStroke(renderTarget, 1 * width, color, 0.3);
|
|
506
372
|
this.rendererTagetAddStroke(renderTarget, 2 * width, color, 0.2);
|
|
507
373
|
this.rendererTagetAddStroke(renderTarget, 3 * width, color, 0.05);
|
|
508
374
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
509
375
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
510
376
|
this.renderTargetgaussBlur(renderTarget, 1, 1);
|
|
511
|
-
}
|
|
377
|
+
}
|
|
512
378
|
// 渲染 渲染目标
|
|
513
|
-
|
|
514
|
-
if (alpha === void 0) { alpha = false; }
|
|
379
|
+
renderRendererTarget(renderTarget, alpha = false) {
|
|
515
380
|
coptyShader.uniforms.map.value = renderTarget.texture;
|
|
516
381
|
coptyShader.uniforms.opacity.value = 1.0;
|
|
517
382
|
fullScreenMesh.material = coptyShader;
|
|
518
383
|
coptyShader.blending = alpha ? NoBlending : NormalBlending;
|
|
519
384
|
fullScreenMesh.render(this.renderer);
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
}(EventDispatcher));
|
|
523
|
-
export default ThreeBase;
|
|
385
|
+
}
|
|
386
|
+
}
|