babylonjs-addons 9.26.0 → 9.26.2

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.
@@ -3,6 +3,7 @@ declare module "babylonjs-addons/index" {
3
3
  export * from "babylonjs-addons/atmosphere/index";
4
4
  export * from "babylonjs-addons/htmlMesh/index";
5
5
  export * from "babylonjs-addons/msdfText/index";
6
+ export * from "babylonjs-addons/multiTexture/index";
6
7
  export * from "babylonjs-addons/navigation/index";
7
8
 
8
9
  }
@@ -1431,6 +1432,455 @@ export function ToSoloNavMeshGeneratorConfig(config: INavMeshParametersV2): Part
1431
1432
  */
1432
1433
  export function ToCrowdAgentParams(agentParams: IAgentParametersV2): Partial<any>;
1433
1434
 
1435
+ }
1436
+ declare module "babylonjs-addons/multiTexture/multiTexture" {
1437
+ /**
1438
+ * MultiTexture: composes an array of image files into a single TEXTURE_2D_ARRAY that can be
1439
+ * assigned to a material slot like any other texture.
1440
+ *
1441
+ * Lives in @babylonjs/addons (not core) because it is an application-oriented, optional feature
1442
+ * with WebGL2/WebGPU requirements, URL polling, and a non-trivial memory footprint.
1443
+ */
1444
+ import { Nullable } from "babylonjs/types";
1445
+ import { InternalTexture } from "babylonjs/Materials/Textures/internalTexture";
1446
+ import { Scene } from "babylonjs/scene.pure";
1447
+ import { Observable } from "babylonjs/Misc/observable";
1448
+ import { BaseTexture } from "babylonjs/Materials/Textures/baseTexture.pure";
1449
+ import { ISize } from "babylonjs/Maths/math.size";
1450
+ import { ProceduralTexture } from "babylonjs/Materials/Textures/Procedurals/proceduralTexture.pure";
1451
+ import { RawTexture2DArray } from "babylonjs/Materials/Textures/rawTexture2DArray";
1452
+ /**
1453
+ * Options for creating a MultiTexture.
1454
+ */
1455
+ export interface IMultiTextureOptions {
1456
+ /** Fixed layer resolution. REQUIRED. Positive integer. */
1457
+ width: number;
1458
+ /** Fixed layer resolution. REQUIRED. Positive integer. */
1459
+ height: number;
1460
+ /** Array depth to allocate. Optional positive integer; default: urls.length. Must be \>= urls.length and \<= the engine's texture2DArrayMaxLayerCount (else throw). Required when urls is empty. */
1461
+ maxLayers?: number;
1462
+ /** Default MultiBlendMode.ALPHA_BLEND. */
1463
+ blendMode?: MultiBlendMode;
1464
+ /** Default false. Passed to RawTexture2DArray: mip levels of the LAYER array. On WebGL2 they are consumed by the composite when rttScale less than 1 (trilinear minification); on WebGPU the composite fetches texels exactly, so these mips only affect direct per-layer sampling via `arrayTexture`. The composite RTT itself never has mips (consumed at 1:1 by materials). */
1465
+ generateMipMaps?: boolean;
1466
+ /** Default Texture.TRILINEAR_SAMPLINGMODE. Passed to RawTexture2DArray. On WebGL2 the composite shader reads the layers through this sampler, so it also drives the composite's mag/min filtering; on WebGPU the composite fetches texels exactly (see the class notes), so it only affects direct per-layer sampling via `arrayTexture`. */
1467
+ samplingMode?: number;
1468
+ /** Default false. Passed through to UploadImageToTexture2DArrayLayer. */
1469
+ premultiplyAlpha?: boolean;
1470
+ /** "resize" (default): scale to width×height. "strict": rejects mismatched dims. */
1471
+ fit?: "resize" | "strict";
1472
+ /** Composite RTT resolution = width*rttScale × height*rttScale. Default 1. On WebGL2 values other than 1 produce a filtered (bilinear) rescale of the composite; on WebGPU the composite fetches its texels exactly, so rttScale effectively rescales the render target without filtering. */
1473
+ rttScale?: number;
1474
+ /** Default false. HEAD-polling change detection. */
1475
+ watch?: boolean;
1476
+ /** Default 2000 ms. Only used when watch is true. */
1477
+ pollInterval?: number;
1478
+ /** Fired once after all initial layers have settled (success or failure). */
1479
+ onLoad?: () => void;
1480
+ /** Fired on any async failure (init, updateLayer, poll). Not thrown. */
1481
+ onError?: (message?: string, exception?: any) => void;
1482
+ }
1483
+ /**
1484
+ * Register side effects for MultiTexture.
1485
+ * Registers the core 2D-array image-source extensions for both backends (the WebGL2
1486
+ * `engine.texture2DArrayImageSource` and its WebGPU counterpart) lazily at first use, matching
1487
+ * the Atmosphere addon's convention. Safe to call multiple times; only the first call has an effect.
1488
+ */
1489
+ export function RegisterMultiTexture(): void;
1490
+ /**
1491
+ * Composes an array of image files into a single TEXTURE_2D_ARRAY and blends the layers per pixel
1492
+ * according to a selectable {@link MultiBlendMode}. The blended result is written to a render-target
1493
+ * texture that can be assigned to materials like any other texture.
1494
+ *
1495
+ * Requires a WebGL2 or WebGPU engine (TEXTURE_2D_ARRAY + sampler2DArray). The constructor throws
1496
+ * synchronously on WebGL1.
1497
+ *
1498
+ * Supported source formats are the raster formats your browser can decode with createImageBitmap
1499
+ * (PNG, JPEG, WebP, AVIF, GIF first frame, BMP). Compressed/container formats such as KTX2 are NOT
1500
+ * supported: the existing KTX2 transcode path goes straight to the GPU (which would bypass the
1501
+ * CPU pixel cache this class maintains), and KTX2 containers hold the whole array in a single file
1502
+ * (which conflicts with the one-file-per-layer-index update model).
1503
+ *
1504
+ * Notes:
1505
+ * - `url` is null (the base texture loader is not used); the `urls` property is the source of truth.
1506
+ * - By default every decoded layer is read back into a CPU `Uint8ClampedArray` (see `pixels`). This
1507
+ * costs one canvas readback (and a full-width×height RGBA CPU copy) per (re)load of a layer — it
1508
+ * runs on every initial load, `updateLayerAsync` reload, and watch-triggered reload, so frequent
1509
+ * reloads or large layers carry a CPU/memory cost (roughly `width × height × 4` bytes per layer).
1510
+ * - With `premultiplyAlpha: true` the GPU layers are stored premultiplied, but the CPU `pixels`
1511
+ * cache still holds the raw decoded (non-premultiplied) bytes.
1512
+ * - The default ALPHA_BLEND mode composites the layers with standard source-over blending: each
1513
+ * layer is drawn over the accumulated result, so later layers cover earlier ones and a fully
1514
+ * opaque layer hides everything below it. With straight-alpha layers (premultiplyAlpha: false)
1515
+ * the fold is the source-over `over` operator (`outA = layer.a + outA * (1 - layer.a)`); with
1516
+ * the premultiplied form (`out = layer + out * (1 - layer.a)`). The composite always outputs
1517
+ * straight RGBA, so materials see identical pixels regardless of `premultiplyAlpha` (which
1518
+ * only controls the layer storage/fold).
1519
+ * - ALPHA_MAX picks the sample with the highest alpha; ties (equal alpha) resolve to the highest
1520
+ * layer index (last input draws over earlier ones).
1521
+ * - With zero active layers, ALPHA_BLEND/ALPHA_MAX/ADD/SUBTRACT/SCREEN output transparent black
1522
+ * and MULTIPLY outputs white (empty-product identity).
1523
+ * - Compositing is performed independently of the scene render loop: MultiTexture re-composites
1524
+ * its internal render target explicitly after every mutation (layer add/insert/remove/update,
1525
+ * blend-mode change, array growth), so `scene.proceduralTexturesEnabled` has no effect on it.
1526
+ * - How the composite samples the layer array depends on the engine backend, but both are
1527
+ * filtered and honour `samplingMode`. On WebGL2 the GLSL composite shader reads the layers
1528
+ * through the array sampler (`texture(...)`), so `samplingMode` affects the output, `rttScale`
1529
+ * other than 1 produces a filtered bilinear rescale, and (with `generateMipMaps: true`)
1530
+ * trilinear minification can use the layer mips. On WebGPU the WGSL composite shader samples
1531
+ * the layer array through its sampler at mip 0 (`textureSampleLevel(..., 0.0)`), so `samplingMode`
1532
+ * affects the output but only mip-0 filtering applies (no mip-level selection) and `rttScale`
1533
+ * rescale is filtered at mip 0. The `_arrayTexture` sampler that materials use to read the
1534
+ * per-layer array is unaffected by this backend difference.
1535
+ * - `MultiTexture` lives in `@babylonjs/addons` and lazily registers the core 2D-array
1536
+ * image-source extensions on first construction, matching the `Atmosphere` addon's convention.
1537
+ * No engine mutation occurs at addons import time. `RegisterMultiTexture()` calls both the WebGL2
1538
+ * (`engine.texture2DArrayImageSource`) and WebGPU pure registration functions, so a pure/tree-shaken
1539
+ * WebGPU build receives `updateTextureArrayLayerFromImageSource` without any extra consumer import.
1540
+ * - The allocated array depth (options.maxLayers ?? urls.length) must be a positive integer and no
1541
+ * larger than the device limit getCaps().texture2DArrayMaxLayerCount. Empty urls are only accepted
1542
+ * together with an explicit options.maxLayers. addLayerAsync/insertLayerAsync double the depth when it is
1543
+ * full and throw a RangeError if the doubled depth would exceed that limit.
1544
+ */
1545
+ export class MultiTexture extends BaseTexture {
1546
+ /**
1547
+ * The internal ProceduralTexture that composites the layers into the render-target texture
1548
+ * assigned to materials. MultiTexture composes, rather than extends, ProceduralTexture: it
1549
+ * creates this composite with `skipSceneRegistration: true` so the scene render loop does not
1550
+ * drive it, and calls {@link _renderComposite} explicitly after each mutation. All texture
1551
+ * surface methods (isReady/getInternalTexture) forward to it.
1552
+ */
1553
+ get composite(): ProceduralTexture;
1554
+ private _compositeInternal;
1555
+ /** Fired once after all initial layers have settled (success or failure). */
1556
+ readonly onLoadObservable: Observable<MultiTexture>;
1557
+ private _layers;
1558
+ private _layerCount;
1559
+ private _maxLayers;
1560
+ private _deviceMaxLayerCap;
1561
+ private _blendMode;
1562
+ private _pollTimer;
1563
+ /** True while a _poll() tick is in flight; overlapping interval firings early-return so a slow tick never double-fetches. */
1564
+ private _pollInFlight;
1565
+ private _canvas;
1566
+ private _ctx;
1567
+ private _disposed;
1568
+ private _mtOptions;
1569
+ private _arrayTexture;
1570
+ /** Number of in-flight mip-suppressed operations (init pool + mutations). See _suppressArrayMips. */
1571
+ private _mipSuppressCount;
1572
+ /**
1573
+ * Number of active layers (drives the uLayerCount uniform). Changes only via addLayerAsync/removeLayerAsync.
1574
+ */
1575
+ get layerCount(): number;
1576
+ /**
1577
+ * The underlying TEXTURE_2D_ARRAY, for users who want to sample individual layers directly.
1578
+ */
1579
+ get arrayTexture(): RawTexture2DArray;
1580
+ /**
1581
+ * Forwards to the internal composite: the render-target texture that composites the layers is
1582
+ * owned by the composite, so the material samples it through here.
1583
+ * @returns The composite's internal texture.
1584
+ */
1585
+ getInternalTexture(): Nullable<InternalTexture>;
1586
+ /**
1587
+ * Forwards to the internal composite: ready once the composite's render-target texture is ready.
1588
+ * @returns True if the composite's render-target texture is ready, otherwise false.
1589
+ */
1590
+ isReady(): boolean;
1591
+ /**
1592
+ * Renders the internal composite, applying the current layer uploads and blend mode.
1593
+ * The composite only draws once its effect is compiled (shaders load asynchronously), so the
1594
+ * first render is deferred to the compiled callback instead of drawing a stale/empty target.
1595
+ */
1596
+ private _renderComposite;
1597
+ /**
1598
+ * Forwards to the composite: the composite render-target is what materials sample.
1599
+ * @returns The composite render-target size.
1600
+ */
1601
+ getSize(): ISize;
1602
+ /**
1603
+ * Forwards to the composite: the composite render-target base size is what materials sample.
1604
+ * @returns The composite render-target base size.
1605
+ */
1606
+ getBaseSize(): ISize;
1607
+ /**
1608
+ * Forwards to the composite's sampling mode.
1609
+ * @returns the composite render-target's sampling mode.
1610
+ */
1611
+ get samplingMode(): number;
1612
+ /**
1613
+ * Forwards to the composite, which owns the render-target texture the material binds.
1614
+ * @param samplingMode the new sampling mode
1615
+ * @param generateMipMaps whether to generate mip maps
1616
+ */
1617
+ updateSamplingMode(samplingMode: number, generateMipMaps?: boolean): void;
1618
+ /**
1619
+ * Forwards to the composite's render-target texture.
1620
+ * @param faceIndex defines the face of the texture to read (in case of cube texture)
1621
+ * @param level defines the LOD level of the texture to read (in case of Mip Maps)
1622
+ * @param buffer defines a user defined buffer to fill with data (can be null)
1623
+ * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels
1624
+ * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture
1625
+ * @param x defines the region x coordinates to start reading from (default to 0)
1626
+ * @param y defines the region y coordinates to start reading from (default to 0)
1627
+ * @param width defines the region width to read from (default to the texture size at level)
1628
+ * @param height defines the region width to read from (default to the texture size at level)
1629
+ * @returns the composite render-target's pixel buffer promise.
1630
+ */
1631
+ readPixels(faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean, x?: number, y?: number, width?: number, height?: number): Nullable<Promise<ArrayBufferView>>;
1632
+ /**
1633
+ * Forwards to the composite's render-target texture.
1634
+ * @param faceIndex defines the face of the texture to read (in case of cube texture)
1635
+ * @param level defines the LOD level of the texture to read (in case of Mip Maps)
1636
+ * @param buffer defines a user defined buffer to fill with data (can be null)
1637
+ * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels
1638
+ * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture
1639
+ * @returns the composite render-target's pixel buffer.
1640
+ */
1641
+ _readPixelsSync(faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean): Nullable<ArrayBufferView>;
1642
+ /**
1643
+ * Forwards to the composite render-target's format.
1644
+ * @returns the composite render-target's internal format.
1645
+ */
1646
+ get textureFormat(): number;
1647
+ /**
1648
+ * Forwards to the composite render-target's type.
1649
+ * @returns the composite render-target's internal type.
1650
+ */
1651
+ get textureType(): number;
1652
+ /**
1653
+ * The input URLs, in layer order. Updated by addLayerAsync/insertLayerAsync/removeLayerAsync/updateLayerAsync.
1654
+ */
1655
+ readonly urls: string[];
1656
+ /**
1657
+ * CPU pixel cache. `pixels[i]` is a full `width × height × 4` RGBA (non-premultiplied) copy of
1658
+ * decoded layer i, or `null` if that layer has not loaded (yet) or failed to load. It is
1659
+ * repopulated on every (re)load of a layer (initial load, `updateLayerAsync`, watch reload) and
1660
+ * cleared on dispose. Memory footprint is approximately `width × height × 4` bytes per loaded
1661
+ * layer; skip it if you only need the GPU composite and do not read `pixels`.
1662
+ */
1663
+ readonly pixels: Array<Uint8ClampedArray | null>;
1664
+ /**
1665
+ * Creates a new MultiTexture.
1666
+ * @param name defines the name of the texture
1667
+ * @param urls defines the array of image URLs to load as layers
1668
+ * @param scene defines the hosting scene
1669
+ * @param options defines the creation options (width/height required)
1670
+ */
1671
+ constructor(name: string, urls: string[], scene: Scene, options: IMultiTextureOptions);
1672
+ /**
1673
+ * How the layers combine. Setting it swaps the composite fragment shader and triggers one
1674
+ * re-composite.
1675
+ */
1676
+ get blendMode(): MultiBlendMode;
1677
+ set blendMode(value: MultiBlendMode);
1678
+ /**
1679
+ * Replaces a layer by URL. Fetches, decodes and uploads layer i only.
1680
+ * Exactly one texSubImage3D is issued for the target layer; uLayerCount is unchanged.
1681
+ * @param index defines the layer index to replace
1682
+ * @param url defines the new source for the layer
1683
+ * @returns a promise resolving once the layer has been uploaded
1684
+ */
1685
+ updateLayerAsync(index: number, url: string): Promise<void>;
1686
+ /**
1687
+ * Appends a new layer at the end and returns its index. Grows the underlying array (doubling its
1688
+ * depth and re-uploading the existing layers from their retained bitmaps) when the current depth
1689
+ * is exhausted. Throws a RangeError if the doubled depth would exceed the device's
1690
+ * texture2DArrayMaxLayerCount.
1691
+ * @param url defines the URL of the image to load as the new layer
1692
+ * @returns a promise resolving to the index of the new layer
1693
+ */
1694
+ addLayerAsync(url: string): Promise<number>;
1695
+ /**
1696
+ * Inserts a new layer at the given index and returns it. Layers at index and above shift up by
1697
+ * one: loaded layers are re-uploaded from their retained bitmaps, and a shifted layer that is
1698
+ * still loading lands in its new slot when its in-flight load settles (loads resolve against
1699
+ * their layer entry, never against a stale index). uLayerCount is incremented. Inserting at
1700
+ * `layerCount` appends (addLayerAsync-equivalent). Grows the underlying array (doubling its depth)
1701
+ * when the current depth is exhausted, same as addLayerAsync, and throws a RangeError if the doubled
1702
+ * depth would exceed the device's texture2DArrayMaxLayerCount.
1703
+ * @param index defines the layer index to insert at (0..layerCount, inclusive)
1704
+ * @param url defines the URL of the image to load as the new layer
1705
+ * @returns a promise resolving to the index of the inserted layer
1706
+ */
1707
+ insertLayerAsync(index: number, url: string): Promise<number>;
1708
+ /**
1709
+ * Removes a layer. Higher indices shift down (re-uploaded from their retained bitmaps) and
1710
+ * uLayerCount is decremented.
1711
+ * @param index defines the layer index to remove
1712
+ * @returns a promise resolving once the shift is done
1713
+ */
1714
+ removeLayerAsync(index: number): Promise<void>;
1715
+ /**
1716
+ * Disposes the texture: stops the watch poller, closes every retained bitmap, disposes the layer
1717
+ * array and releases the composite render target through the standard procedural-texture path.
1718
+ */
1719
+ dispose(): void;
1720
+ /**
1721
+ * Clones the texture: builds a fresh MultiTexture in the same scene with the same name, the
1722
+ * current layer urls and the resolved options (layer resolution, current array capacity,
1723
+ * current blend mode, sampling mode, mipmap generation, RTT scale, fit and watch settings).
1724
+ * The clone re-fetches and re-decodes its layers from scratch; it never shares the 2D array
1725
+ * texture, the pixel cache or the load callbacks (onLoad/onError are not inherited).
1726
+ * @returns the cloned texture
1727
+ */
1728
+ clone(): MultiTexture;
1729
+ /**
1730
+ * MultiTexture is intentionally not scene-serializable: the scene loader has no parser for it,
1731
+ * so the payload produced by the inherited base serialization could never be reconstructed
1732
+ * (urls, capacity, blend mode and watch options have no serialized fields). Fails explicitly
1733
+ * instead of returning a misleading JSON object.
1734
+ * @param _allowEmptyName accepted for signature compatibility; ignored
1735
+ * @throws Error always
1736
+ */
1737
+ serialize(_allowEmptyName?: boolean): never;
1738
+ private _buildDefines;
1739
+ private _bitmapOptions;
1740
+ private _reportError;
1741
+ private _createLayerEntry;
1742
+ private _loadEntryOrThrow;
1743
+ private _loadEntryAndReport;
1744
+ private _warnWatchFailure;
1745
+ private _uploadToLayer;
1746
+ private _reuploadSlot;
1747
+ private _clearLayerSlot;
1748
+ private _loadEntry;
1749
+ private _uploadBitmap;
1750
+ private _initialize;
1751
+ private _pushLayerEntry;
1752
+ private _growArray;
1753
+ private _suppressArrayMips;
1754
+ private _generateArrayMips;
1755
+ private _startPolling;
1756
+ private _poll;
1757
+ }
1758
+ /**
1759
+ * Blend modes controlling how the layers of a MultiTexture are combined per pixel.
1760
+ */
1761
+ export enum MultiBlendMode {
1762
+ /**
1763
+ * Default. Composites the layers with standard source-over alpha blending: each layer is drawn
1764
+ * over the accumulated result, so later layers cover earlier ones and a fully opaque layer
1765
+ * (a = 1) completely hides everything below it. With straight-alpha layers (premultiplyAlpha:
1766
+ * false) the fold is `outA = layer.a + outA * (1 - layer.a)`; with premultiplied layers it is
1767
+ * the premultiplied form `out = layer + out * (1 - layer.a)`. The composite always outputs
1768
+ * straight RGBA, so materials see identical pixels regardless of `premultiplyAlpha` (which
1769
+ * only controls the layer storage/fold). Zero active layers output transparent black.
1770
+ */
1771
+ ALPHA_BLEND = 0,
1772
+ /** Keeps the sample with the highest alpha among the layers (ties: highest index wins). Zero active layers output transparent black. */
1773
+ ALPHA_MAX = 1,
1774
+ /** Adds all layers per channel, clamped to 1. */
1775
+ ADD = 2,
1776
+ /** Multiplies all layers per channel (empty product is 1). */
1777
+ MULTIPLY = 3,
1778
+ /** Starts from layer 0 and subtracts every following layer, clamped to 0. */
1779
+ SUBTRACT = 4,
1780
+ /** Screens all layers per channel. */
1781
+ SCREEN = 5
1782
+ }
1783
+
1784
+ }
1785
+ declare module "babylonjs-addons/multiTexture/index" {
1786
+ export * from "babylonjs-addons/multiTexture/multiTexture";
1787
+
1788
+ }
1789
+ declare module "babylonjs-addons/multiTexture/ShadersWGSL/multiTextureCompositeSubtract.fragment" {
1790
+ /** @internal */
1791
+ export const multiTextureCompositeSubtractPixelShaderWGSL: {
1792
+ name: string;
1793
+ shader: string;
1794
+ };
1795
+
1796
+ }
1797
+ declare module "babylonjs-addons/multiTexture/ShadersWGSL/multiTextureCompositeScreen.fragment" {
1798
+ /** @internal */
1799
+ export const multiTextureCompositeScreenPixelShaderWGSL: {
1800
+ name: string;
1801
+ shader: string;
1802
+ };
1803
+
1804
+ }
1805
+ declare module "babylonjs-addons/multiTexture/ShadersWGSL/multiTextureCompositeMultiply.fragment" {
1806
+ /** @internal */
1807
+ export const multiTextureCompositeMultiplyPixelShaderWGSL: {
1808
+ name: string;
1809
+ shader: string;
1810
+ };
1811
+
1812
+ }
1813
+ declare module "babylonjs-addons/multiTexture/ShadersWGSL/multiTextureCompositeAlphaMax.fragment" {
1814
+ /** @internal */
1815
+ export const multiTextureCompositeAlphaMaxPixelShaderWGSL: {
1816
+ name: string;
1817
+ shader: string;
1818
+ };
1819
+
1820
+ }
1821
+ declare module "babylonjs-addons/multiTexture/ShadersWGSL/multiTextureCompositeAlphaBlend.fragment" {
1822
+ /** @internal */
1823
+ export const multiTextureCompositeAlphaBlendPixelShaderWGSL: {
1824
+ name: string;
1825
+ shader: string;
1826
+ };
1827
+
1828
+ }
1829
+ declare module "babylonjs-addons/multiTexture/ShadersWGSL/multiTextureCompositeAdd.fragment" {
1830
+ /** @internal */
1831
+ export const multiTextureCompositeAddPixelShaderWGSL: {
1832
+ name: string;
1833
+ shader: string;
1834
+ };
1835
+
1836
+ }
1837
+ declare module "babylonjs-addons/multiTexture/Shaders/multiTextureCompositeSubtract.fragment" {
1838
+ /** @internal */
1839
+ export const multiTextureCompositeSubtractPixelShader: {
1840
+ name: string;
1841
+ shader: string;
1842
+ };
1843
+
1844
+ }
1845
+ declare module "babylonjs-addons/multiTexture/Shaders/multiTextureCompositeScreen.fragment" {
1846
+ /** @internal */
1847
+ export const multiTextureCompositeScreenPixelShader: {
1848
+ name: string;
1849
+ shader: string;
1850
+ };
1851
+
1852
+ }
1853
+ declare module "babylonjs-addons/multiTexture/Shaders/multiTextureCompositeMultiply.fragment" {
1854
+ /** @internal */
1855
+ export const multiTextureCompositeMultiplyPixelShader: {
1856
+ name: string;
1857
+ shader: string;
1858
+ };
1859
+
1860
+ }
1861
+ declare module "babylonjs-addons/multiTexture/Shaders/multiTextureCompositeAlphaMax.fragment" {
1862
+ /** @internal */
1863
+ export const multiTextureCompositeAlphaMaxPixelShader: {
1864
+ name: string;
1865
+ shader: string;
1866
+ };
1867
+
1868
+ }
1869
+ declare module "babylonjs-addons/multiTexture/Shaders/multiTextureCompositeAlphaBlend.fragment" {
1870
+ /** @internal */
1871
+ export const multiTextureCompositeAlphaBlendPixelShader: {
1872
+ name: string;
1873
+ shader: string;
1874
+ };
1875
+
1876
+ }
1877
+ declare module "babylonjs-addons/multiTexture/Shaders/multiTextureCompositeAdd.fragment" {
1878
+ /** @internal */
1879
+ export const multiTextureCompositeAddPixelShader: {
1880
+ name: string;
1881
+ shader: string;
1882
+ };
1883
+
1434
1884
  }
