@babylonjs/loaders 9.28.0 → 9.30.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/bvhLoader.js +1 -3
- package/BVH/bvhLoader.js.map +1 -1
- package/OBJ/mtlFileLoader.js +9 -35
- package/OBJ/mtlFileLoader.js.map +1 -1
- package/OBJ/objFileLoader.pure.js +18 -23
- package/OBJ/objFileLoader.pure.js.map +1 -1
- package/OBJ/solidParser.js +11 -25
- package/OBJ/solidParser.js.map +1 -1
- package/SPLAT/splatFileLoader.pure.js +86 -82
- package/SPLAT/splatFileLoader.pure.js.map +1 -1
- package/STL/stlFileLoader.pure.d.ts +1 -0
- package/STL/stlFileLoader.pure.js +18 -16
- package/STL/stlFileLoader.pure.js.map +1 -1
- package/glTF/1.0/glTFLoader.pure.js +30 -37
- package/glTF/1.0/glTFLoader.pure.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js +16 -23
- package/glTF/2.0/Extensions/EXT_lights_area.pure.js.map +1 -1
- package/glTF/2.0/Extensions/EXT_lights_ies.pure.js +1 -3
- package/glTF/2.0/Extensions/EXT_lights_ies.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_gaussian_splatting.pure.js +1 -3
- package/glTF/2.0/Extensions/KHR_gaussian_splatting.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js +3 -3
- package/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphExporter.d.ts +15 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphExporter.js +70 -21
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphExporter.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeReference.d.ts +13 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeReference.js +16 -0
- package/glTF/2.0/Extensions/KHR_interactivity/interactivityNodeReference.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js +18 -25
- package/glTF/2.0/Extensions/KHR_lights_punctual.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js +3 -10
- package/glTF/2.0/Extensions/KHR_node_hoverability.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js +2 -5
- package/glTF/2.0/Extensions/KHR_node_selectability.pure.js.map +1 -1
- package/glTF/2.0/glTFLoader.pure.js +15 -37
- package/glTF/2.0/glTFLoader.pure.js.map +1 -1
- package/package.json +3 -3
|
@@ -44,34 +44,27 @@ export class EXT_lights_area {
|
|
|
44
44
|
return GLTFLoader.LoadExtensionAsync(context, node, this.name, async (extensionContext, extension) => {
|
|
45
45
|
this._loader._allMaterialsDirtyRequired = true;
|
|
46
46
|
return await this._loader.loadNodeAsync(context, node, (babylonMesh) => {
|
|
47
|
-
let babylonLight;
|
|
48
47
|
const light = ArrayItem.Get(extensionContext, this._lights, extension.light);
|
|
49
48
|
const name = light.name || babylonMesh.name;
|
|
50
|
-
this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;
|
|
51
49
|
const size = light.size !== undefined ? light.size : 1.0;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
50
|
+
const babylonLight = this._loader.babylonScene._executeWithBlockedEntityCollection(!!this._loader._assetContainer, () => {
|
|
51
|
+
switch (light.type) {
|
|
52
|
+
case "rect" /* EXTLightsArea_LightType.RECT */: {
|
|
53
|
+
const width = light.rect?.aspect !== undefined ? light.rect.aspect * size : size;
|
|
54
|
+
const height = size;
|
|
55
|
+
return new RectAreaLight(name, Vector3.Zero(), width, height, this._loader.babylonScene);
|
|
56
|
+
}
|
|
57
|
+
case "disk" /* EXTLightsArea_LightType.DISK */: {
|
|
58
|
+
// For disk lights, we'll use a rectangle light with the same area to approximate the disk light
|
|
59
|
+
// In the future, this could be extended to support actual disk area lights
|
|
60
|
+
const newSize = Math.sqrt(size * size * 0.25 * Math.PI); // Area of the disk
|
|
61
|
+
return new RectAreaLight(name, Vector3.Zero(), newSize, newSize, this._loader.babylonScene);
|
|
62
|
+
}
|
|
63
|
+
default:
|
|
64
|
+
throw new Error(`${extensionContext}: Invalid area light type (${light.type})`);
|
|
59
65
|
}
|
|
60
|
-
|
|
61
|
-
// For disk lights, we'll use a rectangle light with the same area to approximate the disk light
|
|
62
|
-
// In the future, this could be extended to support actual disk area lights
|
|
63
|
-
const newSize = Math.sqrt(size * size * 0.25 * Math.PI); // Area of the disk
|
|
64
|
-
const babylonRectAreaLight = new RectAreaLight(name, Vector3.Zero(), newSize, newSize, this._loader.babylonScene);
|
|
65
|
-
babylonLight = babylonRectAreaLight;
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
default: {
|
|
69
|
-
this._loader.babylonScene._blockEntityCollection = false;
|
|
70
|
-
throw new Error(`${extensionContext}: Invalid area light type (${light.type})`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
66
|
+
});
|
|
73
67
|
babylonLight._parentContainer = this._loader._assetContainer;
|
|
74
|
-
this._loader.babylonScene._blockEntityCollection = false;
|
|
75
68
|
light._babylonLight = babylonLight;
|
|
76
69
|
babylonLight.falloffType = Light.FALLOFF_GLTF;
|
|
77
70
|
babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EXT_lights_area.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/EXT_lights_area.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion } from \"core/Maths/math.vector.pure\";\r\nimport { Color3 } from \"core/Maths/math.color.pure\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport { RectAreaLight } from \"core/Lights/rectAreaLight.pure\";\r\nimport { type TransformNode, TransformNode as BabylonTransformNode } from \"core/Meshes/transformNode.pure\";\r\n\r\nimport { type IEXTLightsArea_LightReference, EXTLightsArea_LightType } from \"babylonjs-gltf2interface\";\r\nimport { type INode, type IEXTLightsArea_Light } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader.pure\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"EXT_lights_area\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_lights_area/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_lights_area implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /** hidden */\r\n private _loader: GLTFLoader;\r\n private _lights?: IEXTLightsArea_Light[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name];\r\n this._lights = extension.lights;\r\n ArrayItem.Assign(this._lights);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTLightsArea_LightReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n return await this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n let babylonLight: Light;\r\n\r\n const light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n\r\n this._loader.babylonScene._blockEntityCollection = !!this._loader._assetContainer;\r\n const size = light.size !== undefined ? light.size : 1.0;\r\n\r\n switch (light.type) {\r\n case EXTLightsArea_LightType.RECT: {\r\n const width = light.rect?.aspect !== undefined ? light.rect.aspect * size : size;\r\n const height = size;\r\n const babylonRectAreaLight = new RectAreaLight(name, Vector3.Zero(), width, height, this._loader.babylonScene);\r\n babylonLight = babylonRectAreaLight;\r\n break;\r\n }\r\n case EXTLightsArea_LightType.DISK: {\r\n // For disk lights, we'll use a rectangle light with the same area to approximate the disk light\r\n // In the future, this could be extended to support actual disk area lights\r\n const newSize = Math.sqrt(size * size * 0.25 * Math.PI); // Area of the disk\r\n const babylonRectAreaLight = new RectAreaLight(name, Vector3.Zero(), newSize, newSize, this._loader.babylonScene);\r\n babylonLight = babylonRectAreaLight;\r\n break;\r\n }\r\n default: {\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n throw new Error(`${extensionContext}: Invalid area light type (${light.type})`);\r\n }\r\n }\r\n\r\n babylonLight._parentContainer = this._loader._assetContainer;\r\n this._loader.babylonScene._blockEntityCollection = false;\r\n light._babylonLight = babylonLight;\r\n\r\n babylonLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();\r\n babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;\r\n\r\n // glTF EXT_lights_area specifies lights face down -Z, but Babylon.js area lights face down +Z\r\n // Create a parent transform node with 180-degree rotation around Y axis to flip the direction\r\n const lightParentNode = new BabylonTransformNode(`${name}_orientation`, this._loader.babylonScene);\r\n lightParentNode.rotationQuaternion = Quaternion.RotationAxis(Vector3.Up(), Math.PI);\r\n lightParentNode.parent = babylonMesh;\r\n babylonLight.parent = lightParentNode;\r\n\r\n this._loader._babylonLights.push(babylonLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the EXT_lights_area glTF loader extension.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterEXT_lights_area(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n unregisterGLTFExtension(NAME);\r\n\r\n registerGLTFExtension(NAME, true, (loader) => new EXT_lights_area(loader));\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"EXT_lights_area.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/EXT_lights_area.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion } from \"core/Maths/math.vector.pure\";\r\nimport { Color3 } from \"core/Maths/math.color.pure\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport { RectAreaLight } from \"core/Lights/rectAreaLight.pure\";\r\nimport { type TransformNode, TransformNode as BabylonTransformNode } from \"core/Meshes/transformNode.pure\";\r\n\r\nimport { type IEXTLightsArea_LightReference, EXTLightsArea_LightType } from \"babylonjs-gltf2interface\";\r\nimport { type INode, type IEXTLightsArea_Light } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader.pure\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"EXT_lights_area\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_lights_area/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_lights_area implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /** hidden */\r\n private _loader: GLTFLoader;\r\n private _lights?: IEXTLightsArea_Light[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name];\r\n this._lights = extension.lights;\r\n ArrayItem.Assign(this._lights);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTLightsArea_LightReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n return await this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n const light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n const size = light.size !== undefined ? light.size : 1.0;\r\n const babylonLight = this._loader.babylonScene._executeWithBlockedEntityCollection(!!this._loader._assetContainer, () => {\r\n switch (light.type) {\r\n case EXTLightsArea_LightType.RECT: {\r\n const width = light.rect?.aspect !== undefined ? light.rect.aspect * size : size;\r\n const height = size;\r\n return new RectAreaLight(name, Vector3.Zero(), width, height, this._loader.babylonScene);\r\n }\r\n case EXTLightsArea_LightType.DISK: {\r\n // For disk lights, we'll use a rectangle light with the same area to approximate the disk light\r\n // In the future, this could be extended to support actual disk area lights\r\n const newSize = Math.sqrt(size * size * 0.25 * Math.PI); // Area of the disk\r\n return new RectAreaLight(name, Vector3.Zero(), newSize, newSize, this._loader.babylonScene);\r\n }\r\n default:\r\n throw new Error(`${extensionContext}: Invalid area light type (${light.type})`);\r\n }\r\n });\r\n\r\n babylonLight._parentContainer = this._loader._assetContainer;\r\n light._babylonLight = babylonLight;\r\n\r\n babylonLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonLight.diffuse = light.color ? Color3.FromArray(light.color) : Color3.White();\r\n babylonLight.intensity = light.intensity == undefined ? 1 : light.intensity;\r\n\r\n // glTF EXT_lights_area specifies lights face down -Z, but Babylon.js area lights face down +Z\r\n // Create a parent transform node with 180-degree rotation around Y axis to flip the direction\r\n const lightParentNode = new BabylonTransformNode(`${name}_orientation`, this._loader.babylonScene);\r\n lightParentNode.rotationQuaternion = Quaternion.RotationAxis(Vector3.Up(), Math.PI);\r\n lightParentNode.parent = babylonMesh;\r\n babylonLight.parent = lightParentNode;\r\n\r\n this._loader._babylonLights.push(babylonLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the EXT_lights_area glTF loader extension.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterEXT_lights_area(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n unregisterGLTFExtension(NAME);\r\n\r\n registerGLTFExtension(NAME, true, (loader) => new EXT_lights_area(loader));\r\n}\r\n"]}
|
|
@@ -49,12 +49,10 @@ export class EXT_lights_ies {
|
|
|
49
49
|
const transformNode = await this._loader.loadNodeAsync(context, node, (babylonMesh) => {
|
|
50
50
|
light = ArrayItem.Get(extensionContext, this._lights, extension.light);
|
|
51
51
|
const name = light.name || babylonMesh.name;
|
|
52
|
-
this._loader.babylonScene.
|
|
53
|
-
babylonSpotLight = new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene);
|
|
52
|
+
babylonSpotLight = this._loader.babylonScene._executeWithBlockedEntityCollection(!!this._loader._assetContainer, () => new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene));
|
|
54
53
|
babylonSpotLight.angle = Math.PI / 2;
|
|
55
54
|
babylonSpotLight.innerAngle = 0;
|
|
56
55
|
babylonSpotLight._parentContainer = this._loader._assetContainer;
|
|
57
|
-
this._loader.babylonScene._blockEntityCollection = false;
|
|
58
56
|
light._babylonLight = babylonSpotLight;
|
|
59
57
|
babylonSpotLight.falloffType = Light.FALLOFF_GLTF;
|
|
60
58
|
babylonSpotLight.diffuse = extension.color ? Color3.FromArray(extension.color) : Color3.White();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EXT_lights_ies.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/EXT_lights_ies.pure.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAM1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAE/D,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAE9B;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,cAAc;IAevB;;OAEG;IACH,YAAY,MAAkB;QAjB9B;;WAEG;QACa,SAAI,GAAG,IAAI,CAAC;QAexB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,gBAAgB;IACT,OAAO;QACT,IAAI,CAAC,OAAe,GAAG,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,gBAAgB;IACT,SAAS;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAChD,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC;YAChC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gDAAgD;IAChD,gDAAgD;IACzC,aAAa,CAAC,OAAe,EAAE,IAAW,EAAE,MAAqD;QACpG,OAAO,UAAU,CAAC,kBAAkB,CAA8C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE;YAC9I,IAAI,CAAC,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;YAE/C,IAAI,gBAA2B,CAAC;YAChC,IAAI,KAA0B,CAAC;YAE/B,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;gBAClF,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC;gBAE5C,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"EXT_lights_ies.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/EXT_lights_ies.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type Nullable } from \"core/types\";\r\nimport { Vector3 } from \"core/Maths/math.vector.pure\";\r\nimport { Color3 } from \"core/Maths/math.color.pure\";\r\nimport { SpotLight } from \"core/Lights/spotLight.pure\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode.pure\";\r\n\r\nimport { type IEXTLightsIES_LightReference } from \"babylonjs-gltf2interface\";\r\nimport { type IEXTLightsIES_Light, type INode } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader.pure\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\nimport { Texture } from \"core/Materials/Textures/texture.pure\";\r\n\r\nconst NAME = \"EXT_lights_ies\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Vendor/EXT_lights_ies)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class EXT_lights_ies implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n /** hidden */\r\n private _loader: GLTFLoader;\r\n private _lights?: IEXTLightsIES_Light[];\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._loader as any) = null;\r\n delete this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onLoading(): void {\r\n const extensions = this._loader.gltf.extensions;\r\n if (extensions && extensions[this.name]) {\r\n const extension = extensions[this.name];\r\n this._lights = extension.lights;\r\n ArrayItem.Assign(this._lights);\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n // eslint-disable-next-line no-restricted-syntax\r\n public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable<Promise<TransformNode>> {\r\n return GLTFLoader.LoadExtensionAsync<IEXTLightsIES_LightReference, TransformNode>(context, node, this.name, async (extensionContext, extension) => {\r\n this._loader._allMaterialsDirtyRequired = true;\r\n\r\n let babylonSpotLight: SpotLight;\r\n let light: IEXTLightsIES_Light;\r\n\r\n const transformNode = await this._loader.loadNodeAsync(context, node, (babylonMesh) => {\r\n light = ArrayItem.Get(extensionContext, this._lights, extension.light);\r\n const name = light.name || babylonMesh.name;\r\n\r\n babylonSpotLight = this._loader.babylonScene._executeWithBlockedEntityCollection(\r\n !!this._loader._assetContainer,\r\n () => new SpotLight(name, Vector3.Zero(), Vector3.Backward(), 0, 1, this._loader.babylonScene)\r\n );\r\n babylonSpotLight.angle = Math.PI / 2;\r\n babylonSpotLight.innerAngle = 0;\r\n\r\n babylonSpotLight._parentContainer = this._loader._assetContainer;\r\n light._babylonLight = babylonSpotLight;\r\n\r\n babylonSpotLight.falloffType = Light.FALLOFF_GLTF;\r\n babylonSpotLight.diffuse = extension.color ? Color3.FromArray(extension.color) : Color3.White();\r\n babylonSpotLight.intensity = extension.multiplier || 1;\r\n babylonSpotLight.range = Number.MAX_VALUE;\r\n babylonSpotLight.parent = babylonMesh;\r\n\r\n this._loader._babylonLights.push(babylonSpotLight);\r\n\r\n GLTFLoader.AddPointerMetadata(babylonSpotLight, extensionContext);\r\n\r\n assign(babylonMesh);\r\n });\r\n\r\n // Load the profile\r\n let bufferData: ArrayBufferView;\r\n if (light!.uri) {\r\n bufferData = await this._loader.loadUriAsync(context, light!, light!.uri);\r\n } else {\r\n const bufferView = ArrayItem.Get(`${context}/bufferView`, this._loader.gltf.bufferViews, light!.bufferView);\r\n bufferData = await this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView);\r\n }\r\n babylonSpotLight!.iesProfileTexture = new Texture(\r\n babylonSpotLight!.name + \"_iesProfile\",\r\n this._loader.babylonScene,\r\n true,\r\n false,\r\n undefined,\r\n null,\r\n null,\r\n bufferData,\r\n true,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n \".ies\"\r\n );\r\n\r\n return transformNode;\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the EXT_lights_ies glTF loader extension.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterEXT_lights_ies(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n unregisterGLTFExtension(NAME);\r\n\r\n registerGLTFExtension(NAME, true, (loader) => new EXT_lights_ies(loader));\r\n}\r\n"]}
|
|
@@ -74,10 +74,8 @@ export class KHR_gaussian_splatting {
|
|
|
74
74
|
// attribute data). The base loader wires the node's transform node from this assign call
|
|
75
75
|
// synchronously, so it must happen before the first await. The splat data is uploaded afterwards.
|
|
76
76
|
const scene = loader.babylonScene;
|
|
77
|
-
|
|
78
|
-
const gaussianSplattingMesh = new GaussianSplattingMesh(name, null, scene);
|
|
77
|
+
const gaussianSplattingMesh = scene._executeWithBlockedEntityCollection(!!loader._assetContainer, () => new GaussianSplattingMesh(name, null, scene));
|
|
79
78
|
gaussianSplattingMesh._parentContainer = loader._assetContainer;
|
|
80
|
-
scene._blockEntityCollection = false;
|
|
81
79
|
GLTFLoader.AddPointerMetadata(gaussianSplattingMesh, context);
|
|
82
80
|
loader.parent.onMeshLoadedObservable.notifyObservers(gaussianSplattingMesh);
|
|
83
81
|
assign(gaussianSplattingMesh);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_gaussian_splatting.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_gaussian_splatting.pure.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh.pure\";\r\nimport { GaussianSplattingMesh } from \"core/Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { AllocateShBuffers } from \"core/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure\";\r\n\r\nimport { MeshPrimitiveMode, type IKHRGaussianSplatting } from \"babylonjs-gltf2interface\";\r\nimport { type IMeshPrimitive, type INode, type IMesh, type IAccessor } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader.pure\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_gaussian_splatting\";\r\n\r\n// Zeroth-order spherical harmonics coefficient used to reconstruct a base color from the SH DC term.\r\nconst ShC0 = 0.28209479177387814;\r\n\r\n// Attribute semantics defined by the KHR_gaussian_splatting ellipse kernel.\r\nconst RotationAttribute = \"KHR_gaussian_splatting:ROTATION\";\r\nconst ScaleAttribute = \"KHR_gaussian_splatting:SCALE\";\r\nconst OpacityAttribute = \"KHR_gaussian_splatting:OPACITY\";\r\nconst ShDegree0Attribute = \"KHR_gaussian_splatting:SH_DEGREE_0_COEF_0\";\r\n\r\n// Number of spherical harmonics coefficients (VEC3) for each degree beyond the DC term.\r\nconst ShCoefficientCountPerDegree = [0, 3, 5, 7];\r\n\r\nfunction Clamp255(value: number): number {\r\n return value <= 0 ? 0 : value >= 255 ? 255 : (value + 0.5) | 0;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_gaussian_splatting/README.md)\r\n * Loads a mesh primitive tagged with KHR_gaussian_splatting as a {@link GaussianSplattingMesh}.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_gaussian_splatting implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Nullable<Promise<AbstractMesh>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRGaussianSplatting, AbstractMesh>(context, primitive, this.name, async (extensionContext) => {\r\n if (primitive.mode != undefined && primitive.mode !== MeshPrimitiveMode.POINTS) {\r\n throw new Error(`${extensionContext}: Gaussian splatting primitives must use POINTS mode`);\r\n }\r\n\r\n const loader = this._loader;\r\n\r\n const loadAttribute = (attributeName: string): Nullable<Promise<Float32Array>> => {\r\n const accessorIndex = primitive.attributes[attributeName];\r\n if (accessorIndex == undefined) {\r\n return null;\r\n }\r\n const accessor = ArrayItem.Get(`${context}/attributes/${attributeName}`, loader.gltf.accessors, accessorIndex) as IAccessor;\r\n return loader._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor);\r\n };\r\n\r\n const positionsPromise = loadAttribute(\"POSITION\");\r\n if (!positionsPromise) {\r\n throw new Error(`${extensionContext}: Gaussian splatting primitive is missing the POSITION attribute`);\r\n }\r\n\r\n // Determine which spherical harmonics degrees are present (all lower degrees must exist per spec).\r\n let shDegree = 0;\r\n const shAttributeNames: string[] = [];\r\n for (let degree = 1; degree <= 3; degree++) {\r\n if (primitive.attributes[`KHR_gaussian_splatting:SH_DEGREE_${degree}_COEF_0`] == undefined) {\r\n break;\r\n }\r\n shDegree = degree;\r\n for (let coef = 0; coef < ShCoefficientCountPerDegree[degree]; coef++) {\r\n shAttributeNames.push(`KHR_gaussian_splatting:SH_DEGREE_${degree}_COEF_${coef}`);\r\n }\r\n }\r\n\r\n // Create the Gaussian Splatting mesh and assign it to the node synchronously (before awaiting the\r\n // attribute data). The base loader wires the node's transform node from this assign call\r\n // synchronously, so it must happen before the first await. The splat data is uploaded afterwards.\r\n const scene = loader.babylonScene;\r\n scene._blockEntityCollection = !!loader._assetContainer;\r\n const gaussianSplattingMesh = new GaussianSplattingMesh(name, null, scene);\r\n gaussianSplattingMesh._parentContainer = loader._assetContainer;\r\n scene._blockEntityCollection = false;\r\n\r\n GLTFLoader.AddPointerMetadata(gaussianSplattingMesh, context);\r\n loader.parent.onMeshLoadedObservable.notifyObservers(gaussianSplattingMesh);\r\n assign(gaussianSplattingMesh);\r\n\r\n const engineCaps = scene.getEngine().getCaps();\r\n\r\n const [positions, rotations, scales, opacities, shDegree0, colors, ...shHigherDegrees] = await Promise.all([\r\n positionsPromise,\r\n loadAttribute(RotationAttribute),\r\n loadAttribute(ScaleAttribute),\r\n loadAttribute(OpacityAttribute),\r\n loadAttribute(ShDegree0Attribute),\r\n loadAttribute(\"COLOR_0\"),\r\n ...shAttributeNames.map((attributeName): Nullable<Promise<Float32Array>> => loadAttribute(attributeName)),\r\n ]);\r\n\r\n const splatCount = positions.length / 3;\r\n const colorStride = colors ? colors.length / splatCount : 0;\r\n\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32 bytes: position(12) scale(12) color RGBA(4) quaternion wxyz(4)\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n const floatView = new Float32Array(buffer);\r\n const byteView = new Uint8Array(buffer);\r\n\r\n // Build spherical harmonics texture buffers for degrees above 0.\r\n let shBuffers: Nullable<Uint8Array[]> = null;\r\n if (shDegree > 0) {\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\r\n const shComponentCount = shVectorCount * 3;\r\n const textureCount = Math.ceil(shComponentCount / 16);\r\n const width = engineCaps.maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n shBuffers = AllocateShBuffers(textureCount, height * width * 4 * 4);\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n const floatBase = i * 8;\r\n const byteBase = i * 32;\r\n const p = i * 3;\r\n\r\n // Position (float32 x3, bytes 0-11)\r\n floatView[floatBase + 0] = positions[p + 0];\r\n floatView[floatBase + 1] = positions[p + 1];\r\n floatView[floatBase + 2] = positions[p + 2];\r\n\r\n // Scale (float32 x3, bytes 12-23) — glTF stores linear scale directly.\r\n floatView[floatBase + 3] = scales ? scales[p + 0] : 1;\r\n floatView[floatBase + 4] = scales ? scales[p + 1] : 1;\r\n floatView[floatBase + 5] = scales ? scales[p + 2] : 1;\r\n\r\n // Color RGB (uint8 x3, bytes 24-26) — reconstructed from the SH DC term, or COLOR_0 as a fallback.\r\n if (shDegree0) {\r\n byteView[byteBase + 24] = Clamp255((0.5 + ShC0 * shDegree0[p + 0]) * 255);\r\n byteView[byteBase + 25] = Clamp255((0.5 + ShC0 * shDegree0[p + 1]) * 255);\r\n byteView[byteBase + 26] = Clamp255((0.5 + ShC0 * shDegree0[p + 2]) * 255);\r\n } else if (colors) {\r\n const c = i * colorStride;\r\n byteView[byteBase + 24] = Clamp255(colors[c + 0] * 255);\r\n byteView[byteBase + 25] = Clamp255(colors[c + 1] * 255);\r\n byteView[byteBase + 26] = Clamp255(colors[c + 2] * 255);\r\n } else {\r\n byteView[byteBase + 24] = 255;\r\n byteView[byteBase + 25] = 255;\r\n byteView[byteBase + 26] = 255;\r\n }\r\n\r\n // Alpha (uint8, byte 27) — opacity is a normalized linear value per spec.\r\n if (opacities) {\r\n byteView[byteBase + 27] = Clamp255(opacities[i] * 255);\r\n } else if (colors && colorStride >= 4) {\r\n byteView[byteBase + 27] = Clamp255(colors[i * colorStride + 3] * 255);\r\n } else {\r\n byteView[byteBase + 27] = 255;\r\n }\r\n\r\n // Quaternion (uint8 x4, bytes 28-31) stored as wxyz encoded as q * 127.5 + 127.5. glTF stores xyzw.\r\n const r = i * 4;\r\n const qx = rotations ? rotations[r + 0] : 0;\r\n const qy = rotations ? rotations[r + 1] : 0;\r\n const qz = rotations ? rotations[r + 2] : 0;\r\n const qw = rotations ? rotations[r + 3] : 1;\r\n byteView[byteBase + 28] = Clamp255(qw * 127.5 + 127.5);\r\n byteView[byteBase + 29] = Clamp255(qx * 127.5 + 127.5);\r\n byteView[byteBase + 30] = Clamp255(qy * 127.5 + 127.5);\r\n byteView[byteBase + 31] = Clamp255(qz * 127.5 + 127.5);\r\n\r\n // Spherical harmonics (coefficient-major, channel-minor) encoded as coeff * 128 + 128.\r\n if (shBuffers) {\r\n const offsetPerSplat = i * 16;\r\n for (let coef = 0; coef < shHigherDegrees.length; coef++) {\r\n const coefData = shHigherDegrees[coef];\r\n if (!coefData) {\r\n continue;\r\n }\r\n for (let channel = 0; channel < 3; channel++) {\r\n const flatIndex = coef * 3 + channel;\r\n const textureIndex = flatIndex >> 4; // Math.floor(flatIndex / 16)\r\n const byteIndexInTexture = flatIndex & 15; // flatIndex % 16\r\n shBuffers[textureIndex][offsetPerSplat + byteIndexInTexture] = Clamp255(coefData[p + channel] * 128 + 128);\r\n }\r\n }\r\n }\r\n }\r\n\r\n await gaussianSplattingMesh.updateDataAsync(buffer, shBuffers ?? undefined, undefined, shDegree || undefined);\r\n\r\n return gaussianSplattingMesh;\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_gaussian_splatting glTF loader extension.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_gaussian_splatting(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n unregisterGLTFExtension(NAME);\r\n\r\n registerGLTFExtension(NAME, true, (loader) => new KHR_gaussian_splatting(loader));\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"KHR_gaussian_splatting.pure.js","sourceRoot":"","sources":["../../../../../../dev/loaders/src/glTF/2.0/Extensions/KHR_gaussian_splatting.pure.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"core/types\";\r\nimport { type AbstractMesh } from \"core/Meshes/abstractMesh.pure\";\r\nimport { GaussianSplattingMesh } from \"core/Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { AllocateShBuffers } from \"core/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure\";\r\n\r\nimport { MeshPrimitiveMode, type IKHRGaussianSplatting } from \"babylonjs-gltf2interface\";\r\nimport { type IMeshPrimitive, type INode, type IMesh, type IAccessor } from \"../glTFLoaderInterfaces\";\r\nimport { type IGLTFLoaderExtension } from \"../glTFLoaderExtension\";\r\nimport { GLTFLoader, ArrayItem } from \"../glTFLoader.pure\";\r\nimport { registerGLTFExtension, unregisterGLTFExtension } from \"../glTFLoaderExtensionRegistry\";\r\n\r\nconst NAME = \"KHR_gaussian_splatting\";\r\n\r\n// Zeroth-order spherical harmonics coefficient used to reconstruct a base color from the SH DC term.\r\nconst ShC0 = 0.28209479177387814;\r\n\r\n// Attribute semantics defined by the KHR_gaussian_splatting ellipse kernel.\r\nconst RotationAttribute = \"KHR_gaussian_splatting:ROTATION\";\r\nconst ScaleAttribute = \"KHR_gaussian_splatting:SCALE\";\r\nconst OpacityAttribute = \"KHR_gaussian_splatting:OPACITY\";\r\nconst ShDegree0Attribute = \"KHR_gaussian_splatting:SH_DEGREE_0_COEF_0\";\r\n\r\n// Number of spherical harmonics coefficients (VEC3) for each degree beyond the DC term.\r\nconst ShCoefficientCountPerDegree = [0, 3, 5, 7];\r\n\r\nfunction Clamp255(value: number): number {\r\n return value <= 0 ? 0 : value >= 255 ? 255 : (value + 0.5) | 0;\r\n}\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_gaussian_splatting/README.md)\r\n * Loads a mesh primitive tagged with KHR_gaussian_splatting as a {@link GaussianSplattingMesh}.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_gaussian_splatting implements IGLTFLoaderExtension {\r\n /**\r\n * The name of this extension.\r\n */\r\n public readonly name = NAME;\r\n\r\n /**\r\n * Defines whether this extension is enabled.\r\n */\r\n public enabled: boolean;\r\n\r\n private _loader: GLTFLoader;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(loader: GLTFLoader) {\r\n this._loader = loader;\r\n this.enabled = this._loader.isExtensionUsed(NAME);\r\n }\r\n\r\n /** @internal */\r\n public dispose(): void {\r\n (this._loader as any) = null;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public _loadMeshPrimitiveAsync(\r\n context: string,\r\n name: string,\r\n node: INode,\r\n mesh: IMesh,\r\n primitive: IMeshPrimitive,\r\n assign: (babylonMesh: AbstractMesh) => void\r\n ): Nullable<Promise<AbstractMesh>> {\r\n return GLTFLoader.LoadExtensionAsync<IKHRGaussianSplatting, AbstractMesh>(context, primitive, this.name, async (extensionContext) => {\r\n if (primitive.mode != undefined && primitive.mode !== MeshPrimitiveMode.POINTS) {\r\n throw new Error(`${extensionContext}: Gaussian splatting primitives must use POINTS mode`);\r\n }\r\n\r\n const loader = this._loader;\r\n\r\n const loadAttribute = (attributeName: string): Nullable<Promise<Float32Array>> => {\r\n const accessorIndex = primitive.attributes[attributeName];\r\n if (accessorIndex == undefined) {\r\n return null;\r\n }\r\n const accessor = ArrayItem.Get(`${context}/attributes/${attributeName}`, loader.gltf.accessors, accessorIndex) as IAccessor;\r\n return loader._loadFloatAccessorAsync(`/accessors/${accessor.index}`, accessor);\r\n };\r\n\r\n const positionsPromise = loadAttribute(\"POSITION\");\r\n if (!positionsPromise) {\r\n throw new Error(`${extensionContext}: Gaussian splatting primitive is missing the POSITION attribute`);\r\n }\r\n\r\n // Determine which spherical harmonics degrees are present (all lower degrees must exist per spec).\r\n let shDegree = 0;\r\n const shAttributeNames: string[] = [];\r\n for (let degree = 1; degree <= 3; degree++) {\r\n if (primitive.attributes[`KHR_gaussian_splatting:SH_DEGREE_${degree}_COEF_0`] == undefined) {\r\n break;\r\n }\r\n shDegree = degree;\r\n for (let coef = 0; coef < ShCoefficientCountPerDegree[degree]; coef++) {\r\n shAttributeNames.push(`KHR_gaussian_splatting:SH_DEGREE_${degree}_COEF_${coef}`);\r\n }\r\n }\r\n\r\n // Create the Gaussian Splatting mesh and assign it to the node synchronously (before awaiting the\r\n // attribute data). The base loader wires the node's transform node from this assign call\r\n // synchronously, so it must happen before the first await. The splat data is uploaded afterwards.\r\n const scene = loader.babylonScene;\r\n const gaussianSplattingMesh = scene._executeWithBlockedEntityCollection(!!loader._assetContainer, () => new GaussianSplattingMesh(name, null, scene));\r\n gaussianSplattingMesh._parentContainer = loader._assetContainer;\r\n\r\n GLTFLoader.AddPointerMetadata(gaussianSplattingMesh, context);\r\n loader.parent.onMeshLoadedObservable.notifyObservers(gaussianSplattingMesh);\r\n assign(gaussianSplattingMesh);\r\n\r\n const engineCaps = scene.getEngine().getCaps();\r\n\r\n const [positions, rotations, scales, opacities, shDegree0, colors, ...shHigherDegrees] = await Promise.all([\r\n positionsPromise,\r\n loadAttribute(RotationAttribute),\r\n loadAttribute(ScaleAttribute),\r\n loadAttribute(OpacityAttribute),\r\n loadAttribute(ShDegree0Attribute),\r\n loadAttribute(\"COLOR_0\"),\r\n ...shAttributeNames.map((attributeName): Nullable<Promise<Float32Array>> => loadAttribute(attributeName)),\r\n ]);\r\n\r\n const splatCount = positions.length / 3;\r\n const colorStride = colors ? colors.length / splatCount : 0;\r\n\r\n const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32 bytes: position(12) scale(12) color RGBA(4) quaternion wxyz(4)\r\n const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n const floatView = new Float32Array(buffer);\r\n const byteView = new Uint8Array(buffer);\r\n\r\n // Build spherical harmonics texture buffers for degrees above 0.\r\n let shBuffers: Nullable<Uint8Array[]> = null;\r\n if (shDegree > 0) {\r\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\r\n const shComponentCount = shVectorCount * 3;\r\n const textureCount = Math.ceil(shComponentCount / 16);\r\n const width = engineCaps.maxTextureSize;\r\n const height = Math.ceil(splatCount / width);\r\n shBuffers = AllocateShBuffers(textureCount, height * width * 4 * 4);\r\n }\r\n\r\n for (let i = 0; i < splatCount; i++) {\r\n const floatBase = i * 8;\r\n const byteBase = i * 32;\r\n const p = i * 3;\r\n\r\n // Position (float32 x3, bytes 0-11)\r\n floatView[floatBase + 0] = positions[p + 0];\r\n floatView[floatBase + 1] = positions[p + 1];\r\n floatView[floatBase + 2] = positions[p + 2];\r\n\r\n // Scale (float32 x3, bytes 12-23) — glTF stores linear scale directly.\r\n floatView[floatBase + 3] = scales ? scales[p + 0] : 1;\r\n floatView[floatBase + 4] = scales ? scales[p + 1] : 1;\r\n floatView[floatBase + 5] = scales ? scales[p + 2] : 1;\r\n\r\n // Color RGB (uint8 x3, bytes 24-26) — reconstructed from the SH DC term, or COLOR_0 as a fallback.\r\n if (shDegree0) {\r\n byteView[byteBase + 24] = Clamp255((0.5 + ShC0 * shDegree0[p + 0]) * 255);\r\n byteView[byteBase + 25] = Clamp255((0.5 + ShC0 * shDegree0[p + 1]) * 255);\r\n byteView[byteBase + 26] = Clamp255((0.5 + ShC0 * shDegree0[p + 2]) * 255);\r\n } else if (colors) {\r\n const c = i * colorStride;\r\n byteView[byteBase + 24] = Clamp255(colors[c + 0] * 255);\r\n byteView[byteBase + 25] = Clamp255(colors[c + 1] * 255);\r\n byteView[byteBase + 26] = Clamp255(colors[c + 2] * 255);\r\n } else {\r\n byteView[byteBase + 24] = 255;\r\n byteView[byteBase + 25] = 255;\r\n byteView[byteBase + 26] = 255;\r\n }\r\n\r\n // Alpha (uint8, byte 27) — opacity is a normalized linear value per spec.\r\n if (opacities) {\r\n byteView[byteBase + 27] = Clamp255(opacities[i] * 255);\r\n } else if (colors && colorStride >= 4) {\r\n byteView[byteBase + 27] = Clamp255(colors[i * colorStride + 3] * 255);\r\n } else {\r\n byteView[byteBase + 27] = 255;\r\n }\r\n\r\n // Quaternion (uint8 x4, bytes 28-31) stored as wxyz encoded as q * 127.5 + 127.5. glTF stores xyzw.\r\n const r = i * 4;\r\n const qx = rotations ? rotations[r + 0] : 0;\r\n const qy = rotations ? rotations[r + 1] : 0;\r\n const qz = rotations ? rotations[r + 2] : 0;\r\n const qw = rotations ? rotations[r + 3] : 1;\r\n byteView[byteBase + 28] = Clamp255(qw * 127.5 + 127.5);\r\n byteView[byteBase + 29] = Clamp255(qx * 127.5 + 127.5);\r\n byteView[byteBase + 30] = Clamp255(qy * 127.5 + 127.5);\r\n byteView[byteBase + 31] = Clamp255(qz * 127.5 + 127.5);\r\n\r\n // Spherical harmonics (coefficient-major, channel-minor) encoded as coeff * 128 + 128.\r\n if (shBuffers) {\r\n const offsetPerSplat = i * 16;\r\n for (let coef = 0; coef < shHigherDegrees.length; coef++) {\r\n const coefData = shHigherDegrees[coef];\r\n if (!coefData) {\r\n continue;\r\n }\r\n for (let channel = 0; channel < 3; channel++) {\r\n const flatIndex = coef * 3 + channel;\r\n const textureIndex = flatIndex >> 4; // Math.floor(flatIndex / 16)\r\n const byteIndexInTexture = flatIndex & 15; // flatIndex % 16\r\n shBuffers[textureIndex][offsetPerSplat + byteIndexInTexture] = Clamp255(coefData[p + channel] * 128 + 128);\r\n }\r\n }\r\n }\r\n }\r\n\r\n await gaussianSplattingMesh.updateDataAsync(buffer, shBuffers ?? undefined, undefined, shDegree || undefined);\r\n\r\n return gaussianSplattingMesh;\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_gaussian_splatting glTF loader extension.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_gaussian_splatting(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n unregisterGLTFExtension(NAME);\r\n\r\n registerGLTFExtension(NAME, true, (loader) => new KHR_gaussian_splatting(loader));\r\n}\r\n"]}
|
|
@@ -647,7 +647,7 @@ const gltfToFlowGraphMapping = {
|
|
|
647
647
|
blocks: ["FlowGraphExtractVector2Block" /* FlowGraphBlockNames.ExtractVector2 */],
|
|
648
648
|
inputs: {
|
|
649
649
|
values: {
|
|
650
|
-
a: { name: "input", gltfType: "
|
|
650
|
+
a: { name: "input", gltfType: "float2" },
|
|
651
651
|
},
|
|
652
652
|
},
|
|
653
653
|
outputs: {
|
|
@@ -661,7 +661,7 @@ const gltfToFlowGraphMapping = {
|
|
|
661
661
|
blocks: ["FlowGraphExtractVector3Block" /* FlowGraphBlockNames.ExtractVector3 */],
|
|
662
662
|
inputs: {
|
|
663
663
|
values: {
|
|
664
|
-
a: { name: "input", gltfType: "
|
|
664
|
+
a: { name: "input", gltfType: "float3" },
|
|
665
665
|
},
|
|
666
666
|
},
|
|
667
667
|
outputs: {
|
|
@@ -676,7 +676,7 @@ const gltfToFlowGraphMapping = {
|
|
|
676
676
|
blocks: ["FlowGraphExtractVector4Block" /* FlowGraphBlockNames.ExtractVector4 */],
|
|
677
677
|
inputs: {
|
|
678
678
|
values: {
|
|
679
|
-
a: { name: "input", gltfType: "
|
|
679
|
+
a: { name: "input", gltfType: "float4" },
|
|
680
680
|
},
|
|
681
681
|
},
|
|
682
682
|
outputs: {
|