@vvfx/ge-ir 0.0.1-beta.2 → 0.0.1-beta.4

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.mjs CHANGED
@@ -3,7 +3,7 @@
3
3
  * Description: Galacean Effects and animation IR bidirectional conversion package
4
4
  * Author: Ant Group CO., Ltd.
5
5
  * Contributors: 澄弈
6
- * Version: v0.0.1-beta.2
6
+ * Version: v0.0.1-beta.4
7
7
  */
8
8
 
9
9
  import { IRBlendMode, IRShapePrimitiveType, IRFillType, IRLineCap, IRLineJoin, IRShapeFillRule, IREndBehavior, validateIRCompositionWithWarnings } from '@vvfx/animation-ir';
@@ -21,6 +21,11 @@ function _extends() {
21
21
  return _extends.apply(this, arguments);
22
22
  }
23
23
 
24
+ function _type_of(obj) {
25
+ "@swc/helpers - typeof";
26
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
27
+ }
28
+
24
29
  function _array_like_to_array(arr, len) {
25
30
  if (len == null || len > arr.length) len = arr.length;
26
31
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -124,6 +129,9 @@ var DEFAULT_CLIP_MODE = 1;
124
129
  var childTrackIds = [];
125
130
  childTrackIds.push(toDataPath(buildActivationTrack(collector, delay, duration, endBehavior)));
126
131
  childTrackIds.push(toDataPath(buildTransformTrack(collector, delay, duration, endBehavior, animation)));
132
+ if (isPrecompItemType(itemType)) {
133
+ childTrackIds.push(toDataPath(buildSubCompositionTrack(collector, delay, duration, endBehavior)));
134
+ }
127
135
  if (!isNullItemType(itemType)) {
128
136
  childTrackIds.push(toDataPath(buildSpriteColorTrack(collector, delay, duration, endBehavior, animation)));
129
137
  }
@@ -136,7 +144,10 @@ var DEFAULT_CLIP_MODE = 1;
136
144
  return objectBindingTrackId;
137
145
  }
138
146
  function isNullItemType(itemType) {
139
- return itemType === 'null' || itemType === '3';
147
+ return itemType === 'null' || itemType === '3' || isPrecompItemType(itemType);
148
+ }
149
+ function isPrecompItemType(itemType) {
150
+ return itemType === 'precomp' || itemType === '7';
140
151
  }
141
152
  function buildActivationTrack(collector, delay, duration, endBehavior) {
142
153
  var assetId = createId();
@@ -224,6 +235,28 @@ function buildSpriteColorTrack(collector, delay, duration, endBehavior, animatio
224
235
  });
225
236
  return trackId;
226
237
  }
238
+ function buildSubCompositionTrack(collector, delay, duration, endBehavior) {
239
+ var assetId = createId();
240
+ collector.miscs.push({
241
+ id: assetId,
242
+ dataType: 'SubCompositionPlayableAsset'
243
+ });
244
+ var trackId = createId();
245
+ collector.miscs.push({
246
+ id: trackId,
247
+ dataType: 'SubCompositionTrack',
248
+ children: [],
249
+ clips: [
250
+ {
251
+ start: roundNumber(delay, 4),
252
+ duration: roundNumber(duration, 4),
253
+ endBehavior: endBehavior,
254
+ asset: toDataPath(assetId)
255
+ }
256
+ ]
257
+ });
258
+ return trackId;
259
+ }
227
260
 
228
261
  var DEFAULT_OUT_TANGENT = {
229
262
  x: 0.33,
@@ -772,11 +805,6 @@ function getTimeContext(layer) {
772
805
  };
773
806
  }
774
807
 
