@babylonjs/loaders 5.0.0-rc.1 → 5.0.0-rc.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. package/OBJ/index.d.ts +4 -4
  2. package/OBJ/index.js +4 -4
  3. package/OBJ/index.js.map +1 -1
  4. package/OBJ/mtlFileLoader.d.ts +41 -40
  5. package/OBJ/mtlFileLoader.js +232 -231
  6. package/OBJ/mtlFileLoader.js.map +1 -1
  7. package/OBJ/objFileLoader.d.ts +126 -133
  8. package/OBJ/objFileLoader.js +296 -300
  9. package/OBJ/objFileLoader.js.map +1 -1
  10. package/OBJ/objLoadingOptions.d.ts +43 -43
  11. package/OBJ/objLoadingOptions.js +1 -1
  12. package/OBJ/objLoadingOptions.js.map +1 -1
  13. package/OBJ/solidParser.d.ts +154 -153
  14. package/OBJ/solidParser.js +693 -699
  15. package/OBJ/solidParser.js.map +1 -1
  16. package/STL/index.d.ts +1 -1
  17. package/STL/index.js +1 -1
  18. package/STL/index.js.map +1 -1
  19. package/STL/stlFileLoader.d.ts +64 -71
  20. package/STL/stlFileLoader.js +233 -239
  21. package/STL/stlFileLoader.js.map +1 -1
  22. package/glTF/1.0/glTFBinaryExtension.d.ts +13 -13
  23. package/glTF/1.0/glTFBinaryExtension.js +60 -61
  24. package/glTF/1.0/glTFBinaryExtension.js.map +1 -1
  25. package/glTF/1.0/glTFLoader.d.ts +136 -106
  26. package/glTF/1.0/glTFLoader.js +1814 -1696
  27. package/glTF/1.0/glTFLoader.js.map +1 -1
  28. package/glTF/1.0/glTFLoaderInterfaces.d.ts +412 -412
  29. package/glTF/1.0/glTFLoaderInterfaces.js +95 -95
  30. package/glTF/1.0/glTFLoaderInterfaces.js.map +1 -1
  31. package/glTF/1.0/glTFLoaderUtils.d.ts +63 -62
  32. package/glTF/1.0/glTFLoaderUtils.js +250 -232
  33. package/glTF/1.0/glTFLoaderUtils.js.map +1 -1
  34. package/glTF/1.0/glTFMaterialsCommonExtension.d.ts +10 -10
  35. package/glTF/1.0/glTFMaterialsCommonExtension.js +129 -127
  36. package/glTF/1.0/glTFMaterialsCommonExtension.js.map +1 -1
  37. package/glTF/1.0/index.d.ts +5 -5
  38. package/glTF/1.0/index.js +5 -5
  39. package/glTF/1.0/index.js.map +1 -1
  40. package/glTF/2.0/Extensions/EXT_lights_image_based.d.ts +43 -36
  41. package/glTF/2.0/Extensions/EXT_lights_image_based.js +117 -110
  42. package/glTF/2.0/Extensions/EXT_lights_image_based.js.map +1 -1
  43. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +36 -28
  44. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js +88 -80
  45. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  46. package/glTF/2.0/Extensions/EXT_meshopt_compression.d.ts +34 -27
  47. package/glTF/2.0/Extensions/EXT_meshopt_compression.js +49 -42
  48. package/glTF/2.0/Extensions/EXT_meshopt_compression.js.map +1 -1
  49. package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +29 -21
  50. package/glTF/2.0/Extensions/EXT_texture_webp.js +40 -32
  51. package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
  52. package/glTF/2.0/Extensions/ExtrasAsMetadata.d.ts +50 -32
  53. package/glTF/2.0/Extensions/ExtrasAsMetadata.js +73 -55
  54. package/glTF/2.0/Extensions/ExtrasAsMetadata.js.map +1 -1
  55. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +39 -31
  56. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js +112 -101
  57. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
  58. package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +36 -28
  59. package/glTF/2.0/Extensions/KHR_lights_punctual.js +89 -81
  60. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  61. package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +39 -31
  62. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js +94 -86
  63. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  64. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +38 -30
  65. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js +53 -45
  66. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  67. package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +42 -34
  68. package/glTF/2.0/Extensions/KHR_materials_ior.js +62 -54
  69. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  70. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.d.ts +38 -30
  71. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js +80 -72
  72. package/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.js.map +1 -1
  73. package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +39 -31
  74. package/glTF/2.0/Extensions/KHR_materials_sheen.js +84 -76
  75. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  76. package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +38 -30
  77. package/glTF/2.0/Extensions/KHR_materials_specular.js +74 -66
  78. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  79. package/glTF/2.0/Extensions/KHR_materials_translucency.d.ts +39 -31
  80. package/glTF/2.0/Extensions/KHR_materials_translucency.js +83 -76
  81. package/glTF/2.0/Extensions/KHR_materials_translucency.js.map +1 -1
  82. package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +38 -30
  83. package/glTF/2.0/Extensions/KHR_materials_transmission.js +288 -277
  84. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  85. package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +38 -30
  86. package/glTF/2.0/Extensions/KHR_materials_unlit.js +73 -65
  87. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  88. package/glTF/2.0/Extensions/KHR_materials_variants.d.ts +87 -76
  89. package/glTF/2.0/Extensions/KHR_materials_variants.js +254 -243
  90. package/glTF/2.0/Extensions/KHR_materials_variants.js.map +1 -1
  91. package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +39 -31
  92. package/glTF/2.0/Extensions/KHR_materials_volume.js +85 -78
  93. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  94. package/glTF/2.0/Extensions/KHR_mesh_quantization.d.ts +22 -19
  95. package/glTF/2.0/Extensions/KHR_mesh_quantization.js +23 -21
  96. package/glTF/2.0/Extensions/KHR_mesh_quantization.js.map +1 -1
  97. package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +29 -21
  98. package/glTF/2.0/Extensions/KHR_texture_basisu.js +40 -32
  99. package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
  100. package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +33 -25
  101. package/glTF/2.0/Extensions/KHR_texture_transform.js +61 -53
  102. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  103. package/glTF/2.0/Extensions/KHR_xmp_json_ld.d.ts +32 -29
  104. package/glTF/2.0/Extensions/KHR_xmp_json_ld.js +49 -46
  105. package/glTF/2.0/Extensions/KHR_xmp_json_ld.js.map +1 -1
  106. package/glTF/2.0/Extensions/MSFT_audio_emitter.d.ts +54 -38
  107. package/glTF/2.0/Extensions/MSFT_audio_emitter.js +240 -216
  108. package/glTF/2.0/Extensions/MSFT_audio_emitter.js.map +1 -1
  109. package/glTF/2.0/Extensions/MSFT_lod.d.ts +109 -75
  110. package/glTF/2.0/Extensions/MSFT_lod.js +369 -333
  111. package/glTF/2.0/Extensions/MSFT_lod.js.map +1 -1
  112. package/glTF/2.0/Extensions/MSFT_minecraftMesh.d.ts +14 -14
  113. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js +36 -36
  114. package/glTF/2.0/Extensions/MSFT_minecraftMesh.js.map +1 -1
  115. package/glTF/2.0/Extensions/MSFT_sRGBFactors.d.ts +14 -14
  116. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js +36 -36
  117. package/glTF/2.0/Extensions/MSFT_sRGBFactors.js.map +1 -1
  118. package/glTF/2.0/Extensions/index.d.ts +26 -26
  119. package/glTF/2.0/Extensions/index.js +26 -26
  120. package/glTF/2.0/Extensions/index.js.map +1 -1
  121. package/glTF/2.0/glTFLoader.d.ts +406 -357
  122. package/glTF/2.0/glTFLoader.js +2366 -2266
  123. package/glTF/2.0/glTFLoader.js.map +1 -1
  124. package/glTF/2.0/glTFLoaderExtension.d.ts +152 -152
  125. package/glTF/2.0/glTFLoaderExtension.js +1 -1
  126. package/glTF/2.0/glTFLoaderExtension.js.map +1 -1
  127. package/glTF/2.0/glTFLoaderInterfaces.d.ts +211 -209
  128. package/glTF/2.0/glTFLoaderInterfaces.js +1 -1
  129. package/glTF/2.0/glTFLoaderInterfaces.js.map +1 -1
  130. package/glTF/2.0/index.d.ts +4 -4
  131. package/glTF/2.0/index.js +5 -4
  132. package/glTF/2.0/index.js.map +1 -1
  133. package/glTF/glTFFileLoader.d.ts +433 -373
  134. package/glTF/glTFFileLoader.js +927 -870
  135. package/glTF/glTFFileLoader.js.map +1 -1
  136. package/glTF/glTFValidation.d.ts +29 -29
  137. package/glTF/glTFValidation.js +123 -121
  138. package/glTF/glTFValidation.js.map +1 -1
  139. package/glTF/index.d.ts +5 -5
  140. package/glTF/index.js +6 -5
  141. package/glTF/index.js.map +1 -1
  142. package/index.d.ts +3 -3
  143. package/index.js +4 -3
  144. package/index.js.map +1 -1
  145. package/legacy/legacy-glTF.d.ts +2 -2
  146. package/legacy/legacy-glTF.js +18 -18
  147. package/legacy/legacy-glTF.js.map +1 -1
  148. package/legacy/legacy-glTF1.d.ts +2 -2
  149. package/legacy/legacy-glTF1.js +15 -14
  150. package/legacy/legacy-glTF1.js.map +1 -1
  151. package/legacy/legacy-glTF1FileLoader.d.ts +2 -2
  152. package/legacy/legacy-glTF1FileLoader.js +3 -2
  153. package/legacy/legacy-glTF1FileLoader.js.map +1 -1
  154. package/legacy/legacy-glTF2.d.ts +2 -2
  155. package/legacy/legacy-glTF2.js +33 -32
  156. package/legacy/legacy-glTF2.js.map +1 -1
  157. package/legacy/legacy-glTF2FileLoader.d.ts +2 -2
  158. package/legacy/legacy-glTF2FileLoader.js +3 -2
  159. package/legacy/legacy-glTF2FileLoader.js.map +1 -1
  160. package/legacy/legacy-glTFFileLoader.d.ts +3 -3
  161. package/legacy/legacy-glTFFileLoader.js +4 -3
  162. package/legacy/legacy-glTFFileLoader.js.map +1 -1
  163. package/legacy/legacy-objFileLoader.d.ts +1 -1
  164. package/legacy/legacy-objFileLoader.js +13 -12
  165. package/legacy/legacy-objFileLoader.js.map +1 -1
  166. package/legacy/legacy-stlFileLoader.d.ts +1 -1
  167. package/legacy/legacy-stlFileLoader.js +13 -12
  168. package/legacy/legacy-stlFileLoader.js.map +1 -1
  169. package/legacy/legacy.d.ts +6 -6
  170. package/legacy/legacy.js +8 -6
  171. package/legacy/legacy.js.map +1 -1
  172. package/license.md +71 -0
  173. package/package.json +37 -193
  174. package/readme.md +2 -2
