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