@babylonjs/core 9.4.0 → 9.5.0

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.
Files changed (155) hide show
  1. package/Cameras/Inputs/freeCameraTouchInput.js +5 -3
  2. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  3. package/Cameras/Inputs/freeCameraVirtualJoystickInput.js +11 -7
  4. package/Cameras/Inputs/freeCameraVirtualJoystickInput.js.map +1 -1
  5. package/Cameras/arcRotateCamera.js +2 -1
  6. package/Cameras/arcRotateCamera.js.map +1 -1
  7. package/Cameras/camera.js +1 -0
  8. package/Cameras/camera.js.map +1 -1
  9. package/Cameras/followCamera.js +1 -1
  10. package/Cameras/followCamera.js.map +1 -1
  11. package/Collisions/gpuPicker.d.ts +12 -0
  12. package/Collisions/gpuPicker.js +51 -0
  13. package/Collisions/gpuPicker.js.map +1 -1
  14. package/Culling/ray.core.js +46 -2
  15. package/Culling/ray.core.js.map +1 -1
  16. package/Engines/Native/nativeHelpers.js +26 -0
  17. package/Engines/Native/nativeHelpers.js.map +1 -1
  18. package/Engines/WebGPU/webgpuTextureHelper.js +26 -0
  19. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  20. package/Engines/abstractEngine.js +2 -2
  21. package/Engines/abstractEngine.js.map +1 -1
  22. package/Engines/constants.d.ts +52 -0
  23. package/Engines/constants.js +52 -0
  24. package/Engines/constants.js.map +1 -1
  25. package/Engines/engine.d.ts +13 -0
  26. package/Engines/thinEngine.js +52 -0
  27. package/Engines/thinEngine.js.map +1 -1
  28. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js +10 -3
  29. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js.map +1 -1
  30. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.d.ts +1 -0
  31. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js +36 -3
  32. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js.map +1 -1
  33. package/FlowGraph/flowGraphEventBlock.d.ts +13 -0
  34. package/FlowGraph/flowGraphEventBlock.js +21 -2
  35. package/FlowGraph/flowGraphEventBlock.js.map +1 -1
  36. package/FrameGraph/frameGraphTextureManager.js +26 -0
  37. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  38. package/Layers/layer.js +5 -1
  39. package/Layers/layer.js.map +1 -1
  40. package/LensFlares/lensFlareSystem.js +1 -0
  41. package/LensFlares/lensFlareSystem.js.map +1 -1
  42. package/Lights/Clustered/clusteredLightContainer.js +11 -1
  43. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  44. package/Loading/Plugins/babylonFileLoader.js +14 -0
  45. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  46. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.d.ts +1 -0
  47. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.js +6 -3
  48. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.js.map +1 -1
  49. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +2 -0
  50. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +10 -3
  51. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  52. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.d.ts +2 -1
  53. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js +10 -4
  54. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js.map +1 -1
  55. package/Materials/PBR/openpbrMaterial.d.ts +11 -0
  56. package/Materials/PBR/openpbrMaterial.js +59 -12
  57. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  58. package/Materials/Textures/Loaders/ktxTextureLoader.js +26 -0
  59. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  60. package/Materials/Textures/envCubeTexture.js +33 -15
  61. package/Materials/Textures/envCubeTexture.js.map +1 -1
  62. package/Materials/material.d.ts +16 -1
  63. package/Materials/material.js +16 -1
  64. package/Materials/material.js.map +1 -1
  65. package/Materials/standardMaterial.js +4 -2
  66. package/Materials/standardMaterial.js.map +1 -1
  67. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +1 -1
  68. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +16 -18
  69. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  70. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.d.ts +24 -0
  71. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js +93 -18
  72. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.js.map +1 -1
  73. package/Meshes/abstractMesh.js +1 -0
  74. package/Meshes/abstractMesh.js.map +1 -1
  75. package/Meshes/mesh.js +3 -0
  76. package/Meshes/mesh.js.map +1 -1
  77. package/Meshes/transformNode.d.ts +6 -0
  78. package/Meshes/transformNode.js +6 -0
  79. package/Meshes/transformNode.js.map +1 -1
  80. package/Misc/brdfTextureTools.d.ts +12 -0
  81. package/Misc/brdfTextureTools.js +22 -0
  82. package/Misc/brdfTextureTools.js.map +1 -1
  83. package/Misc/depthReducer.js +1 -1
  84. package/Misc/depthReducer.js.map +1 -1
  85. package/Misc/snapshotRenderingHelper.d.ts +7 -1
  86. package/Misc/snapshotRenderingHelper.js +7 -1
  87. package/Misc/snapshotRenderingHelper.js.map +1 -1
  88. package/Misc/textureTools.js +26 -0
  89. package/Misc/textureTools.js.map +1 -1
  90. package/Misc/tools.js +1 -1
  91. package/Misc/tools.js.map +1 -1
  92. package/Particles/Node/Blocks/Update/updateFlowMapBlock.js +17 -10
  93. package/Particles/Node/Blocks/Update/updateFlowMapBlock.js.map +1 -1
  94. package/Particles/Node/Blocks/Update/updateNoiseBlock.js +14 -0
  95. package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
  96. package/Particles/Node/Blocks/particleSourceTextureBlock.js +114 -12
  97. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  98. package/Particles/Node/nodeParticleBuildState.d.ts +11 -0
  99. package/Particles/Node/nodeParticleBuildState.js +15 -0
  100. package/Particles/Node/nodeParticleBuildState.js.map +1 -1
  101. package/Particles/Node/nodeParticleSystemSet.js +23 -22
  102. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  103. package/Particles/gpuParticleSystem.js +1 -0
  104. package/Particles/gpuParticleSystem.js.map +1 -1
  105. package/Particles/thinParticleSystem.js +1 -0
  106. package/Particles/thinParticleSystem.js.map +1 -1
  107. package/PostProcesses/postProcessManager.d.ts +2 -0
  108. package/PostProcesses/postProcessManager.js +14 -8
  109. package/PostProcesses/postProcessManager.js.map +1 -1
  110. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +12 -9
  111. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  112. package/Rendering/depthRendererSceneComponent.js +6 -6
  113. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  114. package/Rendering/iblCdfGeneratorSceneComponent.d.ts +6 -0
  115. package/Rendering/iblCdfGeneratorSceneComponent.js +16 -0
  116. package/Rendering/iblCdfGeneratorSceneComponent.js.map +1 -1
  117. package/Rendering/prePassRenderer.d.ts +4 -1
  118. package/Rendering/prePassRenderer.js +31 -9
  119. package/Rendering/prePassRenderer.js.map +1 -1
  120. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
  121. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  122. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
  123. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  124. package/Shaders/ShadersInclude/openpbrDirectLighting.js +18 -10
  125. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  126. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +36 -14
  127. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  128. package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -5
  129. package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  130. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +10 -6
  131. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  132. package/Shaders/openpbr.fragment.js +14 -15
  133. package/Shaders/openpbr.fragment.js.map +1 -1
  134. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +1 -1
  135. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  136. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
  137. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
  138. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +19 -11
  139. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  140. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +3 -3
  141. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
  142. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +36 -14
  143. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  144. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +5 -3
  145. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  146. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +5 -6
  147. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  148. package/ShadersWGSL/openpbr.fragment.js +16 -17
  149. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  150. package/Sprites/spriteManager.js +1 -0
  151. package/Sprites/spriteManager.js.map +1 -1
  152. package/package.json +1 -1
  153. package/scene.d.ts +16 -0
  154. package/scene.js +13 -0
  155. package/scene.js.map +1 -1
