@galacean/effects-core 2.5.0-alpha.0 → 2.5.0-alpha.2

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.
@@ -2,7 +2,7 @@ import { Color } from '@galacean/effects-math/es/core/color';
2
2
  import * as spec from '@galacean/effects-specification';
3
3
  import type { Engine } from '../engine';
4
4
  import type { Maskable } from '../material';
5
- import { MaskMode, MaskProcessor } from '../material';
5
+ import { MaskProcessor } from '../material';
6
6
  import type { BoundingBoxTriangle, HitTestTriangleParams, splitsDataType } from '../plugins';
7
7
  import { MeshCollider } from '../plugins';
8
8
  import type { Renderer } from '../render';
@@ -16,9 +16,7 @@ import { RendererComponent } from './renderer-component';
16
16
  export interface ItemRenderer extends Required<Omit<spec.RendererOptions, 'texture' | 'shape' | 'anchor' | 'particleOrigin' | 'mask'>> {
17
17
  texture: Texture;
18
18
  mask: number;
19
- maskMode: MaskMode;
20
19
  shape?: GeometryFromShape;
21
- alphaMask: boolean;
22
20
  }
23
21
  /**
24
22
  * @since 2.1.0
@@ -357,7 +357,6 @@ export declare class Composition extends EventEmitter<CompositionEvent<Compositi
357
357
  */
358
358
  update(deltaTime: number): void;
359
359
  private shouldDispose;
360
- private getUpdateTime;
361
360
  private callAwake;
362
361
  /**
363
362
  * 更新视频数据到纹理
@@ -377,7 +376,7 @@ export declare class Composition extends EventEmitter<CompositionEvent<Compositi
377
376
  /**
378
377
  * 更新主合成组件
379
378
  */
380
- private updateRootComposition;
379
+ private updateCompositionTime;
381
380
  /**
382
381
  * 通过名称获取元素
383
382
  * @param name - 元素名称
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * Description: Galacean Effects runtime core for the web
4
4
  * Author: Ant Group CO., Ltd.
5
5
  * Contributors: 燃然,飂兮,十弦,云垣,茂安,意绮
6
- * Version: v2.5.0-alpha.0
6
+ * Version: v2.5.0-alpha.2
7
7
  */
8
8
 
9
9
  'use strict';
@@ -680,6 +680,17 @@ function asserts(condition, msg) {
680
680
  return /^[^\d.][\w-]*$/.test(fontFamily);
681
681
  }
682
682
 
683
+ /**
684
+ * Simple implementation of the deferred pattern.
685
+ * An object that exposes a promise and functions to resolve and reject it.
686
+ */ var Deferred = function Deferred() {
687
+ var _this = this;
688
+ this.promise = new Promise(function(resolve, reject) {
689
+ _this.resolve = resolve;
690
+ _this.reject = reject;
691
+ });
692
+ };
693
+
683
694
  var prefix = "[Galacean Effects]";
684
695
  var localLogger;
