@babylonjs/loaders 9.13.0 → 9.15.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.
- package/BVH/bvhFileLoader.d.ts +4 -67
- package/BVH/bvhFileLoader.js +6 -130
- package/BVH/bvhFileLoader.js.map +1 -1
- package/BVH/bvhFileLoader.pure.d.ts +75 -0
- package/BVH/bvhFileLoader.pure.js +154 -0
- package/BVH/bvhFileLoader.pure.js.map +1 -0
- package/BVH/bvhFileLoader.types.d.ts +11 -0
- package/BVH/bvhFileLoader.types.js +2 -0
- package/BVH/bvhFileLoader.types.js.map +1 -0
- package/BVH/pure.d.ts +3 -0
- package/BVH/pure.js +5 -0
- package/BVH/pure.js.map +1 -0
- package/FBX/fbxFileLoader.d.ts +4 -192
- package/FBX/fbxFileLoader.js +6 -2437
- package/FBX/fbxFileLoader.js.map +1 -1
- package/FBX/fbxFileLoader.pure.d.ts +190 -0
- package/FBX/fbxFileLoader.pure.js +2451 -0
- package/FBX/fbxFileLoader.pure.js.map +1 -0
- package/FBX/fbxFileLoader.types.d.ts +11 -0
- package/FBX/fbxFileLoader.types.js +2 -0
- package/FBX/fbxFileLoader.types.js.map +1 -0
- package/FBX/pure.d.ts +3 -0
- package/FBX/pure.js +4 -0
- package/FBX/pure.js.map +1 -0
- package/OBJ/objFileLoader.d.ts +4 -134
- package/OBJ/objFileLoader.js +6 -315
- package/OBJ/objFileLoader.js.map +1 -1
- package/OBJ/objFileLoader.pure.d.ts +132 -0
- package/OBJ/objFileLoader.pure.js +329 -0
- package/OBJ/objFileLoader.pure.js.map +1 -0
- package/OBJ/objFileLoader.types.d.ts +11 -0
- package/OBJ/objFileLoader.types.js +2 -0
- package/OBJ/objFileLoader.types.js.map +1 -0
- package/OBJ/pure.d.ts +5 -0
- package/OBJ/pure.js +6 -0
- package/OBJ/pure.js.map +1 -0
- package/OBJ/solidParser.js +4 -3
- package/OBJ/solidParser.js.map +1 -1
- package/SPLAT/gaussianSplattingBlockAllocator.d.ts +137 -0
- package/SPLAT/gaussianSplattingBlockAllocator.js +555 -0
- package/SPLAT/gaussianSplattingBlockAllocator.js.map +1 -0
- package/SPLAT/gaussianSplattingDownloadManager.d.ts +109 -0
- package/SPLAT/gaussianSplattingDownloadManager.js +241 -0
- package/SPLAT/gaussianSplattingDownloadManager.js.map +1 -0
- package/SPLAT/gaussianSplattingResidencyController.d.ts +133 -0
- package/SPLAT/gaussianSplattingResidencyController.js +222 -0
- package/SPLAT/gaussianSplattingResidencyController.js.map +1 -0
- package/SPLAT/gaussianSplattingStream.d.ts +122 -4
- package/SPLAT/gaussianSplattingStream.js +413 -42
- package/SPLAT/gaussianSplattingStream.js.map +1 -1
- package/SPLAT/gaussianSplattingWorkBuffer.d.ts +36 -0
- package/SPLAT/gaussianSplattingWorkBuffer.js +125 -13
- package/SPLAT/gaussianSplattingWorkBuffer.js.map +1 -1
- package/SPLAT/gaussianSplattingWorkBufferShaders.d.ts +15 -0
- package/SPLAT/gaussianSplattingWorkBufferShaders.js +82 -0
- package/SPLAT/gaussianSplattingWorkBufferShaders.js.map +1 -1
- package/SPLAT/pure.d.ts +5 -0
- package/SPLAT/pure.js +7 -0
- package/SPLAT/pure.js.map +1 -0
- package/SPLAT/sog.d.ts +1 -97
- package/SPLAT/sog.js +1 -501
- package/SPLAT/sog.js.map +1 -1
- package/SPLAT/sog.pure.d.ts +102 -0
- package/SPLAT/sog.pure.js +514 -0
- package/SPLAT/sog.pure.js.map +1 -0
- package/SPLAT/splatFileLoader.d.ts +5 -106
- package/SPLAT/splatFileLoader.js +9 -636
- package/SPLAT/splatFileLoader.js.map +1 -1
- package/SPLAT/splatFileLoader.pure.d.ts +104 -0
- package/SPLAT/splatFileLoader.pure.js +650 -0
- package/SPLAT/splatFileLoader.pure.js.map +1 -0
- package/SPLAT/splatFileLoader.types.d.ts +11 -0
- package/SPLAT/splatFileLoader.types.js +2 -0
- package/SPLAT/splatFileLoader.types.js.map +1 -0
- package/STL/pure.d.ts +2 -0
- package/STL/pure.js +3 -0
- package/STL/pure.js.map +1 -0
- package/STL/stlFileLoader.d.ts +5 -76
- package/STL/stlFileLoader.js +7 -236
- package/STL/stlFileLoader.js.map +1 -1
- package/STL/stlFileLoader.pure.d.ts +73 -0
- package/STL/stlFileLoader.pure.js +249 -0
- package/STL/stlFileLoader.pure.js.map +1 -0
- package/STL/stlFileLoader.types.d.ts +10 -0
- package/STL/stlFileLoader.types.js +2 -0
- package/STL/stlFileLoader.types.js.map +1 -0
- package/glTF/1.0/pure.d.ts +3 -0
- package/glTF/1.0/pure.js +4 -0
- package/glTF/1.0/pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_area.d.ts +4 -39
- package/glTF/2.0/Extensions/EXT_lights_area.js +6 -91
- package/glTF/2.0/Extensions/EXT_lights_area.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_area.pure.d.ts +38 -0
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js +106 -0
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_area.types.d.ts +9 -0
- package/glTF/2.0/Extensions/EXT_lights_area.types.js +2 -0
- package/glTF/2.0/Extensions/EXT_lights_area.types.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.d.ts +4 -39
- package/glTF/2.0/Extensions/EXT_lights_ies.js +6 -81
- package/glTF/2.0/Extensions/EXT_lights_ies.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_ies.pure.d.ts +38 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.pure.js +96 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.types.d.ts +9 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.types.js +2 -0
- package/glTF/2.0/Extensions/EXT_lights_ies.types.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.d.ts +4 -46
- package/glTF/2.0/Extensions/EXT_lights_image_based.js +6 -113
- package/glTF/2.0/Extensions/EXT_lights_image_based.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_image_based.pure.d.ts +37 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.pure.js +128 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.types.d.ts +17 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.types.js +2 -0
- package/glTF/2.0/Extensions/EXT_lights_image_based.types.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +5 -37
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +7 -92
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.pure.d.ts +35 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.pure.js +106 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.types.d.ts +9 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.types.js +2 -0
- package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.types.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.d.ts +4 -37
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js +6 -48
- package/glTF/2.0/Extensions/EXT_meshopt_compression.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_meshopt_compression.pure.d.ts +36 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.pure.js +63 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.types.d.ts +9 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.types.js +2 -0
- package/glTF/2.0/Extensions/EXT_meshopt_compression.types.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.d.ts +4 -32
- package/glTF/2.0/Extensions/EXT_texture_avif.js +6 -36
- package/glTF/2.0/Extensions/EXT_texture_avif.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_texture_avif.pure.d.ts +31 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.pure.js +51 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.types.d.ts +9 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.types.js +2 -0
- package/glTF/2.0/Extensions/EXT_texture_avif.types.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +4 -31
- package/glTF/2.0/Extensions/EXT_texture_webp.js +6 -35
- package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_texture_webp.pure.d.ts +30 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.pure.js +50 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.pure.js.map +1 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.types.d.ts +9 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.types.js +2 -0
- package/glTF/2.0/Extensions/EXT_texture_webp.types.js.map +1 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.d.ts +4 -51
- package/glTF/2.0/Extensions/ExtrasAsMetadata.js +6 -71
- package/glTF/2.0/Extensions/ExtrasAsMetadata.js.map +1 -1
- package/glTF/2.0/Extensions/ExtrasAsMetadata.pure.d.ts +50 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.pure.js +85 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.pure.js.map +1 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.types.d.ts +9 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.types.js +2 -0
- package/glTF/2.0/Extensions/ExtrasAsMetadata.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.d.ts +5 -45
- package/glTF/2.0/Extensions/KHR_animation_pointer.js +7 -75
- package/glTF/2.0/Extensions/KHR_animation_pointer.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_animation_pointer.pure.d.ts +43 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.pure.js +89 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_animation_pointer.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +4 -45
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +6 -90
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.pure.d.ts +44 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.pure.js +105 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_draco_mesh_compression.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.d.ts +4 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.js +5 -0
- package/glTF/2.0/Extensions/KHR_interactivity/pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity.d.ts +4 -36
- package/glTF/2.0/Extensions/KHR_interactivity.js +6 -148
- package/glTF/2.0/Extensions/KHR_interactivity.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity.pure.d.ts +35 -0
- package/glTF/2.0/Extensions/KHR_interactivity.pure.js +163 -0
- package/glTF/2.0/Extensions/KHR_interactivity.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_interactivity.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_interactivity.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_interactivity.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +4 -39
- package/glTF/2.0/Extensions/KHR_lights_punctual.js +6 -89
- package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.d.ts +38 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js +104 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +4 -40
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js +6 -63
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.js +78 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +4 -41
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +6 -77
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.pure.d.ts +40 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.pure.js +92 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_clearcoat.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.d.ts +4 -47
- package/glTF/2.0/Extensions/KHR_materials_coat.js +6 -117
- package/glTF/2.0/Extensions/KHR_materials_coat.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.d.ts +46 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.js +132 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_coat.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.d.ts +4 -41
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js +6 -56
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.pure.d.ts +40 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.pure.js +71 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +4 -41
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js +6 -71
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.pure.d.ts +40 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.pure.js +86 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.d.ts +4 -41
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js +6 -54
- package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_dispersion.pure.d.ts +40 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.pure.js +69 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_dispersion.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +4 -40
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +6 -45
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.pure.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.pure.js +60 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_emissive_strength.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.d.ts +4 -41
- package/glTF/2.0/Extensions/KHR_materials_fuzz.js +6 -75
- package/glTF/2.0/Extensions/KHR_materials_fuzz.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_fuzz.pure.d.ts +40 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.pure.js +90 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_fuzz.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +4 -44
- package/glTF/2.0/Extensions/KHR_materials_ior.js +6 -52
- package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_ior.pure.d.ts +43 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.pure.js +67 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_ior.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +4 -40
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js +6 -66
- package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_iridescence.pure.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.pure.js +81 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_iridescence.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.d.ts +4 -40
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js +6 -72
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.pure.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.pure.js +87 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +4 -41
- package/glTF/2.0/Extensions/KHR_materials_sheen.js +6 -71
- package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_sheen.pure.d.ts +40 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.pure.js +86 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_sheen.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +4 -40
- package/glTF/2.0/Extensions/KHR_materials_specular.js +6 -74
- package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_specular.pure.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.pure.js +89 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_specular.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +4 -40
- package/glTF/2.0/Extensions/KHR_materials_transmission.js +6 -70
- package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.js +85 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +4 -40
- package/glTF/2.0/Extensions/KHR_materials_unlit.js +6 -64
- package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_unlit.pure.d.ts +39 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.pure.js +79 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_unlit.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.d.ts +4 -110
- package/glTF/2.0/Extensions/KHR_materials_variants.js +6 -260
- package/glTF/2.0/Extensions/KHR_materials_variants.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_variants.pure.d.ts +97 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.pure.js +275 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.types.d.ts +29 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_variants.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +4 -41
- package/glTF/2.0/Extensions/KHR_materials_volume.js +6 -77
- package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.d.ts +40 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.js +92 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_volume.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.d.ts +4 -43
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js +6 -113
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.d.ts +42 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.js +128 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.d.ts +4 -27
- package/glTF/2.0/Extensions/KHR_mesh_quantization.js +6 -20
- package/glTF/2.0/Extensions/KHR_mesh_quantization.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_mesh_quantization.pure.d.ts +26 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.pure.js +35 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_mesh_quantization.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.d.ts +4 -29
- package/glTF/2.0/Extensions/KHR_node_hoverability.js +6 -187
- package/glTF/2.0/Extensions/KHR_node_hoverability.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.d.ts +28 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js +202 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_node_hoverability.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.d.ts +4 -28
- package/glTF/2.0/Extensions/KHR_node_selectability.js +6 -121
- package/glTF/2.0/Extensions/KHR_node_selectability.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.d.ts +27 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js +136 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_node_selectability.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.d.ts +4 -28
- package/glTF/2.0/Extensions/KHR_node_visibility.js +6 -64
- package/glTF/2.0/Extensions/KHR_node_visibility.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_visibility.pure.d.ts +27 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.pure.js +79 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_node_visibility.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +4 -31
- package/glTF/2.0/Extensions/KHR_texture_basisu.js +6 -35
- package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_basisu.pure.d.ts +30 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.pure.js +50 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_texture_basisu.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +4 -35
- package/glTF/2.0/Extensions/KHR_texture_transform.js +6 -56
- package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_texture_transform.pure.d.ts +34 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.pure.js +71 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_texture_transform.types.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.d.ts +4 -37
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js +6 -45
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.pure.d.ts +36 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.pure.js +60 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.types.d.ts +9 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.types.js +2 -0
- package/glTF/2.0/Extensions/KHR_xmp_json_ld.types.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.d.ts +5 -54
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js +7 -226
- package/glTF/2.0/Extensions/MSFT_audio_emitter.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_audio_emitter.pure.d.ts +52 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.pure.js +240 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.pure.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.types.d.ts +9 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.types.js +2 -0
- package/glTF/2.0/Extensions/MSFT_audio_emitter.types.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_lod.d.ts +4 -102
- package/glTF/2.0/Extensions/MSFT_lod.js +6 -335
- package/glTF/2.0/Extensions/MSFT_lod.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_lod.pure.d.ts +96 -0
- package/glTF/2.0/Extensions/MSFT_lod.pure.js +350 -0
- package/glTF/2.0/Extensions/MSFT_lod.pure.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_lod.types.d.ts +14 -0
- package/glTF/2.0/Extensions/MSFT_lod.types.js +2 -0
- package/glTF/2.0/Extensions/MSFT_lod.types.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.d.ts +6 -27
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +8 -40
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.pure.d.ts +24 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.pure.js +53 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.pure.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.types.d.ts +9 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.types.js +2 -0
- package/glTF/2.0/Extensions/MSFT_minecraftMesh.types.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.d.ts +6 -27
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +8 -38
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.js.map +1 -1
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.pure.d.ts +24 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.pure.js +51 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.pure.js.map +1 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.types.d.ts +9 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.types.js +2 -0
- package/glTF/2.0/Extensions/MSFT_sRGBFactors.types.js.map +1 -0
- package/glTF/2.0/Extensions/objectModelMapping.d.ts +31 -2
- package/glTF/2.0/Extensions/objectModelMapping.js +3 -3
- package/glTF/2.0/Extensions/objectModelMapping.js.map +1 -1
- package/glTF/2.0/Extensions/pure.d.ts +45 -0
- package/glTF/2.0/Extensions/pure.js +47 -0
- package/glTF/2.0/Extensions/pure.js.map +1 -0
- package/glTF/2.0/glTFLoader.d.ts +1 -471
- package/glTF/2.0/glTFLoader.js +3 -2539
- package/glTF/2.0/glTFLoader.js.map +1 -1
- package/glTF/2.0/glTFLoader.pure.d.ts +476 -0
- package/glTF/2.0/glTFLoader.pure.js +2575 -0
- package/glTF/2.0/glTFLoader.pure.js.map +1 -0
- package/glTF/2.0/glTFLoaderAnimation.d.ts +2 -2
- package/glTF/2.0/glTFLoaderAnimation.js +2 -2
- package/glTF/2.0/glTFLoaderAnimation.js.map +1 -1
- package/glTF/2.0/pbrMaterialLoadingAdapter.d.ts +1 -1
- package/glTF/2.0/pbrMaterialLoadingAdapter.js +2 -2
- package/glTF/2.0/pbrMaterialLoadingAdapter.js.map +1 -1
- package/glTF/2.0/pure.d.ts +8 -0
- package/glTF/2.0/pure.js +10 -0
- package/glTF/2.0/pure.js.map +1 -0
- package/glTF/glTFFileLoader.d.ts +5 -551
- package/glTF/glTFFileLoader.js +6 -996
- package/glTF/glTFFileLoader.js.map +1 -1
- package/glTF/glTFFileLoader.pure.d.ts +562 -0
- package/glTF/glTFFileLoader.pure.js +1024 -0
- package/glTF/glTFFileLoader.pure.js.map +1 -0
- package/glTF/glTFFileLoader.types.d.ts +11 -0
- package/glTF/glTFFileLoader.types.js +2 -0
- package/glTF/glTFFileLoader.types.js.map +1 -0
- package/glTF/glTFValidation.js +1 -1
- package/glTF/glTFValidation.js.map +1 -1
- package/glTF/pure.d.ts +6 -0
- package/glTF/pure.js +8 -0
- package/glTF/pure.js.map +1 -0
- package/package.json +56 -4
- package/pure.d.ts +8 -0
- package/pure.js +10 -0
- package/pure.js.map +1 -0
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A node in the {@link GaussianSplattingBlockAllocator}'s linked list, representing either an allocated
|
|
3
|
+
* block or a free region. Callers receive {@link GaussianSplattingMemBlock} instances as handles from
|
|
4
|
+
* {@link GaussianSplattingBlockAllocator.allocate} and must treat their {@link offset}/{@link size} as
|
|
5
|
+
* read-only.
|
|
6
|
+
*
|
|
7
|
+
* Ported from the PlayCanvas engine (`src/core/block-allocator.js`).
|
|
8
|
+
* @experimental
|
|
9
|
+
*/
|
|
10
|
+
export class GaussianSplattingMemBlock {
|
|
11
|
+
constructor() {
|
|
12
|
+
/** @internal Position in the address space. */
|
|
13
|
+
this._offset = 0;
|
|
14
|
+
/** @internal Size of this block. */
|
|
15
|
+
this._size = 0;
|
|
16
|
+
/** @internal True if this is a free region, false if allocated. */
|
|
17
|
+
this._free = true;
|
|
18
|
+
/** @internal Previous node in the main (all-nodes, offset-ordered) list. */
|
|
19
|
+
this._prev = null;
|
|
20
|
+
/** @internal Next node in the main (all-nodes, offset-ordered) list. */
|
|
21
|
+
this._next = null;
|
|
22
|
+
/** @internal Previous node in the bucket free-list. */
|
|
23
|
+
this._prevFree = null;
|
|
24
|
+
/** @internal Next node in the bucket free-list. */
|
|
25
|
+
this._nextFree = null;
|
|
26
|
+
/** @internal Index of the size bucket this free block belongs to, or -1 if not in any bucket. */
|
|
27
|
+
this._bucket = -1;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The offset of this block in the address space.
|
|
31
|
+
*/
|
|
32
|
+
get offset() {
|
|
33
|
+
return this._offset;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The size of this block.
|
|
37
|
+
*/
|
|
38
|
+
get size() {
|
|
39
|
+
return this._size;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A general-purpose 1D block allocator backed by a doubly-linked list with segregated free-list buckets.
|
|
44
|
+
* Manages a linear address space where contiguous blocks can be allocated and freed.
|
|
45
|
+
*
|
|
46
|
+
* Free blocks are organized into power-of-2 size buckets for best-fit allocation, which reduces
|
|
47
|
+
* fragmentation compared to a single first-fit free list. Supports incremental defragmentation and
|
|
48
|
+
* automatic growth. Used to place streamed Gaussian Splatting LOD files into the unified GPU work buffer.
|
|
49
|
+
*
|
|
50
|
+
* Ported from the PlayCanvas engine (`src/core/block-allocator.js`).
|
|
51
|
+
* @experimental
|
|
52
|
+
*/
|
|
53
|
+
export class GaussianSplattingBlockAllocator {
|
|
54
|
+
/**
|
|
55
|
+
* Creates a new block allocator.
|
|
56
|
+
* @param capacity initial address space capacity (defaults to 0)
|
|
57
|
+
* @param growMultiplier multiplicative growth factor for auto-grow in {@link updateAllocation} (defaults to 1.1)
|
|
58
|
+
*/
|
|
59
|
+
constructor(capacity = 0, growMultiplier = 1.1) {
|
|
60
|
+
// Head/tail of the main list (all blocks, offset-ordered).
|
|
61
|
+
this._headAll = null;
|
|
62
|
+
this._tailAll = null;
|
|
63
|
+
// Segregated free-list bucket heads. Bucket i covers sizes [2^i, 2^(i+1)). Grows as larger free blocks appear.
|
|
64
|
+
this._freeBucketHeads = [];
|
|
65
|
+
// Pool of recycled MemBlock objects.
|
|
66
|
+
this._pool = [];
|
|
67
|
+
this._capacity = 0;
|
|
68
|
+
this._usedSize = 0;
|
|
69
|
+
this._freeSize = 0;
|
|
70
|
+
// Number of free regions; maintained O(1) for the fragmentation metric.
|
|
71
|
+
this._freeRegionCount = 0;
|
|
72
|
+
this._growMultiplier = growMultiplier;
|
|
73
|
+
if (capacity > 0) {
|
|
74
|
+
this._capacity = capacity;
|
|
75
|
+
this._freeSize = capacity;
|
|
76
|
+
const block = this._obtain(0, capacity, true);
|
|
77
|
+
this._headAll = block;
|
|
78
|
+
this._tailAll = block;
|
|
79
|
+
this._addToBucket(block);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Total address space capacity.
|
|
84
|
+
*/
|
|
85
|
+
get capacity() {
|
|
86
|
+
return this._capacity;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Total size of all allocated blocks.
|
|
90
|
+
*/
|
|
91
|
+
get usedSize() {
|
|
92
|
+
return this._usedSize;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Total size of all free regions.
|
|
96
|
+
*/
|
|
97
|
+
get freeSize() {
|
|
98
|
+
return this._freeSize;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Fragmentation ratio in the range [0, 1]. Returns 0 when all free space is one contiguous block
|
|
102
|
+
* (ideal), and approaches 1 when free space is split into many pieces. Computed O(1).
|
|
103
|
+
*/
|
|
104
|
+
get fragmentation() {
|
|
105
|
+
return this._freeSize > 0 ? 1 - 1 / this._freeRegionCount : 0;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Allocates a contiguous block of the given size.
|
|
109
|
+
* @param size the number of units to allocate (must be \> 0)
|
|
110
|
+
* @returns a block handle, or null if no space is available
|
|
111
|
+
*/
|
|
112
|
+
allocate(size) {
|
|
113
|
+
if (size <= 0) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const gap = this._findFreeBlock(size);
|
|
117
|
+
if (!gap) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
this._usedSize += size;
|
|
121
|
+
this._freeSize -= size;
|
|
122
|
+
if (gap._size === size) {
|
|
123
|
+
// Perfect fit: convert free block to allocated.
|
|
124
|
+
gap._free = false;
|
|
125
|
+
this._removeFromBucket(gap);
|
|
126
|
+
return gap;
|
|
127
|
+
}
|
|
128
|
+
// Split: create allocated block at start of gap, shrink gap.
|
|
129
|
+
const alloc = this._obtain(gap._offset, size, false);
|
|
130
|
+
gap._offset += size;
|
|
131
|
+
gap._size -= size;
|
|
132
|
+
this._rebucket(gap);
|
|
133
|
+
this._insertAfterInMainList(alloc, gap._prev);
|
|
134
|
+
return alloc;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Frees a previously allocated block. Adjacent free regions are merged automatically.
|
|
138
|
+
* @param block the block to free (must have been returned by {@link allocate})
|
|
139
|
+
*/
|
|
140
|
+
free(block) {
|
|
141
|
+
if (!block || block._free) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
block._free = true;
|
|
145
|
+
this._usedSize -= block._size;
|
|
146
|
+
this._freeSize += block._size;
|
|
147
|
+
const prev = block._prev;
|
|
148
|
+
const next = block._next;
|
|
149
|
+
const prevFree = prev && prev._free;
|
|
150
|
+
const nextFree = next && next._free;
|
|
151
|
+
if (prevFree && nextFree) {
|
|
152
|
+
// Both neighbors free: merge all three into prev.
|
|
153
|
+
prev._size += block._size + next._size;
|
|
154
|
+
this._removeFromMainList(block);
|
|
155
|
+
this._removeFromMainList(next);
|
|
156
|
+
this._removeFromBucket(next);
|
|
157
|
+
this._release(block);
|
|
158
|
+
this._release(next);
|
|
159
|
+
this._rebucket(prev);
|
|
160
|
+
}
|
|
161
|
+
else if (prevFree) {
|
|
162
|
+
// Left neighbor free: merge into prev.
|
|
163
|
+
prev._size += block._size;
|
|
164
|
+
this._removeFromMainList(block);
|
|
165
|
+
this._release(block);
|
|
166
|
+
this._rebucket(prev);
|
|
167
|
+
}
|
|
168
|
+
else if (nextFree) {
|
|
169
|
+
// Right neighbor free: absorb right into block.
|
|
170
|
+
block._size += next._size;
|
|
171
|
+
this._removeFromMainList(next);
|
|
172
|
+
this._removeFromBucket(next);
|
|
173
|
+
this._release(next);
|
|
174
|
+
this._addToBucket(block);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Neither neighbor free: insert into bucket.
|
|
178
|
+
this._addToBucket(block);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Grows the address space. Only increases capacity, never decreases.
|
|
183
|
+
* @param newCapacity the new capacity (must be \> current capacity)
|
|
184
|
+
*/
|
|
185
|
+
grow(newCapacity) {
|
|
186
|
+
if (newCapacity <= this._capacity) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const added = newCapacity - this._capacity;
|
|
190
|
+
this._capacity = newCapacity;
|
|
191
|
+
this._freeSize += added;
|
|
192
|
+
if (this._tailAll && this._tailAll._free) {
|
|
193
|
+
// Extend existing tail free block.
|
|
194
|
+
this._tailAll._size += added;
|
|
195
|
+
this._rebucket(this._tailAll);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Append new free block.
|
|
199
|
+
const block = this._obtain(this._capacity - added, added, true);
|
|
200
|
+
this._insertAfterInMainList(block, this._tailAll);
|
|
201
|
+
this._addToBucket(block);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Defragments the allocator by moving allocated blocks to reduce fragmentation.
|
|
206
|
+
*
|
|
207
|
+
* When maxMoves is 0, performs a full compaction in a single O(n) pass: all allocated blocks are packed
|
|
208
|
+
* contiguously from offset 0 and a single free block is placed at the end. When maxMoves \> 0, performs
|
|
209
|
+
* incremental defragmentation (relocate the last block into the first fitting gap, then slide blocks left).
|
|
210
|
+
*
|
|
211
|
+
* Moved blocks have their {@link GaussianSplattingMemBlock.offset} updated in place (handles stay valid),
|
|
212
|
+
* so callers must relocate the corresponding GPU data for every block in the returned set.
|
|
213
|
+
* @param maxMoves maximum number of block moves (0 = full compaction, the default)
|
|
214
|
+
* @param result optional set to receive the moved blocks (defaults to a new set)
|
|
215
|
+
* @returns the set of blocks that were moved
|
|
216
|
+
*/
|
|
217
|
+
defrag(maxMoves = 0, result = new Set()) {
|
|
218
|
+
result.clear();
|
|
219
|
+
if (this._freeRegionCount === 0) {
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
if (maxMoves === 0) {
|
|
223
|
+
this._defragFull(result);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
this._defragIncremental(maxMoves, result);
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Batch update: frees a set of blocks and allocates new ones. Handles growth and compaction internally
|
|
232
|
+
* when allocations cannot be satisfied. The `toAllocate` array is modified in place: each numeric size
|
|
233
|
+
* entry is replaced with the allocated block.
|
|
234
|
+
* @param toFree blocks to release
|
|
235
|
+
* @param toAllocate sizes to allocate; modified in place (numbers are replaced with block handles)
|
|
236
|
+
* @returns true if a full defrag was performed (all existing blocks have new offsets and must be re-rendered)
|
|
237
|
+
*/
|
|
238
|
+
updateAllocation(toFree, toAllocate) {
|
|
239
|
+
// Phase 1: free old blocks.
|
|
240
|
+
for (let i = 0; i < toFree.length; i++) {
|
|
241
|
+
this.free(toFree[i]);
|
|
242
|
+
}
|
|
243
|
+
// Phase 2: try to allocate all new blocks.
|
|
244
|
+
for (let i = 0; i < toAllocate.length; i++) {
|
|
245
|
+
const size = toAllocate[i];
|
|
246
|
+
const block = this.allocate(size);
|
|
247
|
+
if (block) {
|
|
248
|
+
toAllocate[i] = block;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Allocation failed at index i; entries [0..i-1] are blocks, [i..n-1] are still numbers.
|
|
252
|
+
let totalRemaining = size;
|
|
253
|
+
for (let j = i + 1; j < toAllocate.length; j++) {
|
|
254
|
+
totalRemaining += toAllocate[j];
|
|
255
|
+
}
|
|
256
|
+
// Grow if the free space would be below the headroom threshold.
|
|
257
|
+
const neededCapacity = this._usedSize + totalRemaining;
|
|
258
|
+
const headroomCapacity = Math.ceil(neededCapacity * this._growMultiplier);
|
|
259
|
+
if (headroomCapacity > this._capacity) {
|
|
260
|
+
this.grow(headroomCapacity);
|
|
261
|
+
}
|
|
262
|
+
// Full defrag: compact everything, then allocate the remainder (guaranteed to succeed).
|
|
263
|
+
this.defrag(0);
|
|
264
|
+
for (let j = i; j < toAllocate.length; j++) {
|
|
265
|
+
toAllocate[j] = this.allocate(toAllocate[j]);
|
|
266
|
+
}
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Computes the bucket index for a given block size (= floor(log2(size))).
|
|
274
|
+
* @param size block size (must be \> 0)
|
|
275
|
+
* @returns the bucket index
|
|
276
|
+
*/
|
|
277
|
+
_bucketFor(size) {
|
|
278
|
+
return 31 - Math.clz32(size);
|
|
279
|
+
}
|
|
280
|
+
_addToBucket(block) {
|
|
281
|
+
const b = this._bucketFor(block._size);
|
|
282
|
+
block._bucket = b;
|
|
283
|
+
while (b >= this._freeBucketHeads.length) {
|
|
284
|
+
this._freeBucketHeads.push(null);
|
|
285
|
+
}
|
|
286
|
+
block._prevFree = null;
|
|
287
|
+
block._nextFree = this._freeBucketHeads[b];
|
|
288
|
+
if (this._freeBucketHeads[b]) {
|
|
289
|
+
this._freeBucketHeads[b]._prevFree = block;
|
|
290
|
+
}
|
|
291
|
+
this._freeBucketHeads[b] = block;
|
|
292
|
+
this._freeRegionCount++;
|
|
293
|
+
}
|
|
294
|
+
_removeFromBucket(block) {
|
|
295
|
+
const b = block._bucket;
|
|
296
|
+
if (block._prevFree) {
|
|
297
|
+
block._prevFree._nextFree = block._nextFree;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
this._freeBucketHeads[b] = block._nextFree;
|
|
301
|
+
}
|
|
302
|
+
if (block._nextFree) {
|
|
303
|
+
block._nextFree._prevFree = block._prevFree;
|
|
304
|
+
}
|
|
305
|
+
block._prevFree = null;
|
|
306
|
+
block._nextFree = null;
|
|
307
|
+
block._bucket = -1;
|
|
308
|
+
this._freeRegionCount--;
|
|
309
|
+
}
|
|
310
|
+
_rebucket(block) {
|
|
311
|
+
const newBucket = this._bucketFor(block._size);
|
|
312
|
+
if (newBucket !== block._bucket) {
|
|
313
|
+
this._removeFromBucket(block);
|
|
314
|
+
this._addToBucket(block);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
_obtain(offset, size, free) {
|
|
318
|
+
const block = this._pool.length > 0 ? this._pool.pop() : new GaussianSplattingMemBlock();
|
|
319
|
+
block._offset = offset;
|
|
320
|
+
block._size = size;
|
|
321
|
+
block._free = free;
|
|
322
|
+
block._prev = null;
|
|
323
|
+
block._next = null;
|
|
324
|
+
block._prevFree = null;
|
|
325
|
+
block._nextFree = null;
|
|
326
|
+
block._bucket = -1;
|
|
327
|
+
return block;
|
|
328
|
+
}
|
|
329
|
+
_release(block) {
|
|
330
|
+
block._prev = null;
|
|
331
|
+
block._next = null;
|
|
332
|
+
block._prevFree = null;
|
|
333
|
+
block._nextFree = null;
|
|
334
|
+
block._bucket = -1;
|
|
335
|
+
this._pool.push(block);
|
|
336
|
+
}
|
|
337
|
+
_insertAfterInMainList(block, after) {
|
|
338
|
+
if (after === null) {
|
|
339
|
+
block._prev = null;
|
|
340
|
+
block._next = this._headAll;
|
|
341
|
+
if (this._headAll) {
|
|
342
|
+
this._headAll._prev = block;
|
|
343
|
+
}
|
|
344
|
+
this._headAll = block;
|
|
345
|
+
if (!this._tailAll) {
|
|
346
|
+
this._tailAll = block;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
block._prev = after;
|
|
351
|
+
block._next = after._next;
|
|
352
|
+
if (after._next) {
|
|
353
|
+
after._next._prev = block;
|
|
354
|
+
}
|
|
355
|
+
after._next = block;
|
|
356
|
+
if (this._tailAll === after) {
|
|
357
|
+
this._tailAll = block;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
_removeFromMainList(block) {
|
|
362
|
+
if (block._prev) {
|
|
363
|
+
block._prev._next = block._next;
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
this._headAll = block._next;
|
|
367
|
+
}
|
|
368
|
+
if (block._next) {
|
|
369
|
+
block._next._prev = block._prev;
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
this._tailAll = block._prev;
|
|
373
|
+
}
|
|
374
|
+
block._prev = null;
|
|
375
|
+
block._next = null;
|
|
376
|
+
}
|
|
377
|
+
_findFreeBlock(size) {
|
|
378
|
+
const startBucket = this._bucketFor(size);
|
|
379
|
+
const len = this._freeBucketHeads.length;
|
|
380
|
+
// Target bucket: best-fit (smallest block >= size).
|
|
381
|
+
if (startBucket < len) {
|
|
382
|
+
let best = null;
|
|
383
|
+
let node = this._freeBucketHeads[startBucket];
|
|
384
|
+
while (node) {
|
|
385
|
+
if (node._size >= size) {
|
|
386
|
+
if (!best || node._size < best._size) {
|
|
387
|
+
best = node;
|
|
388
|
+
if (node._size === size) {
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
node = node._nextFree;
|
|
394
|
+
}
|
|
395
|
+
if (best) {
|
|
396
|
+
return best;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// Higher buckets: first-fit (any block is large enough).
|
|
400
|
+
for (let b = startBucket + 1; b < len; b++) {
|
|
401
|
+
if (this._freeBucketHeads[b]) {
|
|
402
|
+
return this._freeBucketHeads[b];
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
_defragFull(result) {
|
|
408
|
+
// Remove all free blocks from all buckets and pool them.
|
|
409
|
+
for (let b = 0; b < this._freeBucketHeads.length; b++) {
|
|
410
|
+
let node = this._freeBucketHeads[b];
|
|
411
|
+
while (node) {
|
|
412
|
+
const nextFree = node._nextFree;
|
|
413
|
+
this._removeFromMainList(node);
|
|
414
|
+
node._prevFree = null;
|
|
415
|
+
node._nextFree = null;
|
|
416
|
+
node._bucket = -1;
|
|
417
|
+
this._pool.push(node);
|
|
418
|
+
node = nextFree;
|
|
419
|
+
}
|
|
420
|
+
this._freeBucketHeads[b] = null;
|
|
421
|
+
}
|
|
422
|
+
this._freeRegionCount = 0;
|
|
423
|
+
// Walk remaining (all allocated) blocks, assigning sequential offsets.
|
|
424
|
+
let offset = 0;
|
|
425
|
+
let block = this._headAll;
|
|
426
|
+
while (block) {
|
|
427
|
+
if (block._offset !== offset) {
|
|
428
|
+
block._offset = offset;
|
|
429
|
+
result.add(block);
|
|
430
|
+
}
|
|
431
|
+
offset += block._size;
|
|
432
|
+
block = block._next;
|
|
433
|
+
}
|
|
434
|
+
// Create a single free block at the end if there is remaining capacity.
|
|
435
|
+
const remaining = this._capacity - offset;
|
|
436
|
+
if (remaining > 0) {
|
|
437
|
+
const freeBlock = this._obtain(offset, remaining, true);
|
|
438
|
+
this._insertAfterInMainList(freeBlock, this._tailAll);
|
|
439
|
+
this._addToBucket(freeBlock);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
_defragIncremental(maxMoves, result) {
|
|
443
|
+
const phase1Moves = Math.ceil(maxMoves / 2);
|
|
444
|
+
const phase2Moves = maxMoves - phase1Moves;
|
|
445
|
+
// Phase 1: relocate the last allocated block to the first fitting gap (maximizes tail free space).
|
|
446
|
+
for (let i = 0; i < phase1Moves; i++) {
|
|
447
|
+
let lastAlloc = this._tailAll;
|
|
448
|
+
while (lastAlloc && lastAlloc._free) {
|
|
449
|
+
lastAlloc = lastAlloc._prev;
|
|
450
|
+
}
|
|
451
|
+
if (!lastAlloc) {
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
const gap = this._findFreeBlock(lastAlloc._size);
|
|
455
|
+
if (!gap || gap._offset >= lastAlloc._offset) {
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
this._moveBlock(lastAlloc, gap);
|
|
459
|
+
result.add(lastAlloc);
|
|
460
|
+
}
|
|
461
|
+
// Phase 2: slide allocated blocks left into adjacent free gaps (cleans up interior fragmentation).
|
|
462
|
+
let block = this._headAll;
|
|
463
|
+
for (let i = 0; i < phase2Moves && block;) {
|
|
464
|
+
const next = block._next;
|
|
465
|
+
if (block._free && next && !next._free) {
|
|
466
|
+
const allocBlock = next;
|
|
467
|
+
const freeBlock = block;
|
|
468
|
+
allocBlock._offset = freeBlock._offset;
|
|
469
|
+
freeBlock._offset = allocBlock._offset + allocBlock._size;
|
|
470
|
+
// Swap in the main list.
|
|
471
|
+
const a = freeBlock._prev;
|
|
472
|
+
const b = allocBlock._next;
|
|
473
|
+
allocBlock._prev = a;
|
|
474
|
+
allocBlock._next = freeBlock;
|
|
475
|
+
freeBlock._prev = allocBlock;
|
|
476
|
+
freeBlock._next = b;
|
|
477
|
+
if (a) {
|
|
478
|
+
a._next = allocBlock;
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
this._headAll = allocBlock;
|
|
482
|
+
}
|
|
483
|
+
if (b) {
|
|
484
|
+
b._prev = freeBlock;
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
this._tailAll = freeBlock;
|
|
488
|
+
}
|
|
489
|
+
// Merge the free block with its new right neighbor if also free.
|
|
490
|
+
if (freeBlock._next && freeBlock._next._free) {
|
|
491
|
+
const right = freeBlock._next;
|
|
492
|
+
freeBlock._size += right._size;
|
|
493
|
+
this._removeFromMainList(right);
|
|
494
|
+
this._removeFromBucket(right);
|
|
495
|
+
this._release(right);
|
|
496
|
+
this._rebucket(freeBlock);
|
|
497
|
+
}
|
|
498
|
+
result.add(allocBlock);
|
|
499
|
+
i++;
|
|
500
|
+
// Continue from the block after freeBlock to find more opportunities.
|
|
501
|
+
block = freeBlock._next;
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
block = next;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
_moveBlock(block, gap) {
|
|
509
|
+
const blockSize = block._size;
|
|
510
|
+
const newOffset = gap._offset;
|
|
511
|
+
// 1. Remove the block from its current position, freeing that space.
|
|
512
|
+
const prev = block._prev;
|
|
513
|
+
this._removeFromMainList(block);
|
|
514
|
+
// Create a free region where the block was.
|
|
515
|
+
const freed = this._obtain(block._offset, blockSize, true);
|
|
516
|
+
this._insertAfterInMainList(freed, prev);
|
|
517
|
+
this._addToBucket(freed);
|
|
518
|
+
// Merge freed with its right neighbor.
|
|
519
|
+
if (freed._next && freed._next._free) {
|
|
520
|
+
const right = freed._next;
|
|
521
|
+
freed._size += right._size;
|
|
522
|
+
this._removeFromMainList(right);
|
|
523
|
+
this._removeFromBucket(right);
|
|
524
|
+
this._release(right);
|
|
525
|
+
this._rebucket(freed);
|
|
526
|
+
}
|
|
527
|
+
// Merge freed with its left neighbor.
|
|
528
|
+
if (freed._prev && freed._prev._free) {
|
|
529
|
+
const left = freed._prev;
|
|
530
|
+
left._size += freed._size;
|
|
531
|
+
this._removeFromMainList(freed);
|
|
532
|
+
this._removeFromBucket(freed);
|
|
533
|
+
this._release(freed);
|
|
534
|
+
this._rebucket(left);
|
|
535
|
+
}
|
|
536
|
+
// 2. Place the block at the gap.
|
|
537
|
+
block._offset = newOffset;
|
|
538
|
+
if (gap._size === blockSize) {
|
|
539
|
+
// Perfect fit: replace the gap with the block.
|
|
540
|
+
const gapPrev = gap._prev;
|
|
541
|
+
this._removeFromMainList(gap);
|
|
542
|
+
this._removeFromBucket(gap);
|
|
543
|
+
this._release(gap);
|
|
544
|
+
this._insertAfterInMainList(block, gapPrev);
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
// Partial fit: shrink the gap, insert the block before it.
|
|
548
|
+
gap._offset += blockSize;
|
|
549
|
+
gap._size -= blockSize;
|
|
550
|
+
this._rebucket(gap);
|
|
551
|
+
this._insertAfterInMainList(block, gap._prev);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=gaussianSplattingBlockAllocator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaussianSplattingBlockAllocator.js","sourceRoot":"","sources":["../../../../dev/loaders/src/SPLAT/gaussianSplattingBlockAllocator.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\n\r\n/**\r\n * A node in the {@link GaussianSplattingBlockAllocator}'s linked list, representing either an allocated\r\n * block or a free region. Callers receive {@link GaussianSplattingMemBlock} instances as handles from\r\n * {@link GaussianSplattingBlockAllocator.allocate} and must treat their {@link offset}/{@link size} as\r\n * read-only.\r\n *\r\n * Ported from the PlayCanvas engine (`src/core/block-allocator.js`).\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMemBlock {\r\n /** @internal Position in the address space. */\r\n public _offset = 0;\r\n /** @internal Size of this block. */\r\n public _size = 0;\r\n /** @internal True if this is a free region, false if allocated. */\r\n public _free = true;\r\n /** @internal Previous node in the main (all-nodes, offset-ordered) list. */\r\n public _prev: Nullable<GaussianSplattingMemBlock> = null;\r\n /** @internal Next node in the main (all-nodes, offset-ordered) list. */\r\n public _next: Nullable<GaussianSplattingMemBlock> = null;\r\n /** @internal Previous node in the bucket free-list. */\r\n public _prevFree: Nullable<GaussianSplattingMemBlock> = null;\r\n /** @internal Next node in the bucket free-list. */\r\n public _nextFree: Nullable<GaussianSplattingMemBlock> = null;\r\n /** @internal Index of the size bucket this free block belongs to, or -1 if not in any bucket. */\r\n public _bucket = -1;\r\n\r\n /**\r\n * The offset of this block in the address space.\r\n */\r\n public get offset(): number {\r\n return this._offset;\r\n }\r\n\r\n /**\r\n * The size of this block.\r\n */\r\n public get size(): number {\r\n return this._size;\r\n }\r\n}\r\n\r\n/**\r\n * A general-purpose 1D block allocator backed by a doubly-linked list with segregated free-list buckets.\r\n * Manages a linear address space where contiguous blocks can be allocated and freed.\r\n *\r\n * Free blocks are organized into power-of-2 size buckets for best-fit allocation, which reduces\r\n * fragmentation compared to a single first-fit free list. Supports incremental defragmentation and\r\n * automatic growth. Used to place streamed Gaussian Splatting LOD files into the unified GPU work buffer.\r\n *\r\n * Ported from the PlayCanvas engine (`src/core/block-allocator.js`).\r\n * @experimental\r\n */\r\nexport class GaussianSplattingBlockAllocator {\r\n // Head/tail of the main list (all blocks, offset-ordered).\r\n private _headAll: Nullable<GaussianSplattingMemBlock> = null;\r\n private _tailAll: Nullable<GaussianSplattingMemBlock> = null;\r\n // Segregated free-list bucket heads. Bucket i covers sizes [2^i, 2^(i+1)). Grows as larger free blocks appear.\r\n private readonly _freeBucketHeads: Array<Nullable<GaussianSplattingMemBlock>> = [];\r\n // Pool of recycled MemBlock objects.\r\n private readonly _pool: GaussianSplattingMemBlock[] = [];\r\n private _capacity = 0;\r\n private _usedSize = 0;\r\n private _freeSize = 0;\r\n // Number of free regions; maintained O(1) for the fragmentation metric.\r\n private _freeRegionCount = 0;\r\n // Multiplicative growth factor used by updateAllocation.\r\n private readonly _growMultiplier: number;\r\n\r\n /**\r\n * Creates a new block allocator.\r\n * @param capacity initial address space capacity (defaults to 0)\r\n * @param growMultiplier multiplicative growth factor for auto-grow in {@link updateAllocation} (defaults to 1.1)\r\n */\r\n public constructor(capacity = 0, growMultiplier = 1.1) {\r\n this._growMultiplier = growMultiplier;\r\n if (capacity > 0) {\r\n this._capacity = capacity;\r\n this._freeSize = capacity;\r\n const block = this._obtain(0, capacity, true);\r\n this._headAll = block;\r\n this._tailAll = block;\r\n this._addToBucket(block);\r\n }\r\n }\r\n\r\n /**\r\n * Total address space capacity.\r\n */\r\n public get capacity(): number {\r\n return this._capacity;\r\n }\r\n\r\n /**\r\n * Total size of all allocated blocks.\r\n */\r\n public get usedSize(): number {\r\n return this._usedSize;\r\n }\r\n\r\n /**\r\n * Total size of all free regions.\r\n */\r\n public get freeSize(): number {\r\n return this._freeSize;\r\n }\r\n\r\n /**\r\n * Fragmentation ratio in the range [0, 1]. Returns 0 when all free space is one contiguous block\r\n * (ideal), and approaches 1 when free space is split into many pieces. Computed O(1).\r\n */\r\n public get fragmentation(): number {\r\n return this._freeSize > 0 ? 1 - 1 / this._freeRegionCount : 0;\r\n }\r\n\r\n /**\r\n * Allocates a contiguous block of the given size.\r\n * @param size the number of units to allocate (must be \\> 0)\r\n * @returns a block handle, or null if no space is available\r\n */\r\n public allocate(size: number): Nullable<GaussianSplattingMemBlock> {\r\n if (size <= 0) {\r\n return null;\r\n }\r\n\r\n const gap = this._findFreeBlock(size);\r\n if (!gap) {\r\n return null;\r\n }\r\n\r\n this._usedSize += size;\r\n this._freeSize -= size;\r\n\r\n if (gap._size === size) {\r\n // Perfect fit: convert free block to allocated.\r\n gap._free = false;\r\n this._removeFromBucket(gap);\r\n return gap;\r\n }\r\n\r\n // Split: create allocated block at start of gap, shrink gap.\r\n const alloc = this._obtain(gap._offset, size, false);\r\n gap._offset += size;\r\n gap._size -= size;\r\n this._rebucket(gap);\r\n this._insertAfterInMainList(alloc, gap._prev);\r\n return alloc;\r\n }\r\n\r\n /**\r\n * Frees a previously allocated block. Adjacent free regions are merged automatically.\r\n * @param block the block to free (must have been returned by {@link allocate})\r\n */\r\n public free(block: GaussianSplattingMemBlock): void {\r\n if (!block || block._free) {\r\n return;\r\n }\r\n\r\n block._free = true;\r\n this._usedSize -= block._size;\r\n this._freeSize += block._size;\r\n\r\n const prev = block._prev;\r\n const next = block._next;\r\n const prevFree = prev && prev._free;\r\n const nextFree = next && next._free;\r\n\r\n if (prevFree && nextFree) {\r\n // Both neighbors free: merge all three into prev.\r\n prev._size += block._size + next._size;\r\n this._removeFromMainList(block);\r\n this._removeFromMainList(next);\r\n this._removeFromBucket(next);\r\n this._release(block);\r\n this._release(next);\r\n this._rebucket(prev);\r\n } else if (prevFree) {\r\n // Left neighbor free: merge into prev.\r\n prev._size += block._size;\r\n this._removeFromMainList(block);\r\n this._release(block);\r\n this._rebucket(prev);\r\n } else if (nextFree) {\r\n // Right neighbor free: absorb right into block.\r\n block._size += next._size;\r\n this._removeFromMainList(next);\r\n this._removeFromBucket(next);\r\n this._release(next);\r\n this._addToBucket(block);\r\n } else {\r\n // Neither neighbor free: insert into bucket.\r\n this._addToBucket(block);\r\n }\r\n }\r\n\r\n /**\r\n * Grows the address space. Only increases capacity, never decreases.\r\n * @param newCapacity the new capacity (must be \\> current capacity)\r\n */\r\n public grow(newCapacity: number): void {\r\n if (newCapacity <= this._capacity) {\r\n return;\r\n }\r\n\r\n const added = newCapacity - this._capacity;\r\n this._capacity = newCapacity;\r\n this._freeSize += added;\r\n\r\n if (this._tailAll && this._tailAll._free) {\r\n // Extend existing tail free block.\r\n this._tailAll._size += added;\r\n this._rebucket(this._tailAll);\r\n } else {\r\n // Append new free block.\r\n const block = this._obtain(this._capacity - added, added, true);\r\n this._insertAfterInMainList(block, this._tailAll);\r\n this._addToBucket(block);\r\n }\r\n }\r\n\r\n /**\r\n * Defragments the allocator by moving allocated blocks to reduce fragmentation.\r\n *\r\n * When maxMoves is 0, performs a full compaction in a single O(n) pass: all allocated blocks are packed\r\n * contiguously from offset 0 and a single free block is placed at the end. When maxMoves \\> 0, performs\r\n * incremental defragmentation (relocate the last block into the first fitting gap, then slide blocks left).\r\n *\r\n * Moved blocks have their {@link GaussianSplattingMemBlock.offset} updated in place (handles stay valid),\r\n * so callers must relocate the corresponding GPU data for every block in the returned set.\r\n * @param maxMoves maximum number of block moves (0 = full compaction, the default)\r\n * @param result optional set to receive the moved blocks (defaults to a new set)\r\n * @returns the set of blocks that were moved\r\n */\r\n public defrag(maxMoves = 0, result: Set<GaussianSplattingMemBlock> = new Set()): Set<GaussianSplattingMemBlock> {\r\n result.clear();\r\n\r\n if (this._freeRegionCount === 0) {\r\n return result;\r\n }\r\n\r\n if (maxMoves === 0) {\r\n this._defragFull(result);\r\n } else {\r\n this._defragIncremental(maxMoves, result);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Batch update: frees a set of blocks and allocates new ones. Handles growth and compaction internally\r\n * when allocations cannot be satisfied. The `toAllocate` array is modified in place: each numeric size\r\n * entry is replaced with the allocated block.\r\n * @param toFree blocks to release\r\n * @param toAllocate sizes to allocate; modified in place (numbers are replaced with block handles)\r\n * @returns true if a full defrag was performed (all existing blocks have new offsets and must be re-rendered)\r\n */\r\n public updateAllocation(toFree: GaussianSplattingMemBlock[], toAllocate: Array<number | GaussianSplattingMemBlock>): boolean {\r\n // Phase 1: free old blocks.\r\n for (let i = 0; i < toFree.length; i++) {\r\n this.free(toFree[i]);\r\n }\r\n\r\n // Phase 2: try to allocate all new blocks.\r\n for (let i = 0; i < toAllocate.length; i++) {\r\n const size = toAllocate[i] as number;\r\n const block = this.allocate(size);\r\n if (block) {\r\n toAllocate[i] = block;\r\n } else {\r\n // Allocation failed at index i; entries [0..i-1] are blocks, [i..n-1] are still numbers.\r\n let totalRemaining = size;\r\n for (let j = i + 1; j < toAllocate.length; j++) {\r\n totalRemaining += toAllocate[j] as number;\r\n }\r\n\r\n // Grow if the free space would be below the headroom threshold.\r\n const neededCapacity = this._usedSize + totalRemaining;\r\n const headroomCapacity = Math.ceil(neededCapacity * this._growMultiplier);\r\n if (headroomCapacity > this._capacity) {\r\n this.grow(headroomCapacity);\r\n }\r\n\r\n // Full defrag: compact everything, then allocate the remainder (guaranteed to succeed).\r\n this.defrag(0);\r\n for (let j = i; j < toAllocate.length; j++) {\r\n toAllocate[j] = this.allocate(toAllocate[j] as number)!;\r\n }\r\n\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Computes the bucket index for a given block size (= floor(log2(size))).\r\n * @param size block size (must be \\> 0)\r\n * @returns the bucket index\r\n */\r\n private _bucketFor(size: number): number {\r\n return 31 - Math.clz32(size);\r\n }\r\n\r\n private _addToBucket(block: GaussianSplattingMemBlock): void {\r\n const b = this._bucketFor(block._size);\r\n block._bucket = b;\r\n while (b >= this._freeBucketHeads.length) {\r\n this._freeBucketHeads.push(null);\r\n }\r\n block._prevFree = null;\r\n block._nextFree = this._freeBucketHeads[b];\r\n if (this._freeBucketHeads[b]) {\r\n this._freeBucketHeads[b]!._prevFree = block;\r\n }\r\n this._freeBucketHeads[b] = block;\r\n this._freeRegionCount++;\r\n }\r\n\r\n private _removeFromBucket(block: GaussianSplattingMemBlock): void {\r\n const b = block._bucket;\r\n if (block._prevFree) {\r\n block._prevFree._nextFree = block._nextFree;\r\n } else {\r\n this._freeBucketHeads[b] = block._nextFree;\r\n }\r\n if (block._nextFree) {\r\n block._nextFree._prevFree = block._prevFree;\r\n }\r\n block._prevFree = null;\r\n block._nextFree = null;\r\n block._bucket = -1;\r\n this._freeRegionCount--;\r\n }\r\n\r\n private _rebucket(block: GaussianSplattingMemBlock): void {\r\n const newBucket = this._bucketFor(block._size);\r\n if (newBucket !== block._bucket) {\r\n this._removeFromBucket(block);\r\n this._addToBucket(block);\r\n }\r\n }\r\n\r\n private _obtain(offset: number, size: number, free: boolean): GaussianSplattingMemBlock {\r\n const block = this._pool.length > 0 ? this._pool.pop()! : new GaussianSplattingMemBlock();\r\n block._offset = offset;\r\n block._size = size;\r\n block._free = free;\r\n block._prev = null;\r\n block._next = null;\r\n block._prevFree = null;\r\n block._nextFree = null;\r\n block._bucket = -1;\r\n return block;\r\n }\r\n\r\n private _release(block: GaussianSplattingMemBlock): void {\r\n block._prev = null;\r\n block._next = null;\r\n block._prevFree = null;\r\n block._nextFree = null;\r\n block._bucket = -1;\r\n this._pool.push(block);\r\n }\r\n\r\n private _insertAfterInMainList(block: GaussianSplattingMemBlock, after: Nullable<GaussianSplattingMemBlock>): void {\r\n if (after === null) {\r\n block._prev = null;\r\n block._next = this._headAll;\r\n if (this._headAll) {\r\n this._headAll._prev = block;\r\n }\r\n this._headAll = block;\r\n if (!this._tailAll) {\r\n this._tailAll = block;\r\n }\r\n } else {\r\n block._prev = after;\r\n block._next = after._next;\r\n if (after._next) {\r\n after._next._prev = block;\r\n }\r\n after._next = block;\r\n if (this._tailAll === after) {\r\n this._tailAll = block;\r\n }\r\n }\r\n }\r\n\r\n private _removeFromMainList(block: GaussianSplattingMemBlock): void {\r\n if (block._prev) {\r\n block._prev._next = block._next;\r\n } else {\r\n this._headAll = block._next;\r\n }\r\n if (block._next) {\r\n block._next._prev = block._prev;\r\n } else {\r\n this._tailAll = block._prev;\r\n }\r\n block._prev = null;\r\n block._next = null;\r\n }\r\n\r\n private _findFreeBlock(size: number): Nullable<GaussianSplattingMemBlock> {\r\n const startBucket = this._bucketFor(size);\r\n const len = this._freeBucketHeads.length;\r\n\r\n // Target bucket: best-fit (smallest block >= size).\r\n if (startBucket < len) {\r\n let best: Nullable<GaussianSplattingMemBlock> = null;\r\n let node = this._freeBucketHeads[startBucket];\r\n while (node) {\r\n if (node._size >= size) {\r\n if (!best || node._size < best._size) {\r\n best = node;\r\n if (node._size === size) {\r\n break;\r\n }\r\n }\r\n }\r\n node = node._nextFree;\r\n }\r\n if (best) {\r\n return best;\r\n }\r\n }\r\n\r\n // Higher buckets: first-fit (any block is large enough).\r\n for (let b = startBucket + 1; b < len; b++) {\r\n if (this._freeBucketHeads[b]) {\r\n return this._freeBucketHeads[b];\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _defragFull(result: Set<GaussianSplattingMemBlock>): void {\r\n // Remove all free blocks from all buckets and pool them.\r\n for (let b = 0; b < this._freeBucketHeads.length; b++) {\r\n let node = this._freeBucketHeads[b];\r\n while (node) {\r\n const nextFree = node._nextFree;\r\n this._removeFromMainList(node);\r\n node._prevFree = null;\r\n node._nextFree = null;\r\n node._bucket = -1;\r\n this._pool.push(node);\r\n node = nextFree;\r\n }\r\n this._freeBucketHeads[b] = null;\r\n }\r\n this._freeRegionCount = 0;\r\n\r\n // Walk remaining (all allocated) blocks, assigning sequential offsets.\r\n let offset = 0;\r\n let block = this._headAll;\r\n while (block) {\r\n if (block._offset !== offset) {\r\n block._offset = offset;\r\n result.add(block);\r\n }\r\n offset += block._size;\r\n block = block._next;\r\n }\r\n\r\n // Create a single free block at the end if there is remaining capacity.\r\n const remaining = this._capacity - offset;\r\n if (remaining > 0) {\r\n const freeBlock = this._obtain(offset, remaining, true);\r\n this._insertAfterInMainList(freeBlock, this._tailAll);\r\n this._addToBucket(freeBlock);\r\n }\r\n }\r\n\r\n private _defragIncremental(maxMoves: number, result: Set<GaussianSplattingMemBlock>): void {\r\n const phase1Moves = Math.ceil(maxMoves / 2);\r\n const phase2Moves = maxMoves - phase1Moves;\r\n\r\n // Phase 1: relocate the last allocated block to the first fitting gap (maximizes tail free space).\r\n for (let i = 0; i < phase1Moves; i++) {\r\n let lastAlloc = this._tailAll;\r\n while (lastAlloc && lastAlloc._free) {\r\n lastAlloc = lastAlloc._prev;\r\n }\r\n if (!lastAlloc) {\r\n break;\r\n }\r\n\r\n const gap = this._findFreeBlock(lastAlloc._size);\r\n if (!gap || gap._offset >= lastAlloc._offset) {\r\n break;\r\n }\r\n\r\n this._moveBlock(lastAlloc, gap);\r\n result.add(lastAlloc);\r\n }\r\n\r\n // Phase 2: slide allocated blocks left into adjacent free gaps (cleans up interior fragmentation).\r\n let block = this._headAll;\r\n for (let i = 0; i < phase2Moves && block; ) {\r\n const next = block._next;\r\n\r\n if (block._free && next && !next._free) {\r\n const allocBlock = next;\r\n const freeBlock = block;\r\n\r\n allocBlock._offset = freeBlock._offset;\r\n freeBlock._offset = allocBlock._offset + allocBlock._size;\r\n\r\n // Swap in the main list.\r\n const a = freeBlock._prev;\r\n const b = allocBlock._next;\r\n\r\n allocBlock._prev = a;\r\n allocBlock._next = freeBlock;\r\n freeBlock._prev = allocBlock;\r\n freeBlock._next = b;\r\n if (a) {\r\n a._next = allocBlock;\r\n } else {\r\n this._headAll = allocBlock;\r\n }\r\n if (b) {\r\n b._prev = freeBlock;\r\n } else {\r\n this._tailAll = freeBlock;\r\n }\r\n\r\n // Merge the free block with its new right neighbor if also free.\r\n if (freeBlock._next && freeBlock._next._free) {\r\n const right = freeBlock._next;\r\n freeBlock._size += right._size;\r\n this._removeFromMainList(right);\r\n this._removeFromBucket(right);\r\n this._release(right);\r\n this._rebucket(freeBlock);\r\n }\r\n\r\n result.add(allocBlock);\r\n i++;\r\n\r\n // Continue from the block after freeBlock to find more opportunities.\r\n block = freeBlock._next;\r\n } else {\r\n block = next;\r\n }\r\n }\r\n }\r\n\r\n private _moveBlock(block: GaussianSplattingMemBlock, gap: GaussianSplattingMemBlock): void {\r\n const blockSize = block._size;\r\n const newOffset = gap._offset;\r\n\r\n // 1. Remove the block from its current position, freeing that space.\r\n const prev = block._prev;\r\n this._removeFromMainList(block);\r\n\r\n // Create a free region where the block was.\r\n const freed = this._obtain(block._offset, blockSize, true);\r\n this._insertAfterInMainList(freed, prev);\r\n this._addToBucket(freed);\r\n\r\n // Merge freed with its right neighbor.\r\n if (freed._next && freed._next._free) {\r\n const right = freed._next;\r\n freed._size += right._size;\r\n this._removeFromMainList(right);\r\n this._removeFromBucket(right);\r\n this._release(right);\r\n this._rebucket(freed);\r\n }\r\n // Merge freed with its left neighbor.\r\n if (freed._prev && freed._prev._free) {\r\n const left = freed._prev;\r\n left._size += freed._size;\r\n this._removeFromMainList(freed);\r\n this._removeFromBucket(freed);\r\n this._release(freed);\r\n this._rebucket(left);\r\n }\r\n\r\n // 2. Place the block at the gap.\r\n block._offset = newOffset;\r\n\r\n if (gap._size === blockSize) {\r\n // Perfect fit: replace the gap with the block.\r\n const gapPrev = gap._prev;\r\n this._removeFromMainList(gap);\r\n this._removeFromBucket(gap);\r\n this._release(gap);\r\n this._insertAfterInMainList(block, gapPrev);\r\n } else {\r\n // Partial fit: shrink the gap, insert the block before it.\r\n gap._offset += blockSize;\r\n gap._size -= blockSize;\r\n this._rebucket(gap);\r\n this._insertAfterInMainList(block, gap._prev);\r\n }\r\n }\r\n}\r\n"]}
|