@galacean/effects-plugin-orientation-transformer 0.0.1-alpha.0
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/README.md +13 -0
- package/dist/composition-transformer-acceler.d.ts +29 -0
- package/dist/device-orientation.d.ts +64 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +802 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +9 -0
- package/dist/index.min.js.map +1 -0
- package/dist/index.mjs +794 -0
- package/dist/index.mjs.map +1 -0
- package/dist/orientation-adapter-acceler.d.ts +24 -0
- package/dist/orientation-plugin-loader.d.ts +23 -0
- package/dist/transform-item.d.ts +2 -0
- package/dist/transform-vfx-item.d.ts +10 -0
- package/dist/utils/angle-limit.d.ts +18 -0
- package/dist/utils/deep-merge.d.ts +1 -0
- package/dist/utils/device.d.ts +1 -0
- package/dist/utils/filtering.d.ts +40 -0
- package/dist/utils/object-type.d.ts +1 -0
- package/package.json +46 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,802 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Name: @galacean/effects-plugin-orientation-transformer
|
|
3
|
+
* Description: Galacean Effects player orientation transformer plugin
|
|
4
|
+
* Author: Ant Group CO., Ltd.
|
|
5
|
+
* Contributors: 燃然,意绮
|
|
6
|
+
* Version: v0.0.1-alpha.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
12
|
+
|
|
13
|
+
var effects = require('@galacean/effects');
|
|
14
|
+
|
|
15
|
+
/******************************************************************************
|
|
16
|
+
Copyright (c) Microsoft Corporation.
|
|
17
|
+
|
|
18
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
19
|
+
purpose with or without fee is hereby granted.
|
|
20
|
+
|
|
21
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
22
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
23
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
24
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
25
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
26
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
27
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
28
|
+
***************************************************************************** */
|
|
29
|
+
/* global Reflect, Promise, SuppressedError, Symbol */
|
|
30
|
+
|
|
31
|
+
var extendStatics = function(d, b) {
|
|
32
|
+
extendStatics = Object.setPrototypeOf ||
|
|
33
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
34
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
35
|
+
return extendStatics(d, b);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function __extends(d, b) {
|
|
39
|
+
if (typeof b !== "function" && b !== null)
|
|
40
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
41
|
+
extendStatics(d, b);
|
|
42
|
+
function __() { this.constructor = d; }
|
|
43
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
var __assign = function() {
|
|
47
|
+
__assign = Object.assign || function __assign(t) {
|
|
48
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
49
|
+
s = arguments[i];
|
|
50
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
51
|
+
}
|
|
52
|
+
return t;
|
|
53
|
+
};
|
|
54
|
+
return __assign.apply(this, arguments);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
function __read(o, n) {
|
|
58
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
59
|
+
if (!m) return o;
|
|
60
|
+
var i = m.call(o), r, ar = [], e;
|
|
61
|
+
try {
|
|
62
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
63
|
+
}
|
|
64
|
+
catch (error) { e = { error: error }; }
|
|
65
|
+
finally {
|
|
66
|
+
try {
|
|
67
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
68
|
+
}
|
|
69
|
+
finally { if (e) throw e.error; }
|
|
70
|
+
}
|
|
71
|
+
return ar;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function __spreadArray(to, from, pack) {
|
|
75
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
76
|
+
if (ar || !(i in from)) {
|
|
77
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
78
|
+
ar[i] = from[i];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
85
|
+
var e = new Error(message);
|
|
86
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
var CompositionTransformerAcceler = /** @class */ (function () {
|
|
90
|
+
function CompositionTransformerAcceler(composition) {
|
|
91
|
+
this.composition = composition;
|
|
92
|
+
this.targets = {};
|
|
93
|
+
this.records = {};
|
|
94
|
+
this.current = {};
|
|
95
|
+
this.gammaRange = [-89, 89];
|
|
96
|
+
this.betaRange = [-80, 80];
|
|
97
|
+
}
|
|
98
|
+
CompositionTransformerAcceler.prototype.update = function (_a) {
|
|
99
|
+
var x = _a.x, y = _a.y;
|
|
100
|
+
this.currentEvent = { x: x, y: y };
|
|
101
|
+
};
|
|
102
|
+
CompositionTransformerAcceler.prototype.updateOrientation = function () {
|
|
103
|
+
var _this = this;
|
|
104
|
+
var event = this.currentEvent;
|
|
105
|
+
if (event) {
|
|
106
|
+
Object.getOwnPropertyNames(this.targets).forEach(function (name) {
|
|
107
|
+
_this.moveLayer(name, event);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
CompositionTransformerAcceler.prototype.initComposition = function () {
|
|
112
|
+
var items = this.composition.items;
|
|
113
|
+
for (var i = 0; i < items.length; i++) {
|
|
114
|
+
var item = items[i];
|
|
115
|
+
var target = this.targets[item.name];
|
|
116
|
+
if (target) {
|
|
117
|
+
var position = item.transform.position.slice();
|
|
118
|
+
var currentPosition = this.current[item.name];
|
|
119
|
+
this.records[item.name] = {
|
|
120
|
+
item: item,
|
|
121
|
+
position: position,
|
|
122
|
+
};
|
|
123
|
+
if (currentPosition) {
|
|
124
|
+
var _a = __read(currentPosition, 3), x = _a[0], y = _a[1], z = _a[2];
|
|
125
|
+
item.transform.setPosition(x, y, z);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
CompositionTransformerAcceler.prototype.addTarget = function (target) {
|
|
131
|
+
this.targets[target.name] = target;
|
|
132
|
+
};
|
|
133
|
+
CompositionTransformerAcceler.prototype.removeTarget = function (name) {
|
|
134
|
+
delete this.targets[name];
|
|
135
|
+
delete this.records[name];
|
|
136
|
+
};
|
|
137
|
+
CompositionTransformerAcceler.prototype.moveLayer = function (name, _a) {
|
|
138
|
+
var _b;
|
|
139
|
+
var _c;
|
|
140
|
+
var x = _a.x, y = _a.y;
|
|
141
|
+
var layer = (_c = this.records[name]) === null || _c === void 0 ? void 0 : _c.item;
|
|
142
|
+
if (layer) {
|
|
143
|
+
var initPosition = this.records[name].position;
|
|
144
|
+
var target = this.targets[name];
|
|
145
|
+
var beta = clamp(x, this.betaRange), gamma = clamp(y, this.gammaRange);
|
|
146
|
+
if (target) {
|
|
147
|
+
var position = [
|
|
148
|
+
initPosition[0] + 1.2 * mapRange((beta - this.gammaRange[0]) / (this.gammaRange[1] - this.gammaRange[0]), target.xMin, target.xMax),
|
|
149
|
+
initPosition[1] + 1.2 * mapRange((gamma - this.betaRange[0]) / (this.betaRange[1] - this.betaRange[0]), target.yMin, target.yMax),
|
|
150
|
+
initPosition[2],
|
|
151
|
+
];
|
|
152
|
+
(_b = layer.transform).setPosition.apply(_b, __spreadArray([], __read(position), false));
|
|
153
|
+
this.current[name] = position.slice();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
return CompositionTransformerAcceler;
|
|
158
|
+
}());
|
|
159
|
+
function clamp(x, range) {
|
|
160
|
+
if (x < range[0]) {
|
|
161
|
+
return range[0];
|
|
162
|
+
}
|
|
163
|
+
else if (x > range[1]) {
|
|
164
|
+
return range[1];
|
|
165
|
+
}
|
|
166
|
+
return x;
|
|
167
|
+
}
|
|
168
|
+
function mapRange(t, min, max) {
|
|
169
|
+
return min + (max - min) * t;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function getObjectType(obj) {
|
|
173
|
+
return Object.prototype.toString.call(obj);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* 角度限制
|
|
178
|
+
* @internal
|
|
179
|
+
* @param angleObj 角度数值对象
|
|
180
|
+
* @param validRange 角度限制值
|
|
181
|
+
*/
|
|
182
|
+
function angleLimit(angleObj, validRange) {
|
|
183
|
+
var flagAlpha = true;
|
|
184
|
+
var flagBeta = true;
|
|
185
|
+
var flagGamma = true;
|
|
186
|
+
if (getObjectType(validRange.alpha) === '[object Array]' && validRange.alpha.length >= 2) {
|
|
187
|
+
var referAlphaA = angleObj.alpha + validRange.alpha[0];
|
|
188
|
+
var referAlphaB = angleObj.alpha + validRange.alpha[1];
|
|
189
|
+
referAlphaA = referAlphaA < 0 ? referAlphaA + 360 : referAlphaA;
|
|
190
|
+
referAlphaB = referAlphaB > 360 ? referAlphaB - 360 : referAlphaB;
|
|
191
|
+
if (referAlphaA < referAlphaB) {
|
|
192
|
+
flagAlpha = angleObj.alpha > referAlphaA && angleObj.alpha < referAlphaB;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
flagAlpha = angleObj.alpha > referAlphaA || angleObj.alpha < referAlphaB;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (getObjectType(validRange.beta) === '[object Array]' && validRange.beta.length >= 2) {
|
|
199
|
+
flagBeta = angleObj.beta >= validRange.beta[0] && angleObj.beta <= validRange.beta[1];
|
|
200
|
+
}
|
|
201
|
+
if (getObjectType(validRange.gamma) === '[object Array]' && validRange.gamma.length >= 2) {
|
|
202
|
+
flagGamma = angleObj.gamma >= validRange.gamma[0] && angleObj.gamma <= validRange.gamma[1];
|
|
203
|
+
}
|
|
204
|
+
return flagAlpha && flagBeta && flagGamma;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function deepMerge(target, args) {
|
|
208
|
+
if (!effects.isObject(target) && !effects.isArray(target)) {
|
|
209
|
+
return target;
|
|
210
|
+
}
|
|
211
|
+
var result = effects.isArray(target) ? __spreadArray([], __read(target), false) : __assign({}, target);
|
|
212
|
+
var length = arguments.length;
|
|
213
|
+
for (var index = 1; index < length; index++) {
|
|
214
|
+
var source = arguments[index] || {};
|
|
215
|
+
if (effects.isObject(source)) {
|
|
216
|
+
var prop = void 0;
|
|
217
|
+
for (prop in source) {
|
|
218
|
+
if (source.hasOwnProperty(prop)) {
|
|
219
|
+
if (effects.isObject(result[prop]) && effects.isObject(source[prop])) {
|
|
220
|
+
result[prop] = deepMerge(result[prop], source[prop]);
|
|
221
|
+
}
|
|
222
|
+
else if (effects.isObject(source[prop])) {
|
|
223
|
+
result[prop] = deepMerge(source[prop]);
|
|
224
|
+
}
|
|
225
|
+
else if (effects.isArray(source[prop])) {
|
|
226
|
+
result[prop] = deepMerge(source[prop]);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
result[prop] = source[prop];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
for (prop in result) {
|
|
234
|
+
if (effects.isObject(result[prop]) &&
|
|
235
|
+
result.hasOwnProperty(prop) &&
|
|
236
|
+
!source.hasOwnProperty(prop)) {
|
|
237
|
+
result[prop] = deepMerge(result[prop]);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (length === 1) {
|
|
243
|
+
for (var prop in result) {
|
|
244
|
+
if (effects.isObject(result[prop]) && result.hasOwnProperty(prop)) {
|
|
245
|
+
result[prop] = deepMerge(result[prop]);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function isIOS() {
|
|
253
|
+
var str = navigator.userAgent.toLowerCase();
|
|
254
|
+
var ver = str.match(/cpu (iphone )?os (.*?) like mac os/);
|
|
255
|
+
return ver ? parseInt(ver[2], 10) : 0;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* 稳定区间
|
|
260
|
+
*/
|
|
261
|
+
var STABLE_RANGE = 3;
|
|
262
|
+
/**
|
|
263
|
+
* 每次增幅的最大值
|
|
264
|
+
*/
|
|
265
|
+
var MAX_CHANGE = 5;
|
|
266
|
+
/**
|
|
267
|
+
* 每次增幅的最小值
|
|
268
|
+
*/
|
|
269
|
+
var MIN_CHANGE = 1;
|
|
270
|
+
/**
|
|
271
|
+
* 数据缓存队列的长度
|
|
272
|
+
*/
|
|
273
|
+
var VALUE_POOL_LENGTH = 5;
|
|
274
|
+
/**
|
|
275
|
+
* 滤波方法
|
|
276
|
+
*/
|
|
277
|
+
var Filtering = /** @class */ (function () {
|
|
278
|
+
function Filtering(options) {
|
|
279
|
+
if (options === void 0) { options = {}; }
|
|
280
|
+
this.options = options;
|
|
281
|
+
this.lastValue = 0;
|
|
282
|
+
this.valuePool = [];
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* 0deg 左右保持一定的稳定区间 STABLE_RANGE
|
|
286
|
+
* - 小于 STABLE_RANGE 的算 0
|
|
287
|
+
* - 大于 STABLE_RANGE 的减去 STABLE_RANGE
|
|
288
|
+
* @param value - 输入值
|
|
289
|
+
* @returns
|
|
290
|
+
*/
|
|
291
|
+
Filtering.prototype.stableFix = function (value) {
|
|
292
|
+
var stableRange = this.options.stableRange || STABLE_RANGE;
|
|
293
|
+
if (Math.abs(value) < stableRange) {
|
|
294
|
+
return 0;
|
|
295
|
+
}
|
|
296
|
+
return value > stableRange ? value - stableRange : value + stableRange;
|
|
297
|
+
};
|
|
298
|
+
/**
|
|
299
|
+
* 变幅限制
|
|
300
|
+
* - 最大变化 MAX_CHANGE
|
|
301
|
+
* - 最小变化 MIN_CHANGE
|
|
302
|
+
* @param value
|
|
303
|
+
* @returns
|
|
304
|
+
*/
|
|
305
|
+
Filtering.prototype.changeLimit = function (value) {
|
|
306
|
+
var lastValue = this.lastValue;
|
|
307
|
+
var result = value;
|
|
308
|
+
if (Math.abs(value - lastValue) > MAX_CHANGE) {
|
|
309
|
+
result = lastValue < value ? lastValue + MAX_CHANGE : lastValue - MAX_CHANGE;
|
|
310
|
+
}
|
|
311
|
+
if (Math.abs(value - lastValue) < MIN_CHANGE) {
|
|
312
|
+
result = lastValue;
|
|
313
|
+
}
|
|
314
|
+
this.lastValue = result;
|
|
315
|
+
return result;
|
|
316
|
+
};
|
|
317
|
+
Filtering.prototype.linearRegressionMedian = function (value) {
|
|
318
|
+
// 在队列中装载数据,达到队列阀值长度时开始计算
|
|
319
|
+
this.valuePool.push(value);
|
|
320
|
+
var result;
|
|
321
|
+
if (this.valuePool.length >= VALUE_POOL_LENGTH) {
|
|
322
|
+
result = getLinearRegressionFixedVal(this.valuePool);
|
|
323
|
+
this.valuePool.shift();
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
result = this.lastValue;
|
|
327
|
+
}
|
|
328
|
+
return result;
|
|
329
|
+
};
|
|
330
|
+
return Filtering;
|
|
331
|
+
}());
|
|
332
|
+
// 计算出线性回归参数
|
|
333
|
+
function linearRegression(x, y) {
|
|
334
|
+
var result = {};
|
|
335
|
+
var n = y.length;
|
|
336
|
+
var sumX = 0;
|
|
337
|
+
var sumY = 0;
|
|
338
|
+
var sumXY = 0;
|
|
339
|
+
var sumXX = 0;
|
|
340
|
+
var sumYY = 0;
|
|
341
|
+
for (var i = 0; i < y.length; i++) {
|
|
342
|
+
sumX += x[i];
|
|
343
|
+
sumY += y[i];
|
|
344
|
+
sumXY += (x[i] * y[i]);
|
|
345
|
+
sumXX += (x[i] * x[i]);
|
|
346
|
+
sumYY += (y[i] * y[i]);
|
|
347
|
+
}
|
|
348
|
+
var avgX = sumX / n;
|
|
349
|
+
var avgY = sumY / n;
|
|
350
|
+
result['a'] = (sumXY - n * avgX * avgY) / (sumXX - n * avgX * avgX);
|
|
351
|
+
result['b'] = avgY - result.a * avgX;
|
|
352
|
+
result['miss'] = Math.pow((n * sumXY - sumX * sumY) / Math.sqrt((n * sumXX - sumX * sumX) * (n * sumYY - sumY * sumY)), 2);
|
|
353
|
+
return result;
|
|
354
|
+
}
|
|
355
|
+
// 生成线性回归函数 F(x) = ax + b
|
|
356
|
+
function createLinearRegressionFx(values) {
|
|
357
|
+
var x = [];
|
|
358
|
+
var y = [];
|
|
359
|
+
values.forEach(function (item, index) {
|
|
360
|
+
x.push(index); // 数据是连续的,所以直接取数组下标为 x
|
|
361
|
+
y.push(item);
|
|
362
|
+
});
|
|
363
|
+
var key = linearRegression(x, y);
|
|
364
|
+
return function (x) {
|
|
365
|
+
return key.a * x + key.b;
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
// 获取线性回归后的中位数
|
|
369
|
+
function getLinearRegressionFixedVal(valuePool) {
|
|
370
|
+
var fx = createLinearRegressionFx(valuePool);
|
|
371
|
+
// 这个迭代修正很重要
|
|
372
|
+
valuePool = valuePool.map(function (item, index) {
|
|
373
|
+
return fx(index);
|
|
374
|
+
});
|
|
375
|
+
return fx(valuePool.length / 2);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
var useJSBridge = isIOS() && typeof window.AlipayJSBridge !== 'undefined';
|
|
379
|
+
var useWindVane = typeof window.WindVane !== 'undefined';
|
|
380
|
+
// 默认参数
|
|
381
|
+
var defaultOptions = {
|
|
382
|
+
X: true,
|
|
383
|
+
Y: true,
|
|
384
|
+
interval: Math.floor(1000 / 30),
|
|
385
|
+
useRequestAnimationFrame: true,
|
|
386
|
+
relativeBeta: false,
|
|
387
|
+
relativeGamma: false,
|
|
388
|
+
validRange: {
|
|
389
|
+
alpha: [-60, 60],
|
|
390
|
+
beta: [-60, 180],
|
|
391
|
+
gamma: [-89, 89],
|
|
392
|
+
},
|
|
393
|
+
stableRange: 3,
|
|
394
|
+
};
|
|
395
|
+
var DeviceOrientation = /** @class */ (function () {
|
|
396
|
+
function DeviceOrientation(options) {
|
|
397
|
+
if (options === void 0) { options = {}; }
|
|
398
|
+
this.lastX = 0;
|
|
399
|
+
this.lastY = 0;
|
|
400
|
+
this.prevAcceler = {
|
|
401
|
+
x: 0,
|
|
402
|
+
y: 0,
|
|
403
|
+
z: 0,
|
|
404
|
+
};
|
|
405
|
+
this.stoped = false;
|
|
406
|
+
this.options = deepMerge(defaultOptions, options);
|
|
407
|
+
var stableRange = this.options.stableRange;
|
|
408
|
+
this.filterX = new Filtering({ stableRange: stableRange });
|
|
409
|
+
this.filterY = new Filtering({ stableRange: stableRange });
|
|
410
|
+
}
|
|
411
|
+
DeviceOrientation.prototype.watch = function (callback) {
|
|
412
|
+
var _this = this;
|
|
413
|
+
if (typeof callback !== 'function') {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
// 目前只能绑定一个方法,此处可以扩展成一个方法队列
|
|
417
|
+
if (this.watchListener) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
var timefragment = 0; // 时间片计时
|
|
421
|
+
var nowts = 0; // 当前时间
|
|
422
|
+
var referGamma = 0; // 初始化角度,作为单独一个用户的空间旋转的参照
|
|
423
|
+
var referBeta = 0;
|
|
424
|
+
var alpha;
|
|
425
|
+
var beta;
|
|
426
|
+
var gamma;
|
|
427
|
+
var gammaFixed;
|
|
428
|
+
var betaFixed;
|
|
429
|
+
var isInValidDegRange;
|
|
430
|
+
var x; // 最终输出的 x
|
|
431
|
+
var y; // 最终输出的 y
|
|
432
|
+
var handleWatch = function (e) {
|
|
433
|
+
if (_this.stoped) {
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
alpha = e.alpha; // 垂直于屏幕的轴 0 ~ 360
|
|
437
|
+
beta = e.beta; // 横向 X 轴 -180 ~ 180
|
|
438
|
+
gamma = e.gamma; // 纵向 Y 轴 -90 ~ 90
|
|
439
|
+
if (!referBeta) {
|
|
440
|
+
referBeta = beta || 0;
|
|
441
|
+
}
|
|
442
|
+
if (!referGamma) {
|
|
443
|
+
referGamma = gamma || 0;
|
|
444
|
+
}
|
|
445
|
+
//
|
|
446
|
+
isInValidDegRange = angleLimit.call(_this, {
|
|
447
|
+
alpha: alpha,
|
|
448
|
+
beta: beta,
|
|
449
|
+
gamma: gamma,
|
|
450
|
+
}, _this.options.validRange);
|
|
451
|
+
if (isInValidDegRange) {
|
|
452
|
+
// 最终结果值
|
|
453
|
+
if (_this.options.X) {
|
|
454
|
+
gammaFixed = gamma - referGamma;
|
|
455
|
+
x = _this.options.relativeGamma ? gammaFixed : gamma;
|
|
456
|
+
x = _this.filterX.stableFix(x);
|
|
457
|
+
x = _this.filterX.changeLimit(x);
|
|
458
|
+
x = _this.filterX.linearRegressionMedian(+x);
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
x = 0;
|
|
462
|
+
}
|
|
463
|
+
if (_this.options.Y) {
|
|
464
|
+
// beta 相对 referBeta 的角度
|
|
465
|
+
betaFixed = beta - referBeta;
|
|
466
|
+
y = _this.options.relativeBeta ? betaFixed : beta;
|
|
467
|
+
y = _this.filterY.stableFix(y);
|
|
468
|
+
y = _this.filterY.changeLimit(y);
|
|
469
|
+
y = _this.filterY.linearRegressionMedian(+y);
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
y = 0;
|
|
473
|
+
}
|
|
474
|
+
if (_this.isValid(x, y)) {
|
|
475
|
+
if (_this.options.useRequestAnimationFrame) {
|
|
476
|
+
window.requestAnimationFrame(function () {
|
|
477
|
+
callback(x, y, { alpha: alpha, beta: beta, gamma: gamma });
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
callback(x, y, { alpha: alpha, beta: beta, gamma: gamma });
|
|
482
|
+
}
|
|
483
|
+
_this.lastX = x;
|
|
484
|
+
_this.lastY = y;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
// 针对不同平台绑定不同事件
|
|
489
|
+
this.stoped = false;
|
|
490
|
+
if (useWindVane) {
|
|
491
|
+
switchWindVane(true, this.options.interval);
|
|
492
|
+
this.watchListener = function (e) {
|
|
493
|
+
if ('param' in e) {
|
|
494
|
+
var _a = e.param, x_1 = _a.x, y_1 = _a.y, z = _a.z;
|
|
495
|
+
// 即使手机没动,也会不停触发,所以这里加个判断,值相等则不调用回调
|
|
496
|
+
if (x_1 === _this.prevAcceler.x && y_1 === _this.prevAcceler.y && z === _this.prevAcceler.z) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
_this.prevAcceler = { x: x_1, y: y_1, z: z };
|
|
500
|
+
var evt = {
|
|
501
|
+
alpha: +z * 180,
|
|
502
|
+
beta: +y_1 * -90,
|
|
503
|
+
gamma: +x_1 * 90,
|
|
504
|
+
};
|
|
505
|
+
handleWatch(evt);
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
document.addEventListener('motion.gyro', this.watchListener, false);
|
|
509
|
+
}
|
|
510
|
+
else if (useJSBridge) {
|
|
511
|
+
switchIOSEvent(true, this.options.interval / 1000);
|
|
512
|
+
this.watchListener = function (e) {
|
|
513
|
+
if (e && 'data' in e) {
|
|
514
|
+
/*
|
|
515
|
+
data:
|
|
516
|
+
{
|
|
517
|
+
data: {
|
|
518
|
+
x: 0.0, // gamma -1 ~ 1
|
|
519
|
+
y: 0.0, // beta -1 ~ 1
|
|
520
|
+
z: 0.0, // alpha
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
*/
|
|
524
|
+
var _a = e.data, x_2 = _a.x, y_2 = _a.y, z = _a.z;
|
|
525
|
+
var evt = {
|
|
526
|
+
alpha: z * 180,
|
|
527
|
+
beta: y_2 * -90,
|
|
528
|
+
gamma: x_2 * 90,
|
|
529
|
+
};
|
|
530
|
+
handleWatch(evt);
|
|
531
|
+
}
|
|
532
|
+
};
|
|
533
|
+
document.addEventListener('accelerometerChange', this.watchListener, false);
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
this.watchListener = function (e) {
|
|
537
|
+
nowts = new Date().getTime();
|
|
538
|
+
// 控制时间片
|
|
539
|
+
if (nowts - timefragment >= _this.options.interval) {
|
|
540
|
+
timefragment = nowts;
|
|
541
|
+
handleWatch(e);
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
window.addEventListener('deviceorientation', this.watchListener, false);
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
DeviceOrientation.prototype.unWatch = function () {
|
|
548
|
+
effects.assertExist(this.watchListener);
|
|
549
|
+
if (useWindVane) {
|
|
550
|
+
switchWindVane(false);
|
|
551
|
+
document.removeEventListener('motion.gyro', this.watchListener);
|
|
552
|
+
}
|
|
553
|
+
else if (useJSBridge) {
|
|
554
|
+
switchIOSEvent(false);
|
|
555
|
+
document.removeEventListener('accelerometerChange', this.watchListener);
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
window.removeEventListener('deviceorientation', this.watchListener);
|
|
559
|
+
}
|
|
560
|
+
this.stoped = true;
|
|
561
|
+
this.watchListener = undefined;
|
|
562
|
+
};
|
|
563
|
+
DeviceOrientation.prototype.pause = function () {
|
|
564
|
+
this.stoped = true;
|
|
565
|
+
if (useJSBridge) {
|
|
566
|
+
switchIOSEvent(false);
|
|
567
|
+
}
|
|
568
|
+
};
|
|
569
|
+
DeviceOrientation.prototype.continue = function () {
|
|
570
|
+
this.stoped = false;
|
|
571
|
+
if (useJSBridge) {
|
|
572
|
+
switchIOSEvent(true, this.options.interval / 1000);
|
|
573
|
+
}
|
|
574
|
+
};
|
|
575
|
+
DeviceOrientation.prototype.isValid = function (x, y) {
|
|
576
|
+
// 判断是否和上次的值一样,检测有没有变
|
|
577
|
+
return this.lastX !== x || this.lastY !== y;
|
|
578
|
+
};
|
|
579
|
+
return DeviceOrientation;
|
|
580
|
+
}());
|
|
581
|
+
// 开启/关闭 iOS 的陀螺仪监听
|
|
582
|
+
function switchIOSEvent(open, interval) {
|
|
583
|
+
window.AlipayJSBridge.call('watchShake', {
|
|
584
|
+
monitorGyroscope: false,
|
|
585
|
+
monitorAccelerometer: !!open,
|
|
586
|
+
interval: !open ? 10 : parseFloat(interval.toFixed(3)),
|
|
587
|
+
}, function () { });
|
|
588
|
+
}
|
|
589
|
+
function switchWindVane(open, interval) {
|
|
590
|
+
var params = {
|
|
591
|
+
// 是开启还是关闭陀螺仪的监听
|
|
592
|
+
on: open,
|
|
593
|
+
// 陀螺仪事件的时间间隔
|
|
594
|
+
frequency: interval,
|
|
595
|
+
};
|
|
596
|
+
window.WindVane.call('WVMotion', 'listenGyro', params, function (e) {
|
|
597
|
+
console.info('call WVMotion success');
|
|
598
|
+
}, function (e) {
|
|
599
|
+
console.error('call WVMotion failed:' + JSON.stringify(e));
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
*
|
|
605
|
+
*/
|
|
606
|
+
var OrientationAdapterAcceler = /** @class */ (function () {
|
|
607
|
+
function OrientationAdapterAcceler() {
|
|
608
|
+
this.transformers = [];
|
|
609
|
+
this.connected = false;
|
|
610
|
+
this.accelerMotion = null;
|
|
611
|
+
this.validRange = {
|
|
612
|
+
alpha: [-60, 60],
|
|
613
|
+
beta: [-80, 80],
|
|
614
|
+
gamma: [-89, 89], // 左右翻转
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
OrientationAdapterAcceler.prototype.connect = function () {
|
|
618
|
+
var _this = this;
|
|
619
|
+
if (!this.connected) {
|
|
620
|
+
this.accelerMotion = new DeviceOrientation({
|
|
621
|
+
X: true,
|
|
622
|
+
Y: true,
|
|
623
|
+
interval: Math.floor(1000 / 60),
|
|
624
|
+
useRequestAnimationFrame: true,
|
|
625
|
+
relativeBeta: false,
|
|
626
|
+
relativeGamma: false,
|
|
627
|
+
validRange: this.validRange,
|
|
628
|
+
stableRange: 3, // 稳定区间
|
|
629
|
+
});
|
|
630
|
+
this.accelerMotion.watch(function (x, y) {
|
|
631
|
+
var motion = {
|
|
632
|
+
x: x,
|
|
633
|
+
y: y,
|
|
634
|
+
};
|
|
635
|
+
_this.dispatchMotion(motion);
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
this.connected = true;
|
|
639
|
+
};
|
|
640
|
+
OrientationAdapterAcceler.prototype.disconnect = function () {
|
|
641
|
+
if (this.accelerMotion) {
|
|
642
|
+
this.accelerMotion.unWatch();
|
|
643
|
+
}
|
|
644
|
+
this.connected = false;
|
|
645
|
+
};
|
|
646
|
+
/**
|
|
647
|
+
*
|
|
648
|
+
* @param motion
|
|
649
|
+
*/
|
|
650
|
+
OrientationAdapterAcceler.prototype.dispatchMotion = function (motion) {
|
|
651
|
+
this.transformers.forEach(function (t) { return t.update(motion); });
|
|
652
|
+
};
|
|
653
|
+
OrientationAdapterAcceler.prototype.addTransformer = function (transformer) {
|
|
654
|
+
if (!this.transformers.includes(transformer)) {
|
|
655
|
+
this.transformers.push(transformer);
|
|
656
|
+
}
|
|
657
|
+
};
|
|
658
|
+
OrientationAdapterAcceler.prototype.removeTransformer = function (transformer) {
|
|
659
|
+
var index = this.transformers.indexOf(transformer);
|
|
660
|
+
if (index > -1) {
|
|
661
|
+
this.transformers.splice(index, 1);
|
|
662
|
+
}
|
|
663
|
+
return this.transformers.length === 0;
|
|
664
|
+
};
|
|
665
|
+
return OrientationAdapterAcceler;
|
|
666
|
+
}());
|
|
667
|
+
var adapter;
|
|
668
|
+
function getAccelerAdapter() {
|
|
669
|
+
if (!adapter) {
|
|
670
|
+
adapter = new OrientationAdapterAcceler();
|
|
671
|
+
}
|
|
672
|
+
return adapter;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
var OrientationPluginLoader = /** @class */ (function (_super) {
|
|
676
|
+
__extends(OrientationPluginLoader, _super);
|
|
677
|
+
function OrientationPluginLoader() {
|
|
678
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
679
|
+
_this.order = 90;
|
|
680
|
+
_this.adapter = null;
|
|
681
|
+
_this.handleConnect = function () {
|
|
682
|
+
var _a;
|
|
683
|
+
if (!closeManually) {
|
|
684
|
+
(_a = _this.adapter) === null || _a === void 0 ? void 0 : _a.connect();
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
_this.handleDisconnect = function () {
|
|
688
|
+
var _a;
|
|
689
|
+
(_a = _this.adapter) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
690
|
+
};
|
|
691
|
+
return _this;
|
|
692
|
+
}
|
|
693
|
+
OrientationPluginLoader.prototype.onCompositionConstructed = function () {
|
|
694
|
+
var _a;
|
|
695
|
+
this.adapter = getAdapter();
|
|
696
|
+
(_a = this.adapter) === null || _a === void 0 ? void 0 : _a.connect();
|
|
697
|
+
this.bindAccelerDocumentEvent();
|
|
698
|
+
};
|
|
699
|
+
OrientationPluginLoader.prototype.onCompositionReset = function (composition) {
|
|
700
|
+
var _a;
|
|
701
|
+
var transformer = composition.loaderData.deviceTransformer = new CompositionTransformerAcceler(composition);
|
|
702
|
+
(_a = this.adapter) === null || _a === void 0 ? void 0 : _a.addTransformer(transformer);
|
|
703
|
+
};
|
|
704
|
+
OrientationPluginLoader.prototype.onCompositionUpdate = function (composition) {
|
|
705
|
+
var transformer = composition.loaderData.deviceTransformer;
|
|
706
|
+
if (transformer) {
|
|
707
|
+
transformer.updateOrientation();
|
|
708
|
+
}
|
|
709
|
+
};
|
|
710
|
+
OrientationPluginLoader.prototype.onCompositionDestroyed = function (composition) {
|
|
711
|
+
var _a, _b;
|
|
712
|
+
var empty = (_a = this.adapter) === null || _a === void 0 ? void 0 : _a.removeTransformer(composition.loaderData.deviceTransformer);
|
|
713
|
+
if (empty) {
|
|
714
|
+
(_b = this.adapter) === null || _b === void 0 ? void 0 : _b.disconnect();
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
OrientationPluginLoader.prototype.bindAccelerDocumentEvent = function () {
|
|
718
|
+
this.unbindAccelerDocumentEvent(); // 保证全局只监听一份
|
|
719
|
+
document.addEventListener('resume', this.handleConnect, false);
|
|
720
|
+
document.addEventListener('pause', this.handleDisconnect, false);
|
|
721
|
+
document.addEventListener('back', this.handleDisconnect, false);
|
|
722
|
+
};
|
|
723
|
+
OrientationPluginLoader.prototype.unbindAccelerDocumentEvent = function () {
|
|
724
|
+
document.removeEventListener('resume', this.handleConnect);
|
|
725
|
+
document.removeEventListener('pause', this.handleDisconnect);
|
|
726
|
+
document.removeEventListener('back', this.handleDisconnect);
|
|
727
|
+
};
|
|
728
|
+
OrientationPluginLoader.prototype.dispose = function () {
|
|
729
|
+
getAdapter().disconnect();
|
|
730
|
+
this.unbindAccelerDocumentEvent();
|
|
731
|
+
};
|
|
732
|
+
return OrientationPluginLoader;
|
|
733
|
+
}(effects.AbstractPlugin));
|
|
734
|
+
// 是否是手动关闭,如果是,那么 resume 时不要恢复
|
|
735
|
+
var closeManually = false;
|
|
736
|
+
/**
|
|
737
|
+
*
|
|
738
|
+
* @returns
|
|
739
|
+
*/
|
|
740
|
+
function getAdapter() {
|
|
741
|
+
// 运动感应类型(默认使用加速度,Native 环境使用陀螺仪)
|
|
742
|
+
return getAccelerAdapter();
|
|
743
|
+
}
|
|
744
|
+
function closeDeviceMotion() {
|
|
745
|
+
closeManually = true;
|
|
746
|
+
getAdapter().disconnect();
|
|
747
|
+
}
|
|
748
|
+
function openDeviceMotion() {
|
|
749
|
+
closeManually = false;
|
|
750
|
+
getAdapter().connect();
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
var TransformVFXItem = /** @class */ (function (_super) {
|
|
754
|
+
__extends(TransformVFXItem, _super);
|
|
755
|
+
function TransformVFXItem() {
|
|
756
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
757
|
+
}
|
|
758
|
+
Object.defineProperty(TransformVFXItem.prototype, "type", {
|
|
759
|
+
get: function () {
|
|
760
|
+
return 'orientation-transformer';
|
|
761
|
+
},
|
|
762
|
+
enumerable: false,
|
|
763
|
+
configurable: true
|
|
764
|
+
});
|
|
765
|
+
TransformVFXItem.prototype.onConstructed = function (options) {
|
|
766
|
+
var targets = options.content.options.targets;
|
|
767
|
+
if (targets) {
|
|
768
|
+
this.targets = targets.map(function (t) { return ({
|
|
769
|
+
name: t.name,
|
|
770
|
+
xMin: +t.xMin || 0,
|
|
771
|
+
yMin: +t.yMin || 0,
|
|
772
|
+
xMax: +t.xMax || 0,
|
|
773
|
+
yMax: +t.yMax || 0,
|
|
774
|
+
}); });
|
|
775
|
+
}
|
|
776
|
+
};
|
|
777
|
+
TransformVFXItem.prototype.onItemRemoved = function (composition) {
|
|
778
|
+
var _a;
|
|
779
|
+
(_a = this.targets) === null || _a === void 0 ? void 0 : _a.forEach(function (target) { var _a; return (_a = composition.loaderData.deviceTransformer) === null || _a === void 0 ? void 0 : _a.removeTarget(target.name); });
|
|
780
|
+
};
|
|
781
|
+
TransformVFXItem.prototype.doCreateContent = function (composition) {
|
|
782
|
+
var _a;
|
|
783
|
+
var transformer = composition.loaderData.deviceTransformer;
|
|
784
|
+
if (transformer) {
|
|
785
|
+
(_a = this.targets) === null || _a === void 0 ? void 0 : _a.forEach(function (target) { return transformer.addTarget(target); });
|
|
786
|
+
transformer.initComposition();
|
|
787
|
+
}
|
|
788
|
+
return {};
|
|
789
|
+
};
|
|
790
|
+
return TransformVFXItem;
|
|
791
|
+
}(effects.VFXItem));
|
|
792
|
+
|
|
793
|
+
effects.registerPlugin('orientation-transformer', OrientationPluginLoader, TransformVFXItem);
|
|
794
|
+
var version = "0.0.1-alpha.0";
|
|
795
|
+
console.info('[Galacean Effects Plugin Orientation Transformer] version: ' + version);
|
|
796
|
+
|
|
797
|
+
exports.OrientationAdapterAcceler = OrientationAdapterAcceler;
|
|
798
|
+
exports.closeDeviceMotion = closeDeviceMotion;
|
|
799
|
+
exports.getAdapter = getAdapter;
|
|
800
|
+
exports.openDeviceMotion = openDeviceMotion;
|
|
801
|
+
exports.version = version;
|
|
802
|
+
//# sourceMappingURL=index.js.map
|