@@ -5,6 +5,7 @@ import { SubMesh } from "../subMesh.js";
5
5
  import { type AbstractMesh } from "../abstractMesh.js";
6
6
  import { Mesh } from "../mesh.js";
7
7
  import { Matrix, Vector2, Vector3 } from "../../Maths/math.vector.js";
8
+ import { type InternalTexture } from "../../Materials/Textures/internalTexture.js";
8
9
  import "../thinInstanceMesh.js";
9
10
  import { type Material } from "../../Materials/material.js";
10
11
  import { type Effect } from "../../Materials/effect.js";
@@ -14,6 +15,12 @@ interface IUpdateOptions {
14
15
  /** @internal When set, skips reprocessing splats [0, previousVertexCount) and copies from cached arrays instead. */
15
16
  previousVertexCount?: number;
16
17
  }
18
+ interface ITextureDataUpdateCapableEngine {
19
+ updateTextureData(texture: InternalTexture, imageData: ArrayBufferView, xOffset: number, yOffset: number, width: number, height: number, faceIndex?: number, lod?: number, generateMipMaps?: boolean): void;
20
+ updateRawTexture(texture: Nullable<InternalTexture>, data: Nullable<ArrayBufferView>, format: number, invertY: boolean, compression?: Nullable<string>, type?: number, useSRGBBuffer?: boolean): void;
21
+ _gl?: unknown;
22
+ isWebGPU?: boolean;
23
+ }
17
24
  /**
18
25
  * Representation of the types
19
26
  */
