{"version":3,"sources":["../src/extensions/ShadoActor.ts","../src/materials/ShadoMaterial.ts","../src/extensions/ShadoInstanceContainer/utils.ts","../src/extensions/AtlasBuilder/AtlasBuilder.ts","../src/extensions/ShadoInstanceContainer/mesh-data.ts","../src/extensions/ShadoInstanceContainer/ShadoInstanceContainer.ts","../src/index.ts"],"names":["ShadoActor","Shado","animationBuffer","__decorateClass","field","gpuStruct","TestClass","BABYLON","normalizePickingOptions","installShadoInstanceClickPicking","pickShadoInstanceAtPointer","pickShadoInstanceWithRay","PACKING_LOGIC","MaxRectsPacker","ShadoInstanceContainer","VATBuilder","vs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Shado } from '../core/Shado';\nimport { field, gpuStruct } from '../decorators';\nimport type { DQClipInfo } from './VATBuilder/VATBuilder';\n\n@gpuStruct({ name: 'ShadoActor' })\nexport class ShadoActor extends Shado {\n  @field('vec4') translation!: Float32Array;\n  @field('vec4') color!: Float32Array;\n  @field('i32') visibleIndex!: number; // This is indirection into the visible array\n  @field('u32') nameIndex!: number;\n  @field('f32') nameWorldPerEM!: number;\n  @field('f32') nameLiftWorld!: number;\n  @field('vec4') nameplateColor!: Float32Array;\n  @field('vec4') animationBuffer!: Float32Array;\n  @field('i32') visibleFlag!: number;\n  @field('f32') padding1!: number;\n  @field('f32') padding2!: number;\n  @field('f32') padding3!: number;\n\n  private readonly _worldPerEM = 0.16;\n  private readonly _yLiftWorld = 2.4;\n\n  constructor(engine: any) {\n    super(engine, true);\n  }\n\n  public initialize() {\n    this.translation = this._randomTranslation();\n    this.color = this._randColor();\n    this.visibleIndex = -1;\n    this.nameIndex = -1;\n    this.nameWorldPerEM = this._worldPerEM;\n    this.nameLiftWorld = this._yLiftWorld;\n    this.nameplateColor = new Float32Array([1.0, 1.0, 1.0, 1.0]);\n    this.animationBuffer = new Float32Array([0, 0, 0, 60]);\n    this.visibleFlag = 1;\n    this.padding1 = 0;\n    this.padding2 = 0;\n    this.padding3 = 0;\n  }\n\n  public playRandomAnimation(animationRanges: DQClipInfo[]) {\n    if (!animationRanges || animationRanges.length === 0) {\n      // No animations available - set default values\n      const animationBuffer = (this as any).animationBuffer as Float32Array;\n      animationBuffer[0] = 0; // from\n      animationBuffer[1] = 0; // to\n      animationBuffer[2] = 0; // randomStart\n      animationBuffer[3] = 60; // fps\n      this.emitHeaderDirty();\n      return;\n    }\n\n    const randomIndex = Math.floor(Math.random() * animationRanges.length);\n    const clip = animationRanges[randomIndex];\n    const animationBuffer = (this as any).animationBuffer as Float32Array;\n    animationBuffer[0] = clip.from;\n    animationBuffer[1] = clip.to;\n\n    const total = clip.to - clip.from;\n    const randomStart = Math.floor(Math.random() * total);\n    animationBuffer[2] = randomStart;\n    animationBuffer[3] = clip.fps || 60;\n    this.emitHeaderDirty();\n  }\n\n  private _rand(min: number, max: number) {\n    return min + Math.random() * (max - min);\n  }\n  private _randColor(): Float32Array {\n    return new Float32Array([\n      this._rand(0.1, 1.0),\n      this._rand(0.1, 1.0),\n      this._rand(0.1, 1.0),\n      1.0,\n    ]);\n  }\n  private _randomTranslation(): Float32Array {\n    return new Float32Array([this._rand(-45, 45), this._rand(-45, 45), this._rand(-45, 45), 1.0]);\n  }\n}\n\n@gpuStruct({ name: 'TestClass' })\nexport class TestClass extends ShadoActor {\n  @field('vec4') testValue!: Float32Array;\n  public testMethod() {\n    console.log('Look at my testValue', this.testValue);\n  }\n}\n","import {\n  BABYLON,\n  type Effect,\n  type Scene,\n  type Mesh,\n  type Texture,\n  type Material,\n  type Ray,\n} from '../babylon';\nimport { Shado } from '../core/Shado';\nimport { VATBuilder } from '../extensions';\nimport { ArrayAtlas } from '../extensions/AtlasBuilder/AtlasBuilder';\nimport type { ShadoActor } from '../extensions/ShadoActor';\nimport {\n  installShadoInstanceClickPicking,\n  normalizePickingOptions,\n  pickShadoInstanceAtPointer,\n  pickShadoInstanceWithRay,\n  type ShadoInstanceAsyncPickingOptions,\n  type ShadoInstancePickResult,\n  type ShadoPickingHandle,\n} from '../render/ShadoAsyncPicking';\nimport type { ShadoConcreteCtor } from '../types';\n\nexport interface ShadoMaterialOptions<TActor extends ShadoActor = ShadoActor> {\n  defines?: string[];\n  logOnCompile?: boolean;\n  picking?: boolean | ShadoInstanceAsyncPickingOptions<TActor>;\n  useVat?: boolean;\n}\n\nexport class ShadoMaterial<T extends Shado> extends BABYLON.ShaderMaterial {\n  private _timeSec = 0;\n  private _timeScale = 1;\n  private _paused = false;\n  private shadoScene: Scene;\n  private shadoMesh: Mesh;\n  private shadoSource: T;\n  private _pickingHandle?: ShadoPickingHandle;\n\n  private _effect: Effect | null = null;\n  private _vat?: VATBuilder;\n  public get effect() {\n    return this._effect;\n  }\n  public set effect(e: Effect | null) {\n    this._effect = e;\n  }\n  public set vatDQ(v: VATBuilder | undefined) {\n    this._vat = v;\n  }\n  public get vatDQ() {\n    return this._vat;\n  }\n  constructor(\n    scene: Scene,\n    mesh: Mesh,\n    atlas: ArrayAtlas,\n    shado: T,\n    opts?: ShadoMaterialOptions<any>\n  ) {\n    const engine = scene.getEngine();\n    const isWebGPU = engine.isWebGPU;\n    const useStorageWGSL = isWebGPU && (shado.constructor as any).backingPreference === 'storage';\n    const shaderIo = (shado.constructor as ShadoConcreteCtor).shaderIO(engine);\n    const name = mesh?.name ?? shado.getSchema()?.name ?? 'Shado';\n    const useVat = opts?.useVat ?? true;\n\n    // ── Detect bone influencers and set attributes/defines ───────────────────\n    const influencers = useVat ? (mesh.numBoneInfluencers ?? (mesh.skeleton ? 4 : 0)) : 0;\n    const attributes = ['position', 'uv', 'aPage', 'aRect'];\n\n    const defines = new Set<string>(opts?.defines ?? []);\n    if (influencers > 0) defines.add('USE_BONES');\n\n    // ── Decide texture features from current mesh material ───────────────────\n    const tex = pickCommonTextures(mesh.material);\n    if (tex.albedo) defines.add('USE_ALBEDO');\n    if (tex.opacity) defines.add('USE_OPACITY');\n    if (tex.emissive) defines.add('USE_EMISSIVE');\n\n    // ── Uniforms & samplers ──────────────────────────────────────────────────\n\n    const uniforms = useStorageWGSL\n      ? ['worldViewProjection']\n      : ['worldViewProjection', ...shaderIo.uniforms];\n    if (useVat) {\n      uniforms.push('bakedVertexAnimationTime');\n      uniforms.push('uDQWidth');\n      uniforms.push('uDQTilesX');\n      uniforms.push('uDQStrideTexels');\n      uniforms.push('uDQHasScale');\n    }\n\n    const samplers = [...shaderIo.samplers, ...(useVat ? ['uDQAtlas'] : []), 'uAtlasArray'];\n\n    const { vertex, fragment } = shado.getShaderNames();\n\n    super(\n      `ShadoMaterial_${name}`,\n      scene,\n      { vertex, fragment },\n      {\n        attributes,\n        uniforms,\n        samplers,\n        uniformBuffers: ['Scene'],\n        defines: Array.from(new Set(defines)),\n        shaderLanguage: useStorageWGSL ? BABYLON.ShaderLanguage.WGSL : BABYLON.ShaderLanguage.GLSL,\n      }\n    );\n\n    this.shadoScene = scene;\n    this.shadoMesh = mesh;\n    this.shadoSource = shado;\n\n    const logOnCompile = opts?.logOnCompile ?? false;\n    if (logOnCompile) {\n      const missingAttributes = attributes.filter(attr => !mesh.isVerticesDataPresent(attr));\n      // eslint-disable-next-line no-console\n      console.debug(`ShadoMaterial ${name} created:`, {\n        mesh: mesh.name,\n        vertices: mesh.getTotalVertices(),\n        indices: mesh.getTotalIndices(),\n        subMeshes: mesh.subMeshes.length,\n        skeleton: mesh.skeleton?.name,\n        bones: mesh.skeleton?.bones.length,\n        influencers,\n        attributes,\n        missingAttributes,\n        uniforms,\n        samplers,\n        defines: Array.from(defines),\n      });\n    }\n    this.onError = (effect, errors) => {\n      // eslint-disable-next-line no-console\n      console.error(`ShadoMaterial ${name} error:`, errors);\n      if (logOnCompile) {\n        // eslint-disable-next-line no-console\n        console.log('Vertex Shader Code:\\n', effect._vertexSourceCode);\n        // eslint-disable-next-line no-console\n        console.log('Fragment Shader Code:\\n', effect._fragmentSourceCode);\n      }\n    };\n    this.onCompiled = (eff: Effect) => {\n      this.effect = eff;\n      this._activeEffect = eff;\n      if (logOnCompile) {\n        // eslint-disable-next-line no-console\n        console.log(\n          `Effect compiled: ${name}\\n` +\n            `Vertex: ${eff._vertexSourceCode?.length ?? 0} chars\\n` +\n            `Fragment: ${eff._fragmentSourceCode?.length ?? 0} chars`\n        );\n      }\n    };\n\n    this.forceCompilation(mesh);\n    this.backFaceCulling = false;\n    this.sideOrientation = BABYLON.Material.CounterClockWiseSideOrientation;\n\n    // ── Bind textures from source material, if any ───────────────────────────\n    if (tex.albedo) this.setTexture('albedoTex', tex.albedo);\n    if (tex.opacity) this.setTexture('opacityTex', tex.opacity);\n    if (tex.emissive) this.setTexture('emissiveTex', tex.emissive);\n\n    // Alpha handling\n    const needsAlpha = defines.has('USE_OPACITY');\n    this.needAlphaBlending = () => needsAlpha;\n    if (needsAlpha) this.alphaMode = BABYLON.Engine.ALPHA_COMBINE;\n\n    // Override the mesh's render method to inject our instanced draw\n    const originalRender = mesh.render.bind(mesh);\n    let lastSkipReason = '';\n    let lastDebugAt = 0;\n    let loggedFirstDraw = false;\n    const logRenderState = (reason: string, extra?: Record<string, unknown>) => {\n      if (!logOnCompile) return;\n      const now = performance.now();\n      const visibleCount = (shado as any).getVisibleCount?.() ?? (shado as any).visibleCount;\n      const instanceCount = (shado as any).instanceCount;\n      const stateKey = `${reason}:${visibleCount}:${instanceCount}`;\n      if (stateKey === lastSkipReason && now - lastDebugAt < 2000) return;\n      lastSkipReason = stateKey;\n      lastDebugAt = now;\n      // eslint-disable-next-line no-console\n      console.debug(`ShadoMaterial ${name} render state:`, {\n        mesh: mesh.name,\n        reason,\n        visibleCount,\n        instanceCount,\n        subMeshes: mesh.subMeshes.length,\n        world: mesh.getWorldMatrix().asArray(),\n        effectReady: subMeshDebugEffect(mesh)?.isReady() ?? false,\n        ...extra,\n      });\n    };\n    mesh.render = (subMesh: any, enableAlphaMode: boolean): any => {\n      shado.commit();\n      (shado as any).bindMaterial?.(this);\n      this.setTexture('uAtlasArray', atlas.texture);\n      if (useVat) this._vat?.bindMaterial(this);\n\n      if (!this.isReadyForSubMesh(mesh, subMesh)) {\n        logRenderState('material not ready', {\n          indexStart: subMesh.indexStart,\n          indexCount: subMesh.indexCount,\n        });\n        return mesh;\n      }\n      const n = (shado as any).getVisibleCount?.() ?? (shado as any).visibleCount ?? 0;\n\n      if (n <= 0) {\n        logRenderState('no visible instances', {\n          indexStart: subMesh.indexStart,\n          indexCount: subMesh.indexCount,\n        });\n        return mesh;\n      }\n\n      const effect = subMesh.effect ?? this.getEffect();\n      if (!effect?.isReady()) {\n        if (logOnCompile) {\n          // eslint-disable-next-line no-console\n          console.debug(`ShadoMaterial ${name} render skipped: effect not ready`, {\n            mesh: mesh.name,\n            visibleCount: n,\n            materialEffectReady: this.getEffect()?.isReady() ?? false,\n            subMeshEffectReady: subMesh.effect?.isReady() ?? false,\n          });\n        }\n        return mesh;\n      }\n\n      const drawWrapper = (this as any)._storeEffectOnSubMeshes\n        ? subMesh._drawWrapper\n        : (this as any)._getDrawWrapper();\n      if (!drawWrapper) {\n        logRenderState('missing draw wrapper', {\n          indexStart: subMesh.indexStart,\n          indexCount: subMesh.indexCount,\n        });\n        return mesh;\n      }\n      (this as any)._preBind(\n        drawWrapper,\n        (mesh as any)._internalMeshDataInfo?._effectiveSideOrientation\n      );\n\n      const worldMatrix = mesh.getWorldMatrix();\n      const transformMatrix = scene.getTransformMatrix();\n      const wvp = worldMatrix.multiply(transformMatrix);\n      effect.setMatrix('worldViewProjection', wvp);\n\n      mesh._bind(subMesh, effect, BABYLON.Material.TriangleFillMode);\n\n      if (enableAlphaMode && this.needAlphaBlending()) {\n        engine.setAlphaMode(this.alphaMode);\n      }\n\n      shado.bind(effect);\n      effect.setTexture('uAtlasArray', atlas.texture);\n      if (useVat) {\n        this._vat?.bind(effect);\n        effect.setFloat('bakedVertexAnimationTime', this._timeSec);\n      }\n\n      (mesh as any)._draw(subMesh, BABYLON.Material.TriangleFillMode, n);\n      this.unbind();\n      if (logOnCompile && !loggedFirstDraw) {\n        loggedFirstDraw = true;\n        const child0 = (shado as any).children?.[0];\n        // eslint-disable-next-line no-console\n        console.debug(`ShadoMaterial ${name} first instanced draw submitted:`, {\n          mesh: mesh.name,\n          visibleCount: n,\n          instanceCount: (shado as any).instanceCount,\n          indexStart: subMesh.indexStart,\n          indexCount: subMesh.indexCount,\n          verticesStart: subMesh.verticesStart,\n          verticesCount: subMesh.verticesCount,\n          unIndexed: (mesh as any)._unIndexed,\n          vertices: mesh.getTotalVertices(),\n          indices: mesh.getTotalIndices(),\n          vat: this._vat\n            ? {\n                framesTotal: this._vat.framesTotal,\n                bones: this._vat.bones,\n                dqWidthBones: this._vat.dqWidthBones,\n                dqTilesX: this._vat.dqTilesX,\n                dqStrideTexels: this._vat.dqStrideTexels,\n                dqHasScale: this._vat.dqHasScale,\n                dqTexReady: this._vat.dqTex?.isReady?.() ?? false,\n              }\n            : null,\n          atlasReady: atlas.texture?.isReady?.() ?? false,\n          firstChild: child0\n            ? {\n                translation: Array.from(child0.translation ?? []),\n                visibleIndex: child0.visibleIndex,\n                visibleFlag: child0.visibleFlag,\n                animationBuffer: Array.from(child0.animationBuffer ?? []),\n              }\n            : null,\n        });\n      }\n\n      return mesh;\n    };\n\n    const timeObs = scene.onBeforeRenderObservable.add(() => {\n      if (!this._paused) {\n        const dt = engine.getDeltaTime() * 0.001;\n        this._timeSec += dt * this._timeScale;\n      }\n    });\n\n    this.onDisposeObservable.add(() => {\n      scene.onBeforeRenderObservable.remove(timeObs);\n      this._pickingHandle?.dispose();\n      mesh.render = originalRender;\n    });\n\n    const picking = normalizePickingOptions(opts?.picking);\n    if (picking) {\n      this.setAsyncPicking(picking);\n    }\n  }\n\n  public setPaused(p: boolean) {\n    this._paused = p;\n  }\n  public setTimeScale(s: number) {\n    this._timeScale = s;\n  }\n  public setTimeSeconds(t: number) {\n    this._timeSec = t;\n  }\n\n  public setAsyncPicking<TActor extends ShadoActor>(\n    options: boolean | ShadoInstanceAsyncPickingOptions<TActor>\n  ): void {\n    this._pickingHandle?.dispose();\n    const normalized = normalizePickingOptions(options);\n    if (!normalized) {\n      this._pickingHandle = undefined;\n      return;\n    }\n    this._pickingHandle = installShadoInstanceClickPicking(\n      this.shadoScene,\n      this.shadoMesh,\n      this.shadoSource as any,\n      normalized\n    );\n  }\n\n  public pickAsync<TActor extends ShadoActor = ShadoActor>(\n    pointerX = this.shadoScene.pointerX,\n    pointerY = this.shadoScene.pointerY,\n    options: ShadoInstanceAsyncPickingOptions<TActor> = {}\n  ): Promise<ShadoInstancePickResult<TActor> | null> {\n    return pickShadoInstanceAtPointer(\n      this.shadoScene,\n      this.shadoMesh,\n      this.shadoSource as any,\n      pointerX,\n      pointerY,\n      options\n    );\n  }\n\n  public pickWithRay<TActor extends ShadoActor = ShadoActor>(\n    ray: Ray,\n    options: ShadoInstanceAsyncPickingOptions<TActor> = {}\n  ): ShadoInstancePickResult<TActor> | null {\n    return pickShadoInstanceWithRay(this.shadoMesh, this.shadoSource as any, ray, options);\n  }\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n\nfunction subMeshDebugEffect(mesh: Mesh): Effect | null {\n  return (mesh.subMeshes[0] as any)?.effect ?? null;\n}\n\ntype CommonTextures = {\n  albedo?: Texture;\n  opacity?: Texture;\n  emissive?: Texture;\n  normal?: Texture;\n};\n\nfunction pickCommonTextures(mat?: Material | null): CommonTextures {\n  const out: CommonTextures = {};\n  if (!mat) return out;\n  const any: any = mat;\n\n  // Standard\n  if (any.diffuseTexture) out.albedo = any.diffuseTexture;\n  if (any.opacityTexture) out.opacity = any.opacityTexture;\n  if (any.emissiveTexture) out.emissive = any.emissiveTexture;\n  if (any.bumpTexture) out.normal = any.bumpTexture;\n\n  // PBR\n  if (any.albedoTexture) out.albedo = any.albedoTexture ?? out.albedo;\n  if (any.opacityTexture) out.opacity = any.opacityTexture ?? out.opacity;\n  if (any.emissiveTexture) out.emissive = any.emissiveTexture ?? out.emissive;\n  if (any.normalTexture || any.bumpTexture)\n    out.normal = any.normalTexture ?? any.bumpTexture ?? out.normal;\n\n  return out;\n}\n","// utils.ts\nimport type {\n  Mesh,\n  Material,\n  MultiMaterial,\n  Texture,\n  StandardMaterial,\n  PBRMaterial,\n  SubMesh,\n} from '../../babylon';\n\nexport type Channel =\n  | 'albedo'\n  | 'diffuse'\n  | 'opacity'\n  | 'emissive'\n  | 'normal'\n  | 'ambientOcclusion'\n  | 'metallic'\n  | 'roughness'\n  | 'metallicRoughness'\n  | 'specularGlossiness'\n  | 'lightmap'\n  | 'detail'; // catch-alls some pipelines use\n\nexport type Source = { id: string; tex: Texture };\n\ntype Collected = {\n  sources: Source[];\n  byMeshId: Map<string, { [ch in Channel]?: string }>;\n  byId: Map<string, { tex: Texture; channel: Channel; material: Material }>;\n};\n\nfunction isTexture(x: any): x is Texture {\n  return (\n    !!x &&\n    typeof x === 'object' &&\n    typeof x.getClassName === 'function' &&\n    /Texture$/.test(x.getClassName())\n  );\n}\n\n// Prefer URL for stability across clones; fallback to internalTexture/texture unique ids.\nfunction getTextureKey(tex: Texture): string {\n  const any: any = tex;\n  const it = any.getInternalTexture?.() ?? any._texture;\n  if (it?.uniqueId != null) return `it:${it.uniqueId}`;\n  if (tex.uniqueId != null) return `tx:${tex.uniqueId}`;\n  // absolute fallback (shouldn’t usually happen)\n  return `tx:${Math.random().toString(36).slice(2)}`;\n}\n\n// Extract ALL 2D texture slots we care about from a material\nfunction texturesFromMaterial(mat: Material): Partial<Record<Channel, Texture>> {\n  const any: any = mat;\n  const out: Partial<Record<Channel, any>> = {};\n\n  // StandardMaterial (legacy)\n  if ((mat as StandardMaterial).diffuseTexture)\n    out.diffuse = (mat as StandardMaterial).diffuseTexture!;\n  if (any.opacityTexture) out.opacity = any.opacityTexture;\n  if (any.emissiveTexture) out.emissive = any.emissiveTexture;\n  if (any.bumpTexture) out.normal = any.bumpTexture;\n  if (any.ambientTexture) out.ambientOcclusion = any.ambientTexture;\n  if (any.specularTexture) out.specularGlossiness = any.specularTexture;\n  if (any.lightmapTexture) out.lightmap = any.lightmapTexture;\n  if (any.detailMap?.texture) out.detail = any.detailMap.texture;\n\n  // PBRMaterial (Babylon)\n  const pbr = mat as PBRMaterial;\n  if (pbr.albedoTexture) out.albedo = pbr.albedoTexture;\n  if (pbr.opacityTexture) out.opacity = pbr.opacityTexture ?? out.opacity;\n  if (pbr.emissiveTexture) out.emissive = pbr.emissiveTexture ?? out.emissive;\n  if ((pbr as any).normalTexture) out.normal = (pbr as any).normalTexture ?? out.normal;\n  if (pbr.bumpTexture) out.normal = pbr.bumpTexture ?? out.normal; // some pipelines still set bump\n  if (pbr.ambientTexture) out.ambientOcclusion = pbr.ambientTexture ?? out.ambientOcclusion;\n\n  // Metallic/Roughness variants\n  if (pbr.metallicTexture) out.metallicRoughness = pbr.metallicTexture;\n  if ((pbr as any).metallicRoughnessTexture)\n    out.metallicRoughness = (pbr as any).metallicRoughnessTexture;\n  if ((pbr as any).metallicTexture) out.metallic = (pbr as any).metallicTexture;\n  if ((pbr as any).roughnessTexture) out.roughness = (pbr as any).roughnessTexture;\n\n  // Spec/Gloss (KHR_materials_pbrSpecularGlossiness)\n  if (any.specularGlossinessTexture) out.specularGlossiness = any.specularGlossinessTexture;\n\n  // Filter to 2D textures only (skip cube/env and 3D/array sources — those we don’t atlas here)\n  for (const k of Object.keys(out) as Channel[]) {\n    const t = out[k];\n    if (!isTexture(t)) {\n      delete out[k];\n      continue;\n    }\n    const cls = (t as any).getClassName?.() ?? '';\n    if (\n      cls.includes('CubeTexture') ||\n      cls.includes('HDRTexture') ||\n      cls.includes('EquiRectangular')\n    ) {\n      delete out[k];\n    }\n  }\n  return out;\n}\n\n/**\n * Walk all meshes and gather EVERY 2D texture channel found.\n * Dedupe by (channel + key(url|internalTextureId|textureId)).\n */\nexport function collectSourcesFromMeshes(meshes: Mesh[]): Collected {\n  const byId = new Map<string, { tex: Texture; channel: Channel; material: Material }>();\n  const byMeshId = new Map<string, { [ch in Channel]?: string }>();\n  const seen = new Set<string>();\n\n  const pushTex = (channel: Channel, tex: Texture, material: Material) => {\n    const key = getTextureKey(tex);\n    const id = `${channel}:${key}`;\n    if (!seen.has(id)) {\n      seen.add(id);\n      byId.set(id, { tex, channel, material });\n    }\n    return id;\n  };\n\n  for (const mesh of meshes) {\n    const mat = mesh.material;\n    if (!mat) continue;\n\n    // MultiMaterial: honor subMeshes’ materialIndex ordering\n    if ((mat as MultiMaterial).subMaterials) {\n      const mm = mat as MultiMaterial;\n      const rec: { [ch in Channel]?: string } = {};\n      for (const sm of mesh.subMeshes) {\n        const subMat = mm.subMaterials[sm.materialIndex];\n        if (!subMat) continue;\n        const texs = texturesFromMaterial(subMat);\n        for (const ch of Object.keys(texs) as Channel[]) {\n          const t = texs[ch];\n          const id = pushTex(ch, t!, subMat);\n          // Keep the first seen per channel for this mesh\n          if (id && !rec[ch]) rec[ch] = id;\n        }\n      }\n      if (Object.keys(rec).length) byMeshId.set(String(mesh.uniqueId), rec);\n    } else {\n      // Single material\n      const texs = texturesFromMaterial(mat);\n      const rec: { [ch in Channel]?: string } = {};\n      for (const ch of Object.keys(texs) as Channel[]) {\n        const t = texs[ch];\n        const id = pushTex(ch, t!, mat);\n        if (id) rec[ch] = id;\n      }\n      if (Object.keys(rec).length) byMeshId.set(String(mesh.uniqueId), rec);\n    }\n  }\n\n  // Emit flat source list\n  const sources: Source[] = Array.from(byId.entries()).map(([id, rec]) => ({ id, tex: rec.tex }));\n  return { sources, byMeshId, byId };\n}\n\n// choose a preferred channel order for the atlas (albedo > diffuse > emissive ...)\nconst PREFERRED: Array<keyof ReturnType<typeof texturesFromMaterial>> = [\n  'albedo',\n  'diffuse',\n  'emissive',\n  'opacity',\n  'normal',\n];\n\nexport function makeResolverForMesh(\n  mesh: Mesh,\n  idForTexture: (tex: Texture) => string | undefined // map Texture -> atlas id (from your collector)\n) {\n  const mat = mesh.material as Material | MultiMaterial | null;\n\n  return (sm: SubMesh, _ordinal: number): string | undefined => {\n    const mtl: Material | null =\n      mat && 'subMaterials' in (mat as any)\n        ? ((mat as any).subMaterials[sm.materialIndex] ?? null)\n        : (mat as Material | null);\n\n    if (!mtl) return undefined;\n\n    const texs = texturesFromMaterial(mtl);\n    for (const key of PREFERRED) {\n      const t = texs[key];\n      if (t) {\n        const id = idForTexture(t);\n        if (id) return id;\n      }\n    }\n    return undefined;\n  };\n}\n","// AtlasBuilder.ts\nimport { MaxRectsPacker, PACKING_LOGIC, type IRectangle } from 'maxrects-packer';\nimport { RawTexture2DArray, Texture, Scene, BABYLON } from '../../babylon';\ntype DebugOptions = {\n  export?: boolean; // download PNGs + JSON\n  name?: string; // filename prefix\n};\ntype Source = { id: string; tex: Texture }; // CHANGED\ntype RectUV = { u0: number; v0: number; u1: number; v1: number };\ntype PixelRect = { x: number; y: number; w: number; h: number };\ntype EntryInfo = { layer: number; rect: RectUV; px?: PixelRect };\nexport type ArrayAtlas = {\n  texture: RawTexture2DArray;\n  layerCount: number;\n  pageSize: number;\n  entries: Record<string, EntryInfo>;\n};\n\nfunction extrude(\n  ctx: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n  b: number\n) {\n  // top/bottom/left/right + corners\n  ctx.drawImage(ctx.canvas, x, y, w, 1, x, y - b, w, b);\n  ctx.drawImage(ctx.canvas, x, y + h - 1, w, 1, x, y + h, w, b);\n  ctx.drawImage(ctx.canvas, x, y, 1, h, x - b, y, b, h);\n  ctx.drawImage(ctx.canvas, x + w - 1, y, 1, h, x + w, y, b, h);\n  ctx.drawImage(ctx.canvas, x, y, 1, 1, x - b, y - b, b, b);\n  ctx.drawImage(ctx.canvas, x + w - 1, y, 1, 1, x + w, y - b, b, b);\n  ctx.drawImage(ctx.canvas, x, y + h - 1, 1, 1, x - b, y + h, b, b);\n  ctx.drawImage(ctx.canvas, x + w - 1, y + h - 1, 1, 1, x + w, y + h, b, b);\n}\nasync function readTextureToImageData(scene: Scene, tex: Texture): Promise<ImageData> {\n  const engine: any = scene.getEngine();\n  const it = (tex as any).getInternalTexture?.() ?? (tex as any)._texture;\n  if (!it) throw new Error('Texture has no InternalTexture');\n\n  // Ensure the texture is ready on GPU\n  if (!tex.isReady()) {\n    await new Promise<void>(resolve => {\n      const obs = tex.onLoadObservable?.addOnce?.(() => resolve()) || setTimeout(resolve, 0);\n      if (!obs) resolve();\n    });\n  }\n\n  const w = it.width,\n    h = it.height;\n\n  // Fast path: uncompressed, UNSIGNED_BYTE -> direct read gives RGBA8\n  const canDirectRead =\n    !!engine._readTexturePixels &&\n    it.type === BABYLON.Engine.TEXTURETYPE_UNSIGNED_BYTE &&\n    it.format === BABYLON.Engine.TEXTUREFORMAT_RGBA &&\n    !it.is3D &&\n    !it.isCube &&\n    !it.isCompressed;\n\n  if (canDirectRead) {\n    const data = (await tex.readPixels()) as Uint8Array;\n    return new ImageData(\n      data instanceof Uint8ClampedArray ? data : new Uint8ClampedArray(data),\n      w,\n      h\n    );\n  }\n\n  throw new Error('readTextureToImageData: Unsupported texture type for readPixels');\n}\n\n/** Packs with maxrects; each page becomes one layer of a 2D array. No network. */\nexport async function buildArrayAtlasFromSources(\n  scene: Scene,\n  sources: Source[],\n  {\n    pageSize = 2048,\n    padding = 2,\n    border = 0,\n    bleed = 2,\n    pot = true,\n    square = true,\n    allowRotation = false,\n    logic = PACKING_LOGIC.MAX_EDGE,\n    sampling = BABYLON.Texture.TRILINEAR_SAMPLINGMODE,\n    fit = 'cover' as 'cover' | 'contain',\n    debug,\n  }: {\n    pageSize?: number;\n    padding?: number;\n    border?: number;\n    bleed?: number;\n    pot?: boolean;\n    square?: boolean;\n    allowRotation?: boolean;\n    logic?: (typeof PACKING_LOGIC)[keyof typeof PACKING_LOGIC];\n    mipmaps?: boolean;\n    sampling?: number;\n    fit?: 'cover' | 'contain';\n    debug?: DebugOptions;\n  } = {}\n): Promise<ArrayAtlas> {\n  // 0) Read pixels from existing textures -> ImageData[]\n  const images = await Promise.all(sources.map(s => readTextureToImageData(scene, s.tex)));\n\n  // 1) Describe rects for the packer\n  const rects: IRectangle[] = images.map((img, i) => ({\n    width: img.width,\n    height: img.height,\n    x: 0,\n    y: 0,\n    data: { id: sources[i].id, idx: i },\n  }));\n\n  // 2) Pack into pageSize×pageSize pages\n  const packer = new MaxRectsPacker<IRectangle>(pageSize, pageSize, padding, {\n    pot,\n    square,\n    allowRotation,\n    border,\n    smart: true,\n    logic,\n  });\n  packer.addArray(rects);\n\n  const bins = packer.bins;\n  const layers = bins.length;\n\n  // 3) Big pixel buffer for the array\n  const layerStride = pageSize * pageSize * 4;\n  const pixels = new Uint8Array(layerStride * layers);\n  const entries: Record<string, EntryInfo> = {};\n\n  // 4) Staging canvases\n  const pageCanvas = document.createElement('canvas');\n  pageCanvas.width = pageSize;\n  pageCanvas.height = pageSize;\n  const pageCtx = pageCanvas.getContext('2d', { willReadFrequently: true })!;\n  const spriteCanvas = document.createElement('canvas');\n  const spriteCtx = spriteCanvas.getContext('2d', { willReadFrequently: true })!;\n  const debugCanvases: HTMLCanvasElement[] = []; // <— capture pages for export\n\n  bins.forEach((bin, layer) => {\n    pageCtx.clearRect(0, 0, pageSize, pageSize);\n\n    for (const r of bin.rects) {\n      const { id, idx } = r.data as { id: string; idx: number };\n      const img = images[idx];\n\n      // Prepare sprite canvas for this image\n      if (spriteCanvas.width !== img.width || spriteCanvas.height !== img.height) {\n        spriteCanvas.width = img.width;\n        spriteCanvas.height = img.height;\n      }\n      spriteCtx.putImageData(img, 0, 0);\n\n      // Compute placement\n      let dx = r.x,\n        dy = r.y,\n        dw = r.width,\n        dh = r.height;\n      if (fit === 'contain') {\n        const scale = Math.min(r.width / img.width, r.height / img.height);\n        dw = Math.max(1, Math.round(img.width * scale));\n        dh = Math.max(1, Math.round(img.height * scale));\n        dx = r.x + Math.floor((r.width - dw) / 2);\n        dy = r.y + Math.floor((r.height - dh) / 2);\n      }\n      // draw (cover = stretch to rect)\n      pageCtx.drawImage(spriteCanvas, 0, 0, img.width, img.height, dx, dy, dw, dh);\n\n      if (bleed > 0) {\n        // simple edge-extrude around the drawn rect\n        // (works fine even when using 'contain' since we pass the drawn size)\n        // reuse your existing extrude helper\n        // extrude draws 1px borders outwards by 'bleed' px\n        // NOTE: clamp within page to avoid overdraw; the helper is fine for that.\n        // If you want strict clamp, add bounds checks.\n        // @ts-ignore\n        extrude(pageCtx, dx, dy, dw, dh, bleed);\n      }\n\n      const u0 = dx / pageSize,\n        v0 = dy / pageSize;\n      const u1 = (dx + dw) / pageSize,\n        v1 = (dy + dh) / pageSize;\n      entries[id] = { layer, rect: { u0, v0, u1, v1 } };\n    }\n\n    // Copy page to pixels[]\n    const pageImg = pageCtx.getImageData(0, 0, pageSize, pageSize);\n    pixels.set(pageImg.data, layer * layerStride);\n\n    if (debug?.export) {\n      const clone = document.createElement('canvas');\n      clone.width = pageSize;\n      clone.height = pageSize;\n      clone.getContext('2d')!.putImageData(pageImg, 0, 0);\n      debugCanvases.push(clone);\n    }\n  });\n\n  // 5) Upload as Texture2DArray\n  const texArr = new BABYLON.RawTexture2DArray(\n    pixels,\n    pageSize,\n    pageSize,\n    layers,\n    BABYLON.Engine.TEXTUREFORMAT_RGBA,\n    scene,\n    false, // mipmaps\n    /* invertY */ false, // <— was false\n    sampling,\n    BABYLON.Engine.TEXTURETYPE_UNSIGNED_BYTE\n  );\n  texArr.wrapU = BABYLON.Texture.CLAMP_ADDRESSMODE;\n  texArr.wrapV = BABYLON.Texture.CLAMP_ADDRESSMODE;\n\n  if (debug?.export) {\n    await exportAtlasDebug({\n      name: debug.name ?? 'atlas',\n      pageSize,\n      canvases: debugCanvases,\n      entries,\n    });\n  }\n\n  return { texture: texArr, layerCount: layers, pageSize, entries };\n}\n\n// Debug\n\nfunction downloadBlob(blob: Blob, filename: string) {\n  const a = document.createElement('a');\n  a.href = URL.createObjectURL(blob);\n  a.download = filename;\n  document.body.appendChild(a);\n  a.click();\n  setTimeout(() => {\n    URL.revokeObjectURL(a.href);\n    a.remove();\n  }, 0);\n}\n\nfunction downloadJSON(obj: any, filename: string) {\n  const blob = new Blob([JSON.stringify(obj, null, 2)], { type: 'application/json' });\n  downloadBlob(blob, filename);\n}\n\nfunction canvasToPNGBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n  return new Promise(resolve => {\n    canvas.toBlob(b => resolve(b!), 'image/png');\n  });\n}\n\nasync function exportAtlasDebug(args: {\n  name: string;\n  pageSize: number;\n  canvases: HTMLCanvasElement[];\n  entries: Record<\n    string,\n    {\n      layer: number;\n      rect: { u0: number; v0: number; u1: number; v1: number };\n      px?: { x: number; y: number; w: number; h: number };\n    }\n  >;\n}) {\n  const { name, canvases, entries, pageSize } = args;\n\n  // 1) PNGs\n  for (let i = 0; i < canvases.length; i++) {\n    const blob = await canvasToPNGBlob(canvases[i]);\n    downloadBlob(blob, `${name}_layer${i}.png`);\n  }\n\n  // 2) JSON manifest\n  const manifest = {\n    name,\n    pageSize,\n    layers: canvases.length,\n    pages: Array.from({ length: canvases.length }, (_, i) => ({\n      index: i,\n      png: `${name}_layer${i}.png`,\n    })),\n    // include both GL-space rects and pixel-space rects\n    entries, // { [id]: { layer, rect:{u0,v0,u1,v1}, px:{x,y,w,h} } }\n  };\n  await new Promise(res => setTimeout(res, 1000)); // let PNG downloads start first\n  downloadJSON(manifest, `${name}.json`);\n}\n","// mesh-data.ts\nimport { BABYLON, type Mesh, type SubMesh } from '../../babylon';\nimport type { ArrayAtlas } from '../AtlasBuilder/AtlasBuilder';\n\n/** Map for one mesh: subMesh.index -> atlas id string */\nexport type MeshSubmeshAtlasIds = Map<number, string>;\nexport type SubmeshIdResolver = (sm: SubMesh, smOrdinal: number) => string | undefined;\n\n/**\n * For a single mesh, stamp aPage (float layer) and aRect (vec4 u0,v0,u1,v1)\n * into per-vertex streams, using each SubMesh's vertex span.\n */\nexport function stampSubmeshAtlasAttributes(\n  mesh: Mesh,\n  atlas: ArrayAtlas,\n  resolveId: SubmeshIdResolver\n) {\n  const vcount = mesh.getTotalVertices();\n  if (!vcount) return;\n\n  const aPage = new Float32Array(vcount);\n  const aRect = new Float32Array(vcount * 4);\n\n  const defaultRect = { u0: 0, v0: 0, u1: 1, v1: 1 };\n\n  mesh.subMeshes.forEach((sm, ordinal) => {\n    const id = resolveId(sm, ordinal);\n    const entry = id ? atlas.entries[id] : undefined;\n    const page = entry ? entry.layer : 0;\n    const rect = entry ? entry.rect : defaultRect;\n\n    const v0 = sm.verticesStart;\n    const v1 = v0 + sm.verticesCount; // exclusive\n    for (let vi = v0; vi < v1; vi++) {\n      aPage[vi] = page;\n      const o = vi * 4;\n      aRect[o + 0] = rect.u0;\n      aRect[o + 1] = rect.v0;\n      aRect[o + 2] = rect.u1;\n      aRect[o + 3] = rect.v1;\n    }\n  });\n\n  mesh.setVerticesData('aPage', aPage, true, 1);\n  mesh.setVerticesData('aRect', aRect, true, 4);\n}\n\n/**\n * After MergeMeshes, re-attach concatenated custom attributes so they line up.\n * Concatenation order must match the meshes[] you passed to MergeMeshes.\n */\nexport function mergeWithPreservedAtlasAttributes(meshes: Mesh[], merged: Mesh) {\n  const totalVerts = meshes.reduce((n, m) => n + (m.getTotalVertices() || 0), 0);\n\n  // aPage (stride 1)\n  {\n    const dst = new Float32Array(totalVerts);\n    let w = 0;\n    for (const m of meshes) {\n      const v = m.getTotalVertices() || 0;\n      const src = (m.getVerticesData('aPage') as Float32Array) ?? new Float32Array(v);\n      dst.set(src, w);\n      w += v;\n    }\n    merged.setVerticesData('aPage', dst, false, 1);\n  }\n\n  // aRect (stride 4)\n  {\n    const dst = new Float32Array(totalVerts * 4);\n    let w = 0;\n    for (const m of meshes) {\n      const v = m.getTotalVertices() || 0;\n      const src = (m.getVerticesData('aRect') as Float32Array) ?? new Float32Array(v * 4);\n      dst.set(src, w * 4);\n      w += v;\n    }\n    merged.setVerticesData('aRect', dst, false, 4);\n  }\n}\n\n/**\n * Babylon's WebGPU path recompiles shaders when common vertex buffers are\n * stored as byte/short data. Shado's VAT shader reads bone indices as floats\n * and rounds them, so normalizing these streams up front keeps the WebGPU\n * attribute layout stable and avoids a second non-float shader rewrite.\n */\nexport function normalizeSkinningIndexAttributesForWebGPU(mesh: Mesh) {\n  const kinds = [\n    BABYLON.VertexBuffer.MatricesIndicesKind,\n    BABYLON.VertexBuffer.MatricesIndicesExtraKind,\n  ];\n\n  for (const kind of kinds) {\n    if (!mesh.isVerticesDataPresent(kind)) continue;\n    const data = mesh.getVerticesData(kind);\n    if (!data) continue;\n    mesh.setVerticesData(kind, new Float32Array(Array.from(data)), false, 4);\n  }\n}\n","import { BABYLON } from '../../babylon';\nimport { ASCExtension, Shado } from '../../core/Shado';\nimport { gpuStruct, field } from '../../decorators';\nimport { ShadoMaterial } from '../../materials/ShadoMaterial';\nimport type { ShadoInstanceAsyncPickingOptions } from '../../render/ShadoAsyncPicking';\nimport { ShadoActor } from '../ShadoActor';\nimport { NameplateData } from '../NameplateData';\nimport type {\n  Camera,\n  Plane,\n  Material,\n  Scene,\n  Mesh,\n  Texture,\n  Observer,\n  Skeleton,\n} from '../../babylon';\nimport { type DQBuildOpts, type SerializedDQVAT, VATBuilder } from '../VATBuilder/VATBuilder';\nimport { InitializeConfig } from '../../types';\nimport { collectSourcesFromMeshes, makeResolverForMesh } from './utils';\nimport { buildArrayAtlasFromSources } from '../AtlasBuilder/AtlasBuilder';\nimport {\n  mergeWithPreservedAtlasAttributes,\n  normalizeSkinningIndexAttributesForWebGPU,\n  stampSubmeshAtlasAttributes,\n} from './mesh-data';\n\nexport type ShadoInstanceContainerOptions = {\n  vat?: 'auto' | 'bake' | 'none';\n  animationRanges?: Array<{ from: number; to: number }>;\n  migrateTextures?: 'share' | 'move' | 'clone' | 'none';\n  replaceMaterial?: boolean;\n  disposeOriginalMaterial?: boolean;\n  defines?: string[];\n  logOnCompile?: boolean;\n  merge?: boolean;\n  vatOptions?: DQBuildOpts;\n  prebakedVat?: SerializedDQVAT;\n  picking?: boolean | ShadoInstanceAsyncPickingOptions<any>;\n};\n\nexport type InstanceNameSource = readonly string[] | ((index: number) => string);\n\ntype ChildFieldRegistration<T extends ShadoActor> = {\n  child: T;\n};\n\n@gpuStruct({ name: 'ShadoInstanceContainer', useWasm: true })\nexport class ShadoInstanceContainer<T extends ShadoActor> extends Shado {\n  @field('u32') visibleCount!: number;\n  @field('u32') instancesPtr!: number;\n  @field('u32') instancesCount!: number;\n  @field({ arrayOf: 'vec4' }) cameraFrustum!: Float32Array;\n  // We fill in the instances array struct dynamically\n\n  private static _instanceName: string = ShadoActor.getSchema().name;\n\n  instances!: T[];\n  private _clipRanges: Map<string, number> = new Map();\n  private _clipIndexByName: Map<string, number> = new Map();\n  private _clipDurations: number[] = [];\n  private _bindings = new Map<\n    Mesh,\n    {\n      material: ShadoMaterial<any>;\n      oldMaterial?: Material | null;\n      vatObserver?: Observer<Scene>;\n    }\n  >();\n\n  private _children: T[] = [];\n  private _useVatMaterial = true;\n  public vat: VATBuilder | undefined;\n  public get children() {\n    return this._children;\n  }\n  public get instanceCount() {\n    return this._children.length;\n  }\n  public override getVisibleCount(): number {\n    return this.visibleCount;\n  }\n\n  public set nameplates(nameplates: NameplateData) {\n    this._nameplates = nameplates;\n  }\n  private _nameplates!: NameplateData;\n\n  public static override async initialize(engine: any, config: InitializeConfig = {}) {\n    const childCtor = ((config.extra as any) ?? ShadoActor) as any;\n    if (!config.additionalFields?.some(f => f.name === 'instances')) {\n      config.additionalFields = [\n        { name: 'instances', type: { arrayOf: { structOf: childCtor } } },\n      ];\n      this._instanceName = childCtor.getSchema?.().name ?? childCtor.name;\n    }\n    return super.initialize(engine, config);\n  }\n\n  constructor(engine: any) {\n    super(engine);\n  }\n\n  public override dispose() {\n    super.dispose();\n  }\n\n  public getClipId(name: string): number | undefined {\n    return this._clipIndexByName.get(name.toLowerCase());\n  }\n  public getClipDurations(): number[] {\n    return this._clipDurations;\n  }\n\n  public setInstanceClip(i: number, clipNameOrId: string | number, speed = 1, phase = 0) {\n    const ch = this._children[i];\n    if (!ch) return;\n    const any: any = ch;\n    const clipId =\n      typeof clipNameOrId === 'number'\n        ? clipNameOrId | 0\n        : (this._clipIndexByName.get(clipNameOrId.toLowerCase()) ?? 0);\n    any.__anim = any.__anim ?? { clipId, timeSec: 0, speed: 1, phase: 0 };\n    any.__anim.clipId = clipId;\n    any.__anim.speed = speed;\n    any.__anim.phase = phase;\n  }\n\n  public async attachMeshes(\n    scene: Scene,\n    meshes: Mesh[],\n    skeleton: Skeleton | null | undefined,\n    opts: ShadoInstanceContainerOptions = {}\n  ): Promise<ShadoMaterial<any>> {\n    const useVat = opts.vat !== 'none';\n    const { sources, byId: byId } = collectSourcesFromMeshes(meshes);\n    const atlas = await buildArrayAtlasFromSources(scene, sources, {\n      pageSize: 2048,\n      padding: 2,\n      bleed: 2,\n      allowRotation: false,\n      mipmaps: true,\n      //debug: { export: true, name: 'atlas' },\n    });\n\n    meshes = meshes.filter(m => m.getTotalVertices() > 0);\n    const texToId = new Map<Texture, string>();\n    for (const [id, rec] of byId /* however you kept it */) {\n      texToId.set(rec.tex, id);\n    }\n    const idForTexture = (t: Texture) => texToId.get(t);\n\n    let mesh: Mesh | undefined | null;\n    if (opts.merge) {\n      for (const m of meshes) {\n        m.computeWorldMatrix(true);\n        m.bakeTransformIntoVertices(m.getWorldMatrix());\n      }\n      for (const m of meshes) {\n        const resolveId = makeResolverForMesh(m, idForTexture);\n        stampSubmeshAtlasAttributes(m, atlas, resolveId);\n      }\n      mesh = BABYLON.Mesh.MergeMeshes(\n        meshes,\n        false, // disposeSource\n        true, // allow32BitsIndices - CRITICAL: Must be true for meshes with >65k vertices\n        undefined,\n        false, // meshSubclass - IMPORTANT: false for proper merging\n        false // multiMultiMaterial - IMPORTANT: false avoids submesh complexity\n      );\n      if (!mesh) throw new Error('Merge failed');\n\n      mergeWithPreservedAtlasAttributes(meshes, mesh);\n      meshes.forEach(m => m.dispose());\n    } else {\n      mesh = meshes[0];\n    }\n\n    if (!mesh) throw new Error('attachMeshes: failed to merge meshes');\n    if (scene.getEngine().isWebGPU) {\n      normalizeSkinningIndexAttributesForWebGPU(mesh);\n    }\n    mesh.skeleton = skeleton ?? null;\n    if (useVat && !skeleton) {\n      throw new Error('attachMeshes: mesh has no Skeleton; VAT/DQ requires a skeleton.');\n    }\n\n    this.vat = useVat\n      ? opts.prebakedVat\n        ? VATBuilder.fromSerialized(scene as any, opts.prebakedVat)\n        : VATBuilder.buildFromScene(\n            scene as any,\n            mesh as any,\n            mesh.skeleton as any,\n            opts.vatOptions ?? {\n              useHalfDQ: true,\n            }\n          )\n      : undefined;\n    this._useVatMaterial = useVat;\n    // 2) Build SOMaterial (this also installs controlled draw + hides default draw)\n    const som = new ShadoMaterial(scene, mesh, atlas, this as unknown as Shado, {\n      defines: opts.defines,\n      logOnCompile: opts.logOnCompile,\n      picking: opts.picking,\n      useVat,\n    });\n    if (this.vat) som.vatDQ = this.vat;\n\n    mesh.material = som;\n    mesh.alwaysSelectAsActiveMesh = true;\n\n    this._bindings.set(mesh, { material: som });\n    return som;\n  }\n\n  detachMesh(mesh: Mesh) {\n    const rec = this._bindings.get(mesh);\n    if (!rec) return;\n    rec.material.dispose(true, true);\n    if (rec.oldMaterial && !mesh.isDisposed()) {\n      mesh.material = rec.oldMaterial;\n      mesh.isVisible = true;\n    }\n    if (rec.vatObserver) mesh.getScene().onBeforeRenderObservable.remove(rec.vatObserver);\n    this._bindings.delete(mesh);\n  }\n\n  static ascExtension: ASCExtension = {\n    source: _schema => `\nexport function frustumMarkAoS(\n  base: usize,\n  planesPtr: usize,\n  baseRadius: f32,\n  camX: f32,\n  camY: f32,\n  camZ: f32,\n  maxDist: f32\n): void {\n  const h = changetype<ShadoInstanceContainerHeader>(base);\n  const count = <i32>h.instancesCount;\n  if (count <= 0) { h.visibleCount = 0; return; }\n\n  // Load planes once\n  const p0 = v128.load(planesPtr +  0 * 16);\n  const p1 = v128.load(planesPtr +  1 * 16);\n  const p2 = v128.load(planesPtr +  2 * 16);\n  const p3 = v128.load(planesPtr +  3 * 16);\n  const p4 = v128.load(planesPtr +  4 * 16);\n  const p5 = v128.load(planesPtr +  5 * 16);\n\n  // Precompute n0 = normal with lane 3 = 0 for each plane\n  const n0_0 = f32x4.replace_lane(p0, 3, 0.0);\n  const n0_1 = f32x4.replace_lane(p1, 3, 0.0);\n  const n0_2 = f32x4.replace_lane(p2, 3, 0.0);\n  const n0_3 = f32x4.replace_lane(p3, 3, 0.0);\n  const n0_4 = f32x4.replace_lane(p4, 3, 0.0);\n  const n0_5 = f32x4.replace_lane(p5, 3, 0.0);\n\n  const d0 = f32x4.extract_lane(p0, 3);\n  const d1 = f32x4.extract_lane(p1, 3);\n  const d2 = f32x4.extract_lane(p2, 3);\n  const d3 = f32x4.extract_lane(p3, 3);\n  const d4 = f32x4.extract_lane(p4, 3);\n  const d5 = f32x4.extract_lane(p5, 3);\n\n  let readPtr   = h.instancesPtr;\n  let writeHead = h.instancesPtr + <usize>OFFSET_${ShadoInstanceContainer._instanceName}_visibleIndex;\n\n  let visCount = 0;\n  const doRange = maxDist > 0.0;\n\n  // Hard bound to prevent OOB if stride constant is off\n  const maxWrite = h.instancesPtr + <usize>SIZEOF_${ShadoInstanceContainer._instanceName}Header * <usize>count;\n\n  for (let i = 0; i < count; i++) {\n    store<i32>(readPtr + <usize>OFFSET_${ShadoInstanceContainer._instanceName}_visibleIndex, -1);\n    store<i32>(readPtr + <usize>OFFSET_${ShadoInstanceContainer._instanceName}_visibleFlag, 0);\n\n    const pos = v128.load(readPtr + <usize>OFFSET_${ShadoInstanceContainer._instanceName}_translation);\n\n    if (doRange) {\n      const dx = f32x4.extract_lane(pos, 0) - camX;\n      const dy = f32x4.extract_lane(pos, 1) - camY;\n      const dz = f32x4.extract_lane(pos, 2) - camZ;\n      const s  = f32x4.extract_lane(pos, 3);\n      const r  = baseRadius * s;\n      const md = maxDist + r;\n      const d2 = dx*dx + dy*dy + dz*dz;\n      if (d2 > md*md) {\n        readPtr += <usize>SIZEOF_${ShadoInstanceContainer._instanceName}Header;\n        continue;\n      }\n    }\n\n    // 6 planes, no allocations\n    let inside = 1;\n\n    {\n      const m = f32x4.mul(pos, n0_0);\n      const dot = f32x4.extract_lane(m, 0) + f32x4.extract_lane(m, 1) + f32x4.extract_lane(m, 2);\n      if (dot + d0 < -baseRadius * f32x4.extract_lane(pos, 3)) inside = 0;\n    }\n    if (inside) {\n      const m = f32x4.mul(pos, n0_1);\n      const dot = f32x4.extract_lane(m, 0) + f32x4.extract_lane(m, 1) + f32x4.extract_lane(m, 2);\n      if (dot + d1 < -baseRadius * f32x4.extract_lane(pos, 3)) inside = 0;\n    }\n    if (inside) {\n      const m = f32x4.mul(pos, n0_2);\n      const dot = f32x4.extract_lane(m, 0) + f32x4.extract_lane(m, 1) + f32x4.extract_lane(m, 2);\n      if (dot + d2 < -baseRadius * f32x4.extract_lane(pos, 3)) inside = 0;\n    }\n    if (inside) {\n      const m = f32x4.mul(pos, n0_3);\n      const dot = f32x4.extract_lane(m, 0) + f32x4.extract_lane(m, 1) + f32x4.extract_lane(m, 2);\n      if (dot + d3 < -baseRadius * f32x4.extract_lane(pos, 3)) inside = 0;\n    }\n    if (inside) {\n      const m = f32x4.mul(pos, n0_4);\n      const dot = f32x4.extract_lane(m, 0) + f32x4.extract_lane(m, 1) + f32x4.extract_lane(m, 2);\n      if (dot + d4 < -baseRadius * f32x4.extract_lane(pos, 3)) inside = 0;\n    }\n    if (inside) {\n      const m = f32x4.mul(pos, n0_5);\n      const dot = f32x4.extract_lane(m, 0) + f32x4.extract_lane(m, 1) + f32x4.extract_lane(m, 2);\n      if (dot + d5 < -baseRadius * f32x4.extract_lane(pos, 3)) inside = 0;\n    }\n\n    if (inside) {\n      if (writeHead >= maxWrite) break; // hard stop on mismatch\n      store<i32>(writeHead, i);\n      writeHead += <usize>SIZEOF_${ShadoInstanceContainer._instanceName}Header;\n      visCount++;\n      store<i32>(readPtr + <usize>OFFSET_${ShadoInstanceContainer._instanceName}_visibleFlag, 1);\n    }\n\n    readPtr += <usize>SIZEOF_${ShadoInstanceContainer._instanceName}Header;\n  }\n\n  h.visibleCount = visCount;\n}\n\n\n\n`,\n  };\n\n  // Call this each frame *only if* the frustum changed (or just call it; it's cheap).\n  public updateFrustumFromCamera(camera: Camera) {\n    const planes: Plane[] =\n      (this as any)._bjsFrustumPlanes ??\n      ((this as any)._bjsFrustumPlanes = new Array<Plane | number>(6)\n        .fill(0)\n        .map(() => new BABYLON.Plane(0, 0, 0, 0)));\n\n    const vp = camera.getScene().getTransformMatrix();\n    BABYLON.Frustum.GetPlanesToRef(vp, planes);\n\n    const out = new Float32Array(6 * 4);\n    let o = 0;\n    for (let i = 0; i < 6; i++) {\n      const p = planes[i];\n      out[o++] = p.normal.x;\n      out[o++] = p.normal.y;\n      out[o++] = p.normal.z;\n      out[o++] = p.d;\n    }\n\n    this.setVarArray('cameraFrustum', out);\n  }\n\n  public frustumCull(camera: Camera, baseRadius: number, maxDistance = 0) {\n    if (!camera) {\n      return;\n    }\n    this._refreshViewsIfGrown();\n    this.updateFrustumFromCamera(camera);\n\n    const frustumMarkAoS = this.ops?.frustumMarkAoS;\n    if (!frustumMarkAoS) {\n      this.frustumCullCPU(camera, baseRadius, maxDistance);\n      return;\n    }\n\n    const camPos = camera.globalPosition ?? camera.position;\n    const planesPtr = this.getVarArrayPtr('cameraFrustum'); // start of the vec4[6] array\n\n    frustumMarkAoS(\n      planesPtr,\n      baseRadius,\n      camPos.x,\n      camPos.y,\n      camPos.z,\n      maxDistance // 0 is sentinel to disable range check\n    );\n    this._arena.markDirty?.();\n  }\n\n  public frustumCullCPU(camera: Camera, baseRadius: number, maxDistance = 0) {\n    const planes: Plane[] =\n      (this as any)._bjsFrustumPlanes ??\n      ((this as any)._bjsFrustumPlanes = new Array<Plane | number>(6)\n        .fill(0)\n        .map(() => new BABYLON.Plane(0, 0, 0, 0)));\n    const camPos = camera.globalPosition ?? camera.position;\n    const doRange = maxDistance > 0;\n    let visibleCount = 0;\n\n    for (let i = 0; i < this._children.length; i++) {\n      const child: any = this._children[i];\n      child.visibleIndex = -1;\n      child.visibleFlag = 0;\n\n      const translation = child.translation as Float32Array;\n      const x = translation[0] ?? 0;\n      const y = translation[1] ?? 0;\n      const z = translation[2] ?? 0;\n      const scale = translation[3] ?? 1;\n      const radius = baseRadius * scale;\n\n      if (doRange) {\n        const dx = x - camPos.x;\n        const dy = y - camPos.y;\n        const dz = z - camPos.z;\n        const max = maxDistance + radius;\n        if (dx * dx + dy * dy + dz * dz > max * max) continue;\n      }\n\n      let inside = true;\n      for (let p = 0; p < 6; p++) {\n        const plane = planes[p];\n        if (plane.normal.x * x + plane.normal.y * y + plane.normal.z * z + plane.d < -radius) {\n          inside = false;\n          break;\n        }\n      }\n\n      if (!inside) continue;\n      const writeTarget: any = this._children[visibleCount];\n      if (writeTarget) writeTarget.visibleIndex = i;\n      child.visibleFlag = 1;\n      visibleCount++;\n    }\n\n    this.visibleCount = visibleCount;\n    this._arena.markDirty?.();\n  }\n\n  public getClipRanges() {\n    return this._clipRanges;\n  }\n\n  public setChildName(childIndex: number, name: string) {\n    const idx = this._nameplates.addName(name);\n    const ch = this._children[childIndex];\n    if (!ch) return;\n    ch.nameIndex = idx;\n    ch.emitHeaderDirty();\n    this._nameplates.rebuildStreams(this._children);\n  }\n\n  public addNamesToPool(names: string[]): number[] {\n    const idxs = this._nameplates.addNamesToPool(names);\n    this._nameplates.rebuildStreams(this._children);\n    return idxs;\n  }\n\n  public addInstance(suppressRebuild?: boolean, name?: string): T {\n    const ch = this.addStructToArray<T>('instances');\n\n    ch.initialize();\n\n    // name index\n    ch.nameIndex = name\n      ? this._nameplates.addName(name)\n      : Math.floor(this._nameplates.nameCount() * Math.random());\n\n    ch.playRandomAnimation(this.vat?.clips ?? []);\n\n    this._children.push(ch);\n    if (!suppressRebuild) this._nameplates.rebuildStreams(this._children);\n    return ch;\n  }\n\n  public addInstances(n: number, names?: InstanceNameSource) {\n    const created: T[] = [];\n    for (let i = 0; i < n; i++) {\n      const name = typeof names === 'function' ? names(i) : names?.[i];\n      created.push(this.addInstance(true, name));\n    }\n    this._nameplates.rebuildStreams(this._children);\n    return created;\n  }\n\n  public removeRandomInstance() {\n    const n = this._children.length;\n    if (!n) return;\n    const randomIndex = Math.floor(Math.random() * n);\n    const lastIndex = n - 1;\n    const removed = this._children[randomIndex];\n    const mover = this._children[lastIndex];\n    if (randomIndex !== lastIndex) this._children[randomIndex] = mover;\n    this._children.pop();\n    removed.dispose();\n\n    this._nameplates.rebuildStreams(this._children);\n  }\n\n  public override generateGLSLPair(): { vs: string; fs: string } {\n    // Get the instance-specific include name\n    const includeName = (this as any)._includeName ?? 'ShadoInstanceContainer';\n\n    const fs = `\nprecision highp float;\nprecision highp int;\n\nvarying vec2 vUV;\nvarying vec4 vColor;\nflat varying int   vPage;\nflat varying vec4  vRect;\n\nuniform highp sampler2DArray uAtlasArray;\n\nvec4 sampleAtlas(vec2 uv, vec4 rect, float page) {\n  vec2 tiled = fract(uv);                 // handle uvs like 3.2 or -0.3\n  vec2 uvA = tiled * (rect.zw - rect.xy) + rect.xy;\n  return texture(uAtlasArray, vec3(uvA, page));\n}\nvoid main() {\n  bool hasAtlasRect = vRect.z > vRect.x && vRect.w > vRect.y;\n  vec4 c = hasAtlasRect ? sampleAtlas(vUV, vRect, float(vPage)) : vec4(1.0);\n  // if (c.a <= 0.001) discard;\n  gl_FragColor = c * vColor;\n}\n`;\n\n    if (!this._useVatMaterial) {\n      const vs = `\nprecision highp float;\nprecision highp int;\n\nattribute vec3 position;\nattribute vec2 uv;\nattribute float aPage;\nattribute vec4  aRect;\n\nuniform mat4 worldViewProjection;\n\n#include<${ShadoInstanceContainer._instanceName}>\n#include<${ShadoInstanceContainer._instanceName}Offsets>\n#include<${includeName}Storage>\n\nvarying vec2 vUV;\nvarying vec4 vColor;\nflat varying int   vPage;\nflat varying vec4  vRect;\n\nvoid main(void) {\n  vUV = uv;\n  vPage = int(aPage);\n  vRect = aRect;\n\n  int drawIdx = gl_InstanceID;\n  int packedBase = uShadoInstanceContainer_instancesBase + drawIdx * uShadoInstanceContainer_instancesStride;\n  int srcIdx = int(ShadoInstanceContainer_fetch(packedBase + ${ShadoInstanceContainer._instanceName}_visibleIndex_OFF));\n  if (srcIdx < 0) { gl_Position = vec4(2.0); return; }\n\n  ${ShadoInstanceContainer._instanceName}Header inst = ShadoInstanceContainer_instances_get(srcIdx);\n  vec4 T = inst.translation;\n  vec3 p = position * T.w + T.xyz;\n  gl_Position = worldViewProjection * vec4(p, 1.0);\n  vColor = inst.color;\n}\n`;\n      return { vs, fs };\n    }\n\n    const vs = `\n// Vertex shader — Dual Quaternion VAT with optional per-bone uniform scale\n// Uses 2 texels per bone when uDQHasScale == false (r,d)\n// Uses 3 texels per bone when uDQHasScale == true  (r,d,scale)\n\nprecision highp float;\nprecision highp int;\n\nattribute vec3 position;\nattribute vec2 uv;\n\nattribute vec4 matricesIndices;\nattribute vec4 matricesWeights;\nattribute float aPage;\nattribute vec4  aRect;\n\n#ifdef BONES8\nattribute vec4 matricesIndicesExtra;\nattribute vec4 matricesWeightsExtra;\n#endif\n\nuniform mat4 worldViewProjection;\nuniform float bakedVertexAnimationTime;\n\nuniform sampler2D uDQAtlas;\nuniform int  uDQWidth;          // bones per row (NOT texels)\nuniform int  uDQTilesX;         // rows per frame (ceil(bones / uDQWidth))\nuniform int  uDQStrideTexels;   // 2 (no scale) or 3 (has scale)\nuniform bool uDQHasScale;       // true when scale texel is present\n\n// Instance data & storage indirection\n#include<${ShadoInstanceContainer._instanceName}>\n#include<${ShadoInstanceContainer._instanceName}Offsets>\n#include<${includeName}Storage>\n\nvarying vec2 vUV;\nvarying vec4 vColor;\nflat varying int   vPage;\nflat varying vec4  vRect;\n\n\n// ---------------------------------------------------------------------------\n\nvec4 fetchDQAtlas(ivec2 p) { return texelFetch(uDQAtlas, p, 0); }\n\nivec4 decodeIndices4(vec4 f) { return ivec4(floor(f + 0.5)); }\n\nint clampBoneIndex(int idx) {\n  // Capacity padded to uDQTilesX * uDQWidth bones\n  int maxIdx = uDQTilesX * uDQWidth - 1;\n  return clamp(idx, 0, maxIdx);\n}\n\nvoid dqHemisphereAlign(inout vec4 r, inout vec4 d, vec4 refR) {\n  if (dot(r, refR) < 0.0) { r = -r; d = -d; }\n}\n\nvoid dqNormalizeConsistent(inout vec4 r, inout vec4 d) {\n  float n2 = max(dot(r, r), 1e-20);\n  float invn = inversesqrt(n2);\n  r *= invn;\n  d *= invn;\n  // enforce unit dual quaternion property: qr · qd = 0\n  d -= r * dot(r, d);\n}\n\nvec3 dqTransformPoint(vec4 qr, vec4 qd, vec3 p) {\n  // Standard DQ transform matching dqMath.glsl.fx\n  vec3 qv = qr.xyz;\n  float qw = qr.w;\n  \n  // Translation: t = 2 * (qd.xyz * qr.w - qr.xyz * qd.w + cross(qr.xyz, qd.xyz))\n  vec3 t = 2.0 * (qd.xyz * qw - qv * qd.w + cross(qv, qd.xyz));\n  \n  // Rotation: p' = p + 2w(q × p) + 2(q × (q × p))\n  vec3 uv  = cross(qv, p);\n  vec3 uuv = cross(qv, uv);\n  vec3 pRot = p + (uv * (2.0 * qw) + uuv * 2.0);\n  \n  return pRot + t;\n}\n\nvoid fetchBoneDQScale(int boneIdx, int frameRow, out vec4 qr, out vec4 qd, out float s) {\n  int stride = uDQStrideTexels;\n  int x     = boneIdx % uDQWidth;\n  int tile  = boneIdx / uDQWidth;\n  int y     = frameRow * uDQTilesX + tile;\n  int baseX = x * stride;\n\n  qr = fetchDQAtlas(ivec2(baseX + 0, y));\n  qd = fetchDQAtlas(ivec2(baseX + 1, y));\n  \n  if (uDQHasScale && stride >= 3) {\n    vec4 sc = fetchDQAtlas(ivec2(baseX + 2, y));\n    s = sc.x;\n  } else {\n    s = 1.0;\n  }\n}\n\nvoid accumDQAligned(inout vec4 rSum, inout vec4 dSum, vec4 addR, vec4 addD, float w) {\n  if (w <= 0.0) return;\n  if (rSum.x!=0.0 || rSum.y!=0.0 || rSum.z!=0.0 || rSum.w!=0.0) {\n    dqHemisphereAlign(addR, addD, rSum);\n  }\n  rSum += addR * w;\n  dSum += addD * w;\n}\n\n// ---------------------------------------------------------------------------\n\nvoid main(void) {\n  vUV = uv;\n  vPage = int(aPage);\n  vRect = aRect;\n  // Instance indirection (draw order compaction)\n  int drawIdx   = gl_InstanceID;\n  int packedBase= uShadoInstanceContainer_instancesBase + drawIdx * uShadoInstanceContainer_instancesStride;\n  int srcIdx    = int(ShadoInstanceContainer_fetch(packedBase + ${ShadoInstanceContainer._instanceName}_visibleIndex_OFF));\n  if (srcIdx < 0) { gl_Position = vec4(2.0); return; }\n\n  ${ShadoInstanceContainer._instanceName}Header inst = ShadoInstanceContainer_instances_get(srcIdx);\n  vec4 T = inst.translation; // xyz + instance scale in w\n  vec4 C = inst.color;\n  vec4 anim = inst.animationBuffer;\n\n  // Resolve absolute frame row in the atlas (wrap within [startF, endF])\n  float startF = anim.x, endF = max(anim.y, startF);\n  float total  = (endF - startF) + 1.0;\n  float tF     = bakedVertexAnimationTime * anim.w + anim.z;\n  float fAbs   = startF + (tF - total * floor(tF / total));\n  int   frame0 = int(floor(fAbs));\n  int   frame1 = min(frame0 + 1, int(endF));\n  float lerpT  = fract(fAbs);\n\n  // Indices/weights\n  ivec4 bi0 = decodeIndices4(matricesIndices);\n  vec4  bw0 = matricesWeights;\n  #ifdef BONES8\n    ivec4 bi1 = decodeIndices4(matricesIndicesExtra);\n    vec4  bw1 = matricesWeightsExtra;\n  #endif\n\n  // Clamp indices to atlas capacity (defensive)\n  bi0.x = clampBoneIndex(bi0.x);\n  bi0.y = clampBoneIndex(bi0.y);\n  bi0.z = clampBoneIndex(bi0.z);\n  bi0.w = clampBoneIndex(bi0.w);\n  #ifdef BONES8\n    bi1.x = clampBoneIndex(bi1.x);\n    bi1.y = clampBoneIndex(bi1.y);\n    bi1.z = clampBoneIndex(bi1.z);\n    bi1.w = clampBoneIndex(bi1.w);\n  #endif\n\n  // Many exporters leave garbage in unused lanes; renormalize\n  float wsum = bw0.x + bw0.y + bw0.z + bw0.w;\n  #ifdef BONES8\n    wsum += bw1.x + bw1.y + bw1.z + bw1.w;\n  #endif\n  if (wsum < 1e-8) wsum = 1.0;\n  bw0 /= wsum;\n  #ifdef BONES8\n    bw1 /= wsum;\n  #endif\n\n  // Accumulate DQ and (optional) uniform scale\n  vec4 r0 = vec4(0.0), d0 = vec4(0.0); float s0 = 0.0;\n  vec4 r1 = vec4(0.0), d1 = vec4(0.0); float s1 = 0.0;\n\n  for (int k=0;k<4;++k) {\n    int idx = (k==0)?bi0.x:(k==1)?bi0.y:(k==2)?bi0.z:bi0.w;\n    float w = (k==0)?bw0.x:(k==1)?bw0.y:(k==2)?bw0.z:bw0.w;\n    if (w <= 0.0) continue;\n    vec4 ar, ad; float as;\n    fetchBoneDQScale(idx, frame0, ar, ad, as); accumDQAligned(r0,d0,ar,ad,w); s0 += as*w;\n    fetchBoneDQScale(idx, frame1, ar, ad, as); accumDQAligned(r1,d1,ar,ad,w); s1 += as*w;\n  }\n\n  #ifdef BONES8\n  for (int k=0;k<4;++k) {\n    int idx = (k==0)?bi1.x:(k==1)?bi1.y:(k==2)?bi1.z:bi1.w;\n    float w = (k==0)?bw1.x:(k==1)?bw1.y:(k==2)?bw1.z:bw1.w;\n    if (w <= 0.0) continue;\n    vec4 ar, ad; float as;\n    fetchBoneDQScale(idx, frame0, ar, ad, as); accumDQAligned(r0,d0,ar,ad,w); s0 += as*w;\n    fetchBoneDQScale(idx, frame1, ar, ad, as); accumDQAligned(r1,d1,ar,ad,w); s1 += as*w;\n  }\n  #endif\n\n  // Normalize per-frame blends and enforce qr * qd = 0\n  dqNormalizeConsistent(r0, d0);\n  dqNormalizeConsistent(r1, d1);\n\n  // Time hemisphere align, then mix and renormalize\n  vec4 r1a = r1, d1a = d1;\n  dqHemisphereAlign(r1a, d1a, r0);\n\n  vec4 r = mix(r0, r1a, lerpT);\n  vec4 d = mix(d0, d1a, lerpT);\n  dqNormalizeConsistent(r, d);\n\n  float boneScale = mix(s0, s1, lerpT);\n  if (!uDQHasScale) boneScale = 1.0;\n\n  vec3 skinned = dqTransformPoint(r, d, position * boneScale);\n  \n  // Apply instance transform\n  vec3 p = skinned * T.w + T.xyz;\n  gl_Position = worldViewProjection * vec4(p, 1.0);\n  vColor = C;\n}\n\n\n`;\n\n    return { vs, fs };\n  }\n\n  public override generateWGSLPair(): { vs: string; fs: string } {\n    // Not implemented yet\n    return { vs: 'moduleSource', fs: 'moduleSource' };\n  }\n\n  public shuffleInstances(animationRanges: any[]) {\n    const reroll = true;\n    for (let i = 0; i < this._children.length; i++) {\n      const ch = this._children[i];\n      ch.initialize();\n      if (reroll) {\n        ch.nameIndex = Math.floor(this._nameplates.nameCount() * Math.random());\n      }\n      ch.playRandomAnimation(animationRanges);\n      ch.emitHeaderDirty();\n    }\n    if (reroll) this._nameplates.rebuildStreams(this._children);\n  }\n}\n","export * from './types';\nexport * from './decorators';\nexport * from './arena/FloatArena';\nexport * from './schema/ShadoSchemaBuilder';\nexport * from './schema/ShadoStructSchema';\nexport * from './includes/register';\nexport * from './backings/DataTexBacking';\nexport * from './backings/StorageBacking';\nexport * from './core/Shado';\nexport { Shado as ShaderObject } from './core/Shado';\nexport * from './utils/type-helpers';\nexport * from './utils/embedded-proxy';\nexport * from './utils/binding-alloc';\nexport * from './utils/glsl-wgsl';\n\n// Extensions\nexport * from './extensions';\n\n// Materials\nexport * from './materials/ShadoMaterial';\n\nexport * from './babylon';\nexport * from './render';\n\nexport const VERSION = '';\n"]}