@lovelace_lol/loom3 1.0.26 → 1.0.28

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
@@ -2984,6 +2984,9 @@ function resolveProfile(base, override) {
2984
2984
  hairPhysics: mergeHairPhysicsConfig(base.hairPhysics, override.hairPhysics)
2985
2985
  };
2986
2986
  }
2987
+ function applyProfileToPreset(base, override) {
2988
+ return override ? resolveProfile(base, override) : base;
2989
+ }
2987
2990
 
2988
2991
  // src/presets/bettaFish.ts
2989
2992
  var BONES = [
@@ -3656,6 +3659,9 @@ var MESHES = {
3656
3659
  morphCount: 0,
3657
3660
  // Fish model has no morphs
3658
3661
  material: {
3662
+ renderOrder: 20,
3663
+ transparent: true,
3664
+ opacity: 1,
3659
3665
  depthWrite: true,
3660
3666
  depthTest: true,
3661
3667
  blending: "Normal"
@@ -3666,29 +3672,126 @@ var MESHES = {
3666
3672
  category: "eye",
3667
3673
  morphCount: 0,
3668
3674
  material: {
3669
- renderOrder: -10,
3670
- // Render early (behind body)
3675
+ renderOrder: 17,
3676
+ transparent: true,
3677
+ opacity: 1,
3678
+ depthWrite: true,
3679
+ depthTest: true,
3680
+ blending: "Normal"
3681
+ }
3682
+ },
3683
+ // Hidden helper shell from the source asset; keep it suppressed by default
3684
+ // so Betta does not rely on a Firestore-only mesh override.
3685
+ "Cube_0": {
3686
+ category: "body",
3687
+ morphCount: 0,
3688
+ material: {
3689
+ renderOrder: -20,
3690
+ transparent: true,
3691
+ opacity: 0,
3671
3692
  depthWrite: true,
3672
3693
  depthTest: true,
3673
3694
  blending: "Normal"
3674
3695
  }
3675
3696
  }
3676
3697
  };
3677
- var BETTA_FISH_PRESET = {
3678
- name: "Betta Fish",
3679
- animalType: "fish",
3680
- emoji: "\u{1F41F}",
3681
- bones: BONES,
3682
- boneNodes: BONE_NODES,
3683
- boneBindings: BONE_BINDINGS,
3684
- actionInfo: AU_INFO2,
3685
- eyeMeshNodes: EYE_MESH_NODES,
3686
- // No morph targets in this model
3687
- auToMorphs: {},
3688
- morphToMesh: {},
3689
- visemeKeys: []
3690
- };
3691
- var AU_MAPPING_CONFIG = {
3698
+ var ANNOTATION_REGIONS = [
3699
+ {
3700
+ name: "full_body",
3701
+ objects: ["*"],
3702
+ paddingFactor: 2.5
3703
+ },
3704
+ {
3705
+ name: "head",
3706
+ bones: ["HEAD"],
3707
+ paddingFactor: 1.8,
3708
+ children: ["left_eye", "right_eye", "mouth"],
3709
+ expandAnimation: "staggered"
3710
+ },
3711
+ {
3712
+ name: "left_eye",
3713
+ meshes: ["EYES_0"],
3714
+ parent: "head",
3715
+ paddingFactor: 1.4,
3716
+ cameraAngle: 270
3717
+ },
3718
+ {
3719
+ name: "right_eye",
3720
+ meshes: ["EYES_0"],
3721
+ parent: "head",
3722
+ paddingFactor: 1.4,
3723
+ cameraAngle: 90
3724
+ },
3725
+ {
3726
+ name: "mouth",
3727
+ bones: ["HEAD"],
3728
+ parent: "head",
3729
+ paddingFactor: 1.5
3730
+ },
3731
+ {
3732
+ name: "body",
3733
+ bones: ["BODY_FRONT", "BODY_MID", "BODY_BACK"],
3734
+ paddingFactor: 1.8
3735
+ },
3736
+ {
3737
+ name: "tail",
3738
+ bones: ["TAIL_BASE", "TAIL_TOP", "TAIL_MID"],
3739
+ paddingFactor: 1.6
3740
+ },
3741
+ {
3742
+ name: "dorsal_fin",
3743
+ bones: ["DORSAL_ROOT", "DORSAL_L", "DORSAL_R"],
3744
+ paddingFactor: 1.8
3745
+ },
3746
+ {
3747
+ name: "pectoral_fins",
3748
+ bones: ["PECTORAL_L_ROOT", "PECTORAL_R_ROOT"],
3749
+ paddingFactor: 1.8,
3750
+ children: ["pectoral_fin_left", "pectoral_fin_right"],
3751
+ expandAnimation: "outward"
3752
+ },
3753
+ {
3754
+ name: "pectoral_fin_left",
3755
+ bones: ["PECTORAL_L_ROOT", "PECTORAL_L_CHAIN1", "PECTORAL_L_CHAIN2"],
3756
+ parent: "pectoral_fins",
3757
+ paddingFactor: 1.6,
3758
+ cameraAngle: 270
3759
+ },
3760
+ {
3761
+ name: "pectoral_fin_right",
3762
+ bones: ["PECTORAL_R_ROOT", "PECTORAL_R_CHAIN1", "PECTORAL_R_ROOT2"],
3763
+ parent: "pectoral_fins",
3764
+ paddingFactor: 1.6,
3765
+ cameraAngle: 90
3766
+ },
3767
+ {
3768
+ name: "ventral_fins",
3769
+ bones: ["VENTRAL_L", "VENTRAL_R"],
3770
+ paddingFactor: 1.6
3771
+ },
3772
+ {
3773
+ name: "gills",
3774
+ bones: ["GILL_L", "GILL_R"],
3775
+ paddingFactor: 1.6,
3776
+ children: ["throat", "gill"],
3777
+ expandAnimation: "outward"
3778
+ },
3779
+ {
3780
+ name: "throat",
3781
+ bones: ["GILL_L", "GILL_L_MID", "GILL_L_TIP"],
3782
+ parent: "gills",
3783
+ paddingFactor: 1.4,
3784
+ cameraAngle: 270
3785
+ },
3786
+ {
3787
+ name: "gill",
3788
+ bones: ["GILL_R", "GILL_R_MID", "GILL_R_TIP"],
3789
+ parent: "gills",
3790
+ paddingFactor: 1.4,
3791
+ cameraAngle: 90
3792
+ }
3793
+ ];
3794
+ var BETTA_FISH_PROFILE = {
3692
3795
  name: "Betta Fish",
3693
3796
  animalType: "fish",
3694
3797
  emoji: "\u{1F41F}",
@@ -3706,18 +3809,27 @@ var AU_MAPPING_CONFIG = {
3706
3809
  compositeRotations: COMPOSITE_ROTATIONS2,
3707
3810
  eyeMeshNodes: EYE_MESH_NODES,
3708
3811
  meshes: MESHES,
3812
+ annotationRegions: ANNOTATION_REGIONS,
3709
3813
  auMixDefaults: {},
3710
3814
  // No mixed AUs (morph+bone) in this model
3711
3815
  continuumPairs: CONTINUUM_PAIRS_MAP2,
3712
3816
  continuumLabels: CONTINUUM_LABELS2
3713
3817
  };
3818
+ var BETTA_FISH_PRESET = {
3819
+ ...BETTA_FISH_PROFILE,
3820
+ bones: BONES,
3821
+ boneBindings: BONE_BINDINGS,
3822
+ actionInfo: AU_INFO2
3823
+ };
3824
+ var AU_MAPPING_CONFIG = BETTA_FISH_PRESET;
3825
+ var FISH_AU_MAPPING_CONFIG = BETTA_FISH_PRESET;
3714
3826
 
3715
3827
  // src/presets/index.ts
3716
3828
  function resolvePreset(presetType) {
3717
3829
  switch (presetType) {
3718
3830
  case "fish":
3719
3831
  case "skeletal":
3720
- return AU_MAPPING_CONFIG;
3832
+ return BETTA_FISH_PRESET;
3721
3833
  case "cc4":
3722
3834
  case "custom":
3723
3835
  default:
@@ -3726,7 +3838,7 @@ function resolvePreset(presetType) {
3726
3838
  }
3727
3839
  function resolvePresetWithOverrides(presetType, overrides) {
3728
3840
  const base = resolvePreset(presetType);
3729
- return overrides ? resolveProfile(base, overrides) : base;
3841
+ return applyProfileToPreset(base, overrides);
3730
3842
  }
3731
3843
 
3732
3844
  // src/engines/three/Loom3.ts
@@ -3803,7 +3915,7 @@ var _Loom3 = class _Loom3 {
3803
3915
  /** Store original emissive colors for highlight reset */
3804
3916
  __publicField(this, "originalEmissive", /* @__PURE__ */ new Map());
3805
3917
  const basePreset = config.presetType ? resolvePreset(config.presetType) : CC4_PRESET;
3806
- this.config = config.profile ? resolveProfile(basePreset, config.profile) : basePreset;
3918
+ this.config = applyProfileToPreset(basePreset, config.profile);
3807
3919
  this.mixWeights = { ...this.config.auMixDefaults };
3808
3920
  this.animation = animation || new AnimationThree();
3809
3921
  this.compositeRotations = this.config.compositeRotations || COMPOSITE_ROTATIONS;
@@ -5211,6 +5323,206 @@ var BLENDING_MODES = {
5211
5323
  "None": 0
5212
5324
  // THREE.NoBlending
5213
5325
  };
5326
+
5327
+ // src/characters/resolveCharacterConfig.ts
5328
+ var PROFILE_OVERRIDE_KEYS = [
5329
+ "name",
5330
+ "animalType",
5331
+ "emoji",
5332
+ "auToMorphs",
5333
+ "auToBones",
5334
+ "boneNodes",
5335
+ "bonePrefix",
5336
+ "boneSuffix",
5337
+ "morphPrefix",
5338
+ "morphSuffix",
5339
+ "suffixPattern",
5340
+ "leftMorphSuffixes",
5341
+ "rightMorphSuffixes",
5342
+ "morphToMesh",
5343
+ "auFacePartToMeshCategory",
5344
+ "visemeKeys",
5345
+ "visemeMeshCategory",
5346
+ "visemeJawAmounts",
5347
+ "auMixDefaults",
5348
+ "auInfo",
5349
+ "eyeMeshNodes",
5350
+ "compositeRotations",
5351
+ "meshes",
5352
+ "continuumPairs",
5353
+ "continuumLabels",
5354
+ "annotationRegions",
5355
+ "hairPhysics"
5356
+ ];
5357
+ function isPlainObject2(value) {
5358
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5359
+ }
5360
+ function cloneArray(value) {
5361
+ return value ? value.map((entry) => cloneValue2(entry)) : void 0;
5362
+ }
5363
+ function cloneValue2(value) {
5364
+ if (Array.isArray(value)) {
5365
+ return value.map((entry) => cloneValue2(entry));
5366
+ }
5367
+ if (isPlainObject2(value)) {
5368
+ const next = {};
5369
+ for (const [key, entry] of Object.entries(value)) {
5370
+ next[key] = cloneValue2(entry);
5371
+ }
5372
+ return next;
5373
+ }
5374
+ return value;
5375
+ }
5376
+ function mergeProfileOverrideValue(base, override) {
5377
+ if (override === void 0) {
5378
+ return base === void 0 ? void 0 : cloneValue2(base);
5379
+ }
5380
+ if (Array.isArray(override)) {
5381
+ return cloneValue2(override);
5382
+ }
5383
+ if (isPlainObject2(base) && isPlainObject2(override)) {
5384
+ return {
5385
+ ...cloneValue2(base),
5386
+ ...cloneValue2(override)
5387
+ };
5388
+ }
5389
+ return cloneValue2(override);
5390
+ }
5391
+ function cloneVector3(value) {
5392
+ return value ? { ...value } : void 0;
5393
+ }
5394
+ function cloneRegion(region) {
5395
+ return {
5396
+ ...region,
5397
+ bones: cloneArray(region.bones),
5398
+ meshes: cloneArray(region.meshes),
5399
+ objects: cloneArray(region.objects),
5400
+ children: cloneArray(region.children),
5401
+ cameraOffset: cloneVector3(region.cameraOffset),
5402
+ customPosition: region.customPosition ? { ...region.customPosition } : void 0,
5403
+ style: region.style ? {
5404
+ ...region.style,
5405
+ line: region.style.line ? { ...region.style.line } : void 0
5406
+ } : void 0
5407
+ };
5408
+ }
5409
+ function mergeRegion(base, override) {
5410
+ return {
5411
+ ...base,
5412
+ ...override,
5413
+ bones: override.bones !== void 0 ? [...override.bones] : base.bones ? [...base.bones] : void 0,
5414
+ meshes: override.meshes !== void 0 ? [...override.meshes] : base.meshes ? [...base.meshes] : void 0,
5415
+ objects: override.objects !== void 0 ? [...override.objects] : base.objects ? [...base.objects] : void 0,
5416
+ children: override.children !== void 0 ? [...override.children] : base.children ? [...base.children] : void 0,
5417
+ cameraOffset: override.cameraOffset ? { ...base.cameraOffset, ...override.cameraOffset } : cloneVector3(base.cameraOffset),
5418
+ customPosition: override.customPosition ? { ...override.customPosition } : base.customPosition ? { ...base.customPosition } : void 0,
5419
+ style: override.style ? {
5420
+ ...base.style,
5421
+ ...override.style,
5422
+ line: override.style.line ? { ...base.style?.line, ...override.style.line } : base.style?.line ? { ...base.style.line } : void 0
5423
+ } : base.style ? {
5424
+ ...base.style,
5425
+ line: base.style.line ? { ...base.style.line } : void 0
5426
+ } : void 0
5427
+ };
5428
+ }
5429
+ function mergeStringRecord(base, override) {
5430
+ if (!base && !override) return void 0;
5431
+ return {
5432
+ ...base ? { ...base } : {},
5433
+ ...override ? { ...override } : {}
5434
+ };
5435
+ }
5436
+ function mergeRegionsByName(base, override) {
5437
+ if (!base && !override) return void 0;
5438
+ const merged = /* @__PURE__ */ new Map();
5439
+ for (const region of base ?? []) {
5440
+ merged.set(region.name, cloneRegion(region));
5441
+ }
5442
+ for (const region of override ?? []) {
5443
+ const existing = merged.get(region.name);
5444
+ merged.set(region.name, existing ? mergeRegion(existing, region) : cloneRegion(region));
5445
+ }
5446
+ return Array.from(merged.values());
5447
+ }
5448
+ function extractProfileOverrides(config) {
5449
+ const topLevelConfig = config;
5450
+ const legacyNestedOverrides = isPlainObject2(config.profile) ? config.profile : {};
5451
+ const overrides = {};
5452
+ for (const key of PROFILE_OVERRIDE_KEYS) {
5453
+ if (key === "annotationRegions") {
5454
+ const topLevelAnnotationRegions = Array.isArray(topLevelConfig.annotationRegions) ? topLevelConfig.annotationRegions : void 0;
5455
+ const legacyAnnotationRegions = Array.isArray(legacyNestedOverrides.annotationRegions) ? legacyNestedOverrides.annotationRegions : void 0;
5456
+ const presetOverrideRegions = mergeRegionsByName(legacyAnnotationRegions, topLevelAnnotationRegions);
5457
+ const regions = mergeRegionsByName(
5458
+ presetOverrideRegions,
5459
+ Array.isArray(config.regions) && config.regions.length > 0 ? config.regions : void 0
5460
+ );
5461
+ if (regions) {
5462
+ overrides.annotationRegions = regions.map((region) => cloneRegion(region));
5463
+ }
5464
+ continue;
5465
+ }
5466
+ const topLevelValue = topLevelConfig[key];
5467
+ const legacyValue = legacyNestedOverrides[key];
5468
+ const mergedValue = mergeProfileOverrideValue(legacyValue, topLevelValue);
5469
+ if (mergedValue !== void 0) {
5470
+ overrides[key] = mergedValue;
5471
+ }
5472
+ }
5473
+ return overrides;
5474
+ }
5475
+ function applyCharacterProfileToPreset(config) {
5476
+ const presetType = config.auPresetType;
5477
+ if (!presetType) {
5478
+ return null;
5479
+ }
5480
+ return applyProfileToPreset(resolvePreset(presetType), extractProfileOverrides(config));
5481
+ }
5482
+ function orderResolvedRegions(resolvedRegions, prioritizedLists) {
5483
+ if (!resolvedRegions) return void 0;
5484
+ const resolvedByName = new Map(resolvedRegions.map((region) => [region.name, region]));
5485
+ const orderedNames = [];
5486
+ const seen = /* @__PURE__ */ new Set();
5487
+ for (const regions of prioritizedLists) {
5488
+ for (const region of regions ?? []) {
5489
+ if (seen.has(region.name)) continue;
5490
+ seen.add(region.name);
5491
+ orderedNames.push(region.name);
5492
+ }
5493
+ }
5494
+ for (const region of resolvedRegions) {
5495
+ if (seen.has(region.name)) continue;
5496
+ seen.add(region.name);
5497
+ orderedNames.push(region.name);
5498
+ }
5499
+ return orderedNames.map((name) => resolvedByName.get(name)).filter((region) => Boolean(region));
5500
+ }
5501
+ function resolveCharacterConfig(config) {
5502
+ const presetType = config.auPresetType;
5503
+ if (!presetType || presetType === "custom") {
5504
+ return config;
5505
+ }
5506
+ const profileOverrides = extractProfileOverrides(config);
5507
+ const presetResolvedProfile = applyCharacterProfileToPreset(config);
5508
+ if (!presetResolvedProfile) {
5509
+ return config;
5510
+ }
5511
+ const presetRegions = presetResolvedProfile.annotationRegions;
5512
+ const mergedRegions = mergeRegionsByName(presetRegions, config.regions);
5513
+ const resolvedRegions = orderResolvedRegions(
5514
+ mergedRegions,
5515
+ [config.regions, profileOverrides.annotationRegions, presetRegions]
5516
+ );
5517
+ return {
5518
+ ...config,
5519
+ bonePrefix: config.bonePrefix ?? presetResolvedProfile.bonePrefix,
5520
+ boneSuffix: config.boneSuffix ?? presetResolvedProfile.boneSuffix,
5521
+ boneNodes: mergeStringRecord(presetResolvedProfile.boneNodes, config.boneNodes),
5522
+ suffixPattern: config.suffixPattern ?? presetResolvedProfile.suffixPattern,
5523
+ regions: resolvedRegions ?? config.regions
5524
+ };
5525
+ }
5214
5526
  var DEFAULT_HEAD_BONE_NAMES = ["CC_Base_Head", "Head", "head", "Bip01_Head"];
5215
5527
  var DEFAULT_REFERENCE_HEIGHT = 1.8;
5216
5528
  var DEFAULT_FORWARD_OFFSET = 0.08;
@@ -5395,6 +5707,9 @@ function detectFacingDirection(model, eyeBoneNames = {
5395
5707
  }
5396
5708
 
5397
5709
  // src/regions/regionMapping.ts
5710
+ function normalizeLooseName(value) {
5711
+ return value.replace(/\./g, "");
5712
+ }
5398
5713
  function resolveBoneName(semanticName, config) {
5399
5714
  if (!config) return semanticName;
5400
5715
  const { bonePrefix, boneSuffix, boneNodes } = config;
@@ -5415,6 +5730,7 @@ function resolveBoneNames(names, config) {
5415
5730
  }
5416
5731
  function fuzzyNameMatch(objectName, targetName, suffixPattern) {
5417
5732
  if (objectName === targetName) return true;
5733
+ if (normalizeLooseName(objectName) === normalizeLooseName(targetName)) return true;
5418
5734
  if (!objectName.startsWith(targetName)) return false;
5419
5735
  const suffix = objectName.slice(targetName.length);
5420
5736
  if (suffix === "") return true;
@@ -5561,6 +5877,9 @@ var HairPhysics = class {
5561
5877
 
5562
5878
  // src/validation/generateMappingCorrections.ts
5563
5879
  var DEFAULT_MIN_CONFIDENCE = 0.6;
5880
+ function normalizeLooseName2(value) {
5881
+ return value.replace(/\./g, "");
5882
+ }
5564
5883
  function levenshteinDistance(a, b) {
5565
5884
  const matrix = [];
5566
5885
  const aLen = a.length;
@@ -5597,6 +5916,9 @@ function scoreCandidate(targetBase, candidate, fullTarget, suffixPattern) {
5597
5916
  if (candidate === fullTarget) {
5598
5917
  return { score: 1, reason: "exact match" };
5599
5918
  }
5919
+ if (normalizeLooseName2(candidate) === normalizeLooseName2(fullTarget)) {
5920
+ return { score: 1, reason: "separator-normalized exact match" };
5921
+ }
5600
5922
  if (suffixPattern && candidate.startsWith(fullTarget)) {
5601
5923
  const suffix = candidate.slice(fullTarget.length);
5602
5924
  if (suffix === "" || suffixPattern.test(suffix)) {
@@ -5785,11 +6107,17 @@ function generateMappingCorrections(meshes, skeleton, config, options = {}) {
5785
6107
  }
5786
6108
 
5787
6109
  // src/validation/validateMappings.ts
6110
+ function normalizeLooseName3(value) {
6111
+ return value.replace(/\./g, "");
6112
+ }
5788
6113
  function fuzzyMatch(targetName, candidateName, prefix, suffix, suffixPattern) {
5789
6114
  const fullTarget = prefix + targetName + suffix;
5790
6115
  if (candidateName === fullTarget) {
5791
6116
  return true;
5792
6117
  }
6118
+ if (normalizeLooseName3(candidateName) === normalizeLooseName3(fullTarget)) {
6119
+ return true;
6120
+ }
5793
6121
  if (suffixPattern && candidateName.startsWith(fullTarget)) {
5794
6122
  const suffix2 = candidateName.slice(fullTarget.length);
5795
6123
  return suffix2 === "" || suffixPattern.test(suffix2);
@@ -6504,6 +6832,6 @@ async function analyzeModel(options) {
6504
6832
  };
6505
6833
  }
6506
6834
 
6507
- export { AU_INFO, AU_MIX_DEFAULTS, AU_TO_MORPHS, AnimationThree, BETTA_FISH_PRESET, BLENDING_MODES, BONE_AU_TO_BINDINGS, CC4_BONE_NODES, CC4_BONE_PREFIX, CC4_EYE_MESH_NODES, CC4_MESHES, CC4_PRESET, CC4_SUFFIX_PATTERN, COMPOSITE_ROTATIONS, CONTINUUM_LABELS, CONTINUUM_PAIRS_MAP, DEFAULT_HAIR_PHYSICS_CONFIG, AU_MAPPING_CONFIG as FISH_AU_MAPPING_CONFIG, HairPhysics, Loom3, Loom3 as Loom3Three, Loom3 as LoomLargeThree, MORPH_TO_MESH, VISEME_JAW_AMOUNTS, VISEME_KEYS, analyzeModel, collectMorphMeshes, detectFacingDirection, extractFromGLTF, extractModelData, findFaceCenter, fuzzyNameMatch, generateMappingCorrections, getModelForwardDirection, hasLeftRightMorphs, isMixedAU, isPresetCompatible, resolveBoneName, resolveBoneNames, resolveFaceCenter, resolvePreset, resolvePresetWithOverrides, resolveProfile, suggestBestPreset, validateMappingConfig, validateMappings };
6835
+ export { AU_INFO, AU_MAPPING_CONFIG, AU_MIX_DEFAULTS, AU_TO_MORPHS, AnimationThree, BETTA_FISH_PRESET, BLENDING_MODES, BONE_AU_TO_BINDINGS, CC4_BONE_NODES, CC4_BONE_PREFIX, CC4_EYE_MESH_NODES, CC4_MESHES, CC4_PRESET, CC4_SUFFIX_PATTERN, COMPOSITE_ROTATIONS, CONTINUUM_LABELS, CONTINUUM_PAIRS_MAP, DEFAULT_HAIR_PHYSICS_CONFIG, FISH_AU_MAPPING_CONFIG, HairPhysics, Loom3, Loom3 as Loom3Three, Loom3 as LoomLargeThree, MORPH_TO_MESH, VISEME_JAW_AMOUNTS, VISEME_KEYS, analyzeModel, applyCharacterProfileToPreset, applyProfileToPreset, collectMorphMeshes, detectFacingDirection, extractFromGLTF, extractModelData, extractProfileOverrides, findFaceCenter, fuzzyNameMatch, generateMappingCorrections, getModelForwardDirection, hasLeftRightMorphs, isMixedAU, isPresetCompatible, mergeRegionsByName as mergeCharacterRegionsByName, resolveBoneName, resolveBoneNames, resolveCharacterConfig, resolveFaceCenter, resolvePreset, resolvePresetWithOverrides, resolveProfile, suggestBestPreset, validateMappingConfig, validateMappings };
6508
6836
  //# sourceMappingURL=index.js.map
6509
6837
  //# sourceMappingURL=index.js.map