1435
1885
  declare module "babylonjs-addons/msdfText/textRenderer" {
1436
1886
  import { AbstractEngine } from "babylonjs/Engines/abstractEngine";
@@ -4910,6 +5360,432 @@ declare namespace ADDONS {
4910
5360
  export function ToCrowdAgentParams(agentParams: IAgentParametersV2): Partial<any>;
4911
5361
 
4912
5362
 
5363
+ /**
5364
+ * MultiTexture: composes an array of image files into a single TEXTURE_2D_ARRAY that can be
5365
+ * assigned to a material slot like any other texture.
5366
+ *
5367
+ * Lives in @babylonjs/addons (not core) because it is an application-oriented, optional feature
5368
+ * with WebGL2/WebGPU requirements, URL polling, and a non-trivial memory footprint.
5369
+ */
5370
+ /**
5371
+ * Options for creating a MultiTexture.
5372
+ */
5373
+ export interface IMultiTextureOptions {
5374
+ /** Fixed layer resolution. REQUIRED. Positive integer. */
5375
+ width: number;
5376
+ /** Fixed layer resolution. REQUIRED. Positive integer. */
5377
+ height: number;
5378
+ /** Array depth to allocate. Optional positive integer; default: urls.length. Must be \>= urls.length and \<= the engine's texture2DArrayMaxLayerCount (else throw). Required when urls is empty. */
5379
+ maxLayers?: number;
5380
+ /** Default MultiBlendMode.ALPHA_BLEND. */
5381
+ blendMode?: MultiBlendMode;
5382
+ /** Default false. Passed to BABYLON.RawTexture2DArray: mip levels of the LAYER array. On WebGL2 they are consumed by the composite when rttScale less than 1 (trilinear minification); on WebGPU the composite fetches texels exactly, so these mips only affect direct per-layer sampling via `arrayTexture`. The composite RTT itself never has mips (consumed at 1:1 by materials). */
5383
+ generateMipMaps?: boolean;
5384
+ /** Default Texture.TRILINEAR_SAMPLINGMODE. Passed to BABYLON.RawTexture2DArray. On WebGL2 the composite shader reads the layers through this sampler, so it also drives the composite's mag/min filtering; on WebGPU the composite fetches texels exactly (see the class notes), so it only affects direct per-layer sampling via `arrayTexture`. */
5385
+ samplingMode?: number;
5386
+ /** Default false. Passed through to UploadImageToTexture2DArrayLayer. */
5387
+ premultiplyAlpha?: boolean;
5388
+ /** "resize" (default): scale to width×height. "strict": rejects mismatched dims. */
5389
+ fit?: "resize" | "strict";
5390
+ /** Composite RTT resolution = width*rttScale × height*rttScale. Default 1. On WebGL2 values other than 1 produce a filtered (bilinear) rescale of the composite; on WebGPU the composite fetches its texels exactly, so rttScale effectively rescales the render target without filtering. */
5391
+ rttScale?: number;
5392
+ /** Default false. HEAD-polling change detection. */
5393
+ watch?: boolean;
5394
+ /** Default 2000 ms. Only used when watch is true. */
5395
+ pollInterval?: number;
5396
+ /** Fired once after all initial layers have settled (success or failure). */
5397
+ onLoad?: () => void;
5398
+ /** Fired on any async failure (init, updateLayer, poll). Not thrown. */
5399
+ onError?: (message?: string, exception?: any) => void;
5400
+ }
5401
+ /**
5402
+ * Register side effects for MultiTexture.
5403
+ * Registers the core 2D-array image-source extensions for both backends (the WebGL2
5404
+ * `engine.texture2DArrayImageSource` and its WebGPU counterpart) lazily at first use, matching
5405
+ * the Atmosphere addon's convention. Safe to call multiple times; only the first call has an effect.
5406
+ */
5407
+ export function RegisterMultiTexture(): void;
5408
+ /**
5409
+ * Composes an array of image files into a single TEXTURE_2D_ARRAY and blends the layers per pixel
5410
+ * according to a selectable {@link MultiBlendMode}. The blended result is written to a render-target
5411
+ * texture that can be assigned to materials like any other texture.
5412
+ *
5413
+ * Requires a WebGL2 or WebGPU engine (TEXTURE_2D_ARRAY + sampler2DArray). The constructor throws
5414
+ * synchronously on WebGL1.
5415
+ *
5416
+ * Supported source formats are the raster formats your browser can decode with createImageBitmap
5417
+ * (PNG, JPEG, WebP, AVIF, GIF first frame, BMP). Compressed/container formats such as KTX2 are NOT
5418
+ * supported: the existing KTX2 transcode path goes straight to the GPU (which would bypass the
5419
+ * CPU pixel cache this class maintains), and KTX2 containers hold the whole array in a single file
5420
+ * (which conflicts with the one-file-per-layer-index update model).
5421
+ *
5422
+ * Notes:
5423
+ * - `url` is null (the base texture loader is not used); the `urls` property is the source of truth.
5424
+ * - By default every decoded layer is read back into a CPU `Uint8ClampedArray` (see `pixels`). This
5425
+ * costs one canvas readback (and a full-width×height RGBA CPU copy) per (re)load of a layer — it
5426
+ * runs on every initial load, `updateLayerAsync` reload, and watch-triggered reload, so frequent
5427
+ * reloads or large layers carry a CPU/memory cost (roughly `width × height × 4` bytes per layer).
5428
+ * - With `premultiplyAlpha: true` the GPU layers are stored premultiplied, but the CPU `pixels`
5429
+ * cache still holds the raw decoded (non-premultiplied) bytes.
5430
+ * - The default ALPHA_BLEND mode composites the layers with standard source-over blending: each
5431
+ * layer is drawn over the accumulated result, so later layers cover earlier ones and a fully
5432
+ * opaque layer hides everything below it. With straight-alpha layers (premultiplyAlpha: false)
5433
+ * the fold is the source-over `over` operator (`outA = layer.a + outA * (1 - layer.a)`); with
5434
+ * the premultiplied form (`out = layer + out * (1 - layer.a)`). The composite always outputs
5435
+ * straight RGBA, so materials see identical pixels regardless of `premultiplyAlpha` (which
5436
+ * only controls the layer storage/fold).
5437
+ * - ALPHA_MAX picks the sample with the highest alpha; ties (equal alpha) resolve to the highest
5438
+ * layer index (last input draws over earlier ones).
5439
+ * - With zero active layers, ALPHA_BLEND/ALPHA_MAX/ADD/SUBTRACT/SCREEN output transparent black
5440
+ * and MULTIPLY outputs white (empty-product identity).
5441
+ * - Compositing is performed independently of the scene render loop: MultiTexture re-composites
5442
+ * its internal render target explicitly after every mutation (layer add/insert/remove/update,
5443
+ * blend-mode change, array growth), so `scene.proceduralTexturesEnabled` has no effect on it.
5444
+ * - How the composite samples the layer array depends on the engine backend, but both are
5445
+ * filtered and honour `samplingMode`. On WebGL2 the GLSL composite shader reads the layers
5446
+ * through the array sampler (`texture(...)`), so `samplingMode` affects the output, `rttScale`
5447
+ * other than 1 produces a filtered bilinear rescale, and (with `generateMipMaps: true`)
5448
+ * trilinear minification can use the layer mips. On WebGPU the WGSL composite shader samples
5449
+ * the layer array through its sampler at mip 0 (`textureSampleLevel(..., 0.0)`), so `samplingMode`
5450
+ * affects the output but only mip-0 filtering applies (no mip-level selection) and `rttScale`
5451
+ * rescale is filtered at mip 0. The `_arrayTexture` sampler that materials use to read the
5452
+ * per-layer array is unaffected by this backend difference.
5453
+ * - `MultiTexture` lives in `@babylonjs/addons` and lazily registers the core 2D-array
5454
+ * image-source extensions on first construction, matching the `Atmosphere` addon's convention.
5455
+ * No engine mutation occurs at addons import time. `RegisterMultiTexture()` calls both the WebGL2
5456
+ * (`engine.texture2DArrayImageSource`) and WebGPU pure registration functions, so a pure/tree-shaken
5457
+ * WebGPU build receives `updateTextureArrayLayerFromImageSource` without any extra consumer import.
5458
+ * - The allocated array depth (options.maxLayers ?? urls.length) must be a positive integer and no
5459
+ * larger than the device limit getCaps().texture2DArrayMaxLayerCount. Empty urls are only accepted
5460
+ * together with an explicit options.maxLayers. addLayerAsync/insertLayerAsync double the depth when it is
5461
+ * full and throw a RangeError if the doubled depth would exceed that limit.
5462
+ */
5463
+ export class MultiTexture extends BABYLON.BaseTexture {
5464
+ /**
5465
+ * The internal BABYLON.ProceduralTexture that composites the layers into the render-target texture
5466
+ * assigned to materials. MultiTexture composes, rather than extends, BABYLON.ProceduralTexture: it
5467
+ * creates this composite with `skipSceneRegistration: true` so the scene render loop does not
5468
+ * drive it, and calls {@link _renderComposite} explicitly after each mutation. All texture
5469
+ * surface methods (isReady/getInternalTexture) forward to it.
5470
+ */
5471
+ get composite(): BABYLON.ProceduralTexture;
5472
+ private _compositeInternal;
5473
+ /** Fired once after all initial layers have settled (success or failure). */
5474
+ readonly onLoadObservable: BABYLON.Observable<MultiTexture>;
5475
+ private _layers;
5476
+ private _layerCount;
5477
+ private _maxLayers;
5478
+ private _deviceMaxLayerCap;
5479
+ private _blendMode;
5480
+ private _pollTimer;
5481
+ /** True while a _poll() tick is in flight; overlapping interval firings early-return so a slow tick never double-fetches. */
5482
+ private _pollInFlight;
5483
+ private _canvas;
5484
+ private _ctx;
5485
+ private _disposed;
5486
+ private _mtOptions;
5487
+ private _arrayTexture;
5488
+ /** Number of in-flight mip-suppressed operations (init pool + mutations). See _suppressArrayMips. */
5489
+ private _mipSuppressCount;
5490
+ /**
5491
+ * Number of active layers (drives the uLayerCount uniform). Changes only via addLayerAsync/removeLayerAsync.
5492
+ */
5493
+ get layerCount(): number;
5494
+ /**
5495
+ * The underlying TEXTURE_2D_ARRAY, for users who want to sample individual layers directly.
5496
+ */
5497
+ get arrayTexture(): BABYLON.RawTexture2DArray;
5498
+ /**
5499
+ * Forwards to the internal composite: the render-target texture that composites the layers is
5500
+ * owned by the composite, so the material samples it through here.
5501
+ * @returns The composite's internal texture.
5502
+ */
5503
+ getInternalTexture(): BABYLON.Nullable<BABYLON.InternalTexture>;
5504
+ /**
5505
+ * Forwards to the internal composite: ready once the composite's render-target texture is ready.
5506
+ * @returns True if the composite's render-target texture is ready, otherwise false.
5507
+ */
5508
+ isReady(): boolean;
5509
+ /**
5510
+ * Renders the internal composite, applying the current layer uploads and blend mode.
5511
+ * The composite only draws once its effect is compiled (shaders load asynchronously), so the
5512
+ * first render is deferred to the compiled callback instead of drawing a stale/empty target.
5513
+ */
5514
+ private _renderComposite;
5515
+ /**
5516
+ * Forwards to the composite: the composite render-target is what materials sample.
5517
+ * @returns The composite render-target size.
5518
+ */
5519
+ getSize(): BABYLON.ISize;
5520
+ /**
5521
+ * Forwards to the composite: the composite render-target base size is what materials sample.
5522
+ * @returns The composite render-target base size.
5523
+ */
5524
+ getBaseSize(): BABYLON.ISize;
5525
+ /**
5526
+ * Forwards to the composite's sampling mode.
5527
+ * @returns the composite render-target's sampling mode.
5528
+ */
5529
+ get samplingMode(): number;
5530
+ /**
5531
+ * Forwards to the composite, which owns the render-target texture the material binds.
5532
+ * @param samplingMode the new sampling mode
5533
+ * @param generateMipMaps whether to generate mip maps
5534
+ */
5535
+ updateSamplingMode(samplingMode: number, generateMipMaps?: boolean): void;
5536
+ /**
5537
+ * Forwards to the composite's render-target texture.
5538
+ * @param faceIndex defines the face of the texture to read (in case of cube texture)
5539
+ * @param level defines the LOD level of the texture to read (in case of Mip Maps)
5540
+ * @param buffer defines a user defined buffer to fill with data (can be null)
5541
+ * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels
5542
+ * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture
5543
+ * @param x defines the region x coordinates to start reading from (default to 0)
5544
+ * @param y defines the region y coordinates to start reading from (default to 0)
5545
+ * @param width defines the region width to read from (default to the texture size at level)
5546
+ * @param height defines the region width to read from (default to the texture size at level)
5547
+ * @returns the composite render-target's pixel buffer promise.
5548
+ */
5549
+ readPixels(faceIndex?: number, level?: number, buffer?: BABYLON.Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean, x?: number, y?: number, width?: number, height?: number): BABYLON.Nullable<Promise<ArrayBufferView>>;
5550
+ /**
5551
+ * Forwards to the composite's render-target texture.
5552
+ * @param faceIndex defines the face of the texture to read (in case of cube texture)
5553
+ * @param level defines the LOD level of the texture to read (in case of Mip Maps)
5554
+ * @param buffer defines a user defined buffer to fill with data (can be null)
5555
+ * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels
5556
+ * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture
5557
+ * @returns the composite render-target's pixel buffer.
5558
+ */
5559
+ _readPixelsSync(faceIndex?: number, level?: number, buffer?: BABYLON.Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean): BABYLON.Nullable<ArrayBufferView>;
5560
+ /**
5561
+ * Forwards to the composite render-target's format.
5562
+ * @returns the composite render-target's internal format.
5563
+ */
5564
+ get textureFormat(): number;
5565
+ /**
5566
+ * Forwards to the composite render-target's type.
5567
+ * @returns the composite render-target's internal type.
5568
+ */
5569
+ get textureType(): number;
5570
+ /**
5571
+ * The input URLs, in layer order. Updated by addLayerAsync/insertLayerAsync/removeLayerAsync/updateLayerAsync.
5572
+ */
5573
+ readonly urls: string[];
5574
+ /**
5575
+ * CPU pixel cache. `pixels[i]` is a full `width × height × 4` RGBA (non-premultiplied) copy of
5576
+ * decoded layer i, or `null` if that layer has not loaded (yet) or failed to load. It is
5577
+ * repopulated on every (re)load of a layer (initial load, `updateLayerAsync`, watch reload) and
5578
+ * cleared on dispose. Memory footprint is approximately `width × height × 4` bytes per loaded
5579
+ * layer; skip it if you only need the GPU composite and do not read `pixels`.
5580
+ */
5581
+ readonly pixels: Array<Uint8ClampedArray | null>;
5582
+ /**
5583
+ * Creates a new MultiTexture.
5584
+ * @param name defines the name of the texture
5585
+ * @param urls defines the array of image URLs to load as layers
5586
+ * @param scene defines the hosting scene
5587
+ * @param options defines the creation options (width/height required)
5588
+ */
5589
+ constructor(name: string, urls: string[], scene: BABYLON.Scene, options: IMultiTextureOptions);
5590
+ /**
5591
+ * How the layers combine. Setting it swaps the composite fragment shader and triggers one
5592
+ * re-composite.
5593
+ */
5594
+ get blendMode(): MultiBlendMode;
5595
+ set blendMode(value: MultiBlendMode);
5596
+ /**
5597
+ * Replaces a layer by URL. Fetches, decodes and uploads layer i only.
5598
+ * Exactly one texSubImage3D is issued for the target layer; uLayerCount is unchanged.
5599
+ * @param index defines the layer index to replace
5600
+ * @param url defines the new source for the layer
5601
+ * @returns a promise resolving once the layer has been uploaded
5602
+ */
5603
+ updateLayerAsync(index: number, url: string): Promise<void>;
5604
+ /**
5605
+ * Appends a new layer at the end and returns its index. Grows the underlying array (doubling its
5606
+ * depth and re-uploading the existing layers from their retained bitmaps) when the current depth
5607
+ * is exhausted. Throws a RangeError if the doubled depth would exceed the device's
5608
+ * texture2DArrayMaxLayerCount.
5609
+ * @param url defines the URL of the image to load as the new layer
5610
+ * @returns a promise resolving to the index of the new layer
5611
+ */
5612
+ addLayerAsync(url: string): Promise<number>;
5613
+ /**
5614
+ * Inserts a new layer at the given index and returns it. Layers at index and above shift up by
5615
+ * one: loaded layers are re-uploaded from their retained bitmaps, and a shifted layer that is
5616
+ * still loading lands in its new slot when its in-flight load settles (loads resolve against
5617
+ * their layer entry, never against a stale index). uLayerCount is incremented. Inserting at
5618
+ * `layerCount` appends (addLayerAsync-equivalent). Grows the underlying array (doubling its depth)
5619
+ * when the current depth is exhausted, same as addLayerAsync, and throws a RangeError if the doubled
5620
+ * depth would exceed the device's texture2DArrayMaxLayerCount.
5621
+ * @param index defines the layer index to insert at (0..layerCount, inclusive)
5622
+ * @param url defines the URL of the image to load as the new layer
5623
+ * @returns a promise resolving to the index of the inserted layer
5624
+ */
5625
+ insertLayerAsync(index: number, url: string): Promise<number>;
5626
+ /**
5627
+ * Removes a layer. Higher indices shift down (re-uploaded from their retained bitmaps) and
5628
+ * uLayerCount is decremented.
5629
+ * @param index defines the layer index to remove
5630
+ * @returns a promise resolving once the shift is done
5631
+ */
5632
+ removeLayerAsync(index: number): Promise<void>;
5633
+ /**
5634
+ * Disposes the texture: stops the watch poller, closes every retained bitmap, disposes the layer
5635
+ * array and releases the composite render target through the standard procedural-texture path.
5636
+ */
5637
+ dispose(): void;
5638
+ /**
5639
+ * Clones the texture: builds a fresh MultiTexture in the same scene with the same name, the
5640
+ * current layer urls and the resolved options (layer resolution, current array capacity,
5641
+ * current blend mode, sampling mode, mipmap generation, RTT scale, fit and watch settings).
5642
+ * The clone re-fetches and re-decodes its layers from scratch; it never shares the 2D array
5643
+ * texture, the pixel cache or the load callbacks (onLoad/onError are not inherited).
5644
+ * @returns the cloned texture
5645
+ */
5646
+ clone(): MultiTexture;
5647
+ /**
5648
+ * MultiTexture is intentionally not scene-serializable: the scene loader has no parser for it,
5649
+ * so the payload produced by the inherited base serialization could never be reconstructed
5650
+ * (urls, capacity, blend mode and watch options have no serialized fields). Fails explicitly
5651
+ * instead of returning a misleading JSON object.
5652
+ * @param _allowEmptyName accepted for signature compatibility; ignored
5653
+ * @throws Error always
5654
+ */
5655
+ serialize(_allowEmptyName?: boolean): never;
5656
+ private _buildDefines;
5657
+ private _bitmapOptions;
5658
+ private _reportError;
5659
+ private _createLayerEntry;
5660
+ private _loadEntryOrThrow;
5661
+ private _loadEntryAndReport;
5662
+ private _warnWatchFailure;
5663
+ private _uploadToLayer;
5664
+ private _reuploadSlot;
5665
+ private _clearLayerSlot;
5666
+ private _loadEntry;
5667
+ private _uploadBitmap;
5668
+ private _initialize;
5669
+ private _pushLayerEntry;
5670
+ private _growArray;
5671
+ private _suppressArrayMips;
5672
+ private _generateArrayMips;
5673
+ private _startPolling;
5674
+ private _poll;
5675
+ }
5676
+ /**
5677
+ * Blend modes controlling how the layers of a MultiTexture are combined per pixel.
5678
+ */
5679
+ export enum MultiBlendMode {
5680
+ /**
5681
+ * Default. Composites the layers with standard source-over alpha blending: each layer is drawn
5682
+ * over the accumulated result, so later layers cover earlier ones and a fully opaque layer
5683
+ * (a = 1) completely hides everything below it. With straight-alpha layers (premultiplyAlpha:
5684
+ * false) the fold is `outA = layer.a + outA * (1 - layer.a)`; with premultiplied layers it is
5685
+ * the premultiplied form `out = layer + out * (1 - layer.a)`. The composite always outputs
5686
+ * straight RGBA, so materials see identical pixels regardless of `premultiplyAlpha` (which
5687
+ * only controls the layer storage/fold). Zero active layers output transparent black.
5688
+ */
5689
+ ALPHA_BLEND = 0,
5690
+ /** Keeps the sample with the highest alpha among the layers (ties: highest index wins). Zero active layers output transparent black. */
5691
+ ALPHA_MAX = 1,
5692
+ /** Adds all layers per channel, clamped to 1. */
5693
+ ADD = 2,
5694
+ /** Multiplies all layers per channel (empty product is 1). */
5695
+ MULTIPLY = 3,
5696
+ /** Starts from layer 0 and subtracts every following layer, clamped to 0. */
5697
+ SUBTRACT = 4,
5698
+ /** Screens all layers per channel. */
5699
+ SCREEN = 5
5700
+ }
5701
+
5702
+
5703
+
5704
+
5705
+ /** @internal */
5706
+ export var multiTextureCompositeSubtractPixelShaderWGSL: {
5707
+ name: string;
5708
+ shader: string;
5709
+ };
5710
+
5711
+
5712
+ /** @internal */
5713
+ export var multiTextureCompositeScreenPixelShaderWGSL: {
5714
+ name: string;
5715
+ shader: string;
5716
+ };
5717
+
5718
+
5719
+ /** @internal */
5720
+ export var multiTextureCompositeMultiplyPixelShaderWGSL: {
5721
+ name: string;
5722
+ shader: string;
5723
+ };
5724
+
5725
+
5726
+ /** @internal */
5727
+ export var multiTextureCompositeAlphaMaxPixelShaderWGSL: {
5728
+ name: string;
5729
+ shader: string;
5730
+ };
5731
+
5732
+
5733
+ /** @internal */
5734
+ export var multiTextureCompositeAlphaBlendPixelShaderWGSL: {
5735
+ name: string;
5736
+ shader: string;
5737
+ };
5738
+
5739
+
5740
+ /** @internal */
5741
+ export var multiTextureCompositeAddPixelShaderWGSL: {
5742
+ name: string;
5743
+ shader: string;
5744
+ };
5745
+
5746
+
5747
+ /** @internal */
5748
+ export var multiTextureCompositeSubtractPixelShader: {
5749
+ name: string;
5750
+ shader: string;
5751
+ };
5752
+
5753
+
5754
+ /** @internal */
5755
+ export var multiTextureCompositeScreenPixelShader: {
5756
+ name: string;
5757
+ shader: string;
5758
+ };
5759
+
5760
+
5761
+ /** @internal */
5762
+ export var multiTextureCompositeMultiplyPixelShader: {
5763
+ name: string;
5764
+ shader: string;
5765
+ };
5766
+
5767
+
5768
+ /** @internal */
5769
+ export var multiTextureCompositeAlphaMaxPixelShader: {
5770
+ name: string;
5771
+ shader: string;
5772
+ };
5773
+
5774
+
5775
+ /** @internal */
5776
+ export var multiTextureCompositeAlphaBlendPixelShader: {
5777
+ name: string;
5778
+ shader: string;
5779
+ };
5780
+
5781
+
5782
+ /** @internal */
5783
+ export var multiTextureCompositeAddPixelShader: {
5784
+ name: string;
5785
+ shader: string;
5786
+ };
5787
+
5788
+
4913
5789
  /**
4914
5790
  * Abstract Node class from Babylon.js
4915
5791
  */