@galacean/effects-threejs 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.
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * Description: Galacean Effects runtime threejs plugin 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';
@@ -702,6 +702,17 @@ function asserts(condition, msg) {
702
702
  return /^[^\d.][\w-]*$/.test(fontFamily);
703
703
  }
704
704
 
705
+ /**
706
+ * Simple implementation of the deferred pattern.
707
+ * An object that exposes a promise and functions to resolve and reject it.
708
+ */ var Deferred = function Deferred() {
709
+ var _this = this;
710
+ this.promise = new Promise(function(resolve, reject) {
711
+ _this.resolve = resolve;
712
+ _this.reject = reject;
713
+ });
714
+ };
715
+
705
716
  var prefix = "[Galacean Effects]";
706
717
  var localLogger;
707
718
  function format(message) {
@@ -7647,6 +7658,8 @@ exports.MaterialRenderType = void 0;
7647
7658
  var MaskProcessor = /*#__PURE__*/ function() {
7648
7659
  function MaskProcessor(engine) {
7649
7660
  this.engine = engine;
7661
+ this.alphaMaskEnabled = false;
7662
+ this.maskMode = exports.MaskMode.NONE;
7650
7663
  this.maskable = null;
7651
7664
  this.stencilClearAction = {
7652
7665
  stencilAction: exports.TextureLoadAction.clear
@@ -7657,19 +7670,17 @@ var MaskProcessor = /*#__PURE__*/ function() {
7657
7670
  return 1;
7658
7671
  };
7659
7672
  _proto.getMaskMode = function getMaskMode(data) {
7660
- var maskMode = exports.MaskMode.NONE;
7661
- if (data.mask) {
7662
- 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;
7663
- if (mask) {
7664
- maskMode = exports.MaskMode.MASK;
7665
- } else if (mode === ObscuredMode.OBSCURED || mode === ObscuredMode.REVERSE_OBSCURED) {
7666
- maskMode = mode === ObscuredMode.OBSCURED ? exports.MaskMode.OBSCURED : exports.MaskMode.REVERSE_OBSCURED;
7667
- if (ref) {
7668
- this.maskable = ref;
7669
- }
7673
+ 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;
7674
+ this.alphaMaskEnabled = alphaMaskEnabled;
7675
+ if (isMask) {
7676
+ this.maskMode = exports.MaskMode.MASK;
7677
+ } else {
7678
+ this.maskMode = inverted ? exports.MaskMode.REVERSE_OBSCURED : exports.MaskMode.OBSCURED;
7679
+ if (reference) {
7680
+ this.maskable = this.engine.findObject(reference);
7670
7681
  }
7671
7682
  }
7672
- return maskMode;
7683
+ return this.maskMode;
7673
7684
  };
7674
7685
  _proto.drawStencilMask = function drawStencilMask(renderer) {
7675
7686
  if (this.maskable) {
@@ -12513,9 +12524,7 @@ var singleSplits = [
12513
12524
  occlusion: false,
12514
12525
  transparentOcclusion: false,
12515
12526
  side: SideMode.DOUBLE,
12516
- maskMode: exports.MaskMode.NONE,
12517
- mask: 0,
12518
- alphaMask: false
12527
+ mask: 0
12519
12528
  };
12520
12529
  _this.defaultGeometry = Geometry.create(_this.engine, {
12521
12530
  attributes: {
@@ -12805,7 +12814,8 @@ var singleSplits = [
12805
12814
  return geometry;
12806
12815
  };
12807
12816
  _proto.configureMaterial = function configureMaterial(renderer) {
12808
- var side = renderer.side, occlusion = renderer.occlusion, blendMode = renderer.blending, maskMode = renderer.maskMode, mask = renderer.mask, texture = renderer.texture;
12817
+ var side = renderer.side, occlusion = renderer.occlusion, blendMode = renderer.blending, mask = renderer.mask, texture = renderer.texture;
12818
+ var maskMode = this.maskManager.maskMode;
12809
12819
  var material = this.material;
12810
12820
  material.blending = true;
12811
12821
  material.depthTest = true;
@@ -12826,9 +12836,9 @@ var singleSplits = [
12826
12836
  texParams.x = renderer.occlusion ? +renderer.transparentOcclusion : 1;
12827
12837
  texParams.y = preMultiAlpha;
12828
12838
  texParams.z = renderer.renderMode;
12829
- texParams.w = renderer.maskMode;
12839
+ texParams.w = maskMode;
12830
12840
  material.setVector4("_TexParams", texParams);
12831
- if (texParams.x === 0 || renderer.alphaMask) {
12841
+ if (texParams.x === 0 || this.maskManager.alphaMaskEnabled) {
12832
12842
  material.enableMacro("ALPHA_CLIP");
12833
12843
  } else {
12834
12844
  material.disableMacro("ALPHA_CLIP");
@@ -12855,11 +12865,10 @@ var singleSplits = [
12855
12865
  var renderer = (_baseRenderComponentData_renderer = baseRenderComponentData.renderer) != null ? _baseRenderComponentData_renderer : {};
12856
12866
  var splits = baseRenderComponentData.splits;
12857
12867
  var textureSheetAnimation = baseRenderComponentData.textureSheetAnimation;
12858
- var maskProps = data.mask;
12859
- if (maskProps && maskProps.ref) {
12860
- maskProps.ref = this.engine.findObject(maskProps.ref);
12868
+ var maskOptions = baseRenderComponentData.mask;
12869
+ if (maskOptions) {
12870
+ this.maskManager.getMaskMode(maskOptions);
12861
12871
  }
12862
- var maskMode = this.maskManager.getMaskMode(data);
12863
12872
  // TODO 新蒙板上线后移除
12864
12873
  //-------------------------------------------------------------------------
12865
12874
  var shapeData = renderer.shape;
@@ -12871,23 +12880,39 @@ var singleSplits = [
12871
12880
  //-------------------------------------------------------------------------
12872
12881
  this.splits = splits || singleSplits;
12873
12882
  this.textureSheetAnimation = textureSheetAnimation;
12874
- var _renderer_renderMode, _renderer_blending, _renderer_side, _renderer_alphaMask;
12883
+ var _renderer_renderMode, _renderer_blending, _renderer_side;
12875
12884
  this.renderer = {
12876
12885
  renderMode: (_renderer_renderMode = renderer.renderMode) != null ? _renderer_renderMode : RenderMode.MESH,
12877
12886
  blending: (_renderer_blending = renderer.blending) != null ? _renderer_blending : BlendingMode.ALPHA,
12878
12887
  texture: renderer.texture ? this.engine.findObject(renderer.texture) : this.engine.emptyTexture,
12879
12888
  occlusion: !!renderer.occlusion,
12880
- transparentOcclusion: !!renderer.transparentOcclusion || maskMode === exports.MaskMode.MASK,
12889
+ transparentOcclusion: !!renderer.transparentOcclusion || this.maskManager.maskMode === exports.MaskMode.MASK,
12881
12890
  side: (_renderer_side = renderer.side) != null ? _renderer_side : SideMode.DOUBLE,
12882
12891
  mask: this.maskManager.getRefValue(),
12883
- shape: shapeGeometry,
12884
- maskMode: maskMode,
12885
- //@ts-expect-error TODO 新蒙版兼容老数据需要增加纹理透明度蒙版是否开启参数
12886
- alphaMask: (_renderer_alphaMask = renderer.alphaMask) != null ? _renderer_alphaMask : false
12892
+ shape: shapeGeometry
12887
12893
  };
12888
12894
  this.configureMaterial(this.renderer);
12889
12895
  if (baseRenderComponentData.geometry) {
12890
12896
  this.geometry = this.engine.findObject(baseRenderComponentData.geometry);
12897
+ var uvTransform = baseRenderComponentData.splits && !baseRenderComponentData.textureSheetAnimation ? baseRenderComponentData.splits[0] : singleSplits[0];
12898
+ var x = uvTransform[0];
12899
+ var y = uvTransform[1];
12900
+ var isRotate90 = uvTransform[4];
12901
+ var width = isRotate90 ? uvTransform[3] : uvTransform[2];
12902
+ var height = isRotate90 ? uvTransform[2] : uvTransform[3];
12903
+ var aUV = this.geometry.getAttributeData("aUV");
12904
+ var aPos = this.geometry.getAttributeData("aPos");
12905
+ if (aUV && aPos) {
12906
+ var vertexCount = aUV.length / 2;
12907
+ for(var i = 0; i < vertexCount; i++){
12908
+ var positionOffset = i * 3;
12909
+ var uvOffset = i * 2;
12910
+ var positionX = aPos[positionOffset];
12911
+ var positionY = aPos[positionOffset + 1];
12912
+ aUV[uvOffset] = (positionX + 0.5) * width + x;
12913
+ aUV[uvOffset + 1] = (positionY + 0.5) * height + y;
12914
+ }
12915
+ }
12891
12916
  } else {
12892
12917
  this.geometry = this.defaultGeometry;
12893
12918
  this.configureDefaultGeometry(this.renderer);
@@ -13226,17 +13251,15 @@ exports.ShapeComponent = /*#__PURE__*/ function(BaseRenderComponent) {
13226
13251
  break;
13227
13252
  }
13228
13253
  }
13229
- var maskProps = data.mask;
13230
- if (maskProps && maskProps.ref) {
13231
- maskProps.ref = this.engine.findObject(maskProps.ref);
13254
+ if (data.mask) {
13255
+ this.maskManager.getMaskMode(data.mask);
13232
13256
  }
13233
- var maskMode = this.maskManager.getMaskMode(data);
13234
13257
  var maskRef = this.maskManager.getRefValue();
13235
13258
  this.material.stencilRef = maskRef !== undefined ? [
13236
13259
  maskRef,
13237
13260
  maskRef
13238
13261
  ] : undefined;
13239
- setMaskMode(this.material, maskMode);
13262
+ setMaskMode(this.material, this.maskManager.maskMode);
13240
13263
  };
13241
13264
  _create_class(ShapeComponent, [
13242
13265
  {
@@ -19711,11 +19734,7 @@ exports.ParticleSystem = /*#__PURE__*/ function(Component) {
19711
19734
  var maskMode = exports.MaskMode.NONE;
19712
19735
  var maskRef = 0;
19713
19736
  if (data.mask) {
19714
- var maskProps = data.mask;
19715
- if (maskProps && maskProps.ref) {
19716
- maskProps.ref = this.engine.findObject(maskProps.ref);
19717
- }
19718
- maskMode = this.maskManager.getMaskMode(data);
19737
+ maskMode = this.maskManager.getMaskMode(data.mask);
19719
19738
  maskRef = this.maskManager.getRefValue();
19720
19739
  }
19721
19740
  return {
@@ -20256,7 +20275,7 @@ var RuntimeClip = /*#__PURE__*/ function() {
20256
20275
  this.playable.play();
20257
20276
  }
20258
20277
  this.parentMixer.setClipWeight(this.playable, weight);
20259
- var clipTime = parseFloat(clip.toLocalTime(localTime).toFixed(3));
20278
+ var clipTime = clip.toLocalTime(localTime);
20260
20279
  this.playable.setTime(clipTime);
20261
20280
  // 判断动画是否结束
20262
20281
  if (ended) {
@@ -21445,11 +21464,12 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21445
21464
  * 前进合成到指定时间
21446
21465
  * @param time - 相对0时刻的时间
21447
21466
  */ _proto.forwardTime = function forwardTime(time) {
21448
- var deltaTime = time * 1000 - this.rootComposition.time * 1000;
21467
+ var deltaTime = time * 1000 - this.time * 1000;
21449
21468
  var reverse = deltaTime < 0;
21450
21469
  var step = 15;
21451
21470
  var t = Math.abs(deltaTime);
21452
21471
  var ss = reverse ? -step : step;
21472
+ // FIXME Update 中可能会修改合成时间,这边需要优化更新逻辑
21453
21473
  for(t; t > step; t -= step){
21454
21474
  this.update(ss);
21455
21475
  }
@@ -21489,13 +21509,14 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21489
21509
  this.callAwake(this.rootItem);
21490
21510
  this.rootItem.beginPlay();
21491
21511
  }
21492
- var dt = parseFloat(this.getUpdateTime(deltaTime * this.speed).toFixed(0));
21493
- this.updateRootComposition(dt / 1000);
21512
+ var previousCompositionTime = this.time;
21513
+ this.updateCompositionTime(deltaTime * this.speed / 1000);
21514
+ var deltaTimeInMs = (this.time - previousCompositionTime) * 1000;
21494
21515
  this.updateVideo();
21495
21516
  // 更新 model-tree-plugin
21496
- this.updatePluginLoaders(deltaTime);
21497
- this.sceneTicking.update.tick(dt);
21498
- this.sceneTicking.lateUpdate.tick(dt);
21517
+ this.updatePluginLoaders(deltaTimeInMs);
21518
+ this.sceneTicking.update.tick(deltaTimeInMs);
21519
+ this.sceneTicking.lateUpdate.tick(deltaTimeInMs);
21499
21520
  this.updateCamera();
21500
21521
  this.prepareRender();
21501
21522
  if (this.isEnded && !this.isEndCalled) {
@@ -21511,14 +21532,6 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21511
21532
  _proto.shouldDispose = function shouldDispose() {
21512
21533
  return this.isEnded && this.rootItem.endBehavior === EndBehavior.destroy && !this.reusable;
21513
21534
  };
21514
- _proto.getUpdateTime = function getUpdateTime(t) {
21515
- var startTimeInMs = this.startTime * 1000;
21516
- var now = this.rootComposition.time * 1000;
21517
- if (t < 0 && now + t < startTimeInMs) {
21518
- return startTimeInMs - now;
21519
- }
21520
- return t;
21521
- };
21522
21535
  _proto.callAwake = function callAwake(item) {
21523
21536
  for(var _iterator = _create_for_of_iterator_helper_loose(item.components), _step; !(_step = _iterator()).done;){
21524
21537
  var component = _step.value;
@@ -21563,14 +21576,18 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21563
21576
  };
21564
21577
  /**
21565
21578
  * 更新主合成组件
21566
- */ _proto.updateRootComposition = function updateRootComposition(deltaTime) {
21579
+ */ _proto.updateCompositionTime = function updateCompositionTime(deltaTime) {
21567
21580
  if (this.rootComposition.state === PlayState.Paused || !this.rootComposition.isActiveAndEnabled) {
21568
21581
  return;
21569
21582
  }
21570
- var localTime = parseFloat((this.time + deltaTime - this.rootItem.start).toFixed(3));
21571
- var isEnded = false;
21583
+ // 相对于合成开始时间的时间
21584
+ var localTime = this.time + deltaTime - this.startTime;
21585
+ if (deltaTime < 0 && localTime < 0) {
21586
+ localTime = 0;
21587
+ }
21572
21588
  var duration = this.rootItem.duration;
21573
21589
  var endBehavior = this.rootItem.endBehavior;
21590
+ var isEnded = false;
21574
21591
  if (localTime - duration > 0.001) {
21575
21592
  isEnded = true;
21576
21593
  switch(endBehavior){
@@ -21595,7 +21612,7 @@ var LateUpdateTickData = /*#__PURE__*/ function(TickData) {
21595
21612
  }
21596
21613
  }
21597
21614
  }
21598
- this.rootComposition.time = localTime;
21615
+ this.rootComposition.time = localTime + this.startTime;
21599
21616
  // end state changed, handle onEnd flags
21600
21617
  if (this.isEnded !== isEnded) {
21601
21618
  if (isEnded) {
@@ -27568,13 +27585,13 @@ function processMask(renderContent) {
27568
27585
  }
27569
27586
  if (maskMode === exports.MaskMode.MASK) {
27570
27587
  renderContent.mask = {
27571
- mask: true
27588
+ isMask: true
27572
27589
  };
27573
27590
  currentMaskComponent = renderContent.id;
27574
27591
  } else if (maskMode === ObscuredMode.OBSCURED || maskMode === ObscuredMode.REVERSE_OBSCURED) {
27575
27592
  renderContent.mask = {
27576
- mode: maskMode,
27577
- ref: {
27593
+ inverted: maskMode === ObscuredMode.REVERSE_OBSCURED ? true : false,
27594
+ reference: {
27578
27595
  "id": currentMaskComponent
27579
27596
  }
27580
27597
  };
@@ -28398,6 +28415,7 @@ function getStandardSpriteContent(sprite, transform) {
28398
28415
  return ret;
28399
28416
  }
28400
28417
 
28418
+ var version$2 = "2.5.0-alpha.2";
28401
28419
  var v0 = /^(\d+)\.(\d+)\.(\d+)(-(\w+)\.\d+)?$/;
28402
28420
  var standardVersion = /^(\d+)\.(\d+)$/;
28403
28421
  var reverseParticle = false;
@@ -28405,6 +28423,11 @@ function getStandardJSON(json) {
28405
28423
  if (!json || typeof json !== "object") {
28406
28424
  throw new Error("Invalid input: Expected a JSON object.");
28407
28425
  }
28426
+ // 如果 JSON 中的 runtime 版本高于当前运行时版本,则发出警告
28427
+ if (checkRuntimeVersion(json)) {
28428
+ var _json_playerVersion;
28429
+ console.warn("The JSON need higher than " + ((_json_playerVersion = json.playerVersion) == null ? void 0 : _json_playerVersion.web) + " runtime version(current: " + version$2 + "). Some features may not work as expected.");
28430
+ }
28408
28431
  // 修正老版本数据中,meshItem 以及 lightItem 结束行为错误问题
28409
28432
  version22Migration(json);
28410
28433
  if (v0.test(json.version)) {
@@ -28720,6 +28743,21 @@ function getStandardItem(item, opt) {
28720
28743
  return {};
28721
28744
  }
28722
28745
  }
28746
+ /**
28747
+ * 检查 json.playerVersion.web 的版本号是否低于当前 runtime 的版本
28748
+ */ function checkRuntimeVersion(json) {
28749
+ var _ref = json.playerVersion || {}, _ref_web = _ref.web, web = _ref_web === void 0 ? "" : _ref_web;
28750
+ if (web) {
28751
+ var _v0_exec;
28752
+ var jsonVersionMatch = (_v0_exec = v0.exec(web)) != null ? _v0_exec : [];
28753
+ var _v0_exec1;
28754
+ var runtimeVersionMatch = (_v0_exec1 = v0.exec(version$2)) != null ? _v0_exec1 : [];
28755
+ var major = jsonVersionMatch[1], minor = jsonVersionMatch[2];
28756
+ var currentMajor = runtimeVersionMatch[1], currentMinor = runtimeVersionMatch[2];
28757
+ return Number(currentMajor) < Number(major) || Number(currentMajor) === Number(major) && Number(currentMinor) < Number(minor);
28758
+ }
28759
+ return false;
28760
+ }
28723
28761
 
28724
28762
  var _obj$1;
28725
28763
  /**
@@ -31627,7 +31665,7 @@ registerPlugin("sprite", SpriteLoader, exports.VFXItem);
31627
31665
  registerPlugin("particle", ParticleLoader, exports.VFXItem);
31628
31666
  registerPlugin("cal", CalculateLoader, exports.VFXItem);
31629
31667
  registerPlugin("interact", InteractLoader, exports.VFXItem);
31630
- var version$1 = "2.5.0-alpha.0";
31668
+ var version$1 = "2.5.0-alpha.2";
31631
31669
  logger.info("Core version: " + version$1 + ".");
31632
31670
 
31633
31671
  var _obj;
@@ -33229,7 +33267,7 @@ setMaxSpriteMeshItemCount(8);
33229
33267
  */ Mesh.create = function(engine, props) {
33230
33268
  return new ThreeMesh(engine, props);
33231
33269
  };
33232
- var version = "2.5.0-alpha.0";
33270
+ var version = "2.5.0-alpha.2";
33233
33271
  logger.info("THREEJS plugin version: " + version + ".");
33234
33272
 
33235
33273
  exports.AbstractPlugin = AbstractPlugin;
@@ -33261,6 +33299,7 @@ exports.Composition = Composition;
33261
33299
  exports.DEFAULT_FONTS = DEFAULT_FONTS;
33262
33300
  exports.DEFAULT_FPS = DEFAULT_FPS;
33263
33301
  exports.Database = Database;
33302
+ exports.Deferred = Deferred;
33264
33303
  exports.Downloader = Downloader;
33265
33304
  exports.EFFECTS_COPY_MESH_NAME = EFFECTS_COPY_MESH_NAME;
33266
33305
  exports.EVENT_TYPE_CLICK = EVENT_TYPE_CLICK;