{"version":3,"sources":["../src/extensions/VATBuilder/VATBuilder.ts"],"names":["BABYLON"],"mappings":"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","file":"chunk-5JGAE273.cjs","sourcesContent":["// VATObject_DQ.ts\nimport type { Effect, Scene, Mesh, Skeleton, Texture, AnimationGroup, Matrix } from '../../babylon';\nimport { BABYLON } from '../../babylon';\n\nexport type DQClipInfo = {\n  name: string;\n  from: number;\n  to: number;\n  frames: number;\n  fps: number;\n};\n\nexport type DQBuildOpts = {\n  useHalfDQ?: boolean;\n  forceHalfDQ?: boolean;\n  scaleEpsilon?: number;\n  debugValidate?: boolean;\n  /**\n   * Manually specify animation ranges for .babylon files without embedded metadata.\n   * If provided, these will be used instead of auto-detection.\n   * Example: [{ from: 0, to: 33, name: 'Walk', fps: 30 }, { from: 34, to: 60, name: 'Run', fps: 30 }]\n   */\n  manualAnimationRanges?: Array<{ from: number; to: number; name?: string; fps?: number }>;\n  defaultFPS?: number;\n};\n\nexport type SerializedDQVAT = {\n  kind: 'shado.dq-vat';\n  version: 1;\n  componentType: 'float32' | 'float16';\n  byteOrder: 'little-endian';\n  widthTexels: number;\n  heightTexels: number;\n  framesTotal: number;\n  bones: number;\n  dqWidthBones: number;\n  dqTilesX: number;\n  dqStrideTexels: number;\n  dqHasScale: boolean;\n  clips: DQClipInfo[];\n  data: {\n    encoding: 'base64';\n    byteLength: number;\n    value: string;\n  };\n};\n\ntype ScaleDetection = {\n  hasScale: boolean;\n  hasAnisotropic: boolean;\n};\nexport class VATBuilder {\n  public framesTotal: number = 0;\n  public bones: number = 0;\n  private _dqTex?: Texture;\n  private _clips: DQClipInfo[] = [];\n\n  // Layout constants for the shader\n  private _dqWidthBones = 0; // bones per row (NOT texels)\n  private _dqTilesX = 0; // horizontal tiles per frame (ceil(bones / dqWidthBones))\n  private _dqStrideTexels = 2; // texels per bone: 2 (r,d) or 3 (r,d,scale)\n  private _dqHasScale = false;\n  private _dqWidthTexels = 0;\n  private _dqHeightTexels = 0;\n  private _dqComponentType: 'float32' | 'float16' = 'float32';\n  private _dqPixels?: Float32Array | Uint16Array;\n\n  public get dqTex() {\n    return this._dqTex;\n  }\n  public get dqWidthBones() {\n    return this._dqWidthBones;\n  }\n  public get dqTilesX() {\n    return this._dqTilesX;\n  }\n  public get dqStrideTexels() {\n    return this._dqStrideTexels;\n  }\n  public get dqHasScale() {\n    return this._dqHasScale;\n  }\n  public get dqWidthTexels() {\n    return this._dqWidthTexels;\n  }\n  public get dqHeightTexels() {\n    return this._dqHeightTexels;\n  }\n  public get dqComponentType() {\n    return this._dqComponentType;\n  }\n  public get clips() {\n    return this._clips.slice();\n  }\n\n  static async initialize(_engine?: any, _config?: any): Promise<boolean> {\n    return true;\n  }\n\n  /** Build DQ atlas from all animation groups that drive this skeleton. */\n  static buildFromScene(\n    scene: Scene,\n    mesh: Mesh,\n    skeleton: Skeleton,\n    opts: DQBuildOpts = {}\n  ): VATBuilder {\n    const engine = scene.getEngine();\n    const dq = new VATBuilder();\n\n    // 1) Collect relevant animation groups (those that touch this skeleton)\n    const groups = collectBoneDrivingGroups(\n      scene,\n      skeleton,\n      opts.manualAnimationRanges,\n      opts.defaultFPS\n    );\n\n    if (groups.length === 0) {\n      throw new Error('No animation groups or scene animations found for this skeleton.');\n    }\n\n    // eslint-disable-next-line no-console\n    console.log(\n      '[VATBuilder] Found animation groups:',\n      groups.length,\n      groups.map(g => ({ name: g.name, from: g.from, to: g.to }))\n    );\n\n    // 2) Count total frames and record per-clip ranges\n    const { clips, framesTotal } = computeClipFrameTable(groups, opts.defaultFPS ?? 60);\n    dq._clips = clips;\n    dq.framesTotal = framesTotal | 0;\n\n    // 3) Decide whether any clip/bone uses (non-unit) scale\n    const scaleEps = opts.scaleEpsilon ?? 1e-5;\n    const scaleInfo = detectAnimatedScale(scene, mesh, skeleton, groups, scaleEps);\n    const hasScale = scaleInfo.hasScale && !scaleInfo.hasAnisotropic;\n    if (scaleInfo.hasAnisotropic) {\n      BABYLON.Logger.Warn(\n        '[VATBuilder] Detected anisotropic bone scaling; falling back to rigid-only DQ sampling (ignoring per-bone scale).'\n      );\n    }\n\n    // 4) Bake: for each absolute frame row, pose skeleton and extract bone matrices -> DQ (+optional scale)\n    const bones = skeleton.bones.length | 0;\n    dq.bones = bones;\n\n    const caps = engine.getCaps();\n    const maxTex = caps.maxTextureSize | 0;\n\n    // OPTIMIZATION: Pack scale into qd.w to reduce texture fetches\n    // - Standard: qr(vec4) + qd(vec4) = 2 texels, 2 fetches\n    // - With scale: qr(vec4) + qd(vec3,scale) = 2 texels, 2 fetches (pack scale into qd.w)\n    // This reduces stride from 3→2 when scale is present, saving 33% bandwidth\n    const strideTexels = hasScale ? 3 : 2; // Always 2 texels: (qr), (qd.xyz + scale in w)\n\n    const dqWidthBones = Math.max(1, Math.min(bones, Math.floor(maxTex / strideTexels)));\n    const tilesX = Math.ceil(bones / dqWidthBones);\n    const atlasWidthTexels = dqWidthBones * strideTexels;\n    const atlasHeight = framesTotal * tilesX;\n\n    const useHalf = !!opts.useHalfDQ && (!!caps.textureHalfFloat || !!opts.forceHalfDQ);\n    const PixelArray = useHalf ? Uint16Array : Float32Array;\n    const pixels = new PixelArray(atlasWidthTexels * atlasHeight * 4);\n\n    // Bake loop\n    let frameRowBase = 0;\n\n    // Detect if we're using scene.beginAnimation fallback (.babylon files)\n    const useSceneBeginAnimation =\n      groups.length > 0 && (groups[0] as any).__fromSceneBeginAnimation;\n\n    for (const animationGroup of groups) {\n      const from = Math.floor(animationGroup.from ?? 0);\n      const to = Math.floor(animationGroup.to ?? from);\n      const frames = Math.max(0, to - from + 1) | 0;\n      if (frames <= 0) continue;\n\n      skeleton.returnToRest();\n\n      if (!useSceneBeginAnimation) {\n        // Standard AnimationGroup approach (glTF)\n        animationGroup.reset();\n        animationGroup.play(false); // play but don't loop\n        animationGroup.pause();\n      }\n\n      for (let f = 0; f < frames; f++) {\n        // Advance to exact frame\n        const targetFrame = from + f;\n\n        if (useSceneBeginAnimation) {\n          // Fallback: Use scene.beginAnimation for .babylon files\n          // This approach works when animations aren't in AnimationGroups\n          scene.beginAnimation(skeleton, targetFrame, targetFrame, false, 1.0);\n          scene.render();\n        } else {\n          // Use the animation group's built-in frame advance\n          animationGroup.goToFrame(targetFrame);\n          // CRITICAL: Force scene to evaluate animations by calling render\n          // This updates all animated properties on bones\n          scene.render();\n        }\n\n        // Force immediate update of all bones\n        for (const bone of skeleton.bones) {\n          bone.computeWorldMatrix(true); // force immediate update\n        }\n\n        skeleton.prepare();\n        skeleton.computeAbsoluteMatrices(true);\n\n        // Write one \"frame-row\": split across tilesX rows\n        const row0 = (frameRowBase + f) * tilesX;\n\n        for (let b = 0; b < bones; b++) {\n          // layout: x is bone % dqWidthBones; tile is floor(bone / dqWidthBones)\n          const xBone = b % dqWidthBones;\n          const tile = (b / dqWidthBones) | 0;\n          const yRow = row0 + tile;\n          const yTex = yRow;\n\n          // Get the bone's current world-space matrix (finalMatrix), then multiply by inverse bind\n          // to get the skinning transform.\n          // For Babylon.js: skinMatrix should transform from bind pose to current pose\n          const bone = skeleton.bones[b];\n          const finalMatrix = bone.getFinalMatrix();\n          const inverseBindMatrix = bone.getAbsoluteInverseBindMatrix();\n\n          // The correct formula for skinning is: skinMatrix = inverseBindMatrix × finalMatrix\n          // This transforms: bindPose -> world -> currentPose\n          const M = finalMatrix.multiply(inverseBindMatrix);\n\n          const S = new BABYLON.Vector3();\n          const R = new BABYLON.Quaternion();\n          const T = new BABYLON.Vector3();\n          M.decompose(S, R, T);\n          R.normalize();\n          if (R.w < 0.0) {\n            R.x = -R.x;\n            R.y = -R.y;\n            R.z = -R.z;\n            R.w = -R.w;\n          }\n          // CRITICAL: Enforce consistent hemisphere (w >= 0) to prevent blending artifacts\n          // Quaternions q and -q represent the same rotation, but blending them causes discontinuities\n          const x = R.x,\n            y = R.y,\n            z = R.z,\n            w = R.w;\n\n          const tx = T.x,\n            ty = T.y,\n            tz = T.z;\n\n          // Dual part: qd = 0.5 * (0, t) * qr\n          const dw = -0.5 * (tx * x + ty * y + tz * z);\n          const dx = 0.5 * (tx * w + ty * z - tz * y);\n          const dy = 0.5 * (-tx * z + ty * w + tz * x);\n          const dz = 0.5 * (tx * y - ty * x + tz * w);\n\n          // three texels when scale present: (r), (d), (s,0,0,0)\n          // NOTE: DQ cannot represent reflections (negative determinant), so we use absolute scale\n          const scaleMagnitude = (Math.abs(S.x) + Math.abs(S.y) + Math.abs(S.z)) / 3.0;\n          const maxAxisDiff = Math.max(\n            Math.abs(Math.abs(S.x) - Math.abs(S.y)),\n            Math.abs(Math.abs(S.x) - Math.abs(S.z)),\n            Math.abs(Math.abs(S.y) - Math.abs(S.z))\n          );\n          const isUniform = maxAxisDiff <= scaleEps;\n          const uniformScale = scaleMagnitude; // Always use positive scale\n          const useScale = hasScale && isUniform;\n          const s = useScale ? uniformScale : 1.0;\n\n          // Write texels: baseX = xBone * strideTexels\n          let px = (yTex * atlasWidthTexels + xBone * strideTexels) * 4;\n\n          if (useHalf) {\n            const H = BABYLON.ToHalfFloat;\n            const p16 = pixels as Uint16Array;\n            p16[px + 0] = H(x);\n            p16[px + 1] = H(y);\n            p16[px + 2] = H(z);\n            p16[px + 3] = H(w);\n            px += 4;\n            p16[px + 0] = H(dx);\n            p16[px + 1] = H(dy);\n            p16[px + 2] = H(dz);\n            p16[px + 3] = H(dw);\n            px += 4;\n            if (hasScale) {\n              p16[px + 0] = H(s);\n              p16[px + 1] = 0;\n              p16[px + 2] = 0;\n              p16[px + 3] = 0;\n            }\n          } else {\n            const p32 = pixels as Float32Array;\n            p32[px + 0] = x;\n            p32[px + 1] = y;\n            p32[px + 2] = z;\n            p32[px + 3] = w;\n            px += 4;\n            p32[px + 0] = dx;\n            p32[px + 1] = dy;\n            p32[px + 2] = dz;\n            p32[px + 3] = dw;\n            px += 4;\n            if (hasScale) {\n              p32[px + 0] = s;\n              p32[px + 1] = 0;\n              p32[px + 2] = 0;\n              p32[px + 3] = 0;\n            }\n          }\n        }\n      }\n\n      animationGroup.stop(); // restore group state\n      frameRowBase += frames;\n    }\n\n    // 5) Create RawTexture (NEAREST, no mips, CLAMP)\n    const dqTex = new BABYLON.RawTexture(\n      pixels,\n      atlasWidthTexels,\n      atlasHeight,\n      BABYLON.Engine.TEXTUREFORMAT_RGBA,\n      engine,\n      false, // no mipmaps\n      false, // invertY\n      BABYLON.Texture.NEAREST_NEAREST,\n      useHalf ? BABYLON.Engine.TEXTURETYPE_HALF_FLOAT : BABYLON.Engine.TEXTURETYPE_FLOAT\n    );\n    dqTex.wrapU = BABYLON.Texture.CLAMP_ADDRESSMODE;\n    dqTex.wrapV = BABYLON.Texture.CLAMP_ADDRESSMODE;\n\n    dq._dqTex = dqTex;\n    dq._dqWidthBones = dqWidthBones;\n    dq._dqTilesX = tilesX;\n    dq._dqStrideTexels = strideTexels;\n    dq._dqHasScale = hasScale;\n    dq._dqWidthTexels = atlasWidthTexels;\n    dq._dqHeightTexels = atlasHeight;\n    dq._dqComponentType = useHalf ? 'float16' : 'float32';\n    dq._dqPixels = pixels;\n\n    return dq;\n  }\n\n  public toSerialized(): SerializedDQVAT {\n    if (!this._dqPixels) {\n      throw new Error('VATBuilder.toSerialized() called before DQ pixels were built');\n    }\n    const bytes = new Uint8Array(\n      this._dqPixels.buffer,\n      this._dqPixels.byteOffset,\n      this._dqPixels.byteLength\n    );\n    return {\n      kind: 'shado.dq-vat',\n      version: 1,\n      componentType: this._dqComponentType,\n      byteOrder: 'little-endian',\n      widthTexels: this._dqWidthTexels,\n      heightTexels: this._dqHeightTexels,\n      framesTotal: this.framesTotal,\n      bones: this.bones,\n      dqWidthBones: this._dqWidthBones,\n      dqTilesX: this._dqTilesX,\n      dqStrideTexels: this._dqStrideTexels,\n      dqHasScale: this._dqHasScale,\n      clips: this.clips,\n      data: {\n        encoding: 'base64',\n        byteLength: bytes.byteLength,\n        value: bytesToBase64(bytes),\n      },\n    };\n  }\n\n  public static fromSerialized(scene: Scene, serialized: SerializedDQVAT): VATBuilder {\n    if (serialized.kind !== 'shado.dq-vat' || serialized.version !== 1) {\n      throw new Error('VATBuilder.fromSerialized() received an unsupported DQ VAT payload');\n    }\n\n    const bytes = base64ToBytes(serialized.data.value);\n    if (bytes.byteLength !== serialized.data.byteLength) {\n      throw new Error(\n        `Serialized DQ VAT byte length mismatch: expected ${serialized.data.byteLength}, got ${bytes.byteLength}`\n      );\n    }\n\n    const buffer = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);\n    const pixels =\n      serialized.componentType === 'float16' ? new Uint16Array(buffer) : new Float32Array(buffer);\n\n    const dqTex = BABYLON.RawTexture.CreateRGBATexture(\n      pixels,\n      serialized.widthTexels,\n      serialized.heightTexels,\n      scene,\n      false,\n      false,\n      BABYLON.Texture.NEAREST_NEAREST,\n      serialized.componentType === 'float16'\n        ? BABYLON.Engine.TEXTURETYPE_HALF_FLOAT\n        : BABYLON.Engine.TEXTURETYPE_FLOAT\n    );\n    dqTex.wrapU = BABYLON.Texture.CLAMP_ADDRESSMODE;\n    dqTex.wrapV = BABYLON.Texture.CLAMP_ADDRESSMODE;\n\n    const dq = new VATBuilder();\n    dq.framesTotal = serialized.framesTotal;\n    dq.bones = serialized.bones;\n    dq._clips = serialized.clips.slice();\n    dq._dqTex = dqTex;\n    dq._dqWidthBones = serialized.dqWidthBones;\n    dq._dqTilesX = serialized.dqTilesX;\n    dq._dqStrideTexels = serialized.dqStrideTexels;\n    dq._dqHasScale = serialized.dqHasScale;\n    dq._dqWidthTexels = serialized.widthTexels;\n    dq._dqHeightTexels = serialized.heightTexels;\n    dq._dqComponentType = serialized.componentType;\n    dq._dqPixels = pixels;\n    return dq;\n  }\n\n  public bind(effect: Effect) {\n    if (this._dqTex) {\n      effect.setTexture('uDQAtlas', this._dqTex);\n    } else {\n      console.error('[VATBuilder.bind] ERROR: No DQ texture exists!');\n    }\n    effect.setInt('uDQWidth', this._dqWidthBones);\n    effect.setInt('uDQTilesX', this._dqTilesX);\n    effect.setInt('uDQStrideTexels', this._dqStrideTexels);\n    effect.setBool('uDQHasScale', this._dqHasScale);\n  }\n\n  public bindMaterial(material: { setTexture: Function; setInt: Function }) {\n    if (this._dqTex) {\n      material.setTexture('uDQAtlas', this._dqTex);\n    } else {\n      console.error('[VATBuilder.bindMaterial] ERROR: No DQ texture exists!');\n    }\n    material.setInt('uDQWidth', this._dqWidthBones);\n    material.setInt('uDQTilesX', this._dqTilesX);\n    material.setInt('uDQStrideTexels', this._dqStrideTexels);\n    material.setInt('uDQHasScale', this._dqHasScale ? 1 : 0);\n  }\n\n  public dispose() {\n    (this._dqTex as any)?.dispose?.();\n    this._dqTex = undefined as any;\n  }\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n  const maybeBuffer = (globalThis as any).Buffer;\n  if (maybeBuffer?.from) return maybeBuffer.from(bytes).toString('base64');\n\n  let binary = '';\n  const chunkSize = 0x8000;\n  for (let i = 0; i < bytes.length; i += chunkSize) {\n    const chunk = bytes.subarray(i, i + chunkSize);\n    binary += String.fromCharCode(...chunk);\n  }\n  return btoa(binary);\n}\n\nfunction base64ToBytes(value: string): Uint8Array {\n  const maybeBuffer = (globalThis as any).Buffer;\n  if (maybeBuffer?.from) return new Uint8Array(maybeBuffer.from(value, 'base64'));\n\n  const binary = atob(value);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n  return bytes;\n}\n\nfunction collectBoneDrivingGroups(\n  scene: Scene,\n  skeleton: Skeleton,\n  manualRanges?: Array<{ from: number; to: number; name?: string; fps?: number }>,\n  defaultFPS?: number\n): AnimationGroup[] {\n  // If manual ranges provided, use them directly\n  if (manualRanges && manualRanges.length > 0) {\n    // eslint-disable-next-line no-console\n    console.log('[VATBuilder] Using manually specified animation ranges:', manualRanges);\n    return manualRanges.map((range, idx) => {\n      const group = new BABYLON.AnimationGroup(range.name ?? `ManualClip_${idx}`, scene);\n      (group as any).__fromSceneBeginAnimation = true;\n      (group as any).__manualFPS = range.fps ?? defaultFPS ?? 60;\n      (group as any).from = range.from;\n      (group as any).to = range.to;\n      return group;\n    });\n  }\n\n  // First, try to get AnimationGroups (glTF, modern format)\n  const groups = scene.animationGroups.filter(g =>\n    g.targetedAnimations?.some(ta => {\n      const t: any = ta.target;\n      if (!t) return false;\n\n      // CRITICAL: Ensure the target actually belongs to THIS skeleton\n      if (t.getClassName?.() === 'Bone') {\n        return t.getSkeleton?.() === skeleton;\n      }\n\n      if (t.getClassName?.() === 'TransformNode') {\n        // For glTF: TransformNodes represent bones, check if skeleton has a bone with matching name\n        const boneName = t.name;\n        const hasBone = skeleton.bones.some(b => b.name === boneName);\n        if (hasBone) return true;\n\n        // Also check parent-based approach as fallback\n        const parent = t.parent;\n        if (parent && parent.getClassName?.() === 'Bone') {\n          return parent.getSkeleton?.() === skeleton;\n        }\n        return false;\n      }\n\n      if (t.skeleton) {\n        return t.skeleton === skeleton;\n      }\n\n      return false;\n    })\n  );\n\n  if (groups.length > 0) {\n    return groups;\n  }\n\n  // Fallback: For .babylon files, create AnimationGroups from skeleton animation ranges\n  const skeletonAny = skeleton as any;\n  if (skeletonAny.getAnimationRanges && skeletonAny.getAnimationRanges().length > 0) {\n    const ranges = skeletonAny.getAnimationRanges();\n    return ranges.map((range: any, idx: number) => {\n      const group = new BABYLON.AnimationGroup(range.name ?? `Animation_${idx}`, scene);\n\n      // Add all bone animations to the group\n      for (const bone of skeleton.bones) {\n        const boneAny = bone as any;\n        if (boneAny.animations && boneAny.animations.length > 0) {\n          for (const animation of boneAny.animations) {\n            group.addTargetedAnimation(animation, bone);\n          }\n        }\n      }\n\n      group.normalize(range.from, range.to);\n      (group as any).__fromSceneBeginAnimation = true; // Mark for special handling\n      return group;\n    });\n  }\n\n  // Final fallback: Probe for animations using scene.beginAnimation\n  // This handles .babylon files where animations exist but aren't in AnimationGroups or ranges\n  // eslint-disable-next-line no-console\n  console.log(\n    '[VATBuilder] No AnimationGroups or ranges found. Probing for animations with scene.beginAnimation...'\n  );\n\n  // Save initial bone states\n  const initialMatrices: Matrix[] = [];\n  for (const bone of skeleton.bones) {\n    initialMatrices.push(bone.getFinalMatrix().clone());\n  }\n\n  // Common animation range to probe (0-120 frames is typical)\n  const probeMax = 120;\n  let lastValidFrame = -1;\n\n  // Sample every 10 frames to find the animation extent\n  for (let frame = 0; frame <= probeMax; frame += 10) {\n    skeleton.returnToRest();\n    const animatable = scene.beginAnimation(skeleton, frame, frame, false, 1.0);\n    scene.render();\n    skeleton.computeAbsoluteMatrices(true);\n\n    // Check if any bone moved from rest pose by comparing matrices\n    let hasMoved = false;\n    for (let b = 0; b < Math.min(skeleton.bones.length, 5); b++) {\n      const bone = skeleton.bones[b];\n      const currentMatrix = bone.getFinalMatrix();\n      const initialMatrix = initialMatrices[b];\n\n      // Compare matrices - if they differ, animation exists\n      if (!currentMatrix.equals(initialMatrix)) {\n        hasMoved = true;\n        lastValidFrame = frame;\n        break;\n      }\n    }\n\n    if (animatable) {\n      animatable.stop();\n    }\n\n    if (!hasMoved && lastValidFrame >= 0) {\n      // Found end of animation\n      break;\n    }\n  }\n\n  if (lastValidFrame >= 0) {\n    // eslint-disable-next-line no-console\n    console.log(`[VATBuilder] Detected animation from frame 0 to ${lastValidFrame}`);\n\n    const group = new BABYLON.AnimationGroup('DetectedAnimation', scene);\n    (group as any).__fromSceneBeginAnimation = true;\n    (group as any).from = 0;\n    (group as any).to = lastValidFrame;\n\n    return [group];\n  }\n\n  return [];\n}\n\nfunction inferFPSFromGroup(g: AnimationGroup, fallback = 60): number {\n  const manualFPS = (g as any).__manualFPS;\n  if (manualFPS !== undefined) {\n    return manualFPS;\n  }\n  const ta = g.targetedAnimations?.[0];\n  return (ta?.animation?.framePerSecond ?? fallback) || fallback;\n}\n\nfunction computeClipFrameTable(groups: AnimationGroup[], defaultFPS: number) {\n  const clips: DQClipInfo[] = [];\n  let framesTotal = 0;\n  for (const g of groups) {\n    const from = Math.floor(g.from ?? 0);\n    const to = Math.floor(g.to ?? from);\n    const frames = Math.max(0, to - from + 1) | 0;\n    if (frames <= 0) continue;\n    const fps = inferFPSFromGroup(g, defaultFPS);\n    clips.push({\n      name: g.name || `clip_${clips.length}`,\n      from: framesTotal, // absolute row start\n      to: framesTotal + frames - 1, // inclusive\n      frames,\n      fps,\n    });\n    framesTotal += frames;\n  }\n  return { clips, framesTotal };\n}\n\n/** Quick pre-pass to see if any bone in any frame has non-unit scale. */\nfunction detectAnimatedScale(\n  scene: Scene,\n  mesh: Mesh,\n  skeleton: Skeleton,\n  groups: AnimationGroup[],\n  eps: number\n): ScaleDetection {\n  let hasScale = false;\n  let hasAnisotropic = false;\n\n  for (const ag of groups) {\n    const from = Math.floor(ag.from ?? 0);\n    const to = Math.floor(ag.to ?? from);\n    const frames = Math.max(0, to - from + 1) | 0;\n    if (frames <= 0) continue;\n\n    skeleton.returnToRest();\n    ag.reset();\n    ag.play(true);\n    ag.pause();\n\n    for (let f = 0; f < frames; f++) {\n      ag.goToFrame(from + f);\n      scene.render();\n      skeleton.computeAbsoluteMatrices(true);\n\n      for (let b = 0; b < skeleton.bones.length; b++) {\n        const bone = skeleton.bones[b];\n        const finalMatrix = bone.getFinalMatrix();\n        const inverseBindMatrix = bone.getAbsoluteInverseBindMatrix();\n        const M = finalMatrix.multiply(inverseBindMatrix);\n\n        const S = new BABYLON.Vector3();\n        const R = new BABYLON.Quaternion();\n        const T = new BABYLON.Vector3();\n        M.decompose(S, R, T);\n        const sx = Math.abs(S.x);\n        const sy = Math.abs(S.y);\n        const sz = Math.abs(S.z);\n        if (Math.abs(sx - 1) > eps || Math.abs(sy - 1) > eps || Math.abs(sz - 1) > eps) {\n          hasScale = true;\n          const axisDiff = Math.max(Math.abs(sx - sy), Math.abs(sx - sz), Math.abs(sy - sz));\n          if (axisDiff > eps) {\n            hasAnisotropic = true;\n            ag.stop();\n            return { hasScale, hasAnisotropic };\n          }\n        }\n      }\n    }\n    ag.stop();\n  }\n  return { hasScale, hasAnisotropic };\n}\n\n/**\n * Export helper function to convert matrix to dual quaternion with hemisphere enforcement\n * Used by both production code and tests\n */\nexport function matrixToDualQuaternion(M: Matrix): {\n  qr: { x: number; y: number; z: number; w: number };\n  qd: { x: number; y: number; z: number; w: number };\n  scale: number;\n} {\n  const S = new BABYLON.Vector3();\n  const R = new BABYLON.Quaternion();\n  const T = new BABYLON.Vector3();\n  M.decompose(S, R, T);\n  R.normalize();\n\n  // CRITICAL: Enforce consistent hemisphere (w >= 0)\n  let x = R.x;\n  let y = R.y;\n  let z = R.z;\n  let w = R.w;\n  if (w < 0.0) {\n    x = -x;\n    y = -y;\n    z = -z;\n    w = -w;\n  }\n\n  const tx = T.x;\n  const ty = T.y;\n  const tz = T.z;\n\n  // Dual part: qd = 0.5 * (0, t) * qr\n  const dw = -0.5 * (tx * x + ty * y + tz * z);\n  const dx = 0.5 * (tx * w + ty * z - tz * y);\n  const dy = 0.5 * (-tx * z + ty * w + tz * x);\n  const dz = 0.5 * (tx * y - ty * x + tz * w);\n\n  const scaleMagnitude = (Math.abs(S.x) + Math.abs(S.y) + Math.abs(S.z)) / 3.0;\n\n  return {\n    qr: { x, y, z, w },\n    qd: { x: dx, y: dy, z: dz, w: dw },\n    scale: scaleMagnitude,\n  };\n}\n"]}