@@ -262,6 +269,20 @@ export declare class GaussianSplattingMeshBase extends Mesh {
262
269
  private static readonly _BatchSize;
263
270
  private _cameraViewInfos;
264
271
  protected static readonly _DefaultViewUpdateThreshold = 0.0001;
272
+ /**
273
+ * Returns a byte-accurate view for retained splat data, preserving any non-zero byte offset.
274
+ * @param data The retained splat source bytes.
275
+ * @returns A Uint8Array covering the exact source byte range.
276
+ * @internal
277
+ */
278
+ protected static _GetSplatDataBytes(data: ArrayBuffer | ArrayBufferView): Uint8Array;
279
+ /**
280
+ * Returns a Float32 reinterpretation for retained splat data, copying only when alignment requires it.
281
+ * @param data The retained splat source bytes.
282
+ * @returns A Float32Array over the exact source byte range.
283
+ * @internal
284
+ */
285
+ protected static _GetSplatDataFloats(data: ArrayBuffer | ArrayBufferView): Float32Array;
265
286
  /**
266
287
  * Cosine value of the angle threshold to update view dependent splat sorting. Default is 0.0001.
267
288
  */
@@ -573,6 +594,9 @@ export declare class GaussianSplattingMeshBase extends Mesh {
573
594
  refreshBoundingInfo(): Mesh;
574
595
  protected _updateSplatIndexBuffer(vertexCount: number): void;
575
596
  protected _updateTextureFromData: (texture: BaseTexture, data: ArrayBufferView, width: number, lineStart: number, lineCount: number) => void;
597
+ protected _updateTextureFromDataRect: (texture: BaseTexture, data: ArrayBufferView, xOffset: number, yOffset: number, width: number, height: number) => void;
598
+ protected _getTextureDataUpdateEngine(): ITextureDataUpdateCapableEngine;
599
+ protected _updateShTextureData(texture: BaseTexture, shData: Uint8Array, textureWidth: number, lineStart: number, lineCount: number): void;
576
600
  protected _updateSubTextures(centers: Float32Array, covA: Uint16Array, covB: Uint16Array, colors: Uint8Array, lineStart: number, lineCount: number, sh?: Uint8Array[]): void;
577
601
  protected _instantiateWorker(): void;
578
602
  protected _getTextureSize(length: number): Vector2;
@@ -191,6 +191,34 @@ var PLYValue;
191
191
  * @internal Use GaussianSplattingMesh instead; this class is an internal implementation detail.
192
192
  */
193
193
  export class GaussianSplattingMeshBase extends Mesh {
194
+ /**
195
+ * Returns a byte-accurate view for retained splat data, preserving any non-zero byte offset.
196
+ * @param data The retained splat source bytes.
197
+ * @returns A Uint8Array covering the exact source byte range.
198
+ * @internal
199
+ */
200
+ static _GetSplatDataBytes(data) {
201
+ return ArrayBuffer.isView(data) ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength) : new Uint8Array(data);
202
+ }
203
+ /**
204
+ * Returns a Float32 reinterpretation for retained splat data, copying only when alignment requires it.
205
+ * @param data The retained splat source bytes.
206
+ * @returns A Float32Array over the exact source byte range.
207
+ * @internal
208
+ */
209
+ static _GetSplatDataFloats(data) {
210
+ const bytes = GaussianSplattingMeshBase._GetSplatDataBytes(data);
211
+ const floatSize = Float32Array.BYTES_PER_ELEMENT;
212
+ if (bytes.byteLength % floatSize !== 0) {
213
+ throw new Error(`Gaussian splat data byte length (${bytes.byteLength}) is not divisible by ${floatSize} and cannot be reinterpreted as Float32 data.`);
214
+ }
215
+ if (bytes.byteOffset % floatSize !== 0) {
216
+ const copy = new Uint8Array(bytes.byteLength);
217
+ copy.set(bytes);
218
+ return new Float32Array(copy.buffer, 0, bytes.byteLength / floatSize);
219
+ }
220
+ return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / floatSize);
221
+ }
194
222
  /**
195
223
  * If true, disables depth sorting of the splats (default: false)
196
224
  */
@@ -436,7 +464,12 @@ export class GaussianSplattingMeshBase extends Mesh {
436
464
  this._disableDepthSort = false;
437
465
  this._loadingPromise = null;
438
466
  this._updateTextureFromData = (texture, data, width, lineStart, lineCount) => {
439
- this.getEngine().updateTextureData(texture.getInternalTexture(), data, 0, lineStart, width, lineCount, 0, 0, false);
467
+ const engine = this._getTextureDataUpdateEngine();
468
+ engine.updateTextureData(texture.getInternalTexture(), data, 0, lineStart, width, lineCount, 0, 0, false);
469
+ };
470
+ this._updateTextureFromDataRect = (texture, data, xOffset, yOffset, width, height) => {
471
+ const engine = this._getTextureDataUpdateEngine();
472
+ engine.updateTextureData(texture.getInternalTexture(), data, xOffset, yOffset, width, height, 0, 0, false);
440
473
  };
441
474
  this.subMeshes = [];
442
475
  new SubMesh(0, 0, 4 * GaussianSplattingMeshBase._BatchSize, 0, 6 * GaussianSplattingMeshBase._BatchSize, this);
@@ -1702,8 +1735,8 @@ export class GaussianSplattingMeshBase extends Mesh {
1702
1735
  const createTextureFromDataU8 = (data, width, height, format) => {
1703
1736
  return new RawTexture(data, width, height, format, this._scene, false, false, 2, 0);
1704
1737
  };
1705
- const createTextureFromDataU32 = (data, width, height, format) => {
1706
- return new RawTexture(data, width, height, format, this._scene, false, false, 1, 7);
1738
+ const createEmptyTextureU32 = (width, height, format) => {
1739
+ return new RawTexture(null, width, height, format, this._scene, false, false, 1, 7);
1707
1740
  };
1708
1741
  const createTextureFromDataF16 = (data, width, height, format) => {
1709
1742
  return new RawTexture(data, width, height, format, this._scene, false, false, 2, 2);
@@ -1720,12 +1753,12 @@ export class GaussianSplattingMeshBase extends Mesh {
1720
1753
  // Handle SH textures in update path - create if they don't exist
1721
1754
  if (sh && !this._shTextures) {
1722
1755
  this._shTextures = [];
1723
- for (const shData of sh) {
1724
- const buffer = new Uint32Array(shData.buffer);
1725
- const shTexture = createTextureFromDataU32(buffer, textureSize.x, textureSize.y, 11);
1756
+ for (let textureIndex = 0; textureIndex < sh.length; textureIndex++) {
1757
+ const shTexture = createEmptyTextureU32(textureSize.x, textureSize.y, 11);
1726
1758
  shTexture.wrapU = 0;
1727
1759
  shTexture.wrapV = 0;
1728
1760
  this._shTextures.push(shTexture);
1761
+ this._updateShTextureData(shTexture, sh[textureIndex], textureSize.x, 0, textureSize.y);
1729
1762
  }
1730
1763
  }
1731
1764
  if (this._needsRotationScaleTextures && this._rotationDataA) {
@@ -1758,13 +1791,15 @@ export class GaussianSplattingMeshBase extends Mesh {
1758
1791
  this._colorsTexture = createTextureFromDataU8(colorArray, textureSize.x, textureSize.y, 5);
1759
1792
  if (sh) {
1760
1793
  this._shTextures = [];
1761
- for (const shData of sh) {
1762
- const buffer = new Uint32Array(shData.buffer);
1763
- const shTexture = createTextureFromDataU32(buffer, textureSize.x, textureSize.y, 11);
1794
+ for (let textureIndex = 0; textureIndex < sh.length; textureIndex++) {
1795
+ const shTexture = createEmptyTextureU32(textureSize.x, textureSize.y, 11);
1764
1796
  shTexture.wrapU = 0;
1765
1797
  shTexture.wrapV = 0;
1766
1798
  this._shTextures.push(shTexture);
1767
1799
  }
1800
+ for (let textureIndex = 0; textureIndex < sh.length; textureIndex++) {
1801
+ this._updateShTextureData(this._shTextures[textureIndex], sh[textureIndex], textureSize.x, 0, textureSize.y);
1802
+ }
1768
1803
  }
1769
1804
  if (this._needsRotationScaleTextures) {
1770
1805
  const rotDataA = this._rotationDataA ?? new Uint16Array(covA.length);
@@ -2007,6 +2042,52 @@ export class GaussianSplattingMeshBase extends Mesh {
2007
2042
  }
2008
2043
  this.forcedInstanceCount = Math.max(paddedVertexCount >> 4, 1);
2009
2044
  }
2045
+ _getTextureDataUpdateEngine() {
2046
+ return this.getEngine();
2047
+ }
2048
+ _updateShTextureData(texture, shData, textureWidth, lineStart, lineCount) {
2049
+ const engine = this._getTextureDataUpdateEngine();
2050
+ // NativeEngine/NullEngine, updateTextureData unsupported
2051
+ if (!engine._gl && !engine.isWebGPU) {
2052
+ const internalTexture = texture.getInternalTexture();
2053
+ const expectedByteLength = textureWidth * internalTexture.height * 16;
2054
+ let uploadData;
2055
+ if (shData.byteLength === expectedByteLength && shData.byteOffset % Uint32Array.BYTES_PER_ELEMENT === 0) {
2056
+ uploadData = new Uint32Array(shData.buffer, shData.byteOffset, shData.byteLength / Uint32Array.BYTES_PER_ELEMENT);
2057
+ }
2058
+ else {
2059
+ const padded = new Uint8Array(expectedByteLength);
2060
+ padded.set(shData.subarray(0, Math.min(shData.byteLength, expectedByteLength)));
2061
+ uploadData = new Uint32Array(padded.buffer);
2062
+ }
2063
+ engine.updateRawTexture(internalTexture, uploadData, internalTexture.format, internalTexture.invertY, null, internalTexture.type, internalTexture._useSRGBBuffer);
2064
+ return;
2065
+ }
2066
+ const bytesPerTexel = 16;
2067
+ const componentsPerTexel = 4;
2068
+ const startTexel = lineStart * textureWidth;
2069
+ const availableTexelCount = Math.floor(shData.byteLength / bytesPerTexel);
2070
+ if (startTexel >= availableTexelCount) {
2071
+ return;
2072
+ }
2073
+ let texelCount = Math.min(lineCount * textureWidth, availableTexelCount - startTexel);
2074
+ if (texelCount <= 0) {
2075
+ return;
2076
+ }
2077
+ const createView = (byteOffset, viewTexelCount) => {
2078
+ return new Uint32Array(shData.buffer, shData.byteOffset + byteOffset, viewTexelCount * componentsPerTexel);
2079
+ };
2080
+ const fullRowCount = Math.floor(texelCount / textureWidth);
2081
+ if (fullRowCount > 0) {
2082
+ const fullRowTexelCount = fullRowCount * textureWidth;
2083
+ this._updateTextureFromData(texture, createView(startTexel * bytesPerTexel, fullRowTexelCount), textureWidth, lineStart, fullRowCount);
2084
+ texelCount -= fullRowTexelCount;
2085
+ }
2086
+ if (texelCount > 0) {
2087
+ const partialRowOffset = (startTexel + fullRowCount * textureWidth) * bytesPerTexel;
2088
+ this._updateTextureFromDataRect(texture, createView(partialRowOffset, texelCount), 0, lineStart + fullRowCount, texelCount, 1);
2089
+ }
2090
+ }
2010
2091
  _updateSubTextures(centers, covA, covB, colors, lineStart, lineCount, sh) {
2011
2092
  const textureSize = this._getTextureSize(this._vertexCount);
2012
2093
  const covBSItemSize = this._useRGBACovariants ? 4 : 2;
@@ -2030,9 +2111,7 @@ export class GaussianSplattingMeshBase extends Mesh {
2030
2111
  }
2031
2112
  if (sh) {
2032
2113
  for (let i = 0; i < sh.length; i++) {
2033
- const componentCount = 4;
2034
- const shView = new Uint32Array(sh[i].buffer, texelStart * componentCount * 4, texelCount * componentCount);
2035
- this._updateTextureFromData(this._shTextures[i], shView, textureSize.x, lineStart, lineCount);
2114
+ this._updateShTextureData(this._shTextures[i], sh[i], textureSize.x, lineStart, lineCount);
2036
2115
  }
2037
2116
  }
2038
2117
  }
@@ -2164,12 +2243,8 @@ export class GaussianSplattingMeshBase extends Mesh {
2164
2243
  if (!srcRaw || srcCount === 0) {
2165
2244
  return;
2166
2245
  }
2167
- // _splatsData is typed as ArrayBuffer but callers may have stored a TypedArray before this
2168
- // guard was added. Extract the underlying ArrayBuffer so Float32Array reinterprets bytes
2169
- // correctly instead of value-converting each element.
2170
- const srcBuffer = srcRaw instanceof ArrayBuffer ? srcRaw : srcRaw.buffer;
2171
- const uBuffer = new Uint8Array(srcBuffer);
2172
- const fBuffer = new Float32Array(srcBuffer);
2246
+ const uBuffer = GaussianSplattingMeshBase._GetSplatDataBytes(srcRaw);
2247
+ const fBuffer = GaussianSplattingMeshBase._GetSplatDataFloats(srcRaw);
2173
2248
  for (let i = 0; i < srcCount; i++) {
2174
2249
  this._makeSplat(dstOffset + i, fBuffer, uBuffer, covA, covB, colorArray, minimum, maximum, false, i);
2175
2250
  }