685
696
  function format(message) {
@@ -7625,6 +7636,8 @@ exports.MaterialRenderType = void 0;
7625
7636
  var MaskProcessor = /*#__PURE__*/ function() {
7626
7637
  function MaskProcessor(engine) {
7627
7638
  this.engine = engine;
7639
+ this.alphaMaskEnabled = false;
7640
+ this.maskMode = exports.MaskMode.NONE;
7628
7641
  this.maskable = null;
7629
7642
  this.stencilClearAction = {
7630
7643
  stencilAction: exports.TextureLoadAction.clear
@@ -7635,19 +7648,17 @@ var MaskProcessor = /*#__PURE__*/ function() {
7635
7648
  return 1;
7636
7649
  };
7637
7650
  _proto.getMaskMode = function getMaskMode(data) {
7638
- var maskMode = exports.MaskMode.NONE;
7639
- if (data.mask) {
7640
- var _data_mask = data.mask, _data_mask_mask = _data_mask.mask, mask = _data_mask_mask === void 0 ? false : _data_mask_mask, _data_mask_mode = _data_mask.mode, mode = _data_mask_mode === void 0 ? exports.MaskMode.NONE : _data_mask_mode, ref = _data_mask.ref;
7641
- if (mask) {
7642
- maskMode = exports.MaskMode.MASK;
7643
- } else if (mode === ObscuredMode.OBSCURED || mode === ObscuredMode.REVERSE_OBSCURED) {
7644
- maskMode = mode === ObscuredMode.OBSCURED ? exports.MaskMode.OBSCURED : exports.MaskMode.REVERSE_OBSCURED;
7645
- if (ref) {
7646
- this.maskable = ref;
7647
- }
7651
+ var _data_isMask = data.isMask, isMask = _data_isMask === void 0 ? false : _data_isMask, _data_inverted = data.inverted, inverted = _data_inverted === void 0 ? false : _data_inverted, reference = data.reference, _data_alphaMaskEnabled = data.alphaMaskEnabled, alphaMaskEnabled = _data_alphaMaskEnabled === void 0 ? false : _data_alphaMaskEnabled;
7652
+ this.alphaMaskEnabled = alphaMaskEnabled;
7653
+ if (isMask) {
7654
+ this.maskMode = exports.MaskMode.MASK;
7655
+ } else {
7656
+ this.maskMode = inverted ? exports.MaskMode.REVERSE_OBSCURED : exports.MaskMode.OBSCURED;
7657
+ if (reference) {
7658
+ this.maskable = this.engine.findObject(reference);
7648
7659
  }
7649
7660
  }
7650
- return maskMode;
7661
+ return this.maskMode;
7651
7662
  };
7652
7663
  _proto.drawStencilMask = function drawStencilMask(renderer) {
7653
7664
  if (this.maskable) {
@@ -12491,9 +12502,7 @@ var singleSplits = [
12491
12502
  occlusion: false,
12492
12503
  transparentOcclusion: false,
12493
12504
  side: SideMode.DOUBLE,
12494
- maskMode: exports.MaskMode.NONE,
12495
- mask: 0,
12496
- alphaMask: false
12505
+ mask: 0
12497
12506
  };
12498
12507
  _this.defaultGeometry = Geometry.create(_this.engine, {
12499
12508
  attributes: {
@@ -12783,7 +12792,8 @@ var singleSplits = [
12783
12792
  return geometry;
12784
12793
  };
12785
12794
  _proto.configureMaterial = function configureMaterial(renderer) {
12786
- var side = renderer.side, occlusion = renderer.occlusion, blendMode = renderer.blending, maskMode = renderer.maskMode, mask = renderer.mask, texture = renderer.texture;
12795
+ var side = renderer.side, occlusion = renderer.occlusion, blendMode = renderer.blending, mask = renderer.mask, texture = renderer.texture;
12796
+ var maskMode = this.maskManager.maskMode;
12787
12797
  var material = this.material;
12788
12798
  material.blending = true;
12789
12799
  material.depthTest = true;
@@ -12804,9 +12814,9 @@ var singleSplits = [
12804
12814
  texParams.x = renderer.occlusion ? +renderer.transparentOcclusion : 1;
12805
12815
  texParams.y = preMultiAlpha;
12806
12816
  texParams.z = renderer.renderMode;
12807
- texParams.w = renderer.maskMode;
12817
+ texParams.w = maskMode;
12808
12818
  material.setVector4("_TexParams", texParams);
12809
- if (texParams.x === 0 || renderer.alphaMask) {
12819
+ if (texParams.x === 0 || this.maskManager.alphaMaskEnabled) {
12810
12820
  material.enableMacro("ALPHA_CLIP");
12811
12821
  } else {
12812
12822
  material.disableMacro("ALPHA_CLIP");
@@ -12833,11 +12843,10 @@ var singleSplits = [
12833
12843
  var renderer = (_baseRenderComponentData_renderer = baseRenderComponentData.renderer) != null ? _baseRenderComponentData_renderer : {};
12834
12844
  var splits = baseRenderComponentData.splits;
12835
12845
  var textureSheetAnimation = baseRenderComponentData.textureSheetAnimation;
12836
- var maskProps = data.mask;
12837
- if (maskProps && maskProps.ref) {
12838
- maskProps.ref = this.engine.findObject(maskProps.ref);
12846
+ var maskOptions = baseRenderComponentData.mask;
12847
+ if (maskOptions) {
12848
+ this.maskManager.getMaskMode(maskOptions);
12839
12849
  }
12840
- var maskMode = this.maskManager.getMaskMode(data);
12841
12850
  // TODO 新蒙板上线后移除
12842
12851
  //-------------------------------------------------------------------------
12843
12852
  var shapeData = renderer.shape;
@@ -12849,23 +12858,39 @@ var singleSplits = [
12849
12858
  //-------------------------------------------------------------------------
12850
12859
  this.splits = splits || singleSplits;
12851
12860
  this.textureSheetAnimation = textureSheetAnimation;
12852
- var _renderer_renderMode, _renderer_blending, _renderer_side, _renderer_alphaMask;
12861
+ var _renderer_renderMode, _renderer_blending, _renderer_side;
12853
12862
  this.renderer = {
12854
12863
  renderMode: (_renderer_renderMode = renderer.renderMode) != null ? _renderer_renderMode : RenderMode.MESH,
12855
12864
  blending: (_renderer_blending = renderer.blending) != null ? _renderer_blending : BlendingMode.ALPHA,
12856
12865
  texture: renderer.texture ? this.engine.findObject(renderer.texture) : this.engine.emptyTexture,
12857
12866
  occlusion: !!renderer.occlusion,
12858
- transparentOcclusion: !!renderer.transparentOcclusion || maskMode === exports.MaskMode.MASK,
12867
+ transparentOcclusion: !!renderer.transparentOcclusion || this.maskManager.maskMode === exports.MaskMode.MASK,
12859
12868
  side: (_renderer_side = renderer.side) != null ? _renderer_side : SideMode.DOUBLE,
12860
12869
  mask: this.maskManager.getRefValue(),
12861
- shape: shapeGeometry,
12862
- maskMode: maskMode,
12863
- //@ts-expect-error TODO 新蒙版兼容老数据需要增加纹理透明度蒙版是否开启参数
12864
- alphaMask: (_renderer_alphaMask = renderer.alphaMask) != null ? _renderer_alphaMask : false
12870
+ shape: shapeGeometry
12865
12871
  };
12866
12872
  this.configureMaterial(this.renderer);
12867
12873
  if (baseRenderComponentData.geometry) {
12868
12874
  this.geometry = this.engine.findObject(baseRenderComponentData.geometry);
12875
+ var uvTransform = baseRenderComponentData.splits && !baseRenderComponentData.textureSheetAnimation ? baseRenderComponentData.splits[0] : singleSplits[0];
12876
+ var x = uvTransform[0];
12877
+ var y = uvTransform[1];
12878
+ var isRotate90 = uvTransform[4];
12879
+ var width = isRotate90 ? uvTransform[3] : uvTransform[2];
12880
+ var height = isRotate90 ? uvTransform[2] : uvTransform[3];
12881
+ var aUV = this.geometry.getAttributeData("aUV");
12882
+ var aPos = this.geometry.getAttributeData("aPos");
12883
+ if (aUV && aPos) {
12884
+ var vertexCount = aUV.length / 2;
12885
+ for(var i = 0; i < vertexCount; i++){
12886
+ var positionOffset = i * 3;
12887
+ var uvOffset = i * 2;
12888
+ var positionX = aPos[positionOffset];
12889
+ var positionY = aPos[positionOffset + 1];
12890
+ aUV[uvOffset] = (positionX + 0.5) * width + x;
12891
+ aUV[uvOffset + 1] = (positionY + 0.5) * height + y;
12892
+ }
12893
+ }
12869
12894
  } else {
12870
12895
  this.geometry = this.defaultGeometry;
12871
12896
  this.configureDefaultGeometry(this.renderer);
@@ -13204,17 +13229,15 @@ exports.ShapeComponent = /*#__PURE__*/ function(BaseRenderComponent) {
13204
13229
  break;
13205
13230
  }
13206
13231
  }
13207
- var maskProps = data.mask;
13208
- if (maskProps && maskProps.ref) {
13209
- maskProps.ref = this.engine.findObject(maskProps.ref);
13232
+ if (data.mask) {
13233
+ this.maskManager.getMaskMode(data.mask);
13210
13234
  }
13211
- var maskMode = this.maskManager.getMaskMode(data);
13212
13235
  var maskRef = this.maskManager.getRefValue();
13213
13236
  this.material.stencilRef = maskRef !== undefined ? [
13214
13237
  maskRef,
13215
13238
  maskRef
13216
13239
  ] : undefined;
13217
- setMaskMode(this.material, maskMode);
13240
+ setMaskMode(this.material, this.maskManager.maskMode);
13218
13241
  };
13219
13242
  _create_class(ShapeComponent, [
13220
13243
  {
@@ -19689,11 +19712,7 @@ exports.ParticleSystem = /*#__PURE__*/ function(Component) {
19689
19712
  var maskMode = exports.MaskMode.NONE;
19690
19713
  var maskRef = 0;
19691
19714
  if (data.mask) {
19692
- var maskProps = data.mask;
19693
- if (maskProps && maskProps.ref) {
19694
- maskProps.ref = this.engine.findObject(maskProps.ref);
19695
- }
19696
- maskMode = this.maskManager.getMaskMode(data);
19715
+ maskMode = this.maskManager.getMaskMode(data.mask);
19697
19716
  maskRef = this.maskManager.getRefValue();
19698
19717
  }
19699
19718
  return {
@@ -20234,7 +20253,7 @@ var RuntimeClip = /*#__PURE__*/ function() {
20234
20253
  this.playable.play();
20235
20254
  }
20236
20255
  this.parentMixer.setClipWeight(this.playable, weight);
20237
- var clipTime = parseFloat(clip.toLocalTime(localTime).toFixed(3));
20256
+ var clipTime = clip.toLocalTime(localTime);
20238
20257
  this.playable.setTime(clipTime);
20239
20258
  // 判断动画是否结束
20240
20259
  if (ended) {
@@ -21423,11 +21442,12 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21423
21442
  * 前进合成到指定时间
21424
21443
  * @param time - 相对0时刻的时间
21425
21444
  */ _proto.forwardTime = function forwardTime(time) {
21426
- var deltaTime = time * 1000 - this.rootComposition.time * 1000;
21445
+ var deltaTime = time * 1000 - this.time * 1000;
21427
21446
  var reverse = deltaTime < 0;
21428
21447
  var step = 15;
21429
21448
  var t = Math.abs(deltaTime);
21430
21449
  var ss = reverse ? -step : step;
21450
+ // FIXME Update 中可能会修改合成时间,这边需要优化更新逻辑
21431
21451
  for(t; t > step; t -= step){
21432
21452
  this.update(ss);
21433
21453
  }
@@ -21467,13 +21487,14 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21467
21487
  this.callAwake(this.rootItem);
21468
21488
  this.rootItem.beginPlay();
21469
21489
  }
21470
- var dt = parseFloat(this.getUpdateTime(deltaTime * this.speed).toFixed(0));
21471
- this.updateRootComposition(dt / 1000);
21490
+ var previousCompositionTime = this.time;
21491
+ this.updateCompositionTime(deltaTime * this.speed / 1000);
21492
+ var deltaTimeInMs = (this.time - previousCompositionTime) * 1000;
21472
21493
  this.updateVideo();
21473
21494
  // 更新 model-tree-plugin
21474
- this.updatePluginLoaders(deltaTime);
21475
- this.sceneTicking.update.tick(dt);
21476
- this.sceneTicking.lateUpdate.tick(dt);
21495
+ this.updatePluginLoaders(deltaTimeInMs);
21496
+ this.sceneTicking.update.tick(deltaTimeInMs);
21497
+ this.sceneTicking.lateUpdate.tick(deltaTimeInMs);
21477
21498
  this.updateCamera();
21478
21499
  this.prepareRender();
21479
21500
  if (this.isEnded && !this.isEndCalled) {
@@ -21489,14 +21510,6 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21489
21510
  _proto.shouldDispose = function shouldDispose() {
21490
21511
  return this.isEnded && this.rootItem.endBehavior === EndBehavior.destroy && !this.reusable;
21491
21512
  };
21492
- _proto.getUpdateTime = function getUpdateTime(t) {
21493
- var startTimeInMs = this.startTime * 1000;
21494
- var now = this.rootComposition.time * 1000;
21495
- if (t < 0 && now + t < startTimeInMs) {
21496
- return startTimeInMs - now;
21497
- }
21498
- return t;
21499
- };
21500
21513
  _proto.callAwake = function callAwake(item) {
21501
21514
  for(var _iterator = _create_for_of_iterator_helper_loose(item.components), _step; !(_step = _iterator()).done;){
21502
21515
  var component = _step.value;
@@ -21541,14 +21554,18 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21541
21554
  };
21542
21555
  /**
21543
21556
  * 更新主合成组件
21544
- */ _proto.updateRootComposition = function updateRootComposition(deltaTime) {
21557
+ */ _proto.updateCompositionTime = function updateCompositionTime(deltaTime) {
21545
21558
  if (this.rootComposition.state === PlayState.Paused || !this.rootComposition.isActiveAndEnabled) {
21546
21559
  return;
21547
21560
  }
21548
- var localTime = parseFloat((this.time + deltaTime - this.rootItem.start).toFixed(3));
21549
- var isEnded = false;
21561
+ // 相对于合成开始时间的时间
21562
+ var localTime = this.time + deltaTime - this.startTime;
21563
+ if (deltaTime < 0 && localTime < 0) {
21564
+ localTime = 0;
21565
+ }
21550
21566
  var duration = this.rootItem.duration;
21551
21567
  var endBehavior = this.rootItem.endBehavior;
21568
+ var isEnded = false;
21552
21569
  if (localTime - duration > 0.001) {
21553
21570
  isEnded = true;
21554
21571
  switch(endBehavior){
@@ -21573,7 +21590,7 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21573
21590
  }
21574
21591
  }
21575
21592
  }
21576
- this.rootComposition.time = localTime;
21593
+ this.rootComposition.time = localTime + this.startTime;
21577
21594
  // end state changed, handle onEnd flags
21578
21595
  if (this.isEnded !== isEnded) {
21579
21596
  if (isEnded) {
@@ -27546,13 +27563,13 @@ function processMask(renderContent) {
27546
27563
  }
27547
27564
  if (maskMode === exports.MaskMode.MASK) {
27548
27565
  renderContent.mask = {
27549
- mask: true
27566
+ isMask: true
27550
27567
  };
27551
27568
  currentMaskComponent = renderContent.id;
27552
27569
  } else if (maskMode === ObscuredMode.OBSCURED || maskMode === ObscuredMode.REVERSE_OBSCURED) {
27553
27570
  renderContent.mask = {
27554
- mode: maskMode,
27555
- ref: {
27571
+ inverted: maskMode === ObscuredMode.REVERSE_OBSCURED ? true : false,
27572
+ reference: {
27556
27573
  "id": currentMaskComponent
27557
27574
  }
27558
27575
  };
@@ -28376,6 +28393,7 @@ function getStandardSpriteContent(sprite, transform) {
28376
28393
  return ret;
28377
28394
  }
28378
28395
 
28396
+ var version$1 = "2.5.0-alpha.2";
28379
28397
  var v0 = /^(\d+)\.(\d+)\.(\d+)(-(\w+)\.\d+)?$/;
28380
28398
  var standardVersion = /^(\d+)\.(\d+)$/;
28381
28399
  var reverseParticle = false;
@@ -28383,6 +28401,11 @@ function getStandardJSON(json) {
28383
28401
  if (!json || typeof json !== "object") {
28384
28402
  throw new Error("Invalid input: Expected a JSON object.");
28385
28403
  }
28404
+ // 如果 JSON 中的 runtime 版本高于当前运行时版本,则发出警告
28405
+ if (checkRuntimeVersion(json)) {
28406
+ var _json_playerVersion;
28407
+ console.warn("The JSON need higher than " + ((_json_playerVersion = json.playerVersion) == null ? void 0 : _json_playerVersion.web) + " runtime version(current: " + version$1 + "). Some features may not work as expected.");
28408
+ }
28386
28409
  // 修正老版本数据中,meshItem 以及 lightItem 结束行为错误问题
28387
28410
  version22Migration(json);
28388
28411
  if (v0.test(json.version)) {
@@ -28698,6 +28721,21 @@ function getStandardItem(item, opt) {
28698
28721
  return {};
28699
28722
  }
28700
28723
  }
28724
+ /**
28725
+ * 检查 json.playerVersion.web 的版本号是否低于当前 runtime 的版本
28726
+ */ function checkRuntimeVersion(json) {
28727
+ var _ref = json.playerVersion || {}, _ref_web = _ref.web, web = _ref_web === void 0 ? "" : _ref_web;
28728
+ if (web) {
28729
+ var _v0_exec;
28730
+ var jsonVersionMatch = (_v0_exec = v0.exec(web)) != null ? _v0_exec : [];
28731
+ var _v0_exec1;
28732
+ var runtimeVersionMatch = (_v0_exec1 = v0.exec(version$1)) != null ? _v0_exec1 : [];
28733
+ var major = jsonVersionMatch[1], minor = jsonVersionMatch[2];
28734
+ var currentMajor = runtimeVersionMatch[1], currentMinor = runtimeVersionMatch[2];
28735
+ return Number(currentMajor) < Number(major) || Number(currentMajor) === Number(major) && Number(currentMinor) < Number(minor);
28736
+ }
28737
+ return false;
28738
+ }
28701
28739
 
28702
28740
  var _obj;
28703
28741
  /**
@@ -31605,7 +31643,7 @@ registerPlugin("sprite", SpriteLoader, exports.VFXItem);
31605
31643
  registerPlugin("particle", ParticleLoader, exports.VFXItem);
31606
31644
  registerPlugin("cal", CalculateLoader, exports.VFXItem);
31607
31645
  registerPlugin("interact", InteractLoader, exports.VFXItem);
31608
- var version = "2.5.0-alpha.0";
31646
+ var version = "2.5.0-alpha.2";
31609
31647
  logger.info("Core version: " + version + ".");
31610
31648
 
31611
31649
  exports.AbstractPlugin = AbstractPlugin;
@@ -31633,6 +31671,7 @@ exports.Composition = Composition;
31633
31671
  exports.DEFAULT_FONTS = DEFAULT_FONTS;
31634
31672
  exports.DEFAULT_FPS = DEFAULT_FPS;
31635
31673
  exports.Database = Database;
31674
+ exports.Deferred = Deferred;
31636
31675
  exports.Downloader = Downloader;
31637
31676
  exports.EFFECTS_COPY_MESH_NAME = EFFECTS_COPY_MESH_NAME;
31638
31677
  exports.EVENT_TYPE_CLICK = EVENT_TYPE_CLICK;