@onerjs/serializers 8.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/OBJ/index.d.ts +1 -0
  2. package/OBJ/index.js +2 -0
  3. package/OBJ/index.js.map +1 -0
  4. package/OBJ/objSerializer.d.ts +21 -0
  5. package/OBJ/objSerializer.js +171 -0
  6. package/OBJ/objSerializer.js.map +1 -0
  7. package/USDZ/index.d.ts +1 -0
  8. package/USDZ/index.js +3 -0
  9. package/USDZ/index.js.map +1 -0
  10. package/USDZ/usdzExporter.d.ts +50 -0
  11. package/USDZ/usdzExporter.js +589 -0
  12. package/USDZ/usdzExporter.js.map +1 -0
  13. package/exportUtils.d.ts +12 -0
  14. package/exportUtils.js +37 -0
  15. package/exportUtils.js.map +1 -0
  16. package/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.d.ts +24 -0
  17. package/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.js +61 -0
  18. package/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.js.map +1 -0
  19. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +36 -0
  20. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +109 -0
  21. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -0
  22. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +32 -0
  23. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +135 -0
  24. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -0
  25. package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +39 -0
  26. package/glTF/2.0/Extensions/KHR_lights_punctual.js +145 -0
  27. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -0
  28. package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +24 -0
  29. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js +62 -0
  30. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -0
  31. package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +24 -0
  32. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +85 -0
  33. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -0
  34. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +40 -0
  35. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js +118 -0
  36. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -0
  37. package/glTF/2.0/Extensions/KHR_materials_dispersion.d.ts +31 -0
  38. package/glTF/2.0/Extensions/KHR_materials_dispersion.js +63 -0
  39. package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -0
  40. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +27 -0
  41. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +54 -0
  42. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -0
  43. package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +29 -0
  44. package/glTF/2.0/Extensions/KHR_materials_ior.js +55 -0
  45. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -0
  46. package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +24 -0
  47. package/glTF/2.0/Extensions/KHR_materials_iridescence.js +69 -0
  48. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -0
  49. package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +24 -0
  50. package/glTF/2.0/Extensions/KHR_materials_sheen.js +66 -0
  51. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -0
  52. package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +41 -0
  53. package/glTF/2.0/Extensions/KHR_materials_specular.js +94 -0
  54. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -0
  55. package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +41 -0
  56. package/glTF/2.0/Extensions/KHR_materials_transmission.js +92 -0
  57. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -0
  58. package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +20 -0
  59. package/glTF/2.0/Extensions/KHR_materials_unlit.js +46 -0
  60. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -0
  61. package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +40 -0
  62. package/glTF/2.0/Extensions/KHR_materials_volume.js +96 -0
  63. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -0
  64. package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +21 -0
  65. package/glTF/2.0/Extensions/KHR_texture_transform.js +93 -0
  66. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -0
  67. package/glTF/2.0/Extensions/index.d.ts +17 -0
  68. package/glTF/2.0/Extensions/index.js +18 -0
  69. package/glTF/2.0/Extensions/index.js.map +1 -0
  70. package/glTF/2.0/bufferManager.d.ts +68 -0
  71. package/glTF/2.0/bufferManager.js +154 -0
  72. package/glTF/2.0/bufferManager.js.map +1 -0
  73. package/glTF/2.0/dataWriter.d.ts +20 -0
  74. package/glTF/2.0/dataWriter.js +83 -0
  75. package/glTF/2.0/dataWriter.js.map +1 -0
  76. package/glTF/2.0/glTFAnimation.d.ts +191 -0
  77. package/glTF/2.0/glTFAnimation.js +786 -0
  78. package/glTF/2.0/glTFAnimation.js.map +1 -0
  79. package/glTF/2.0/glTFData.d.ts +21 -0
  80. package/glTF/2.0/glTFData.js +30 -0
  81. package/glTF/2.0/glTFData.js.map +1 -0
  82. package/glTF/2.0/glTFExporter.d.ts +109 -0
  83. package/glTF/2.0/glTFExporter.js +1166 -0
  84. package/glTF/2.0/glTFExporter.js.map +1 -0
  85. package/glTF/2.0/glTFExporterExtension.d.ts +77 -0
  86. package/glTF/2.0/glTFExporterExtension.js +4 -0
  87. package/glTF/2.0/glTFExporterExtension.js.map +1 -0
  88. package/glTF/2.0/glTFMaterialExporter.d.ts +99 -0
  89. package/glTF/2.0/glTFMaterialExporter.js +778 -0
  90. package/glTF/2.0/glTFMaterialExporter.js.map +1 -0
  91. package/glTF/2.0/glTFMorphTargetsUtilities.d.ts +14 -0
  92. package/glTF/2.0/glTFMorphTargetsUtilities.js +149 -0
  93. package/glTF/2.0/glTFMorphTargetsUtilities.js.map +1 -0
  94. package/glTF/2.0/glTFSerializer.d.ts +78 -0
  95. package/glTF/2.0/glTFSerializer.js +39 -0
  96. package/glTF/2.0/glTFSerializer.js.map +1 -0
  97. package/glTF/2.0/glTFUtilities.d.ts +89 -0
  98. package/glTF/2.0/glTFUtilities.js +349 -0
  99. package/glTF/2.0/glTFUtilities.js.map +1 -0
  100. package/glTF/2.0/index.d.ts +4 -0
  101. package/glTF/2.0/index.js +6 -0
  102. package/glTF/2.0/index.js.map +1 -0
  103. package/glTF/glTFFileExporter.d.ts +20 -0
  104. package/glTF/glTFFileExporter.js +4 -0
  105. package/glTF/glTFFileExporter.js.map +1 -0
  106. package/glTF/index.d.ts +2 -0
  107. package/glTF/index.js +4 -0
  108. package/glTF/index.js.map +1 -0
  109. package/index.d.ts +4 -0
  110. package/index.js +6 -0
  111. package/index.js.map +1 -0
  112. package/legacy/legacy-glTF2Serializer.d.ts +2 -0
  113. package/legacy/legacy-glTF2Serializer.js +45 -0
  114. package/legacy/legacy-glTF2Serializer.js.map +1 -0
  115. package/legacy/legacy-objSerializer.d.ts +1 -0
  116. package/legacy/legacy-objSerializer.js +14 -0
  117. package/legacy/legacy-objSerializer.js.map +1 -0
  118. package/legacy/legacy-stlSerializer.d.ts +1 -0
  119. package/legacy/legacy-stlSerializer.js +14 -0
  120. package/legacy/legacy-stlSerializer.js.map +1 -0
  121. package/legacy/legacy-usdzSerializer.d.ts +1 -0
  122. package/legacy/legacy-usdzSerializer.js +14 -0
  123. package/legacy/legacy-usdzSerializer.js.map +1 -0
  124. package/legacy/legacy.d.ts +5 -0
  125. package/legacy/legacy.js +8 -0
  126. package/legacy/legacy.js.map +1 -0
  127. package/license.md +71 -0
  128. package/package.json +49 -0
  129. package/readme.md +29 -0
  130. package/stl/index.d.ts +1 -0
  131. package/stl/index.js +2 -0
  132. package/stl/index.js.map +1 -0
  133. package/stl/stlSerializer.d.ts +20 -0
  134. package/stl/stlSerializer.js +135 -0
  135. package/stl/stlSerializer.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KHR_draco_mesh_compression.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\nimport { GLTFExporter } from \"../glTFExporter\";\nimport { MeshPrimitiveMode } from \"babylonjs-gltf2interface\";\nimport type { IAccessor, IBufferView, IKHRDracoMeshCompression, IMeshPrimitive } from \"babylonjs-gltf2interface\";\nimport type { BufferManager } from \"../bufferManager\";\nimport { DracoEncoder } from \"core/Meshes/Compression/dracoEncoder\";\nimport { GetTypedArrayData, GetTypeByteLength } from \"core/Buffers/bufferUtils\";\nimport { GetAccessorElementCount } from \"../glTFUtilities\";\nimport type { DracoAttributeName, IDracoAttributeData, IDracoEncoderOptions } from \"core/Meshes/Compression/dracoEncoder.types\";\nimport { Logger } from \"core/Misc/logger\";\nimport type { Nullable } from \"core/types\";\n\nconst NAME = \"KHR_draco_mesh_compression\";\n\nfunction GetDracoAttributeName(glTFName: string): DracoAttributeName {\n if (glTFName === \"POSITION\") {\n return \"POSITION\";\n } else if (glTFName === \"NORMAL\") {\n return \"NORMAL\";\n } else if (glTFName.startsWith(\"COLOR\")) {\n return \"COLOR\";\n } else if (glTFName.startsWith(\"TEXCOORD\")) {\n return \"TEX_COORD\";\n }\n return \"GENERIC\";\n}\n\n/**\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_draco_mesh_compression/README.md)\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_draco_mesh_compression implements IGLTFExporterExtensionV2 {\n /** Name of this extension */\n public readonly name = NAME;\n\n /** Defines whether this extension is enabled */\n public enabled;\n\n /** KHR_draco_mesh_compression is required, as uncompressed fallback data is not yet implemented. */\n public required = true;\n\n /** BufferViews used for Draco data, which may be eligible for removal after Draco encoding */\n private _bufferViewsUsed: Set<IBufferView> = new Set();\n\n /** Accessors that were replaced with Draco data, which may be eligible for removal after Draco encoding */\n private _accessorsUsed: Set<IAccessor> = new Set();\n\n /** Promise pool for Draco encoding work */\n private _encodePromises: Promise<void>[] = [];\n\n private _wasUsed = false;\n\n /** @internal */\n public get wasUsed() {\n return this._wasUsed;\n }\n\n /** @internal */\n constructor(exporter: GLTFExporter) {\n this.enabled = exporter.options.meshCompressionMethod === \"Draco\" && DracoEncoder.DefaultAvailable;\n }\n\n /** @internal */\n public dispose() {}\n\n /** @internal */\n public postExportMeshPrimitive(primitive: IMeshPrimitive, bufferManager: BufferManager, accessors: IAccessor[]): void {\n if (!this.enabled) {\n return;\n }\n\n if (primitive.mode !== MeshPrimitiveMode.TRIANGLES && primitive.mode !== MeshPrimitiveMode.TRIANGLE_STRIP) {\n Logger.Warn(\"Cannot compress primitive with mode \" + primitive.mode + \".\");\n return;\n }\n\n // Collect bufferViews and accessors used by this primitive\n const primitiveBufferViews: IBufferView[] = [];\n const primitiveAccessors: IAccessor[] = [];\n\n // Prepare indices for Draco encoding\n let indices: Nullable<Uint32Array | Uint16Array> = null;\n if (primitive.indices !== undefined) {\n const accessor = accessors[primitive.indices];\n const bufferView = bufferManager.getBufferView(accessor);\n // Per exportIndices, indices must be either Uint16Array or Uint32Array\n indices = bufferManager.getData(bufferView).slice() as Uint32Array | Uint16Array;\n\n primitiveBufferViews.push(bufferView);\n primitiveAccessors.push(accessor);\n }\n\n // Prepare attributes for Draco encoding\n const attributes: IDracoAttributeData[] = [];\n for (const [name, accessorIndex] of Object.entries(primitive.attributes)) {\n const accessor = accessors[accessorIndex];\n const bufferView = bufferManager.getBufferView(accessor);\n\n const size = GetAccessorElementCount(accessor.type);\n const data = GetTypedArrayData(\n bufferManager.getData(bufferView),\n size,\n accessor.componentType,\n accessor.byteOffset || 0,\n bufferView.byteStride || GetTypeByteLength(accessor.componentType) * size,\n accessor.normalized || false,\n accessor.count,\n true\n );\n\n attributes.push({ kind: name, dracoName: GetDracoAttributeName(name), size: GetAccessorElementCount(accessor.type), data: data });\n\n primitiveBufferViews.push(bufferView);\n primitiveAccessors.push(accessor);\n }\n\n // Use sequential encoding to preserve vertex order for cases like morph targets\n const options: IDracoEncoderOptions = {\n method: primitive.targets ? \"MESH_SEQUENTIAL_ENCODING\" : \"MESH_EDGEBREAKER_ENCODING\",\n };\n\n const promise = DracoEncoder.Default._encodeAsync(attributes, indices, options)\n // eslint-disable-next-line github/no-then\n .then((encodedData) => {\n if (!encodedData) {\n Logger.Error(\"Draco encoding failed for primitive.\");\n return;\n }\n\n const dracoInfo: IKHRDracoMeshCompression = {\n bufferView: -1, // bufferView will be set to a real index later, when we write the binary and decide bufferView ordering\n attributes: encodedData.attributeIds,\n };\n const bufferView = bufferManager.createBufferView(encodedData.data);\n bufferManager.setBufferView(dracoInfo, bufferView);\n\n for (const bufferView of primitiveBufferViews) {\n this._bufferViewsUsed.add(bufferView);\n }\n for (const accessor of primitiveAccessors) {\n this._accessorsUsed.add(accessor);\n }\n\n primitive.extensions ||= {};\n primitive.extensions[NAME] = dracoInfo;\n })\n // eslint-disable-next-line github/no-then\n .catch((error) => {\n Logger.Error(\"Draco encoding failed for primitive: \" + error);\n });\n\n this._encodePromises.push(promise);\n\n this._wasUsed = true;\n }\n\n /** @internal */\n public async preGenerateBinaryAsync(bufferManager: BufferManager): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n await Promise.all(this._encodePromises);\n\n // Cull obsolete bufferViews that were replaced with Draco data\n this._bufferViewsUsed.forEach((bufferView) => {\n const references = bufferManager.getPropertiesWithBufferView(bufferView);\n const onlyUsedByEncodedPrimitives = references.every((object) => {\n return this._accessorsUsed.has(object as IAccessor); // has() can handle any object, but TS doesn't know that\n });\n if (onlyUsedByEncodedPrimitives) {\n bufferManager.removeBufferView(bufferView);\n }\n });\n\n this._bufferViewsUsed.clear();\n this._accessorsUsed.clear();\n }\n}\n\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_draco_mesh_compression(exporter));\n"]}