@@ -1,278 +1,289 @@
1
- import { __assign } from "tslib";
2
- import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
3
- import { GLTFLoader } from "../glTFLoader.js";
4
- import { RenderTargetTexture } from "@babylonjs/core/Materials/Textures/renderTargetTexture.js";
5
- import { Observable } from "@babylonjs/core/Misc/observable.js";
6
- import { Constants } from "@babylonjs/core/Engines/constants.js";
7
- import { Tools } from "@babylonjs/core/Misc/tools.js";
8
- /**
9
- * A class to handle setting up the rendering of opaque objects to be shown through transmissive objects.
10
- */
11
- var TransmissionHelper = /** @class */ (function () {
12
- /**
13
- * constructor
14
- * @param options Defines the options we want to customize the helper
15
- * @param scene The scene to add the material to
16
- */
17
- function TransmissionHelper(options, scene) {
18
- var _this = this;
19
- this._opaqueRenderTarget = null;
20
- this._opaqueMeshesCache = [];
21
- this._transparentMeshesCache = [];
22
- this._materialObservers = {};
23
- this._options = __assign(__assign({}, TransmissionHelper._getDefaultOptions()), options);
24
- this._scene = scene;
25
- this._scene._transmissionHelper = this;
26
- this.onErrorObservable = new Observable();
27
- this._scene.onDisposeObservable.addOnce(function (scene) {
28
- _this.dispose();
29
- });
30
- this._parseScene();
31
- this._setupRenderTargets();
32
- }
33
- /**
34
- * Creates the default options for the helper.
35
- */
36
- TransmissionHelper._getDefaultOptions = function () {
37
- return {
38
- renderSize: 1024,
39
- samples: 4,
40
- lodGenerationScale: 1,
41
- lodGenerationOffset: -4,
42
- renderTargetTextureType: Constants.TEXTURETYPE_HALF_FLOAT,
43
- generateMipmaps: true,
44
- };
45
- };
46
- /**
47
- * Updates the background according to the new options
48
- * @param options
49
- */
50
- TransmissionHelper.prototype.updateOptions = function (options) {
51
- var _this = this;
52
- // First check if any options are actually being changed. If not, exit.
53
- var newValues = Object.keys(options).filter(function (key) { return _this._options[key] !== options[key]; });
54
- if (!newValues.length) {
55
- return;
56
- }
57
- var newOptions = __assign(__assign({}, this._options), options);
58
- var oldOptions = this._options;
59
- this._options = newOptions;
60
- // If size changes, recreate everything
61
- if (newOptions.renderSize !== oldOptions.renderSize || newOptions.renderTargetTextureType !== oldOptions.renderTargetTextureType || newOptions.generateMipmaps !== oldOptions.generateMipmaps || !this._opaqueRenderTarget) {
62
- this._setupRenderTargets();
63
- }
64
- else {
65
- this._opaqueRenderTarget.samples = newOptions.samples;
66
- this._opaqueRenderTarget.lodGenerationScale = newOptions.lodGenerationScale;
67
- this._opaqueRenderTarget.lodGenerationOffset = newOptions.lodGenerationOffset;
68
- }
69
- };
70
- TransmissionHelper.prototype.getOpaqueTarget = function () {
71
- return this._opaqueRenderTarget;
72
- };
73
- TransmissionHelper.prototype.shouldRenderAsTransmission = function (material) {
74
- if (!material) {
75
- return false;
76
- }
77
- if (material instanceof PBRMaterial && (material.subSurface.isRefractionEnabled)) {
78
- return true;
79
- }
80
- return false;
81
- };
82
- TransmissionHelper.prototype._addMesh = function (mesh) {
83
- var _this = this;
84
- this._materialObservers[mesh.uniqueId] = mesh.onMaterialChangedObservable.add(this._onMeshMaterialChanged.bind(this));
85
- // we need to defer the processing because _addMesh may be called as part as an instance mesh creation, in which case some
86
- // internal properties are not setup yet, like _sourceMesh (needed when doing mesh.material below)
87
- Tools.SetImmediate(function () {
88
- if (_this.shouldRenderAsTransmission(mesh.material)) {
89
- mesh.material.refractionTexture = _this._opaqueRenderTarget;
90
- _this._transparentMeshesCache.push(mesh);
91
- }
92
- else {
93
- _this._opaqueMeshesCache.push(mesh);
94
- }
95
- });
96
- };
97
- TransmissionHelper.prototype._removeMesh = function (mesh) {
98
- mesh.onMaterialChangedObservable.remove(this._materialObservers[mesh.uniqueId]);
99
- delete this._materialObservers[mesh.uniqueId];
100
- var idx = this._transparentMeshesCache.indexOf(mesh);
101
- if (idx !== -1) {
102
- this._transparentMeshesCache.splice(idx, 1);
103
- }
104
- idx = this._opaqueMeshesCache.indexOf(mesh);
105
- if (idx !== -1) {
106
- this._opaqueMeshesCache.splice(idx, 1);
107
- }
108
- };
109
- TransmissionHelper.prototype._parseScene = function () {
110
- this._scene.meshes.forEach(this._addMesh.bind(this));
111
- // Listen for when a mesh is added to the scene and add it to our cache lists.
112
- this._scene.onNewMeshAddedObservable.add(this._addMesh.bind(this));
113
- // Listen for when a mesh is removed from to the scene and remove it from our cache lists.
114
- this._scene.onMeshRemovedObservable.add(this._removeMesh.bind(this));
115
- };
116
- // When one of the meshes in the scene has its material changed, make sure that it's in the correct cache list.
117
- TransmissionHelper.prototype._onMeshMaterialChanged = function (mesh) {
118
- var transparentIdx = this._transparentMeshesCache.indexOf(mesh);
119
- var opaqueIdx = this._opaqueMeshesCache.indexOf(mesh);
120
- // If the material is transparent, make sure that it's added to the transparent list and removed from the opaque list
121
- var useTransmission = this.shouldRenderAsTransmission(mesh.material);
122
- if (useTransmission) {
123
- if (mesh.material instanceof PBRMaterial) {
124
- mesh.material.subSurface.refractionTexture = this._opaqueRenderTarget;
125
- }
126
- if (opaqueIdx !== -1) {
127
- this._opaqueMeshesCache.splice(opaqueIdx, 1);
128
- this._transparentMeshesCache.push(mesh);
129
- }
130
- else if (transparentIdx === -1) {
131
- this._transparentMeshesCache.push(mesh);
132
- }
133
- // If the material is opaque, make sure that it's added to the opaque list and removed from the transparent list
134
- }
135
- else {
136
- if (transparentIdx !== -1) {
137
- this._transparentMeshesCache.splice(transparentIdx, 1);
138
- this._opaqueMeshesCache.push(mesh);
139
- }
140
- else if (opaqueIdx === -1) {
141
- this._opaqueMeshesCache.push(mesh);
142
- }
143
- }
144
- };
145
- /**
146
- * Setup the render targets according to the specified options.
147
- */
148
- TransmissionHelper.prototype._setupRenderTargets = function () {
149
- var _this = this;
150
- var _a, _b;
151
- if (this._opaqueRenderTarget) {
152
- this._opaqueRenderTarget.dispose();
153
- }
154
- this._opaqueRenderTarget = new RenderTargetTexture("opaqueSceneTexture", this._options.renderSize, this._scene, this._options.generateMipmaps, undefined, this._options.renderTargetTextureType);
155
- this._opaqueRenderTarget.ignoreCameraViewport = true;
156
- this._opaqueRenderTarget.renderList = this._opaqueMeshesCache;
157
- this._opaqueRenderTarget.clearColor = (_b = (_a = this._options.clearColor) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : this._scene.clearColor.clone();
158
- this._opaqueRenderTarget.gammaSpace = false;
159
- this._opaqueRenderTarget.lodGenerationScale = this._options.lodGenerationScale;
160
- this._opaqueRenderTarget.lodGenerationOffset = this._options.lodGenerationOffset;
161
- this._opaqueRenderTarget.samples = this._options.samples;
162
- var sceneImageProcessingapplyByPostProcess;
163
- var saveSceneEnvIntensity;
164
- this._opaqueRenderTarget.onBeforeBindObservable.add(function (opaqueRenderTarget) {
165
- saveSceneEnvIntensity = _this._scene.environmentIntensity;
166
- _this._scene.environmentIntensity = 1.0;
167
- sceneImageProcessingapplyByPostProcess = _this._scene.imageProcessingConfiguration.applyByPostProcess;
168
- if (!_this._options.clearColor) {
169
- _this._scene.clearColor.toLinearSpaceToRef(opaqueRenderTarget.clearColor);
170
- }
171
- else {
172
- opaqueRenderTarget.clearColor.copyFrom(_this._options.clearColor);
173
- }
174
- // we do not use the applyByPostProcess setter to avoid flagging all the materials as "image processing dirty"!
175
- _this._scene.imageProcessingConfiguration._applyByPostProcess = true;
176
- });
177
- this._opaqueRenderTarget.onAfterUnbindObservable.add(function () {
178
- _this._scene.environmentIntensity = saveSceneEnvIntensity;
179
- _this._scene.imageProcessingConfiguration._applyByPostProcess = sceneImageProcessingapplyByPostProcess;
180
- });
181
- this._transparentMeshesCache.forEach(function (mesh) {
182
- if (_this.shouldRenderAsTransmission(mesh.material)) {
183
- mesh.material.refractionTexture = _this._opaqueRenderTarget;
184
- }
185
- });
186
- };
187
- /**
188
- * Dispose all the elements created by the Helper.
189
- */
190
- TransmissionHelper.prototype.dispose = function () {
191
- this._scene._transmissionHelper = undefined;
192
- if (this._opaqueRenderTarget) {
193
- this._opaqueRenderTarget.dispose();
194
- this._opaqueRenderTarget = null;
195
- }
196
- this._transparentMeshesCache = [];
197
- this._opaqueMeshesCache = [];
198
- };
199
- return TransmissionHelper;
200
- }());
201
- var NAME = "KHR_materials_transmission";
202
- /**
203
- * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_transmission/README.md)
204
- */
205
- var KHR_materials_transmission = /** @class */ (function () {
206
- /** @hidden */
207
- function KHR_materials_transmission(loader) {
208
- /**
209
- * The name of this extension.
210
- */
211
- this.name = NAME;
212
- /**
213
- * Defines a number that determines the order the extensions are applied.
214
- */
215
- this.order = 175;
216
- this._loader = loader;
217
- this.enabled = this._loader.isExtensionUsed(NAME);
218
- if (this.enabled) {
219
- loader.parent.transparencyAsCoverage = true;
220
- }
221
- }
222
- /** @hidden */
223
- KHR_materials_transmission.prototype.dispose = function () {
224
- this._loader = null;
225
- };
226
- /** @hidden */
227
- KHR_materials_transmission.prototype.loadMaterialPropertiesAsync = function (context, material, babylonMaterial) {
228
- var _this = this;
229
- return GLTFLoader.LoadExtensionAsync(context, material, this.name, function (extensionContext, extension) {
230
- var promises = new Array();
231
- promises.push(_this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
232
- promises.push(_this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));
233
- promises.push(_this._loadTransparentPropertiesAsync(extensionContext, material, babylonMaterial, extension));
234
- return Promise.all(promises).then(function () { });
235
- });
236
- };
237
- KHR_materials_transmission.prototype._loadTransparentPropertiesAsync = function (context, material, babylonMaterial, extension) {
238
- if (!(babylonMaterial instanceof PBRMaterial)) {
239
- throw new Error("".concat(context, ": Material type not supported"));
240
- }
241
- var pbrMaterial = babylonMaterial;
242
- // Enables "refraction" texture which represents transmitted light.
243
- pbrMaterial.subSurface.isRefractionEnabled = true;
244
- // Since this extension models thin-surface transmission only, we must make IOR = 1.0
245
- pbrMaterial.subSurface.volumeIndexOfRefraction = 1.0;
246
- // Albedo colour will tint transmission.
247
- pbrMaterial.subSurface.useAlbedoToTintRefraction = true;
248
- if (extension.transmissionFactor !== undefined) {
249
- pbrMaterial.subSurface.refractionIntensity = extension.transmissionFactor;
250
- var scene = pbrMaterial.getScene();
251
- if (pbrMaterial.subSurface.refractionIntensity && !scene._transmissionHelper) {
252
- new TransmissionHelper({}, pbrMaterial.getScene());
253
- }
254
- }
255
- else {
256
- pbrMaterial.subSurface.refractionIntensity = 0.0;
257
- pbrMaterial.subSurface.isRefractionEnabled = false;
258
- return Promise.resolve();
259
- }
260
- pbrMaterial.subSurface.minimumThickness = 0.0;
261
- pbrMaterial.subSurface.maximumThickness = 0.0;
262
- if (extension.transmissionTexture) {
263
- extension.transmissionTexture.nonColorData = true;
264
- return this._loader.loadTextureInfoAsync("".concat(context, "/transmissionTexture"), extension.transmissionTexture, undefined)
265
- .then(function (texture) {
266
- pbrMaterial.subSurface.refractionIntensityTexture = texture;
267
- pbrMaterial.subSurface.useGltfStyleTextures = true;
268
- });
269
- }
270
- else {
271
- return Promise.resolve();
272
- }
273
- };
274
- return KHR_materials_transmission;
275
- }());
276
- export { KHR_materials_transmission };
277
- GLTFLoader.RegisterExtension(NAME, function (loader) { return new KHR_materials_transmission(loader); });
1
+ import { __assign } from "tslib";
2
+ import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
3
+ import { GLTFLoader } from "../glTFLoader";
4
+ import { RenderTargetTexture } from "@babylonjs/core/Materials/Textures/renderTargetTexture.js";
5
+ import { Observable } from "@babylonjs/core/Misc/observable.js";
6
+ import { Constants } from "@babylonjs/core/Engines/constants.js";
7
+ import { Tools } from "@babylonjs/core/Misc/tools.js";
8
+ /**
9
+ * A class to handle setting up the rendering of opaque objects to be shown through transmissive objects.
10
+ */
11
+ var TransmissionHelper = /** @class */ (function () {
12
+ /**
13
+ * constructor
14
+ * @param options Defines the options we want to customize the helper
15
+ * @param scene The scene to add the material to
16
+ */
17
+ function TransmissionHelper(options, scene) {
18
+ var _this = this;
19
+ this._opaqueRenderTarget = null;
20
+ this._opaqueMeshesCache = [];
21
+ this._transparentMeshesCache = [];
22
+ this._materialObservers = {};
23
+ this._options = __assign(__assign({}, TransmissionHelper._GetDefaultOptions()), options);
24
+ this._scene = scene;
25
+ this._scene._transmissionHelper = this;
26
+ this.onErrorObservable = new Observable();
27
+ this._scene.onDisposeObservable.addOnce(function () {
28
+ _this.dispose();
29
+ });
30
+ this._parseScene();
31
+ this._setupRenderTargets();
32
+ }
33
+ /**
34
+ * Creates the default options for the helper.
35
+ */
36
+ TransmissionHelper._GetDefaultOptions = function () {
37
+ return {
38
+ renderSize: 1024,
39
+ samples: 4,
40
+ lodGenerationScale: 1,
41
+ lodGenerationOffset: -4,
42
+ renderTargetTextureType: Constants.TEXTURETYPE_HALF_FLOAT,
43
+ generateMipmaps: true,
44
+ };
45
+ };
46
+ /**
47
+ * Updates the background according to the new options
48
+ * @param options
49
+ */
50
+ TransmissionHelper.prototype.updateOptions = function (options) {
51
+ var _this = this;
52
+ // First check if any options are actually being changed. If not, exit.
53
+ var newValues = Object.keys(options).filter(function (key) { return _this._options[key] !== options[key]; });
54
+ if (!newValues.length) {
55
+ return;
56
+ }
57
+ var newOptions = __assign(__assign({}, this._options), options);
58
+ var oldOptions = this._options;
59
+ this._options = newOptions;
60
+ // If size changes, recreate everything
61
+ if (newOptions.renderSize !== oldOptions.renderSize ||
62
+ newOptions.renderTargetTextureType !== oldOptions.renderTargetTextureType ||
63
+ newOptions.generateMipmaps !== oldOptions.generateMipmaps ||
64
+ !this._opaqueRenderTarget) {
65
+ this._setupRenderTargets();
66
+ }
67
+ else {
68
+ this._opaqueRenderTarget.samples = newOptions.samples;
69
+ this._opaqueRenderTarget.lodGenerationScale = newOptions.lodGenerationScale;
70
+ this._opaqueRenderTarget.lodGenerationOffset = newOptions.lodGenerationOffset;
71
+ }
72
+ };
73
+ TransmissionHelper.prototype.getOpaqueTarget = function () {
74
+ return this._opaqueRenderTarget;
75
+ };
76
+ TransmissionHelper.prototype._shouldRenderAsTransmission = function (material) {
77
+ if (!material) {
78
+ return false;
79
+ }
80
+ if (material instanceof PBRMaterial && material.subSurface.isRefractionEnabled) {
81
+ return true;
82
+ }
83
+ return false;
84
+ };
85
+ TransmissionHelper.prototype._addMesh = function (mesh) {
86
+ var _this = this;
87
+ this._materialObservers[mesh.uniqueId] = mesh.onMaterialChangedObservable.add(this._onMeshMaterialChanged.bind(this));
88
+ // we need to defer the processing because _addMesh may be called as part as an instance mesh creation, in which case some
89
+ // internal properties are not setup yet, like _sourceMesh (needed when doing mesh.material below)
90
+ Tools.SetImmediate(function () {
91
+ if (_this._shouldRenderAsTransmission(mesh.material)) {
92
+ mesh.material.refractionTexture = _this._opaqueRenderTarget;
93
+ _this._transparentMeshesCache.push(mesh);
94
+ }
95
+ else {
96
+ _this._opaqueMeshesCache.push(mesh);
97
+ }
98
+ });
99
+ };
100
+ TransmissionHelper.prototype._removeMesh = function (mesh) {
101
+ mesh.onMaterialChangedObservable.remove(this._materialObservers[mesh.uniqueId]);
102
+ delete this._materialObservers[mesh.uniqueId];
103
+ var idx = this._transparentMeshesCache.indexOf(mesh);
104
+ if (idx !== -1) {
105
+ this._transparentMeshesCache.splice(idx, 1);
106
+ }
107
+ idx = this._opaqueMeshesCache.indexOf(mesh);
108
+ if (idx !== -1) {
109
+ this._opaqueMeshesCache.splice(idx, 1);
110
+ }
111
+ };
112
+ TransmissionHelper.prototype._parseScene = function () {
113
+ this._scene.meshes.forEach(this._addMesh.bind(this));
114
+ // Listen for when a mesh is added to the scene and add it to our cache lists.
115
+ this._scene.onNewMeshAddedObservable.add(this._addMesh.bind(this));
116
+ // Listen for when a mesh is removed from to the scene and remove it from our cache lists.
117
+ this._scene.onMeshRemovedObservable.add(this._removeMesh.bind(this));
118
+ };
119
+ // When one of the meshes in the scene has its material changed, make sure that it's in the correct cache list.
120
+ TransmissionHelper.prototype._onMeshMaterialChanged = function (mesh) {
121
+ var transparentIdx = this._transparentMeshesCache.indexOf(mesh);
122
+ var opaqueIdx = this._opaqueMeshesCache.indexOf(mesh);
123
+ // If the material is transparent, make sure that it's added to the transparent list and removed from the opaque list
124
+ var useTransmission = this._shouldRenderAsTransmission(mesh.material);
125
+ if (useTransmission) {
126
+ if (mesh.material instanceof PBRMaterial) {
127
+ mesh.material.subSurface.refractionTexture = this._opaqueRenderTarget;
128
+ }
129
+ if (opaqueIdx !== -1) {
130
+ this._opaqueMeshesCache.splice(opaqueIdx, 1);
131
+ this._transparentMeshesCache.push(mesh);
132
+ }
133
+ else if (transparentIdx === -1) {
134
+ this._transparentMeshesCache.push(mesh);
135
+ }
136
+ // If the material is opaque, make sure that it's added to the opaque list and removed from the transparent list
137
+ }
138
+ else {
139
+ if (transparentIdx !== -1) {
140
+ this._transparentMeshesCache.splice(transparentIdx, 1);
141
+ this._opaqueMeshesCache.push(mesh);
142
+ }
143
+ else if (opaqueIdx === -1) {
144
+ this._opaqueMeshesCache.push(mesh);
145
+ }
146
+ }
147
+ };
148
+ /**
149
+ * Setup the render targets according to the specified options.
150
+ */
151
+ TransmissionHelper.prototype._setupRenderTargets = function () {
152
+ var _this = this;
153
+ var _a, _b;
154
+ if (this._opaqueRenderTarget) {
155
+ this._opaqueRenderTarget.dispose();
156
+ }
157
+ this._opaqueRenderTarget = new RenderTargetTexture("opaqueSceneTexture", this._options.renderSize, this._scene, this._options.generateMipmaps, undefined, this._options.renderTargetTextureType);
158
+ this._opaqueRenderTarget.ignoreCameraViewport = true;
159
+ this._opaqueRenderTarget.renderList = this._opaqueMeshesCache;
160
+ this._opaqueRenderTarget.clearColor = (_b = (_a = this._options.clearColor) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : this._scene.clearColor.clone();
161
+ this._opaqueRenderTarget.gammaSpace = false;
162
+ this._opaqueRenderTarget.lodGenerationScale = this._options.lodGenerationScale;
163
+ this._opaqueRenderTarget.lodGenerationOffset = this._options.lodGenerationOffset;
164
+ this._opaqueRenderTarget.samples = this._options.samples;
165
+ var sceneImageProcessingapplyByPostProcess;
166
+ var saveSceneEnvIntensity;
167
+ this._opaqueRenderTarget.onBeforeBindObservable.add(function (opaqueRenderTarget) {
168
+ saveSceneEnvIntensity = _this._scene.environmentIntensity;
169
+ _this._scene.environmentIntensity = 1.0;
170
+ sceneImageProcessingapplyByPostProcess = _this._scene.imageProcessingConfiguration.applyByPostProcess;
171
+ if (!_this._options.clearColor) {
172
+ _this._scene.clearColor.toLinearSpaceToRef(opaqueRenderTarget.clearColor);
173
+ }
174
+ else {
175
+ opaqueRenderTarget.clearColor.copyFrom(_this._options.clearColor);
176
+ }
177
+ // we do not use the applyByPostProcess setter to avoid flagging all the materials as "image processing dirty"!
178
+ _this._scene.imageProcessingConfiguration._applyByPostProcess = true;
179
+ });
180
+ this._opaqueRenderTarget.onAfterUnbindObservable.add(function () {
181
+ _this._scene.environmentIntensity = saveSceneEnvIntensity;
182
+ _this._scene.imageProcessingConfiguration._applyByPostProcess = sceneImageProcessingapplyByPostProcess;
183
+ });
184
+ this._transparentMeshesCache.forEach(function (mesh) {
185
+ if (_this._shouldRenderAsTransmission(mesh.material)) {
186
+ mesh.material.refractionTexture = _this._opaqueRenderTarget;
187
+ }
188
+ });
189
+ };
190
+ /**
191
+ * Dispose all the elements created by the Helper.
192
+ */
193
+ TransmissionHelper.prototype.dispose = function () {
194
+ this._scene._transmissionHelper = undefined;
195
+ if (this._opaqueRenderTarget) {
196
+ this._opaqueRenderTarget.dispose();
197
+ this._opaqueRenderTarget = null;
198
+ }
199
+ this._transparentMeshesCache = [];
200
+ this._opaqueMeshesCache = [];
201
+ };
202
+ return TransmissionHelper;
203
+ }());
204
+ var NAME = "KHR_materials_transmission";
205
+ /**
206
+ * [Specification](https://github.com/KhronosGroup/glTF/blob/master/extensions/2.0/Khronos/KHR_materials_transmission/README.md)
207
+ */
208
+ // eslint-disable-next-line @typescript-eslint/naming-convention
209
+ var KHR_materials_transmission = /** @class */ (function () {
210
+ /**
211
+ * @param loader
212
+ * @hidden
213
+ */
214
+ function KHR_materials_transmission(loader) {
215
+ /**
216
+ * The name of this extension.
217
+ */
218
+ this.name = NAME;
219
+ /**
220
+ * Defines a number that determines the order the extensions are applied.
221
+ */
222
+ this.order = 175;
223
+ this._loader = loader;
224
+ this.enabled = this._loader.isExtensionUsed(NAME);
225
+ if (this.enabled) {
226
+ loader.parent.transparencyAsCoverage = true;
227
+ }
228
+ }
229
+ /** @hidden */
230
+ KHR_materials_transmission.prototype.dispose = function () {
231
+ this._loader = null;
232
+ };
233
+ /**
234
+ * @param context
235
+ * @param material
236
+ * @param babylonMaterial
237
+ * @hidden
238
+ */
239
+ KHR_materials_transmission.prototype.loadMaterialPropertiesAsync = function (context, material, babylonMaterial) {
240
+ var _this = this;
241
+ return GLTFLoader.LoadExtensionAsync(context, material, this.name, function (extensionContext, extension) {
242
+ var promises = new Array();
243
+ promises.push(_this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial));
244
+ promises.push(_this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial));
245
+ promises.push(_this._loadTransparentPropertiesAsync(extensionContext, material, babylonMaterial, extension));
246
+ return Promise.all(promises).then(function () { });
247
+ });
248
+ };
249
+ KHR_materials_transmission.prototype._loadTransparentPropertiesAsync = function (context, material, babylonMaterial, extension) {
250
+ if (!(babylonMaterial instanceof PBRMaterial)) {
251
+ throw new Error("".concat(context, ": Material type not supported"));
252
+ }
253
+ var pbrMaterial = babylonMaterial;
254
+ // Enables "refraction" texture which represents transmitted light.
255
+ pbrMaterial.subSurface.isRefractionEnabled = true;
256
+ // Since this extension models thin-surface transmission only, we must make IOR = 1.0
257
+ pbrMaterial.subSurface.volumeIndexOfRefraction = 1.0;
258
+ // Albedo colour will tint transmission.
259
+ pbrMaterial.subSurface.useAlbedoToTintRefraction = true;
260
+ if (extension.transmissionFactor !== undefined) {
261
+ pbrMaterial.subSurface.refractionIntensity = extension.transmissionFactor;
262
+ var scene = pbrMaterial.getScene();
263
+ if (pbrMaterial.subSurface.refractionIntensity && !scene._transmissionHelper) {
264
+ new TransmissionHelper({}, pbrMaterial.getScene());
265
+ }
266
+ }
267
+ else {
268
+ pbrMaterial.subSurface.refractionIntensity = 0.0;
269
+ pbrMaterial.subSurface.isRefractionEnabled = false;
270
+ return Promise.resolve();
271
+ }
272
+ pbrMaterial.subSurface.minimumThickness = 0.0;
273
+ pbrMaterial.subSurface.maximumThickness = 0.0;
274
+ if (extension.transmissionTexture) {
275
+ extension.transmissionTexture.nonColorData = true;
276
+ return this._loader.loadTextureInfoAsync("".concat(context, "/transmissionTexture"), extension.transmissionTexture, undefined).then(function (texture) {
277
+ pbrMaterial.subSurface.refractionIntensityTexture = texture;
278
+ pbrMaterial.subSurface.useGltfStyleTextures = true;
279
+ });
280
+ }
281
+ else {
282
+ return Promise.resolve();
283
+ }
284
+ };
285
+ return KHR_materials_transmission;
286
+ }());
287
+ export { KHR_materials_transmission };
288
+ GLTFLoader.RegisterExtension(NAME, function (loader) { return new KHR_materials_transmission(loader); });
278
289
  //# sourceMappingURL=KHR_materials_transmission.js.map