775
- function _type_of(obj) {
776
- "@swc/helpers - typeof";
777
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
778
- }
779
-
780
808
  function readGE2IRMetadata(ir, layer) {
781
809
  if (ir.source !== 'ge') {
782
810
  return undefined;
@@ -786,7 +814,7 @@ function readGE2IRMetadata(ir, layer) {
786
814
  return undefined;
787
815
  }
788
816
  var namespaced = metadata['ge2ir'];
789
- if (isRecord$1(namespaced)) {
817
+ if (isRecord$4(namespaced)) {
790
818
  return namespaced;
791
819
  }
792
820
  var legacy = readLegacyGE2IRMetadata(metadata);
@@ -800,27 +828,46 @@ function readLegacyGE2IRMetadata(metadata) {
800
828
  var colorOverLifetime = metadata['colorOverLifetime'];
801
829
  var geComponentId = metadata['geComponentId'];
802
830
  var geMask = metadata['geMask'];
803
- if (isRecord$1(positionOverLifetime)) {
831
+ var precompRefId = metadata['precompRefId'];
832
+ var precompContent = metadata['precompContent'];
833
+ if (isRecord$4(positionOverLifetime)) {
804
834
  legacy.positionOverLifetime = positionOverLifetime;
805
835
  }
806
- if (isRecord$1(rotationOverLifetime)) {
836
+ if (isRecord$4(rotationOverLifetime)) {
807
837
  legacy.rotationOverLifetime = rotationOverLifetime;
808
838
  }
809
- if (isRecord$1(sizeOverLifetime)) {
839
+ if (isRecord$4(sizeOverLifetime)) {
810
840
  legacy.sizeOverLifetime = sizeOverLifetime;
811
841
  }
812
- if (isRecord$1(colorOverLifetime)) {
842
+ if (isRecord$4(colorOverLifetime)) {
813
843
  legacy.colorOverLifetime = colorOverLifetime;
814
844
  }
815
845
  if (typeof geComponentId === 'string') {
816
846
  legacy.geComponentId = geComponentId;
817
847
  }
818
- if (isRecord$1(geMask)) {
848
+ if (isRecord$4(geMask)) {
819
849
  legacy.geMask = geMask;
820
850
  }
851
+ if (typeof precompRefId === 'string') {
852
+ legacy.precompRefId = precompRefId;
853
+ }
854
+ if (isRecord$4(precompContent)) {
855
+ legacy.precompContent = precompContent;
856
+ }
821
857
  return legacy;
822
858
  }
823
- function isRecord$1(value) {
859
+ function readGE2IRCompositionMetadata(ir) {
860
+ if (ir.source !== 'ge') {
861
+ return undefined;
862
+ }
863
+ var metadata = ir.metadata;
864
+ if (metadata == null) {
865
+ return undefined;
866
+ }
867
+ var namespaced = metadata['ge2ir'];
868
+ return isRecord$4(namespaced) ? namespaced : undefined;
869
+ }
870
+ function isRecord$4(value) {
824
871
  return value != null && (typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object' && !Array.isArray(value);
825
872
  }
826
873
 
@@ -1702,6 +1749,61 @@ function processNullLayer(layer, ctx) {
1702
1749
  layerIndex: layerIndex
1703
1750
  });
1704
1751
  }
1752
+ function processPrecompLayer(layer, ctx) {
1753
+ var itemId = createId();
1754
+ var layerIndex = layer.index;
1755
+ ctx.layerToItemId[layerIndex] = itemId;
1756
+ var _computeLayerTiming = computeLayerTiming(layer, ctx.frameRate), delay = _computeLayerTiming.delay, layerDuration = _computeLayerTiming.layerDuration;
1757
+ var animation = buildTransformAnimation(layer, ctx);
1758
+ var position = computeStaticPosition(layer, ctx);
1759
+ var objectBindingTrackId = buildTimelineTracks(ctx.collector, delay, layerDuration, 4, animation, 'precomp');
1760
+ var geMetadata = readGE2IRMetadata(ctx.ir, layer);
1761
+ var content = buildPrecompContent(geMetadata == null ? void 0 : geMetadata.precompContent, geMetadata == null ? void 0 : geMetadata.precompRefId);
1762
+ var item = {
1763
+ id: itemId,
1764
+ dataType: 'VFXItemData',
1765
+ name: layer.name,
1766
+ duration: layerDuration,
1767
+ type: '7',
1768
+ visible: layer.visibility.enabled && !layer.visibility.hidden,
1769
+ endBehavior: 4,
1770
+ delay: delay,
1771
+ renderLevel: 'B+',
1772
+ content: content,
1773
+ components: [],
1774
+ transform: buildGETransform(position, [
1775
+ 0,
1776
+ 0,
1777
+ 0
1778
+ ], [
1779
+ 1,
1780
+ 1,
1781
+ 1
1782
+ ])
1783
+ };
1784
+ ctx.collector.items.push(item);
1785
+ ctx.processedItems.push({
1786
+ itemId: itemId,
1787
+ objectBindingTrackId: objectBindingTrackId,
1788
+ layerIndex: layerIndex
1789
+ });
1790
+ }
1791
+ function buildPrecompContent(rawContent, refId) {
1792
+ var content = rawContent != null ? cloneRecord(rawContent) : {};
1793
+ var rawOptions = content['options'];
1794
+ var options = isRecord$3(rawOptions) ? _extends({}, rawOptions) : {};
1795
+ if (refId != null) {
1796
+ options['refId'] = refId;
1797
+ }
1798
+ content['options'] = options;
1799
+ return content;
1800
+ }
1801
+ function cloneRecord(value) {
1802
+ return JSON.parse(JSON.stringify(value));
1803
+ }
1804
+ function isRecord$3(value) {
1805
+ return value != null && (typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object' && !Array.isArray(value);
1806
+ }
1705
1807
  /**
1706
1808
  * Emit a null+sprite pair: the null carries the layer transform and sits at
1707
1809
  * the layer's logical position; the sprite/text child carries the visual
@@ -2925,10 +3027,16 @@ function applyVisibilityStep(ir, state) {
2925
3027
  });
2926
3028
  collector.items.reverse();
2927
3029
  processedItems.reverse();
2928
- return assembleScene(workingIR, collector, processedItems, duration);
3030
+ return mergePreservedPrecompScene(assembleScene(workingIR, collector, processedItems, duration), workingIR);
2929
3031
  }
2930
3032
  function processLayer(layer, ctx) {
2931
- if (layer.type === 'null' || layer.type === 'precomp') {
3033
+ if (layer.type === 'precomp') {
3034
+ if (hasGEPrecompMetadata(ctx.ir, layer)) {
3035
+ processPrecompLayer(layer, ctx);
3036
+ } else {
3037
+ processNullLayer(layer, ctx);
3038
+ }
3039
+ } else if (layer.type === 'null') {
2932
3040
  processNullLayer(layer, ctx);
2933
3041
  } else if (ctx.parentIndexSet.has(layer.index)) {
2934
3042
  processParentLayer(layer, ctx);
@@ -2936,6 +3044,10 @@ function processLayer(layer, ctx) {
2936
3044
  processVisualLayer(layer, ctx);
2937
3045
  }
2938
3046
  }
3047
+ function hasGEPrecompMetadata(ir, layer) {
3048
+ var metadata = readGE2IRMetadata(ir, layer);
3049
+ return (metadata == null ? void 0 : metadata.precompRefId) != null || (metadata == null ? void 0 : metadata.precompContent) != null;
3050
+ }
2939
3051
  /**
2940
3052
  * Extend parent layers' endFrame to cover transform-only children's time spans.
2941
3053
  *
@@ -2973,6 +3085,209 @@ function processLayer(layer, ctx) {
2973
3085
  }
2974
3086
  return clonedLayers;
2975
3087
  }
3088
+ function mergePreservedPrecompScene(generated, ir) {
3089
+ var _loop = function() {
3090
+ var pool = _step.value;
3091
+ result[pool] = mergePool(asArray(generated[pool]), asArray(sourceScene[pool]).filter(function(entry) {
3092
+ return !isExcludedPoolEntry(pool, entry, excluded);
3093
+ }));
3094
+ };
3095
+ var metadata = readGE2IRCompositionMetadata(ir);
3096
+ var sourceScene = metadata == null ? void 0 : metadata.sourceScene;
3097
+ if (sourceScene == null) {
3098
+ return generated;
3099
+ }
3100
+ var result = _extends({}, generated);
3101
+ var sourceCompositionId = metadata == null ? void 0 : metadata.sourceCompositionId;
3102
+ var excluded = collectRootCompositionIds(sourceScene, sourceCompositionId);
3103
+ var pools = [
3104
+ 'images',
3105
+ 'fonts',
3106
+ 'plugins',
3107
+ 'components',
3108
+ 'geometries',
3109
+ 'materials',
3110
+ 'items',
3111
+ 'shaders',
3112
+ 'bins',
3113
+ 'textures',
3114
+ 'animations',
3115
+ 'miscs'
3116
+ ];
3117
+ for(var _iterator = _create_for_of_iterator_helper_loose(pools), _step; !(_step = _iterator()).done;)_loop();
3118
+ result['compositions'] = mergePool(asRecordArray(generated['compositions']), asRecordArray(sourceScene['compositions']).filter(function(comp) {
3119
+ return comp['id'] !== sourceCompositionId;
3120
+ }));
3121
+ return result;
3122
+ }
3123
+ function collectRootCompositionIds(sourceScene, sourceCompositionId) {
3124
+ var excluded = {
3125
+ components: new Set(),
3126
+ items: new Set(),
3127
+ miscs: new Set()
3128
+ };
3129
+ if (sourceCompositionId == null) {
3130
+ return excluded;
3131
+ }
3132
+ var components = asRecordArray(sourceScene['components']);
3133
+ var items = asRecordArray(sourceScene['items']);
3134
+ var miscs = asRecordArray(sourceScene['miscs']);
3135
+ var componentById = indexById(components);
3136
+ var itemById = indexById(items);
3137
+ var miscById = indexById(miscs);
3138
+ var rootComposition = asRecordArray(sourceScene['compositions']).find(function(composition) {
3139
+ return composition['id'] === sourceCompositionId;
3140
+ });
3141
+ if (rootComposition == null) {
3142
+ return excluded;
3143
+ }
3144
+ for(var _iterator = _create_for_of_iterator_helper_loose(asDataPathArray(rootComposition['components'])), _step; !(_step = _iterator()).done;){
3145
+ var componentRef = _step.value;
3146
+ var componentId = componentRef.id;
3147
+ var component = componentById.get(componentId);
3148
+ if (component == null) {
3149
+ continue;
3150
+ }
3151
+ excluded.components.add(componentId);
3152
+ for(var _iterator1 = _create_for_of_iterator_helper_loose(asDataPathArray(component['items'])), _step1; !(_step1 = _iterator1()).done;){
3153
+ var itemRef = _step1.value;
3154
+ collectItemAndOwnedComponents(itemRef.id, itemById, excluded);
3155
+ }
3156
+ var timelineAssetId = readDataPathId(component['timelineAsset']);
3157
+ if (timelineAssetId != null) {
3158
+ collectMiscGraph(timelineAssetId, miscById, excluded);
3159
+ }
3160
+ for(var _iterator2 = _create_for_of_iterator_helper_loose(asRecordArray(component['sceneBindings'])), _step2; !(_step2 = _iterator2()).done;){
3161
+ var binding = _step2.value;
3162
+ var trackId = readDataPathId(binding['key']);
3163
+ if (trackId != null) {
3164
+ collectMiscGraph(trackId, miscById, excluded);
3165
+ }
3166
+ }
3167
+ }
3168
+ return excluded;
3169
+ }
3170
+ function collectItemAndOwnedComponents(itemId, itemById, excluded) {
3171
+ var item = itemById.get(itemId);
3172
+ if (item == null || excluded.items.has(itemId)) {
3173
+ return;
3174
+ }
3175
+ excluded.items.add(itemId);
3176
+ for(var _iterator = _create_for_of_iterator_helper_loose(asDataPathArray(item['components'])), _step; !(_step = _iterator()).done;){
3177
+ var componentRef = _step.value;
3178
+ excluded.components.add(componentRef.id);
3179
+ }
3180
+ }
3181
+ function collectMiscGraph(miscId, miscById, excluded) {
3182
+ if (excluded.miscs.has(miscId)) {
3183
+ return;
3184
+ }
3185
+ var misc = miscById.get(miscId);
3186
+ if (misc == null) {
3187
+ return;
3188
+ }
3189
+ excluded.miscs.add(miscId);
3190
+ for(var _iterator = _create_for_of_iterator_helper_loose(asDataPathArray(misc['tracks'])), _step; !(_step = _iterator()).done;){
3191
+ var childRef = _step.value;
3192
+ collectMiscGraph(childRef.id, miscById, excluded);
3193
+ }
3194
+ for(var _iterator1 = _create_for_of_iterator_helper_loose(asDataPathArray(misc['children'])), _step1; !(_step1 = _iterator1()).done;){
3195
+ var childRef1 = _step1.value;
3196
+ collectMiscGraph(childRef1.id, miscById, excluded);
3197
+ }
3198
+ for(var _iterator2 = _create_for_of_iterator_helper_loose(asRecordArray(misc['clips'])), _step2; !(_step2 = _iterator2()).done;){
3199
+ var clip = _step2.value;
3200
+ var assetId = readDataPathId(clip['asset']);
3201
+ if (assetId != null) {
3202
+ collectMiscGraph(assetId, miscById, excluded);
3203
+ }
3204
+ }
3205
+ }
3206
+ function isExcludedPoolEntry(pool, entry, excluded) {
3207
+ if (!isRecord$2(entry)) {
3208
+ return false;
3209
+ }
3210
+ var id = entry['id'];
3211
+ if (typeof id !== 'string') {
3212
+ return false;
3213
+ }
3214
+ if (pool === 'components') {
3215
+ return excluded.components.has(id);
3216
+ }
3217
+ if (pool === 'items') {
3218
+ return excluded.items.has(id);
3219
+ }
3220
+ if (pool === 'miscs') {
3221
+ return excluded.miscs.has(id);
3222
+ }
3223
+ return false;
3224
+ }
3225
+ function mergePool(generated, preserved) {
3226
+ var result = [].concat(generated);
3227
+ var seen = new Set();
3228
+ for(var _iterator = _create_for_of_iterator_helper_loose(result), _step; !(_step = _iterator()).done;){
3229
+ var entry = _step.value;
3230
+ var key = poolEntryKey(entry);
3231
+ if (key != null) {
3232
+ seen.add(key);
3233
+ }
3234
+ }
3235
+ for(var _iterator1 = _create_for_of_iterator_helper_loose(preserved), _step1; !(_step1 = _iterator1()).done;){
3236
+ var entry1 = _step1.value;
3237
+ var key1 = poolEntryKey(entry1);
3238
+ if (key1 != null) {
3239
+ if (seen.has(key1)) {
3240
+ continue;
3241
+ }
3242
+ seen.add(key1);
3243
+ }
3244
+ result.push(cloneJson$1(entry1));
3245
+ }
3246
+ return result;
3247
+ }
3248
+ function poolEntryKey(entry) {
3249
+ var id = isRecord$2(entry) ? entry['id'] : undefined;
3250
+ if (typeof id === 'string') {
3251
+ return "id:" + id;
3252
+ }
3253
+ return "json:" + JSON.stringify(entry);
3254
+ }
3255
+ function asArray(value) {
3256
+ return Array.isArray(value) ? value : [];
3257
+ }
3258
+ function asRecordArray(value) {
3259
+ return Array.isArray(value) ? value.filter(function(entry) {
3260
+ return entry != null && (typeof entry === "undefined" ? "undefined" : _type_of(entry)) === 'object' && !Array.isArray(entry);
3261
+ }) : [];
3262
+ }
3263
+ function asDataPathArray(value) {
3264
+ return Array.isArray(value) ? value.filter(function(entry) {
3265
+ return isRecord$2(entry) && typeof entry['id'] === 'string';
3266
+ }) : [];
3267
+ }
3268
+ function readDataPathId(value) {
3269
+ return isRecord$2(value) && typeof value['id'] === 'string' ? value['id'] : undefined;
3270
+ }
3271
+ function indexById(entries) {
3272
+ var map = new Map();
3273
+ for(var _iterator = _create_for_of_iterator_helper_loose(entries), _step; !(_step = _iterator()).done;){
3274
+ var entry = _step.value;
3275
+ var id = entry['id'];
3276
+ if (typeof id === 'string') {
3277
+ map.set(id, entry);
3278
+ }
3279
+ }
3280
+ return map;
3281
+ }
3282
+ function cloneJson$1(value) {
3283
+ if (value === undefined) {
3284
+ return value;
3285
+ }
3286
+ return JSON.parse(JSON.stringify(value));
3287
+ }
3288
+ function isRecord$2(value) {
3289
+ return value != null && (typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object' && !Array.isArray(value);
3290
+ }
2976
3291
 
2977
3292
  function buildPoolIndex(pool) {
2978
3293
  var map = new Map();
@@ -3070,6 +3385,7 @@ function buildSceneContext(scene, options) {
3070
3385
  var textureById = buildPoolIndex(textures);
3071
3386
  var itemIdToTrackId = buildSceneBindings(componentById, miscById, composition);
3072
3387
  return {
3388
+ compositionId: compositionId,
3073
3389
  width: width,
3074
3390
  height: height,
3075
3391
  frameRate: frameRate,
@@ -4333,7 +4649,7 @@ function hasParentTransformSignal(desc, ctx) {
4333
4649
  return true;
4334
4650
  }
4335
4651
  var transform = desc.item['transform'];
4336
- return isRecord(transform) && (hasNonDefaultScale(transform) || hasNonDefaultEulerHint(transform));
4652
+ return isRecord$1(transform) && (hasNonDefaultScale(transform) || hasNonDefaultEulerHint(transform));
4337
4653
  }
4338
4654
  function hasNoIndependentChildTransform(desc, ctx) {
4339
4655
  var timeline = parseTimeline(desc.itemId, ctx);
@@ -4347,7 +4663,7 @@ function hasTransformPayload(asset) {
4347
4663
  }
4348
4664
  function hasNonDefaultScale(transform) {
4349
4665
  var scale = transform['scale'];
4350
- if (!isRecord(scale)) {
4666
+ if (!isRecord$1(scale)) {
4351
4667
  return false;
4352
4668
  }
4353
4669
  var x = typeof scale['x'] === 'number' ? scale['x'] : 1;
@@ -4357,7 +4673,7 @@ function hasNonDefaultScale(transform) {
4357
4673
  }
4358
4674
  function hasNonDefaultEulerHint(transform) {
4359
4675
  var eulerHint = transform['eulerHint'];
4360
- if (!isRecord(eulerHint)) {
4676
+ if (!isRecord$1(eulerHint)) {
4361
4677
  return false;
4362
4678
  }
4363
4679
  var x = typeof eulerHint['x'] === 'number' ? eulerHint['x'] : 0;
@@ -4366,7 +4682,7 @@ function hasNonDefaultEulerHint(transform) {
4366
4682
  return Math.abs(x) > 1e-6 || Math.abs(y) > 1e-6 || Math.abs(z) > 1e-6;
4367
4683
  }
4368
4684
  function hasNonEmptyRecord(value) {
4369
- return isRecord(value) && Object.keys(value).length > 0;
4685
+ return isRecord$1(value) && Object.keys(value).length > 0;
4370
4686
  }
4371
4687
  function readItemEndBehavior(item) {
4372
4688
  var endBehavior = item['endBehavior'];
@@ -4375,7 +4691,7 @@ function readItemEndBehavior(item) {
4375
4691
  function nearlyEqual(a, b) {
4376
4692
  return Math.abs(a - b) < 1e-6;
4377
4693
  }
4378
- function isRecord(value) {
4694
+ function isRecord$1(value) {
4379
4695
  return value != null && (typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object' && !Array.isArray(value);
4380
4696
  }
4381
4697
  function mergeNullAndSprite(nullDesc, childDesc, ctx) {
@@ -4429,8 +4745,8 @@ function mergeNullAndSprite(nullDesc, childDesc, ctx) {
4429
4745
  // side overwrites the other's GE round-trip data.
4430
4746
  if (childDesc.layer.metadata != null) {
4431
4747
  var _merged_metadata;
4432
- var parentGE2IR = isRecord((_merged_metadata = merged.metadata) == null ? void 0 : _merged_metadata['ge2ir']) ? merged.metadata['ge2ir'] : undefined;
4433
- var childGE2IR = isRecord(childDesc.layer.metadata['ge2ir']) ? childDesc.layer.metadata['ge2ir'] : undefined;
4748
+ var parentGE2IR = isRecord$1((_merged_metadata = merged.metadata) == null ? void 0 : _merged_metadata['ge2ir']) ? merged.metadata['ge2ir'] : undefined;
4749
+ var childGE2IR = isRecord$1(childDesc.layer.metadata['ge2ir']) ? childDesc.layer.metadata['ge2ir'] : undefined;
4434
4750
  merged.metadata = _extends({}, merged.metadata, childDesc.layer.metadata);
4435
4751
  if (parentGE2IR != null || childGE2IR != null) {
4436
4752
  merged.metadata['ge2ir'] = _extends({}, parentGE2IR != null ? parentGE2IR : {}, childGE2IR != null ? childGE2IR : {});
@@ -4538,7 +4854,8 @@ function convertGEToIR(scene, options) {
4538
4854
  outPoint: ctx.outPoint,
4539
4855
  backgroundColor: ctx.backgroundColor,
4540
4856
  endBehavior: ctx.endBehavior,
4541
- layers: layers
4857
+ layers: layers,
4858
+ metadata: buildCompositionMetadata(scene, ctx.compositionId, itemIds, ctx)
4542
4859
  };
4543
4860
  }
4544
4861
  function parseItemToLayer(item, itemId, index, ctx) {
@@ -4562,6 +4879,8 @@ function parseItemToLayer(item, itemId, index, ctx) {
4562
4879
  type = 'shape';
4563
4880
  } else if ((componentData == null ? void 0 : componentData.type) === 'image') {
4564
4881
  type = 'image';
4882
+ } else if (geType === '7') {
4883
+ type = 'precomp';
4565
4884
  } else if ((componentData == null ? void 0 : componentData.solidColor) != null) {
4566
4885
  type = 'solid';
4567
4886
  } else if (geType === '1') {
@@ -4752,7 +5071,9 @@ function parseItemToLayer(item, itemId, index, ctx) {
4752
5071
  }
4753
5072
  var geComponentId = componentData == null ? void 0 : componentData.geComponentId;
4754
5073
  var rawMask = componentData == null ? void 0 : componentData.rawMask;
4755
- if (rawTransformPassthrough != null || rawColorOverLifetime != null || geComponentId != null || rawMask != null) {
5074
+ var precompContent = geType === '7' ? item['content'] : undefined;
5075
+ var precompRefId = isRecord(precompContent == null ? void 0 : precompContent['options']) ? precompContent['options']['refId'] : undefined;
5076
+ if (rawTransformPassthrough != null || rawColorOverLifetime != null || geComponentId != null || rawMask != null || typeof precompRefId === 'string' || precompContent != null) {
4756
5077
  // Mask round-trip: geComponentId is the rendezvous key linking a target's
4757
5078
  // mask.reference.id (a GE1 component id) to the regenerated GE2 component id.
4758
5079
  // ir2ge copies ge2ir.geMask onto the rebuilt component and a post-process pass
@@ -4763,6 +5084,10 @@ function parseItemToLayer(item, itemId, index, ctx) {
4763
5084
  geComponentId: geComponentId
4764
5085
  }, rawMask != null && {
4765
5086
  geMask: rawMask
5087
+ }, typeof precompRefId === 'string' && {
5088
+ precompRefId: precompRefId
5089
+ }, precompContent != null && {
5090
+ precompContent: cloneJson(precompContent)
4766
5091
  });
4767
5092
  layer.metadata = _extends({}, layer.metadata, {
4768
5093
  ge2ir: ge2irMetadata
@@ -4770,6 +5095,29 @@ function parseItemToLayer(item, itemId, index, ctx) {
4770
5095
  }
4771
5096
  return layer;
4772
5097
  }
5098
+ function buildCompositionMetadata(scene, compositionId, itemIds, ctx) {
5099
+ if (!hasPrecompItem(itemIds, ctx)) {
5100
+ return undefined;
5101
+ }
5102
+ return {
5103
+ ge2ir: {
5104
+ sourceCompositionId: compositionId,
5105
+ sourceScene: cloneJson(scene)
5106
+ }
5107
+ };
5108
+ }
5109
+ function hasPrecompItem(itemIds, ctx) {
5110
+ return itemIds.some(function(itemId) {
5111
+ var _ctx_itemById_get;
5112
+ return ((_ctx_itemById_get = ctx.itemById.get(itemId)) == null ? void 0 : _ctx_itemById_get['type']) === '7';
5113
+ });
5114
+ }
5115
+ function cloneJson(value) {
5116
+ return JSON.parse(JSON.stringify(value));
5117
+ }
5118
+ function isRecord(value) {
5119
+ return value != null && (typeof value === "undefined" ? "undefined" : _type_of(value)) === 'object' && !Array.isArray(value);
5120
+ }
4773
5121
 
4774
5122
  /**
4775
5123
  * Read-side accessors for the `IRLayerNode.specific.lottie` slot.