@@ -0,0 +1,39 @@
1
+ import type { Nullable } from "@babylonjs/core/types.js";
2
+ import type { Node } from "@babylonjs/core/node.js";
3
+ import type { INode } from "babylonjs-gltf2interface";
4
+ import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
5
+ import { GLTFExporter } from "../glTFExporter.js";
6
+ /**
7
+ * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md)
8
+ */
9
+ export declare class KHR_lights_punctual implements IGLTFExporterExtensionV2 {
10
+ /** The name of this extension. */
11
+ readonly name = "KHR_lights_punctual";
12
+ /** Defines whether this extension is enabled. */
13
+ enabled: boolean;
14
+ /** Defines whether this extension is required */
15
+ required: boolean;
16
+ /** Reference to the glTF exporter */
17
+ private _exporter;
18
+ private _lights;
19
+ /**
20
+ * @internal
21
+ */
22
+ constructor(exporter: GLTFExporter);
23
+ /** @internal */
24
+ dispose(): void;
25
+ /** @internal */
26
+ get wasUsed(): boolean;
27
+ /** @internal */
28
+ onExporting(): void;
29
+ /**
30
+ * Define this method to modify the default behavior when exporting a node
31
+ * @param context The context when exporting the node
32
+ * @param node glTF node
33
+ * @param babylonNode BabylonJS node
34
+ * @param nodeMap Node mapping of babylon node to glTF node index
35
+ * @param convertToRightHanded Flag to convert the values to right-handed
36
+ * @returns nullable INode promise
37
+ */
38
+ postExportNodeAsync(context: string, node: INode, babylonNode: Node, nodeMap: Map<Node, number>, convertToRightHanded: boolean): Promise<Nullable<INode>>;
39
+ }
@@ -0,0 +1,145 @@
1
+ import { Vector3, Quaternion, TmpVectors } from "@babylonjs/core/Maths/math.vector.js";
2
+ import { Light } from "@babylonjs/core/Lights/light.js";
3
+ import { ShadowLight } from "@babylonjs/core/Lights/shadowLight.js";
4
+ import { GLTFExporter } from "../glTFExporter.js";
5
+ import { Logger } from "@babylonjs/core/Misc/logger.js";
6
+ import { ConvertToRightHandedPosition, OmitDefaultValues, CollapseChildIntoParent, IsChildCollapsible } from "../glTFUtilities.js";
7
+ const NAME = "KHR_lights_punctual";
8
+ const DEFAULTS = {
9
+ name: "",
10
+ color: [1, 1, 1],
11
+ intensity: 1,
12
+ range: Number.MAX_VALUE,
13
+ };
14
+ const SPOTDEFAULTS = {
15
+ innerConeAngle: 0,
16
+ outerConeAngle: Math.PI / 4.0,
17
+ };
18
+ const LIGHTDIRECTION = Vector3.Backward();
19
+ /**
20
+ * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md)
21
+ */
22
+ // eslint-disable-next-line @typescript-eslint/naming-convention
23
+ export class KHR_lights_punctual {
24
+ /**
25
+ * @internal
26
+ */
27
+ constructor(exporter) {
28
+ /** The name of this extension. */
29
+ this.name = NAME;
30
+ /** Defines whether this extension is enabled. */
31
+ this.enabled = true;
32
+ /** Defines whether this extension is required */
33
+ this.required = false;
34
+ this._exporter = exporter;
35
+ }
36
+ /** @internal */
37
+ dispose() {
38
+ this._lights = null;
39
+ }
40
+ /** @internal */
41
+ get wasUsed() {
42
+ return !!this._lights;
43
+ }
44
+ /** @internal */
45
+ onExporting() {
46
+ this._exporter._glTF.extensions[NAME] = this._lights;
47
+ }
48
+ /**
49
+ * Define this method to modify the default behavior when exporting a node
50
+ * @param context The context when exporting the node
51
+ * @param node glTF node
52
+ * @param babylonNode BabylonJS node
53
+ * @param nodeMap Node mapping of babylon node to glTF node index
54
+ * @param convertToRightHanded Flag to convert the values to right-handed
55
+ * @returns nullable INode promise
56
+ */
57
+ async postExportNodeAsync(context, node, babylonNode, nodeMap, convertToRightHanded) {
58
+ return await new Promise((resolve) => {
59
+ if (!(babylonNode instanceof Light)) {
60
+ resolve(node);
61
+ return;
62
+ }
63
+ const lightType = babylonNode.getTypeID() == Light.LIGHTTYPEID_POINTLIGHT
64
+ ? "point" /* KHRLightsPunctual_LightType.POINT */
65
+ : babylonNode.getTypeID() == Light.LIGHTTYPEID_DIRECTIONALLIGHT
66
+ ? "directional" /* KHRLightsPunctual_LightType.DIRECTIONAL */
67
+ : babylonNode.getTypeID() == Light.LIGHTTYPEID_SPOTLIGHT
68
+ ? "spot" /* KHRLightsPunctual_LightType.SPOT */
69
+ : null;
70
+ if (!lightType || !(babylonNode instanceof ShadowLight)) {
71
+ Logger.Warn(`${context}: Light ${babylonNode.name} is not supported in ${NAME}`);
72
+ resolve(node);
73
+ return;
74
+ }
75
+ if (babylonNode.falloffType !== Light.FALLOFF_GLTF) {
76
+ Logger.Warn(`${context}: Light falloff for ${babylonNode.name} does not match the ${NAME} specification!`);
77
+ }
78
+ // Set the node's translation and rotation here, since lights are not handled in exportNodeAsync
79
+ if (!babylonNode.position.equalsToFloats(0, 0, 0)) {
80
+ const translation = TmpVectors.Vector3[0].copyFrom(babylonNode.position);
81
+ if (convertToRightHanded) {
82
+ ConvertToRightHandedPosition(translation);
83
+ }
84
+ node.translation = translation.asArray();
85
+ }
86
+ // Represent the Babylon light's direction as a quaternion
87
+ // relative to glTF lights' forward direction, (0, 0, -1).
88
+ if (lightType !== "point" /* KHRLightsPunctual_LightType.POINT */) {
89
+ const direction = babylonNode.direction.normalizeToRef(TmpVectors.Vector3[0]);
90
+ if (convertToRightHanded) {
91
+ ConvertToRightHandedPosition(direction);
92
+ }
93
+ const lightRotationQuaternion = Quaternion.FromUnitVectorsToRef(LIGHTDIRECTION, direction, TmpVectors.Quaternion[0]);
94
+ if (!Quaternion.IsIdentity(lightRotationQuaternion)) {
95
+ node.rotation = lightRotationQuaternion.asArray();
96
+ }
97
+ }
98
+ const light = {
99
+ type: lightType,
100
+ name: babylonNode.name,
101
+ color: babylonNode.diffuse.asArray(),
102
+ intensity: babylonNode.intensity,
103
+ range: babylonNode.range,
104
+ };
105
+ OmitDefaultValues(light, DEFAULTS);
106
+ // Separately handle the required 'spot' field for spot lights
107
+ if (lightType === "spot" /* KHRLightsPunctual_LightType.SPOT */) {
108
+ const babylonSpotLight = babylonNode;
109
+ light.spot = {
110
+ innerConeAngle: babylonSpotLight.innerAngle / 2.0,
111
+ outerConeAngle: babylonSpotLight.angle / 2.0,
112
+ };
113
+ OmitDefaultValues(light.spot, SPOTDEFAULTS);
114
+ }
115
+ this._lights || (this._lights = {
116
+ lights: [],
117
+ });
118
+ this._lights.lights.push(light);
119
+ const lightReference = {
120
+ light: this._lights.lights.length - 1,
121
+ };
122
+ // Assign the light to its parent node, if possible, to condense the glTF
123
+ // Why and when: the glTF loader generates a new parent TransformNode for each light node, which we should undo on export
124
+ const parentBabylonNode = babylonNode.parent;
125
+ if (parentBabylonNode && IsChildCollapsible(babylonNode, parentBabylonNode)) {
126
+ const parentNodeIndex = nodeMap.get(parentBabylonNode);
127
+ if (parentNodeIndex) {
128
+ // Combine the light's transformation with the parent's
129
+ const parentNode = this._exporter._nodes[parentNodeIndex];
130
+ CollapseChildIntoParent(node, parentNode);
131
+ parentNode.extensions || (parentNode.extensions = {});
132
+ parentNode.extensions[NAME] = lightReference;
133
+ // Do not export the original node
134
+ resolve(null);
135
+ return;
136
+ }
137
+ }
138
+ node.extensions || (node.extensions = {});
139
+ node.extensions[NAME] = lightReference;
140
+ resolve(node);
141
+ });
142
+ }
143
+ }
144
+ GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_lights_punctual(exporter));
145
+ //# sourceMappingURL=KHR_lights_punctual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KHR_lights_punctual.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_lights_punctual.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SpotLight } from \"core/Lights/spotLight\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Vector3, Quaternion, TmpVectors } from \"core/Maths/math.vector\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { Node } from \"core/node\";\r\nimport { ShadowLight } from \"core/Lights/shadowLight\";\r\nimport type { INode, IKHRLightsPunctual_LightReference, IKHRLightsPunctual_Light, IKHRLightsPunctual } from \"babylonjs-gltf2interface\";\r\nimport { KHRLightsPunctual_LightType } from \"babylonjs-gltf2interface\";\r\nimport type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { ConvertToRightHandedPosition, OmitDefaultValues, CollapseChildIntoParent, IsChildCollapsible } from \"../glTFUtilities\";\r\n\r\nconst NAME = \"KHR_lights_punctual\";\r\nconst DEFAULTS: Omit<IKHRLightsPunctual_Light, \"type\"> = {\r\n name: \"\",\r\n color: [1, 1, 1],\r\n intensity: 1,\r\n range: Number.MAX_VALUE,\r\n};\r\nconst SPOTDEFAULTS: NonNullable<IKHRLightsPunctual_Light[\"spot\"]> = {\r\n innerConeAngle: 0,\r\n outerConeAngle: Math.PI / 4.0,\r\n};\r\nconst LIGHTDIRECTION = Vector3.Backward();\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_lights_punctual/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_lights_punctual implements IGLTFExporterExtensionV2 {\r\n /** The name of this extension. */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled. */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n /** Reference to the glTF exporter */\r\n private _exporter: GLTFExporter;\r\n\r\n private _lights: IKHRLightsPunctual;\r\n\r\n /**\r\n * @internal\r\n */\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n /** @internal */\r\n public dispose() {\r\n (this._lights as any) = null;\r\n }\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return !!this._lights;\r\n }\r\n\r\n /** @internal */\r\n public onExporting(): void {\r\n this._exporter._glTF.extensions![NAME] = this._lights;\r\n }\r\n /**\r\n * Define this method to modify the default behavior when exporting a node\r\n * @param context The context when exporting the node\r\n * @param node glTF node\r\n * @param babylonNode BabylonJS node\r\n * @param nodeMap Node mapping of babylon node to glTF node index\r\n * @param convertToRightHanded Flag to convert the values to right-handed\r\n * @returns nullable INode promise\r\n */\r\n public async postExportNodeAsync(context: string, node: INode, babylonNode: Node, nodeMap: Map<Node, number>, convertToRightHanded: boolean): Promise<Nullable<INode>> {\r\n return await new Promise((resolve) => {\r\n if (!(babylonNode instanceof Light)) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n const lightType =\r\n babylonNode.getTypeID() == Light.LIGHTTYPEID_POINTLIGHT\r\n ? KHRLightsPunctual_LightType.POINT\r\n : babylonNode.getTypeID() == Light.LIGHTTYPEID_DIRECTIONALLIGHT\r\n ? KHRLightsPunctual_LightType.DIRECTIONAL\r\n : babylonNode.getTypeID() == Light.LIGHTTYPEID_SPOTLIGHT\r\n ? KHRLightsPunctual_LightType.SPOT\r\n : null;\r\n if (!lightType || !(babylonNode instanceof ShadowLight)) {\r\n Logger.Warn(`${context}: Light ${babylonNode.name} is not supported in ${NAME}`);\r\n resolve(node);\r\n return;\r\n }\r\n\r\n if (babylonNode.falloffType !== Light.FALLOFF_GLTF) {\r\n Logger.Warn(`${context}: Light falloff for ${babylonNode.name} does not match the ${NAME} specification!`);\r\n }\r\n\r\n // Set the node's translation and rotation here, since lights are not handled in exportNodeAsync\r\n if (!babylonNode.position.equalsToFloats(0, 0, 0)) {\r\n const translation = TmpVectors.Vector3[0].copyFrom(babylonNode.position);\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedPosition(translation);\r\n }\r\n node.translation = translation.asArray();\r\n }\r\n\r\n // Represent the Babylon light's direction as a quaternion\r\n // relative to glTF lights' forward direction, (0, 0, -1).\r\n if (lightType !== KHRLightsPunctual_LightType.POINT) {\r\n const direction = babylonNode.direction.normalizeToRef(TmpVectors.Vector3[0]);\r\n if (convertToRightHanded) {\r\n ConvertToRightHandedPosition(direction);\r\n }\r\n\r\n const lightRotationQuaternion = Quaternion.FromUnitVectorsToRef(LIGHTDIRECTION, direction, TmpVectors.Quaternion[0]);\r\n if (!Quaternion.IsIdentity(lightRotationQuaternion)) {\r\n node.rotation = lightRotationQuaternion.asArray();\r\n }\r\n }\r\n\r\n const light: IKHRLightsPunctual_Light = {\r\n type: lightType,\r\n name: babylonNode.name,\r\n color: babylonNode.diffuse.asArray(),\r\n intensity: babylonNode.intensity,\r\n range: babylonNode.range,\r\n };\r\n OmitDefaultValues(light, DEFAULTS);\r\n\r\n // Separately handle the required 'spot' field for spot lights\r\n if (lightType === KHRLightsPunctual_LightType.SPOT) {\r\n const babylonSpotLight = babylonNode as SpotLight;\r\n light.spot = {\r\n innerConeAngle: babylonSpotLight.innerAngle / 2.0,\r\n outerConeAngle: babylonSpotLight.angle / 2.0,\r\n };\r\n OmitDefaultValues(light.spot, SPOTDEFAULTS);\r\n }\r\n\r\n this._lights ||= {\r\n lights: [],\r\n };\r\n this._lights.lights.push(light);\r\n\r\n const lightReference: IKHRLightsPunctual_LightReference = {\r\n light: this._lights.lights.length - 1,\r\n };\r\n\r\n // Assign the light to its parent node, if possible, to condense the glTF\r\n // Why and when: the glTF loader generates a new parent TransformNode for each light node, which we should undo on export\r\n const parentBabylonNode = babylonNode.parent;\r\n\r\n if (parentBabylonNode && IsChildCollapsible(babylonNode, parentBabylonNode)) {\r\n const parentNodeIndex = nodeMap.get(parentBabylonNode);\r\n if (parentNodeIndex) {\r\n // Combine the light's transformation with the parent's\r\n const parentNode = this._exporter._nodes[parentNodeIndex];\r\n CollapseChildIntoParent(node, parentNode);\r\n parentNode.extensions ||= {};\r\n parentNode.extensions[NAME] = lightReference;\r\n\r\n // Do not export the original node\r\n resolve(null);\r\n return;\r\n }\r\n }\r\n\r\n node.extensions ||= {};\r\n node.extensions[NAME] = lightReference;\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_lights_punctual(exporter));\r\n"]}
@@ -0,0 +1,24 @@
1
+ import type { IMaterial } from "babylonjs-gltf2interface";
2
+ import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
3
+ import { GLTFExporter } from "../glTFExporter.js";
4
+ import type { Material } from "@babylonjs/core/Materials/material.js";
5
+ import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
6
+ /**
7
+ * @internal
8
+ */
9
+ export declare class KHR_materials_anisotropy implements IGLTFExporterExtensionV2 {
10
+ /** Name of this extension */
11
+ readonly name = "KHR_materials_anisotropy";
12
+ /** Defines whether this extension is enabled */
13
+ enabled: boolean;
14
+ /** Defines whether this extension is required */
15
+ required: boolean;
16
+ private _exporter;
17
+ private _wasUsed;
18
+ constructor(exporter: GLTFExporter);
19
+ dispose(): void;
20
+ /** @internal */
21
+ get wasUsed(): boolean;
22
+ postExportMaterialAdditionalTextures?(context: string, node: IMaterial, babylonMaterial: Material): BaseTexture[];
23
+ postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
24
+ }
@@ -0,0 +1,62 @@
1
+ import { GLTFExporter } from "../glTFExporter.js";
2
+ import { PBRBaseMaterial } from "@babylonjs/core/Materials/PBR/pbrBaseMaterial.js";
3
+ const NAME = "KHR_materials_anisotropy";
4
+ /**
5
+ * @internal
6
+ */
7
+ // eslint-disable-next-line @typescript-eslint/naming-convention
8
+ export class KHR_materials_anisotropy {
9
+ constructor(exporter) {
10
+ /** Name of this extension */
11
+ this.name = NAME;
12
+ /** Defines whether this extension is enabled */
13
+ this.enabled = true;
14
+ /** Defines whether this extension is required */
15
+ this.required = false;
16
+ this._wasUsed = false;
17
+ this._exporter = exporter;
18
+ }
19
+ dispose() { }
20
+ /** @internal */
21
+ get wasUsed() {
22
+ return this._wasUsed;
23
+ }
24
+ postExportMaterialAdditionalTextures(context, node, babylonMaterial) {
25
+ const additionalTextures = [];
26
+ if (babylonMaterial instanceof PBRBaseMaterial) {
27
+ if (babylonMaterial.anisotropy.isEnabled && !babylonMaterial.anisotropy.legacy) {
28
+ if (babylonMaterial.anisotropy.texture) {
29
+ additionalTextures.push(babylonMaterial.anisotropy.texture);
30
+ }
31
+ return additionalTextures;
32
+ }
33
+ }
34
+ return [];
35
+ }
36
+ // eslint-disable-next-line no-restricted-syntax
37
+ postExportMaterialAsync(context, node, babylonMaterial) {
38
+ return new Promise((resolve) => {
39
+ if (babylonMaterial instanceof PBRBaseMaterial) {
40
+ if (!babylonMaterial.anisotropy.isEnabled || babylonMaterial.anisotropy.legacy) {
41
+ resolve(node);
42
+ return;
43
+ }
44
+ this._wasUsed = true;
45
+ node.extensions = node.extensions || {};
46
+ const anisotropyTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.anisotropy.texture);
47
+ const anisotropyInfo = {
48
+ anisotropyStrength: babylonMaterial.anisotropy.intensity,
49
+ anisotropyRotation: babylonMaterial.anisotropy.angle,
50
+ anisotropyTexture: anisotropyTextureInfo ?? undefined,
51
+ };
52
+ if (anisotropyInfo.anisotropyTexture !== null) {
53
+ this._exporter._materialNeedsUVsSet.add(babylonMaterial);
54
+ }
55
+ node.extensions[NAME] = anisotropyInfo;
56
+ }
57
+ resolve(node);
58
+ });
59
+ }
60
+ }
61
+ GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_anisotropy(exporter));
62
+ //# sourceMappingURL=KHR_materials_anisotropy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KHR_materials_anisotropy.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_anisotropy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,yDAA2C;AAGrE,MAAM,IAAI,GAAG,0BAA0B,CAAC;AAExC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,wBAAwB;IAcjC,YAAY,QAAsB;QAblC,6BAA6B;QACb,SAAI,GAAG,IAAI,CAAC;QAE5B,gDAAgD;QACzC,YAAO,GAAG,IAAI,CAAC;QAEtB,iDAAiD;QAC1C,aAAQ,GAAG,KAAK,CAAC;QAIhB,aAAQ,GAAG,KAAK,CAAC;QAGrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAEM,OAAO,KAAI,CAAC;IAEnB,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,oCAAoC,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACpG,MAAM,kBAAkB,GAAkB,EAAE,CAAC;QAC7C,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;YAC7C,IAAI,eAAe,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC7E,IAAI,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACrC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAChE,CAAC;gBACD,OAAO,kBAAkB,CAAC;YAC9B,CAAC;QACL,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC;IAED,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;gBAC7C,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,IAAI,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;oBAC7E,OAAO,CAAC,IAAI,CAAC,CAAC;oBACd,OAAO;gBACX,CAAC;gBAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBAExC,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBAElH,MAAM,cAAc,GAA4B;oBAC5C,kBAAkB,EAAE,eAAe,CAAC,UAAU,CAAC,SAAS;oBACxD,kBAAkB,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK;oBACpD,iBAAiB,EAAE,qBAAqB,IAAI,SAAS;iBACxD,CAAC;gBAEF,IAAI,cAAc,CAAC,iBAAiB,KAAK,IAAI,EAAE,CAAC;oBAC5C,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7D,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC;YAC3C,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC","sourcesContent":["import type { IMaterial, IKHRMaterialsAnisotropy } from \"babylonjs-gltf2interface\";\r\nimport type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\n\r\nconst NAME = \"KHR_materials_anisotropy\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_anisotropy implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public postExportMaterialAdditionalTextures?(context: string, node: IMaterial, babylonMaterial: Material): BaseTexture[] {\r\n const additionalTextures: BaseTexture[] = [];\r\n if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (babylonMaterial.anisotropy.isEnabled && !babylonMaterial.anisotropy.legacy) {\r\n if (babylonMaterial.anisotropy.texture) {\r\n additionalTextures.push(babylonMaterial.anisotropy.texture);\r\n }\r\n return additionalTextures;\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (!babylonMaterial.anisotropy.isEnabled || babylonMaterial.anisotropy.legacy) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n const anisotropyTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.anisotropy.texture);\r\n\r\n const anisotropyInfo: IKHRMaterialsAnisotropy = {\r\n anisotropyStrength: babylonMaterial.anisotropy.intensity,\r\n anisotropyRotation: babylonMaterial.anisotropy.angle,\r\n anisotropyTexture: anisotropyTextureInfo ?? undefined,\r\n };\r\n\r\n if (anisotropyInfo.anisotropyTexture !== null) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = anisotropyInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_anisotropy(exporter));\r\n"]}
@@ -0,0 +1,24 @@
1
+ import type { IMaterial } from "babylonjs-gltf2interface";
2
+ import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
3
+ import { GLTFExporter } from "../glTFExporter.js";
4
+ import type { Material } from "@babylonjs/core/Materials/material.js";
5
+ import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
6
+ /**
7
+ * @internal
8
+ */
9
+ export declare class KHR_materials_clearcoat implements IGLTFExporterExtensionV2 {
10
+ /** Name of this extension */
11
+ readonly name = "KHR_materials_clearcoat";
12
+ /** Defines whether this extension is enabled */
13
+ enabled: boolean;
14
+ /** Defines whether this extension is required */
15
+ required: boolean;
16
+ private _exporter;
17
+ private _wasUsed;
18
+ constructor(exporter: GLTFExporter);
19
+ dispose(): void;
20
+ /** @internal */
21
+ get wasUsed(): boolean;
22
+ postExportMaterialAdditionalTextures?(context: string, node: IMaterial, babylonMaterial: Material): BaseTexture[];
23
+ postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
24
+ }
@@ -0,0 +1,85 @@
1
+ import { GLTFExporter } from "../glTFExporter.js";
2
+ import { PBRBaseMaterial } from "@babylonjs/core/Materials/PBR/pbrBaseMaterial.js";
3
+ import { Tools } from "@babylonjs/core/Misc/tools.js";
4
+ const NAME = "KHR_materials_clearcoat";
5
+ /**
6
+ * @internal
7
+ */
8
+ // eslint-disable-next-line @typescript-eslint/naming-convention
9
+ export class KHR_materials_clearcoat {
10
+ constructor(exporter) {
11
+ /** Name of this extension */
12
+ this.name = NAME;
13
+ /** Defines whether this extension is enabled */
14
+ this.enabled = true;
15
+ /** Defines whether this extension is required */
16
+ this.required = false;
17
+ this._wasUsed = false;
18
+ this._exporter = exporter;
19
+ }
20
+ dispose() { }
21
+ /** @internal */
22
+ get wasUsed() {
23
+ return this._wasUsed;
24
+ }
25
+ postExportMaterialAdditionalTextures(context, node, babylonMaterial) {
26
+ const additionalTextures = [];
27
+ if (babylonMaterial instanceof PBRBaseMaterial) {
28
+ if (babylonMaterial.clearCoat.isEnabled) {
29
+ if (babylonMaterial.clearCoat.texture) {
30
+ additionalTextures.push(babylonMaterial.clearCoat.texture);
31
+ }
32
+ if (!babylonMaterial.clearCoat.useRoughnessFromMainTexture && babylonMaterial.clearCoat.textureRoughness) {
33
+ additionalTextures.push(babylonMaterial.clearCoat.textureRoughness);
34
+ }
35
+ if (babylonMaterial.clearCoat.bumpTexture) {
36
+ additionalTextures.push(babylonMaterial.clearCoat.bumpTexture);
37
+ }
38
+ return additionalTextures;
39
+ }
40
+ }
41
+ return [];
42
+ }
43
+ // eslint-disable-next-line no-restricted-syntax
44
+ postExportMaterialAsync(context, node, babylonMaterial) {
45
+ return new Promise((resolve) => {
46
+ if (babylonMaterial instanceof PBRBaseMaterial) {
47
+ if (!babylonMaterial.clearCoat.isEnabled) {
48
+ resolve(node);
49
+ return;
50
+ }
51
+ this._wasUsed = true;
52
+ node.extensions = node.extensions || {};
53
+ const clearCoatTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);
54
+ let clearCoatTextureRoughnessInfo;
55
+ if (babylonMaterial.clearCoat.useRoughnessFromMainTexture) {
56
+ clearCoatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);
57
+ }
58
+ else {
59
+ clearCoatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.textureRoughness);
60
+ }
61
+ if (babylonMaterial.clearCoat.isTintEnabled) {
62
+ Tools.Warn(`Clear Color tint is not supported for glTF export. Ignoring for: ${babylonMaterial.name}`);
63
+ }
64
+ if (babylonMaterial.clearCoat.remapF0OnInterfaceChange) {
65
+ Tools.Warn(`Clear Color F0 remapping is not supported for glTF export. Ignoring for: ${babylonMaterial.name}`);
66
+ }
67
+ const clearCoatNormalTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.bumpTexture);
68
+ const clearCoatInfo = {
69
+ clearcoatFactor: babylonMaterial.clearCoat.intensity,
70
+ clearcoatTexture: clearCoatTextureInfo ?? undefined,
71
+ clearcoatRoughnessFactor: babylonMaterial.clearCoat.roughness,
72
+ clearcoatRoughnessTexture: clearCoatTextureRoughnessInfo ?? undefined,
73
+ clearcoatNormalTexture: clearCoatNormalTextureInfo ?? undefined,
74
+ };
75
+ if (clearCoatInfo.clearcoatTexture !== null || clearCoatInfo.clearcoatRoughnessTexture !== null || clearCoatInfo.clearcoatRoughnessTexture !== null) {
76
+ this._exporter._materialNeedsUVsSet.add(babylonMaterial);
77
+ }
78
+ node.extensions[NAME] = clearCoatInfo;
79
+ }
80
+ resolve(node);
81
+ });
82
+ }
83
+ }
84
+ GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_clearcoat(exporter));
85
+ //# sourceMappingURL=KHR_materials_clearcoat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KHR_materials_clearcoat.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_clearcoat.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IMaterial, IKHRMaterialsClearcoat } from \"babylonjs-gltf2interface\";\r\nimport type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\n\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\nconst NAME = \"KHR_materials_clearcoat\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_clearcoat implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public postExportMaterialAdditionalTextures?(context: string, node: IMaterial, babylonMaterial: Material): BaseTexture[] {\r\n const additionalTextures: BaseTexture[] = [];\r\n if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (babylonMaterial.clearCoat.isEnabled) {\r\n if (babylonMaterial.clearCoat.texture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.texture);\r\n }\r\n if (!babylonMaterial.clearCoat.useRoughnessFromMainTexture && babylonMaterial.clearCoat.textureRoughness) {\r\n additionalTextures.push(babylonMaterial.clearCoat.textureRoughness);\r\n }\r\n if (babylonMaterial.clearCoat.bumpTexture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.bumpTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (!babylonMaterial.clearCoat.isEnabled) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n const clearCoatTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);\r\n let clearCoatTextureRoughnessInfo;\r\n if (babylonMaterial.clearCoat.useRoughnessFromMainTexture) {\r\n clearCoatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);\r\n } else {\r\n clearCoatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.textureRoughness);\r\n }\r\n\r\n if (babylonMaterial.clearCoat.isTintEnabled) {\r\n Tools.Warn(`Clear Color tint is not supported for glTF export. Ignoring for: ${babylonMaterial.name}`);\r\n }\r\n\r\n if (babylonMaterial.clearCoat.remapF0OnInterfaceChange) {\r\n Tools.Warn(`Clear Color F0 remapping is not supported for glTF export. Ignoring for: ${babylonMaterial.name}`);\r\n }\r\n\r\n const clearCoatNormalTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.bumpTexture);\r\n\r\n const clearCoatInfo: IKHRMaterialsClearcoat = {\r\n clearcoatFactor: babylonMaterial.clearCoat.intensity,\r\n clearcoatTexture: clearCoatTextureInfo ?? undefined,\r\n clearcoatRoughnessFactor: babylonMaterial.clearCoat.roughness,\r\n clearcoatRoughnessTexture: clearCoatTextureRoughnessInfo ?? undefined,\r\n clearcoatNormalTexture: clearCoatNormalTextureInfo ?? undefined,\r\n };\r\n\r\n if (clearCoatInfo.clearcoatTexture !== null || clearCoatInfo.clearcoatRoughnessTexture !== null || clearCoatInfo.clearcoatRoughnessTexture !== null) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = clearCoatInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_clearcoat(exporter));\r\n"]}
@@ -0,0 +1,40 @@
1
+ import type { IMaterial } from "babylonjs-gltf2interface";
2
+ import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
3
+ import { GLTFExporter } from "../glTFExporter.js";
4
+ import type { Material } from "@babylonjs/core/Materials/material.js";
5
+ import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
6
+ /**
7
+ * [Proposed Specification](https://github.com/KhronosGroup/glTF/pull/1825)
8
+ * !!! Experimental Extension Subject to Changes !!!
9
+ */
10
+ export declare class KHR_materials_diffuse_transmission implements IGLTFExporterExtensionV2 {
11
+ /** Name of this extension */
12
+ readonly name = "KHR_materials_diffuse_transmission";
13
+ /** Defines whether this extension is enabled */
14
+ enabled: boolean;
15
+ /** Defines whether this extension is required */
16
+ required: boolean;
17
+ private _exporter;
18
+ private _wasUsed;
19
+ constructor(exporter: GLTFExporter);
20
+ dispose(): void;
21
+ /** @internal */
22
+ get wasUsed(): boolean;
23
+ /**
24
+ * After exporting a material, deal with additional textures
25
+ * @param context GLTF context of the material
26
+ * @param node exported GLTF node
27
+ * @param babylonMaterial corresponding babylon material
28
+ * @returns array of additional textures to export
29
+ */
30
+ postExportMaterialAdditionalTextures?(context: string, node: IMaterial, babylonMaterial: Material): BaseTexture[];
31
+ private _isExtensionEnabled;
32
+ /**
33
+ * After exporting a material
34
+ * @param context GLTF context of the material
35
+ * @param node exported GLTF node
36
+ * @param babylonMaterial corresponding babylon material
37
+ * @returns promise that resolves with the updated node
38
+ */
39
+ postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
40
+ }
@@ -0,0 +1,118 @@
1
+ import { GLTFExporter } from "../glTFExporter.js";
2
+ import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
3
+ import { Logger } from "@babylonjs/core/Misc/logger.js";
4
+ const NAME = "KHR_materials_diffuse_transmission";
5
+ /**
6
+ * Get the appropriate translucency intensity texture for the material.
7
+ * @internal
8
+ */
9
+ function GetTranslucencyIntensityTexture(context, babylonMaterial) {
10
+ const subs = babylonMaterial.subSurface;
11
+ let texture = null;
12
+ // Check if translucency intensity texture is available or can be derived from thickness texture
13
+ if (subs.translucencyIntensityTexture) {
14
+ texture = subs.translucencyIntensityTexture;
15
+ }
16
+ else if (subs.thicknessTexture && subs.useMaskFromThicknessTexture) {
17
+ texture = subs.thicknessTexture;
18
+ }
19
+ if (texture && !subs.useGltfStyleTextures) {
20
+ Logger.Warn(`${context}: Translucency intensity texture is not supported when useGltfStyleTextures = false. Ignoring for: ${babylonMaterial.name}`, 1);
21
+ return null;
22
+ }
23
+ return texture;
24
+ }
25
+ /**
26
+ * [Proposed Specification](https://github.com/KhronosGroup/glTF/pull/1825)
27
+ * !!! Experimental Extension Subject to Changes !!!
28
+ */
29
+ // eslint-disable-next-line @typescript-eslint/naming-convention
30
+ export class KHR_materials_diffuse_transmission {
31
+ constructor(exporter) {
32
+ /** Name of this extension */
33
+ this.name = NAME;
34
+ /** Defines whether this extension is enabled */
35
+ this.enabled = true;
36
+ /** Defines whether this extension is required */
37
+ this.required = false;
38
+ this._wasUsed = false;
39
+ this._exporter = exporter;
40
+ }
41
+ dispose() { }
42
+ /** @internal */
43
+ get wasUsed() {
44
+ return this._wasUsed;
45
+ }
46
+ /**
47
+ * After exporting a material, deal with additional textures
48
+ * @param context GLTF context of the material
49
+ * @param node exported GLTF node
50
+ * @param babylonMaterial corresponding babylon material
51
+ * @returns array of additional textures to export
52
+ */
53
+ postExportMaterialAdditionalTextures(context, node, babylonMaterial) {
54
+ const additionalTextures = [];
55
+ if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {
56
+ const translucencyIntensityTexture = GetTranslucencyIntensityTexture(context, babylonMaterial);
57
+ if (translucencyIntensityTexture) {
58
+ additionalTextures.push(translucencyIntensityTexture);
59
+ }
60
+ if (babylonMaterial.subSurface.translucencyColorTexture) {
61
+ additionalTextures.push(babylonMaterial.subSurface.translucencyColorTexture);
62
+ }
63
+ return additionalTextures;
64
+ }
65
+ return additionalTextures;
66
+ }
67
+ _isExtensionEnabled(mat) {
68
+ // This extension must not be used on a material that also uses KHR_materials_unlit
69
+ if (mat.unlit) {
70
+ return false;
71
+ }
72
+ const subs = mat.subSurface;
73
+ if (!subs.isTranslucencyEnabled) {
74
+ return false;
75
+ }
76
+ return (!mat.unlit &&
77
+ !subs.useAlbedoToTintTranslucency &&
78
+ subs.useGltfStyleTextures &&
79
+ subs.volumeIndexOfRefraction === 1 &&
80
+ subs.minimumThickness === 0 &&
81
+ subs.maximumThickness === 0);
82
+ }
83
+ /**
84
+ * After exporting a material
85
+ * @param context GLTF context of the material
86
+ * @param node exported GLTF node
87
+ * @param babylonMaterial corresponding babylon material
88
+ * @returns promise that resolves with the updated node
89
+ */
90
+ // eslint-disable-next-line no-restricted-syntax
91
+ postExportMaterialAsync(context, node, babylonMaterial) {
92
+ return new Promise((resolve) => {
93
+ if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {
94
+ this._wasUsed = true;
95
+ const subs = babylonMaterial.subSurface;
96
+ const translucencyIntensityTexture = GetTranslucencyIntensityTexture(context, babylonMaterial);
97
+ const diffuseTransmissionFactor = subs.translucencyIntensity == 0 ? undefined : subs.translucencyIntensity;
98
+ const diffuseTransmissionTexture = this._exporter._materialExporter.getTextureInfo(translucencyIntensityTexture) ?? undefined;
99
+ const diffuseTransmissionColorFactor = !subs.translucencyColor || subs.translucencyColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : subs.translucencyColor.asArray();
100
+ const diffuseTransmissionColorTexture = this._exporter._materialExporter.getTextureInfo(subs.translucencyColorTexture) ?? undefined;
101
+ const diffuseTransmissionInfo = {
102
+ diffuseTransmissionFactor,
103
+ diffuseTransmissionTexture,
104
+ diffuseTransmissionColorFactor,
105
+ diffuseTransmissionColorTexture,
106
+ };
107
+ if (diffuseTransmissionTexture || diffuseTransmissionColorTexture) {
108
+ this._exporter._materialNeedsUVsSet.add(babylonMaterial);
109
+ }
110
+ node.extensions = node.extensions || {};
111
+ node.extensions[NAME] = diffuseTransmissionInfo;
112
+ }
113
+ resolve(node);
114
+ });
115
+ }
116
+ }
117
+ GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_diffuse_transmission(exporter));
118
+ //# sourceMappingURL=KHR_materials_diffuse_transmission.js.map