@babylonjs/serializers 8.13.0 → 8.14.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.
@@ -1,10 +1,13 @@
1
1
  /* eslint-disable @typescript-eslint/naming-convention */
2
2
  import { VertexBuffer } from "@babylonjs/core/Buffers/buffer.js";
3
3
  import { Constants } from "@babylonjs/core/Engines/constants.js";
4
+ import { PBRBaseMaterial } from "@babylonjs/core/Materials/PBR/pbrBaseMaterial.js";
5
+ import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial.js";
4
6
  import { Color3 } from "@babylonjs/core/Maths/math.color.js";
5
7
  import { Matrix, Vector2 } from "@babylonjs/core/Maths/math.vector.js";
6
8
  import { DumpTools } from "@babylonjs/core/Misc/dumpTools.js";
7
9
  import { Tools } from "@babylonjs/core/Misc/tools.js";
10
+ import { IsNoopNode } from "../exportUtils.js";
8
11
  function BuildHeader() {
9
12
  return `#usda 1.0
10
13
  (
@@ -142,6 +145,25 @@ function BuildUSDFileAsString(dataToInsert) {
142
145
  output += dataToInsert;
143
146
  return fflate.strToU8(output);
144
147
  }
148
+ function GetMeshWorldMatrix(mesh) {
149
+ const matrix = mesh.getWorldMatrix().clone();
150
+ // If there's a LH->RH __root__ conversion node, cancel out its effect
151
+ const useRightHandedSystem = mesh.getScene().useRightHandedSystem;
152
+ if (!useRightHandedSystem) {
153
+ let current = mesh.parent;
154
+ while (current) {
155
+ if (IsNoopNode(current, useRightHandedSystem)) {
156
+ matrix.multiplyToRef(current.getWorldMatrix().invert(), matrix);
157
+ break;
158
+ }
159
+ current = current.parent;
160
+ }
161
+ }
162
+ if (matrix.determinant() < 0) {
163
+ Tools.Warn(`Exporting mesh ${mesh.name} with negative scale. Result may look incorrect in destination engine.`);
164
+ }
165
+ return matrix;
166
+ }
145
167
  function BuildMatrix(matrix) {
146
168
  const array = matrix.m;
147
169
  return `( ${BuildMatrixRow(array, 0)}, ${BuildMatrixRow(array, 4)}, ${BuildMatrixRow(array, 8)}, ${BuildMatrixRow(array, 12)} )`;
@@ -151,10 +173,7 @@ function BuildMatrixRow(array, offset) {
151
173
  }
152
174
  function BuildXform(mesh) {
153
175
  const name = "Object_" + mesh.uniqueId;
154
- const matrix = mesh.getWorldMatrix().clone();
155
- if (matrix.determinant() < 0) {
156
- Tools.Warn(`Exporting mesh ${mesh.name} with negative scale. Result may look incorrect in destination engine.`);
157
- }
176
+ const matrix = GetMeshWorldMatrix(mesh);
158
177
  const transform = BuildMatrix(matrix);
159
178
  return `def Xform "${name}" (
160
179
  prepend references = @./geometries/Geometry_${mesh.geometry.uniqueId}.usda@</Geometry>
@@ -253,110 +272,77 @@ function BuildTexture(texture, material, mapType, color, textureToExports, optio
253
272
  }`;
254
273
  }
255
274
  function ExtractTextureInformations(material) {
256
- const className = material.getClassName();
257
- switch (className) {
258
- case "StandardMaterial":
259
- return {
260
- diffuseMap: material.diffuseTexture,
261
- diffuse: material.diffuseColor,
262
- alphaCutOff: material.alphaCutOff,
263
- emissiveMap: material.emissiveTexture,
264
- emissive: material.emissiveColor,
265
- roughnessMap: null,
266
- normalMap: null,
267
- metalnessMap: null,
268
- roughness: 1,
269
- metalness: 0,
270
- aoMap: null,
271
- aoMapIntensity: 0,
272
- alphaMap: material.opacityTexture,
273
- ior: 1,
274
- clearCoat: 0,
275
- clearCoatMap: null,
276
- clearCoatRoughness: 0,
277
- clearCoatRoughnessMap: null,
278
- };
279
- case "PBRMaterial":
280
- return {
281
- diffuseMap: material.albedoTexture,
282
- diffuse: material.albedoColor,
283
- alphaCutOff: material.alphaCutOff,
284
- emissiveMap: material.emissiveTexture,
285
- emissive: material.emissiveColor,
286
- normalMap: material.bumpTexture,
287
- roughnessMap: material.metallicTexture,
288
- roughnessChannel: material.useRoughnessFromMetallicTextureAlpha ? "a" : "g",
289
- roughness: material.roughness || 1,
290
- metalnessMap: material.metallicTexture,
291
- metalnessChannel: material.useMetallnessFromMetallicTextureBlue ? "b" : "r",
292
- metalness: material.metallic || 0,
293
- aoMap: material.ambientTexture,
294
- aoMapChannel: material.useAmbientInGrayScale ? "r" : "rgb",
295
- aoMapIntensity: material.ambientTextureStrength,
296
- alphaMap: material.opacityTexture,
297
- ior: material.indexOfRefraction,
298
- clearCoat: material.clearCoat.intensity,
299
- clearCoatMap: material.clearCoat.texture,
300
- clearCoatRoughness: material.clearCoat.roughness,
301
- clearCoatRoughnessMap: material.clearCoat.useRoughnessFromMainTexture
302
- ? material.clearCoat.texture
303
- : material.clearCoat.textureRoughness,
304
- };
305
- case "PBRMetallicRoughnessMaterial":
306
- return {
307
- diffuseMap: material.baseTexture,
308
- diffuse: material.baseColor,
309
- alphaCutOff: material.alphaCutOff,
310
- emissiveMap: material.emissiveTexture,
311
- emissive: material.emissiveColor,
312
- normalMap: material.normalTexture,
313
- roughnessMap: material.metallicTexture,
314
- roughnessChannel: material.useRoughnessFromMetallicTextureAlpha ? "a" : "g",
315
- roughness: material.roughness || 1,
316
- metalnessMap: material.metallicTexture,
317
- metalnessChannel: material.useMetallnessFromMetallicTextureBlue ? "b" : "r",
318
- metalness: material.metallic || 0,
319
- aoMap: material.ambientTexture,
320
- aoMapChannel: material.useAmbientInGrayScale ? "r" : "rgb",
321
- aoMapIntensity: material.ambientTextureStrength,
322
- alphaMap: material.opacityTexture,
323
- ior: material.indexOfRefraction,
324
- clearCoat: material.clearCoat.intensity,
325
- clearCoatMap: material.clearCoat.texture,
326
- clearCoatRoughness: material.clearCoat.roughness,
327
- clearCoatRoughnessMap: material.clearCoat.useRoughnessFromMainTexture
328
- ? material.clearCoat.texture
329
- : material.clearCoat.textureRoughness,
330
- };
331
- default:
332
- return {
333
- diffuseMap: null,
334
- diffuse: null,
335
- emissiveMap: null,
336
- emissemissiveiveColor: null,
337
- normalMap: null,
338
- roughnessMap: null,
339
- metalnessMap: null,
340
- alphaCutOff: 0,
341
- roughness: 0,
342
- metalness: 0,
343
- aoMap: null,
344
- aoMapIntensity: 0,
345
- alphaMap: null,
346
- ior: 1,
347
- clearCoat: 0,
348
- clearCoatMap: null,
349
- clearCoatRoughness: 0,
350
- clearCoatRoughnessMap: null,
351
- };
352
- }
275
+ const defaults = {
276
+ diffuseMap: null,
277
+ diffuse: null,
278
+ alphaCutOff: 0,
279
+ emissiveMap: null,
280
+ emissive: null,
281
+ normalMap: null,
282
+ roughnessMap: null,
283
+ roughnessChannel: "a",
284
+ roughness: 0,
285
+ metalnessMap: null,
286
+ metalnessChannel: "r",
287
+ metalness: 0,
288
+ aoMap: null,
289
+ aoMapChannel: "rgb",
290
+ aoMapIntensity: 0,
291
+ alphaMap: null,
292
+ ior: 1,
293
+ clearCoatEnabled: false,
294
+ clearCoat: 0,
295
+ clearCoatMap: null,
296
+ clearCoatRoughness: 0,
297
+ clearCoatRoughnessMap: null,
298
+ };
299
+ if (material instanceof StandardMaterial) {
300
+ return {
301
+ ...defaults,
302
+ diffuseMap: material.diffuseTexture,
303
+ diffuse: material.diffuseColor,
304
+ alphaCutOff: material.alphaCutOff,
305
+ emissiveMap: material.emissiveTexture,
306
+ emissive: material.emissiveColor,
307
+ roughness: 1,
308
+ alphaMap: material.opacityTexture,
309
+ };
310
+ }
311
+ if (material instanceof PBRBaseMaterial) {
312
+ return {
313
+ ...defaults,
314
+ diffuseMap: material._albedoTexture,
315
+ diffuse: material._albedoColor,
316
+ alphaCutOff: material._alphaCutOff,
317
+ emissiveMap: material._emissiveTexture,
318
+ emissive: material._emissiveColor,
319
+ normalMap: material._bumpTexture,
320
+ roughnessMap: material._metallicTexture,
321
+ roughnessChannel: material._useRoughnessFromMetallicTextureAlpha ? "a" : "g",
322
+ roughness: material._roughness ?? 1,
323
+ metalnessMap: material._metallicTexture,
324
+ metalnessChannel: material._useMetallnessFromMetallicTextureBlue ? "b" : "r",
325
+ metalness: material._metallic ?? 0,
326
+ aoMap: material._ambientTexture,
327
+ aoMapChannel: material._useAmbientInGrayScale ? "r" : "rgb",
328
+ aoMapIntensity: material._ambientTextureStrength,
329
+ alphaMap: material._opacityTexture,
330
+ ior: material.subSurface.indexOfRefraction,
331
+ clearCoatEnabled: material.clearCoat.isEnabled,
332
+ clearCoat: material.clearCoat.intensity,
333
+ clearCoatMap: material.clearCoat.texture,
334
+ clearCoatRoughness: material.clearCoat.roughness,
335
+ clearCoatRoughnessMap: material.clearCoat.useRoughnessFromMainTexture ? material.clearCoat.texture : material.clearCoat.textureRoughness,
336
+ };
337
+ }
338
+ return defaults;
353
339
  }
354
340
  function BuildMaterial(material, textureToExports, options) {
355
341
  // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html
356
342
  const pad = " ";
357
343
  const inputs = [];
358
344
  const samplers = [];
359
- const { diffuseMap, diffuse, alphaCutOff, emissiveMap, emissive, normalMap, roughnessMap, roughnessChannel, roughness, metalnessMap, metalnessChannel, metalness, aoMap, aoMapChannel, aoMapIntensity, alphaMap, ior, clearCoat, clearCoatMap, clearCoatRoughness, clearCoatRoughnessMap, } = ExtractTextureInformations(material);
345
+ const { diffuseMap, diffuse, alphaCutOff, emissiveMap, emissive, normalMap, roughnessMap, roughnessChannel, roughness, metalnessMap, metalnessChannel, metalness, aoMap, aoMapChannel, aoMapIntensity, alphaMap, ior, clearCoatEnabled, clearCoat, clearCoatMap, clearCoatRoughness, clearCoatRoughnessMap, } = ExtractTextureInformations(material);
360
346
  if (diffuseMap !== null) {
361
347
  inputs.push(`${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:rgb>`);
362
348
  if (material.needAlphaBlending()) {
@@ -408,19 +394,21 @@ function BuildMaterial(material, textureToExports, options) {
408
394
  else {
409
395
  inputs.push(`${pad}float inputs:opacity = ${material.alpha}`);
410
396
  }
411
- if (clearCoatMap !== null) {
412
- inputs.push(`${pad}float inputs:clearcoat.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatMap.uniqueId}_clearcoat.outputs:r>`);
413
- samplers.push(BuildTexture(clearCoatMap, material, "clearcoat", new Color3(clearCoat, clearCoat, clearCoat), textureToExports, options));
414
- }
415
- else {
416
- inputs.push(`${pad}float inputs:clearcoat = ${clearCoat}`);
417
- }
418
- if (clearCoatRoughnessMap !== null) {
419
- inputs.push(`${pad}float inputs:clearcoatRoughness.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatRoughnessMap.uniqueId}_clearcoatRoughness.outputs:g>`);
420
- samplers.push(BuildTexture(clearCoatRoughnessMap, material, "clearcoatRoughness", new Color3(clearCoatRoughness, clearCoatRoughness, clearCoatRoughness), textureToExports, options));
421
- }
422
- else {
423
- inputs.push(`${pad}float inputs:clearcoatRoughness = ${clearCoatRoughness}`);
397
+ if (clearCoatEnabled) {
398
+ if (clearCoatMap !== null) {
399
+ inputs.push(`${pad}float inputs:clearcoat.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatMap.uniqueId}_clearcoat.outputs:r>`);
400
+ samplers.push(BuildTexture(clearCoatMap, material, "clearcoat", new Color3(clearCoat, clearCoat, clearCoat), textureToExports, options));
401
+ }
402
+ else {
403
+ inputs.push(`${pad}float inputs:clearcoat = ${clearCoat}`);
404
+ }
405
+ if (clearCoatRoughnessMap !== null) {
406
+ inputs.push(`${pad}float inputs:clearcoatRoughness.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatRoughnessMap.uniqueId}_clearcoatRoughness.outputs:g>`);
407
+ samplers.push(BuildTexture(clearCoatRoughnessMap, material, "clearcoatRoughness", new Color3(clearCoatRoughness, clearCoatRoughness, clearCoatRoughness), textureToExports, options));
408
+ }
409
+ else {
410
+ inputs.push(`${pad}float inputs:clearcoatRoughness = ${clearCoatRoughness}`);
411
+ }
424
412
  }
425
413
  inputs.push(`${pad}float inputs:ior = ${ior}`);
426
414
  return `
@@ -1 +1 @@
1
- {"version":3,"file":"usdzExporter.js","sourceRoot":"","sources":["../../../../dev/serializers/src/USDZ/usdzExporter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport type { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { PBRMetallicRoughnessMaterial } from \"core/Materials/PBR/pbrMetallicRoughnessMaterial\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2 } from \"core/Maths/math.vector\";\r\nimport type { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { DumpTools } from \"core/Misc/dumpTools\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\n\r\n/**\r\n * Ported from https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/USDZExporter.js\r\n * Thanks a lot to the three.js team for their amazing work!\r\n */\r\n\r\n// FFlate access\r\ndeclare const fflate: any;\r\n\r\n/**\r\n * Options for the USDZ export\r\n */\r\nexport interface IUSDZExportOptions {\r\n /**\r\n * URL to load the fflate library from\r\n */\r\n fflateUrl?: string;\r\n /**\r\n * Include anchoring properties in the USDZ file\r\n */\r\n includeAnchoringProperties?: boolean;\r\n /**\r\n * Anchoring type (plane by default)\r\n */\r\n anchoringType?: string;\r\n /**\r\n * Plane anchoring alignment (horizontal by default)\r\n */\r\n planeAnchoringAlignment?: string;\r\n /**\r\n * Model file name (model.usda by default)\r\n */\r\n modelFileName?: string;\r\n /**\r\n * Precision to use for number (5 by default)\r\n */\r\n precision?: number;\r\n /**\r\n * Export the camera (false by default)\r\n */\r\n exportCamera?: boolean;\r\n /**\r\n * Camera sensor width (35 by default)\r\n */\r\n cameraSensorWidth?: number;\r\n}\r\n\r\nfunction BuildHeader() {\r\n return `#usda 1.0\r\n (\r\n customLayerData = {\r\n string creator = \"Babylon.js USDZExportAsync\"\r\n }\r\n defaultPrim = \"Root\"\r\n metersPerUnit = 1\r\n upAxis = \"Y\"\r\n )`;\r\n}\r\n\r\nfunction BuildSceneStart(options: IUSDZExportOptions) {\r\n const alignment =\r\n options.includeAnchoringProperties === true\r\n ? `\r\n\t\ttoken preliminary:anchoring:type = \"${options.anchoringType}\"\r\n\t\ttoken preliminary:planeAnchoring:alignment = \"${options.planeAnchoringAlignment}\"`\r\n : \"\";\r\n return `def Xform \"Root\"\r\n {\r\n def Scope \"Scenes\" (\r\n kind = \"sceneLibrary\"\r\n )\r\n {\r\n def Xform \"Scene\" (\r\n customData = {\r\n bool preliminary_collidesWithEnvironment = 0\r\n string sceneName = \"Scene\"\r\n }\r\n sceneName = \"Scene\"\r\n )\r\n {${alignment}\r\n `;\r\n}\r\n\r\nfunction BuildSceneEnd() {\r\n return `\r\n }\r\n }\r\n }`;\r\n}\r\n\r\nfunction BuildMeshVertexCount(geometry: Geometry) {\r\n const count = geometry.getIndices()?.length ? geometry.getTotalIndices() : geometry.getTotalVertices();\r\n\r\n return Array(count / 3)\r\n .fill(3)\r\n .join(\", \");\r\n}\r\n\r\nfunction BuildMeshVertexIndices(geometry: Geometry) {\r\n const index = geometry.getIndices();\r\n const array = [];\r\n\r\n if (index !== null) {\r\n for (let i = 0; i < index.length; i++) {\r\n array.push(index[i]);\r\n }\r\n } else {\r\n const length = geometry.getTotalVertices();\r\n\r\n for (let i = 0; i < length; i++) {\r\n array.push(i);\r\n }\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector3Array(attribute: FloatArray, options: IUSDZExportOptions, stride = 3) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / stride; i++) {\r\n const x = attribute[i * stride];\r\n const y = attribute[i * stride + 1];\r\n const z = attribute[i * stride + 2];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${y.toPrecision(options.precision)}, ${z.toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector2Array(attribute: FloatArray, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / 2; i++) {\r\n const x = attribute[i * 2];\r\n const y = attribute[i * 2 + 1];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${(1 - y).toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildAdditionalAttributes(geometry: Geometry, options: IUSDZExportOptions) {\r\n let string = \"\";\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const id = i > 0 ? i : \"\";\r\n const uvAttribute = geometry.getVerticesData(VertexBuffer.UVKind + (id ? id + 1 : \"\")); // UV names go like \"uv\", \"uv2\", \"uv3\", etc.\r\n\r\n if (uvAttribute) {\r\n string += `\r\n\t\ttexCoord2f[] primvars:st${id} = [${BuildVector2Array(uvAttribute, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n }\r\n\r\n // vertex colors\r\n\r\n const colorAttribute = geometry.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n if (colorAttribute) {\r\n string += `\r\n\tcolor3f[] primvars:displayColor = [${BuildVector3Array(colorAttribute, options, colorAttribute.length / geometry.getTotalVertices())}] (\r\n\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n\r\n return string;\r\n}\r\n\r\nfunction BuildMesh(geometry: Geometry, options: IUSDZExportOptions) {\r\n const name = \"Geometry\";\r\n const position = geometry.getVerticesData(VertexBuffer.PositionKind);\r\n const normal = geometry.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (!position || !normal) {\r\n return;\r\n }\r\n\r\n return `\r\n\tdef Mesh \"${name}\"\r\n\t{\r\n\t\tint[] faceVertexCounts = [${BuildMeshVertexCount(geometry)}]\r\n\t\tint[] faceVertexIndices = [${BuildMeshVertexIndices(geometry)}]\r\n\t\tnormal3f[] normals = [${BuildVector3Array(normal, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)\r\n\t\tpoint3f[] points = [${BuildVector3Array(position, options)}]\r\n ${BuildAdditionalAttributes(geometry, options)}\r\n\t\tuniform token subdivisionScheme = \"none\"\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildMeshObject(geometry: Geometry, options: IUSDZExportOptions) {\r\n const mesh = BuildMesh(geometry, options);\r\n return `\r\n def \"Geometry\"\r\n {\r\n ${mesh}\r\n }\r\n `;\r\n}\r\n\r\nfunction BuildUSDFileAsString(dataToInsert: string) {\r\n let output = BuildHeader();\r\n output += dataToInsert;\r\n return fflate.strToU8(output);\r\n}\r\n\r\nfunction BuildMatrix(matrix: Matrix) {\r\n const array = matrix.m as number[];\r\n\r\n return `( ${BuildMatrixRow(array, 0)}, ${BuildMatrixRow(array, 4)}, ${BuildMatrixRow(array, 8)}, ${BuildMatrixRow(array, 12)} )`;\r\n}\r\n\r\nfunction BuildMatrixRow(array: number[], offset: number) {\r\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`;\r\n}\r\n\r\nfunction BuildXform(mesh: Mesh) {\r\n const name = \"Object_\" + mesh.uniqueId;\r\n const matrix = mesh.getWorldMatrix().clone();\r\n\r\n if (matrix.determinant() < 0) {\r\n Tools.Warn(`Exporting mesh ${mesh.name} with negative scale. Result may look incorrect in destination engine.`);\r\n }\r\n const transform = BuildMatrix(matrix);\r\n\r\n return `def Xform \"${name}\" (\r\n\tprepend references = @./geometries/Geometry_${mesh.geometry!.uniqueId}.usda@</Geometry>\r\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\r\n)\r\n{\r\n\tmatrix4d xformOp:transform = ${transform}\r\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\t\r\n\r\n rel material:binding = </Materials/Material_${mesh.material!.uniqueId}>\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildMaterials(materials: { [key: string]: Material }, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (const uuid in materials) {\r\n const material = materials[uuid];\r\n\r\n array.push(BuildMaterial(material, textureToExports, options));\r\n }\r\n\r\n return `\r\n def \"Materials\"\r\n{\r\n${array.join(\"\")}\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildWrapping(wrapping: number) {\r\n switch (wrapping) {\r\n case Constants.TEXTURE_CLAMP_ADDRESSMODE:\r\n return \"clamp\";\r\n case Constants.TEXTURE_MIRROR_ADDRESSMODE:\r\n return \"mirror\";\r\n case Constants.TEXTURE_WRAP_ADDRESSMODE:\r\n default:\r\n return \"repeat\";\r\n }\r\n}\r\n\r\nfunction BuildColor4(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b}, 1.0)`;\r\n}\r\n\r\nfunction BuildVector2(vector: Vector2) {\r\n return `(${vector.x}, ${vector.y})`;\r\n}\r\n\r\nfunction BuildColor(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b})`;\r\n}\r\n\r\nfunction BuildTexture(\r\n texture: Texture,\r\n material: Material,\r\n mapType: string,\r\n color: Nullable<Color3>,\r\n textureToExports: { [key: string]: BaseTexture },\r\n options: IUSDZExportOptions\r\n) {\r\n const id = texture.getInternalTexture()!.uniqueId + \"_\" + texture.invertY;\r\n\r\n textureToExports[id] = texture;\r\n\r\n const uv = texture.coordinatesIndex > 0 ? \"st\" + texture.coordinatesIndex : \"st\";\r\n const repeat = new Vector2(texture.uScale, texture.vScale);\r\n const offset = new Vector2(texture.uOffset, texture.vOffset);\r\n const rotation = texture.wAng;\r\n\r\n // rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\r\n const xRotationOffset = Math.sin(rotation);\r\n const yRotationOffset = Math.cos(rotation);\r\n\r\n // texture coordinates start in the opposite corner, need to correct\r\n offset.y = 1 - offset.y - repeat.y;\r\n\r\n offset.x += xRotationOffset * repeat.x;\r\n offset.y += (1 - yRotationOffset) * repeat.y;\r\n\r\n return `\r\n def Shader \"PrimvarReader_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdPrimvarReader_float2\"\r\n float2 inputs:fallback = (0.0, 0.0)\r\n token inputs:varname = \"${uv}\"\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Transform2d_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdTransform2d\"\r\n token inputs:in.connect = </Materials/Material_${material.uniqueId}/PrimvarReader_${mapType}.outputs:result>\r\n float inputs:rotation = ${(rotation * (180 / Math.PI)).toFixed(options.precision)}\r\n float2 inputs:scale = ${BuildVector2(repeat)}\r\n float2 inputs:translation = ${BuildVector2(offset)}\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Texture_${texture.uniqueId}_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdUVTexture\"\r\n asset inputs:file = @textures/Texture_${id}.png@\r\n float2 inputs:st.connect = </Materials/Material_${material.uniqueId}/Transform2d_${mapType}.outputs:result>\r\n ${color ? \"float4 inputs:scale = \" + BuildColor4(color) : \"\"}\r\n token inputs:sourceColorSpace = \"${texture.gammaSpace ? \"raw\" : \"sRGB\"}\"\r\n token inputs:wrapS = \"${BuildWrapping(texture.wrapU)}\"\r\n token inputs:wrapT = \"${BuildWrapping(texture.wrapV)}\"\r\n float outputs:r\r\n float outputs:g\r\n float outputs:b\r\n float3 outputs:rgb\r\n ${material.needAlphaBlending() ? \"float outputs:a\" : \"\"}\r\n }`;\r\n}\r\n\r\nfunction ExtractTextureInformations(material: Material) {\r\n const className = material.getClassName();\r\n\r\n switch (className) {\r\n case \"StandardMaterial\":\r\n return {\r\n diffuseMap: (material as StandardMaterial).diffuseTexture,\r\n diffuse: (material as StandardMaterial).diffuseColor,\r\n alphaCutOff: (material as StandardMaterial).alphaCutOff,\r\n emissiveMap: (material as StandardMaterial).emissiveTexture,\r\n emissive: (material as StandardMaterial).emissiveColor,\r\n roughnessMap: null,\r\n normalMap: null,\r\n metalnessMap: null,\r\n roughness: 1,\r\n metalness: 0,\r\n aoMap: null,\r\n aoMapIntensity: 0,\r\n alphaMap: (material as StandardMaterial).opacityTexture,\r\n ior: 1,\r\n clearCoat: 0,\r\n clearCoatMap: null,\r\n clearCoatRoughness: 0,\r\n clearCoatRoughnessMap: null,\r\n };\r\n case \"PBRMaterial\":\r\n return {\r\n diffuseMap: (material as PBRMaterial).albedoTexture,\r\n diffuse: (material as PBRMaterial).albedoColor,\r\n alphaCutOff: (material as PBRMaterial).alphaCutOff,\r\n emissiveMap: (material as PBRMaterial).emissiveTexture,\r\n emissive: (material as PBRMaterial).emissiveColor,\r\n normalMap: (material as PBRMaterial).bumpTexture,\r\n roughnessMap: (material as PBRMaterial).metallicTexture,\r\n roughnessChannel: (material as PBRMaterial).useRoughnessFromMetallicTextureAlpha ? \"a\" : \"g\",\r\n roughness: (material as PBRMaterial).roughness || 1,\r\n metalnessMap: (material as PBRMaterial).metallicTexture,\r\n metalnessChannel: (material as PBRMaterial).useMetallnessFromMetallicTextureBlue ? \"b\" : \"r\",\r\n metalness: (material as PBRMaterial).metallic || 0,\r\n aoMap: (material as PBRMaterial).ambientTexture,\r\n aoMapChannel: (material as PBRMaterial).useAmbientInGrayScale ? \"r\" : \"rgb\",\r\n aoMapIntensity: (material as PBRMaterial).ambientTextureStrength,\r\n alphaMap: (material as PBRMaterial).opacityTexture,\r\n ior: (material as PBRMaterial).indexOfRefraction,\r\n clearCoat: (material as PBRMaterial).clearCoat.intensity,\r\n clearCoatMap: (material as PBRMaterial).clearCoat.texture,\r\n clearCoatRoughness: (material as PBRMaterial).clearCoat.roughness,\r\n clearCoatRoughnessMap: (material as PBRMaterial).clearCoat.useRoughnessFromMainTexture\r\n ? (material as PBRMaterial).clearCoat.texture\r\n : (material as PBRMaterial).clearCoat.textureRoughness,\r\n };\r\n case \"PBRMetallicRoughnessMaterial\":\r\n return {\r\n diffuseMap: (material as PBRMetallicRoughnessMaterial).baseTexture,\r\n diffuse: (material as PBRMetallicRoughnessMaterial).baseColor,\r\n alphaCutOff: (material as PBRMetallicRoughnessMaterial).alphaCutOff,\r\n emissiveMap: (material as PBRMetallicRoughnessMaterial).emissiveTexture,\r\n emissive: (material as PBRMetallicRoughnessMaterial).emissiveColor,\r\n normalMap: (material as PBRMetallicRoughnessMaterial).normalTexture,\r\n roughnessMap: (material as PBRMaterial).metallicTexture,\r\n roughnessChannel: (material as PBRMaterial).useRoughnessFromMetallicTextureAlpha ? \"a\" : \"g\",\r\n roughness: (material as PBRMetallicRoughnessMaterial).roughness || 1,\r\n metalnessMap: (material as PBRMaterial).metallicTexture,\r\n metalnessChannel: (material as PBRMaterial).useMetallnessFromMetallicTextureBlue ? \"b\" : \"r\",\r\n metalness: (material as PBRMetallicRoughnessMaterial).metallic || 0,\r\n aoMap: (material as PBRMaterial).ambientTexture,\r\n aoMapChannel: (material as PBRMaterial).useAmbientInGrayScale ? \"r\" : \"rgb\",\r\n aoMapIntensity: (material as PBRMaterial).ambientTextureStrength,\r\n alphaMap: (material as PBRMaterial).opacityTexture,\r\n ior: (material as PBRMaterial).indexOfRefraction,\r\n clearCoat: (material as PBRMetallicRoughnessMaterial).clearCoat.intensity,\r\n clearCoatMap: (material as PBRMetallicRoughnessMaterial).clearCoat.texture,\r\n clearCoatRoughness: (material as PBRMetallicRoughnessMaterial).clearCoat.roughness,\r\n clearCoatRoughnessMap: (material as PBRMetallicRoughnessMaterial).clearCoat.useRoughnessFromMainTexture\r\n ? (material as PBRMetallicRoughnessMaterial).clearCoat.texture\r\n : (material as PBRMetallicRoughnessMaterial).clearCoat.textureRoughness,\r\n };\r\n default:\r\n return {\r\n diffuseMap: null,\r\n diffuse: null,\r\n emissiveMap: null,\r\n emissemissiveiveColor: null,\r\n normalMap: null,\r\n roughnessMap: null,\r\n metalnessMap: null,\r\n alphaCutOff: 0,\r\n roughness: 0,\r\n metalness: 0,\r\n aoMap: null,\r\n aoMapIntensity: 0,\r\n alphaMap: null,\r\n ior: 1,\r\n clearCoat: 0,\r\n clearCoatMap: null,\r\n clearCoatRoughness: 0,\r\n clearCoatRoughnessMap: null,\r\n };\r\n }\r\n}\r\n\r\nfunction BuildMaterial(material: Material, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\r\n\r\n const pad = \"\t\t\t\";\r\n const inputs = [];\r\n const samplers = [];\r\n\r\n const {\r\n diffuseMap,\r\n diffuse,\r\n alphaCutOff,\r\n emissiveMap,\r\n emissive,\r\n normalMap,\r\n roughnessMap,\r\n roughnessChannel,\r\n roughness,\r\n metalnessMap,\r\n metalnessChannel,\r\n metalness,\r\n aoMap,\r\n aoMapChannel,\r\n aoMapIntensity,\r\n alphaMap,\r\n ior,\r\n clearCoat,\r\n clearCoatMap,\r\n clearCoatRoughness,\r\n clearCoatRoughnessMap,\r\n } = ExtractTextureInformations(material);\r\n\r\n if (diffuseMap !== null) {\r\n inputs.push(`${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:rgb>`);\r\n\r\n if (material.needAlphaBlending()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n } else if (material.needAlphaTesting()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = ${alphaCutOff}`);\r\n }\r\n\r\n samplers.push(BuildTexture(diffuseMap as Texture, material, \"diffuse\", diffuse, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}color3f inputs:diffuseColor = ${BuildColor(diffuse || Color3.White())}`);\r\n }\r\n\r\n if (emissiveMap !== null) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.uniqueId}/Texture_${emissiveMap.uniqueId}_emissive.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(emissiveMap as Texture, material, \"emissive\", emissive, textureToExports, options));\r\n } else if (emissive && emissive.toLuminance() > 0) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor = ${BuildColor(emissive)}`);\r\n }\r\n\r\n if (normalMap !== null) {\r\n inputs.push(`${pad}normal3f inputs:normal.connect = </Materials/Material_${material.uniqueId}/Texture_${normalMap.uniqueId}_normal.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(normalMap as Texture, material, \"normal\", null, textureToExports, options));\r\n }\r\n\r\n if (aoMap !== null) {\r\n inputs.push(`${pad}float inputs:occlusion.connect = </Materials/Material_${material.uniqueId}/Texture_${aoMap.uniqueId}_occlusion.outputs:${aoMapChannel}>`);\r\n\r\n samplers.push(BuildTexture(aoMap as Texture, material, \"occlusion\", new Color3(aoMapIntensity, aoMapIntensity, aoMapIntensity), textureToExports, options));\r\n }\r\n\r\n if (roughnessMap !== null) {\r\n inputs.push(`${pad}float inputs:roughness.connect = </Materials/Material_${material.uniqueId}/Texture_${roughnessMap.uniqueId}_roughness.outputs:${roughnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(roughnessMap as Texture, material, \"roughness\", new Color3(roughness, roughness, roughness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:roughness = ${roughness}`);\r\n }\r\n\r\n if (metalnessMap !== null) {\r\n inputs.push(`${pad}float inputs:metallic.connect = </Materials/Material_${material.uniqueId}/Texture_${metalnessMap.uniqueId}_metallic.outputs:${metalnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(metalnessMap as Texture, material, \"metallic\", new Color3(metalness, metalness, metalness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:metallic = ${metalness}`);\r\n }\r\n\r\n if (alphaMap !== null) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${alphaMap.uniqueId}_opacity.outputs:r>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = 0.0001`);\r\n\r\n samplers.push(BuildTexture(alphaMap as Texture, material, \"opacity\", null, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:opacity = ${material.alpha}`);\r\n }\r\n\r\n if (clearCoatMap !== null) {\r\n inputs.push(`${pad}float inputs:clearcoat.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatMap.uniqueId}_clearcoat.outputs:r>`);\r\n samplers.push(BuildTexture(clearCoatMap as Texture, material, \"clearcoat\", new Color3(clearCoat, clearCoat, clearCoat), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:clearcoat = ${clearCoat}`);\r\n }\r\n\r\n if (clearCoatRoughnessMap !== null) {\r\n inputs.push(\r\n `${pad}float inputs:clearcoatRoughness.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatRoughnessMap.uniqueId}_clearcoatRoughness.outputs:g>`\r\n );\r\n samplers.push(\r\n BuildTexture(\r\n clearCoatRoughnessMap as Texture,\r\n material,\r\n \"clearcoatRoughness\",\r\n new Color3(clearCoatRoughness, clearCoatRoughness, clearCoatRoughness),\r\n textureToExports,\r\n options\r\n )\r\n );\r\n } else {\r\n inputs.push(`${pad}float inputs:clearcoatRoughness = ${clearCoatRoughness}`);\r\n }\r\n\r\n inputs.push(`${pad}float inputs:ior = ${ior}`);\r\n\r\n return `\r\n\tdef Material \"Material_${material.uniqueId}\"\r\n\t{\r\n\t\tdef Shader \"PreviewSurface\"\r\n\t\t{\r\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\r\n${inputs.join(\"\\n\")}\r\n\t\t\tint inputs:useSpecularWorkflow = 0\r\n\t\t\ttoken outputs:surface\r\n\t\t}\r\n\r\n\t\ttoken outputs:surface.connect = </Materials/Material_${material.uniqueId}/PreviewSurface.outputs:surface>\r\n\r\n${samplers.join(\"\\n\")}\r\n\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildCamera(camera: Camera, options: IUSDZExportOptions) {\r\n const name = \"Camera_\" + camera.uniqueId;\r\n const matrix = Matrix.RotationY(Math.PI).multiply(camera.getWorldMatrix()); // work towards positive z\r\n\r\n const transform = BuildMatrix(matrix);\r\n\r\n if (camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat horizontalAperture = ${((Math.abs(camera.orthoLeft || 1) + Math.abs(camera.orthoRight || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${((Math.abs(camera.orthoTop || 1) + Math.abs(camera.orthoBottom || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\ttoken projection = \"orthographic\"\r\n\t\t}\r\n\t\r\n\t`;\r\n } else {\r\n const aspect = camera.getEngine().getAspectRatio(camera);\r\n const sensorwidth = options.cameraSensorWidth || 35;\r\n\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat focalLength = ${(sensorwidth / (2 * Math.tan(camera.fov * 0.5))).toPrecision(options.precision)}\r\n token projection = \"perspective\"\r\n\t\t\tfloat horizontalAperture = ${(sensorwidth * aspect).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${(sensorwidth / aspect).toPrecision(options.precision)} \r\n\t\t}\r\n\t\r\n\t`;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param scene scene to export\r\n * @param options options to configure the export\r\n * @param meshPredicate predicate to filter the meshes to export\r\n * @returns a uint8 array containing the USDZ file\r\n * @see [Simple sphere](https://playground.babylonjs.com/#H2G5XW#6)\r\n * @see [Red sphere](https://playground.babylonjs.com/#H2G5XW#7)\r\n * @see [Boombox](https://playground.babylonjs.com/#5N3RWK#5)\r\n */\r\nexport async function USDZExportAsync(scene: Scene, options: Partial<IUSDZExportOptions>, meshPredicate?: (m: Mesh) => boolean): Promise<Uint8Array> {\r\n const localOptions = {\r\n fflateUrl: \"https://unpkg.com/fflate@0.8.2\",\r\n includeAnchoringProperties: true,\r\n anchoringType: \"plane\",\r\n planeAnchoringAlignment: \"horizontal\",\r\n modelFileName: \"model.usda\",\r\n precision: 5,\r\n exportCamera: false,\r\n cameraSensorWidth: 35,\r\n ...options,\r\n };\r\n\r\n // Get the fflate library\r\n if (typeof fflate === \"undefined\") {\r\n await Tools.LoadScriptAsync(localOptions.fflateUrl);\r\n }\r\n\r\n // Start the export\r\n const files: { [key: string]: any } = {};\r\n\r\n // model file should be first in USDZ archive so we init it here\r\n files[localOptions.modelFileName] = null;\r\n\r\n let output = BuildHeader();\r\n output += BuildSceneStart(localOptions);\r\n\r\n const materialToExports: { [key: string]: Material } = {};\r\n\r\n // Meshes\r\n for (const abstractMesh of scene.meshes) {\r\n if (abstractMesh.getTotalVertices() === 0) {\r\n continue;\r\n }\r\n const mesh = abstractMesh as Mesh;\r\n const geometry = mesh.geometry;\r\n const material = mesh.material;\r\n\r\n if (!material || !geometry || (meshPredicate && !meshPredicate(mesh))) {\r\n continue;\r\n }\r\n\r\n const supportedMaterials = [\"StandardMaterial\", \"PBRMaterial\", \"PBRMetallicRoughnessMaterial\"];\r\n\r\n if (supportedMaterials.indexOf(material.getClassName()) !== -1) {\r\n const geometryFileName = \"geometries/Geometry_\" + geometry.uniqueId + \".usda\";\r\n\r\n if (!(geometryFileName in files)) {\r\n const meshObject = BuildMeshObject(geometry, localOptions);\r\n files[geometryFileName] = BuildUSDFileAsString(meshObject);\r\n }\r\n\r\n if (!(material.uniqueId in materialToExports)) {\r\n materialToExports[material.uniqueId] = material;\r\n }\r\n\r\n output += BuildXform(mesh);\r\n } else {\r\n Tools.Warn(\"USDZExportAsync does not support this material type: \" + material.getClassName());\r\n }\r\n }\r\n\r\n // Camera\r\n if (scene.activeCamera && localOptions.exportCamera) {\r\n output += BuildCamera(scene.activeCamera, localOptions);\r\n }\r\n\r\n // Close scene\r\n output += BuildSceneEnd();\r\n\r\n // Materials\r\n const textureToExports: { [key: string]: BaseTexture } = {};\r\n output += BuildMaterials(materialToExports, textureToExports, localOptions);\r\n\r\n // Compress\r\n files[localOptions.modelFileName] = fflate.strToU8(output);\r\n\r\n // Textures\r\n for (const id in textureToExports) {\r\n const texture = textureToExports[id];\r\n\r\n const size = texture.getSize();\r\n // eslint-disable-next-line no-await-in-loop\r\n const textureData = await texture.readPixels();\r\n\r\n if (!textureData) {\r\n throw new Error(\"Texture data is not available\");\r\n }\r\n\r\n // eslint-disable-next-line no-await-in-loop\r\n const fileContent = await DumpTools.DumpDataAsync(size.width, size.height, textureData, \"image/png\", undefined, false, true);\r\n\r\n files[`textures/Texture_${id}.png`] = new Uint8Array(fileContent as ArrayBuffer).slice(); // This is to avoid getting a link and not a copy\r\n }\r\n\r\n // 64 byte alignment\r\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\r\n\r\n let offset = 0;\r\n\r\n for (const filename in files) {\r\n const file = files[filename];\r\n if (!file) {\r\n continue;\r\n }\r\n const headerSize = 34 + filename.length;\r\n\r\n offset += headerSize;\r\n\r\n const offsetMod64 = offset & 63;\r\n\r\n if (offsetMod64 !== 4) {\r\n const padLength = 64 - offsetMod64;\r\n const padding = new Uint8Array(padLength);\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n files[filename] = [file, { extra: { 12345: padding } }];\r\n }\r\n\r\n offset = file.length;\r\n }\r\n\r\n return fflate.zipSync(files, { level: 0 });\r\n}\r\n"]}
1
+ {"version":3,"file":"usdzExporter.js","sourceRoot":"","sources":["../../../../dev/serializers/src/USDZ/usdzExporter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { VertexBuffer } from \"core/Buffers/buffer\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2 } from \"core/Maths/math.vector\";\r\nimport type { Geometry } from \"core/Meshes/geometry\";\r\nimport type { Mesh } from \"core/Meshes/mesh\";\r\nimport { DumpTools } from \"core/Misc/dumpTools\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { FloatArray, Nullable } from \"core/types\";\r\nimport { IsNoopNode } from \"../exportUtils\";\r\n\r\n/**\r\n * Ported from https://github.com/mrdoob/three.js/blob/master/examples/jsm/exporters/USDZExporter.js\r\n * Thanks a lot to the three.js team for their amazing work!\r\n */\r\n\r\n// FFlate access\r\ndeclare const fflate: any;\r\n\r\n/**\r\n * Options for the USDZ export\r\n */\r\nexport interface IUSDZExportOptions {\r\n /**\r\n * URL to load the fflate library from\r\n */\r\n fflateUrl?: string;\r\n /**\r\n * Include anchoring properties in the USDZ file\r\n */\r\n includeAnchoringProperties?: boolean;\r\n /**\r\n * Anchoring type (plane by default)\r\n */\r\n anchoringType?: string;\r\n /**\r\n * Plane anchoring alignment (horizontal by default)\r\n */\r\n planeAnchoringAlignment?: string;\r\n /**\r\n * Model file name (model.usda by default)\r\n */\r\n modelFileName?: string;\r\n /**\r\n * Precision to use for number (5 by default)\r\n */\r\n precision?: number;\r\n /**\r\n * Export the camera (false by default)\r\n */\r\n exportCamera?: boolean;\r\n /**\r\n * Camera sensor width (35 by default)\r\n */\r\n cameraSensorWidth?: number;\r\n}\r\n\r\nfunction BuildHeader() {\r\n return `#usda 1.0\r\n (\r\n customLayerData = {\r\n string creator = \"Babylon.js USDZExportAsync\"\r\n }\r\n defaultPrim = \"Root\"\r\n metersPerUnit = 1\r\n upAxis = \"Y\"\r\n )`;\r\n}\r\n\r\nfunction BuildSceneStart(options: IUSDZExportOptions) {\r\n const alignment =\r\n options.includeAnchoringProperties === true\r\n ? `\r\n\t\ttoken preliminary:anchoring:type = \"${options.anchoringType}\"\r\n\t\ttoken preliminary:planeAnchoring:alignment = \"${options.planeAnchoringAlignment}\"`\r\n : \"\";\r\n return `def Xform \"Root\"\r\n {\r\n def Scope \"Scenes\" (\r\n kind = \"sceneLibrary\"\r\n )\r\n {\r\n def Xform \"Scene\" (\r\n customData = {\r\n bool preliminary_collidesWithEnvironment = 0\r\n string sceneName = \"Scene\"\r\n }\r\n sceneName = \"Scene\"\r\n )\r\n {${alignment}\r\n `;\r\n}\r\n\r\nfunction BuildSceneEnd() {\r\n return `\r\n }\r\n }\r\n }`;\r\n}\r\n\r\nfunction BuildMeshVertexCount(geometry: Geometry) {\r\n const count = geometry.getIndices()?.length ? geometry.getTotalIndices() : geometry.getTotalVertices();\r\n\r\n return Array(count / 3)\r\n .fill(3)\r\n .join(\", \");\r\n}\r\n\r\nfunction BuildMeshVertexIndices(geometry: Geometry) {\r\n const index = geometry.getIndices();\r\n const array = [];\r\n\r\n if (index !== null) {\r\n for (let i = 0; i < index.length; i++) {\r\n array.push(index[i]);\r\n }\r\n } else {\r\n const length = geometry.getTotalVertices();\r\n\r\n for (let i = 0; i < length; i++) {\r\n array.push(i);\r\n }\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector3Array(attribute: FloatArray, options: IUSDZExportOptions, stride = 3) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / stride; i++) {\r\n const x = attribute[i * stride];\r\n const y = attribute[i * stride + 1];\r\n const z = attribute[i * stride + 2];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${y.toPrecision(options.precision)}, ${z.toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildVector2Array(attribute: FloatArray, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (let i = 0; i < attribute.length / 2; i++) {\r\n const x = attribute[i * 2];\r\n const y = attribute[i * 2 + 1];\r\n\r\n array.push(`(${x.toPrecision(options.precision)}, ${(1 - y).toPrecision(options.precision)})`);\r\n }\r\n\r\n return array.join(\", \");\r\n}\r\n\r\nfunction BuildAdditionalAttributes(geometry: Geometry, options: IUSDZExportOptions) {\r\n let string = \"\";\r\n\r\n for (let i = 0; i < 4; i++) {\r\n const id = i > 0 ? i : \"\";\r\n const uvAttribute = geometry.getVerticesData(VertexBuffer.UVKind + (id ? id + 1 : \"\")); // UV names go like \"uv\", \"uv2\", \"uv3\", etc.\r\n\r\n if (uvAttribute) {\r\n string += `\r\n\t\ttexCoord2f[] primvars:st${id} = [${BuildVector2Array(uvAttribute, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n }\r\n\r\n // vertex colors\r\n\r\n const colorAttribute = geometry.getVerticesData(VertexBuffer.ColorKind);\r\n\r\n if (colorAttribute) {\r\n string += `\r\n\tcolor3f[] primvars:displayColor = [${BuildVector3Array(colorAttribute, options, colorAttribute.length / geometry.getTotalVertices())}] (\r\n\t\tinterpolation = \"vertex\"\r\n\t\t)`;\r\n }\r\n\r\n return string;\r\n}\r\n\r\nfunction BuildMesh(geometry: Geometry, options: IUSDZExportOptions) {\r\n const name = \"Geometry\";\r\n const position = geometry.getVerticesData(VertexBuffer.PositionKind);\r\n const normal = geometry.getVerticesData(VertexBuffer.NormalKind);\r\n\r\n if (!position || !normal) {\r\n return;\r\n }\r\n\r\n return `\r\n\tdef Mesh \"${name}\"\r\n\t{\r\n\t\tint[] faceVertexCounts = [${BuildMeshVertexCount(geometry)}]\r\n\t\tint[] faceVertexIndices = [${BuildMeshVertexIndices(geometry)}]\r\n\t\tnormal3f[] normals = [${BuildVector3Array(normal, options)}] (\r\n\t\t\tinterpolation = \"vertex\"\r\n\t\t)\r\n\t\tpoint3f[] points = [${BuildVector3Array(position, options)}]\r\n ${BuildAdditionalAttributes(geometry, options)}\r\n\t\tuniform token subdivisionScheme = \"none\"\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildMeshObject(geometry: Geometry, options: IUSDZExportOptions) {\r\n const mesh = BuildMesh(geometry, options);\r\n return `\r\n def \"Geometry\"\r\n {\r\n ${mesh}\r\n }\r\n `;\r\n}\r\n\r\nfunction BuildUSDFileAsString(dataToInsert: string) {\r\n let output = BuildHeader();\r\n output += dataToInsert;\r\n return fflate.strToU8(output);\r\n}\r\n\r\nfunction GetMeshWorldMatrix(mesh: Mesh) {\r\n const matrix = mesh.getWorldMatrix().clone();\r\n\r\n // If there's a LH->RH __root__ conversion node, cancel out its effect\r\n const useRightHandedSystem = mesh.getScene().useRightHandedSystem;\r\n if (!useRightHandedSystem) {\r\n let current = mesh.parent;\r\n while (current) {\r\n if (IsNoopNode(current, useRightHandedSystem)) {\r\n matrix.multiplyToRef(current.getWorldMatrix().invert(), matrix);\r\n break;\r\n }\r\n current = current.parent;\r\n }\r\n }\r\n\r\n if (matrix.determinant() < 0) {\r\n Tools.Warn(`Exporting mesh ${mesh.name} with negative scale. Result may look incorrect in destination engine.`);\r\n }\r\n\r\n return matrix;\r\n}\r\n\r\nfunction BuildMatrix(matrix: Matrix) {\r\n const array = matrix.m as number[];\r\n\r\n return `( ${BuildMatrixRow(array, 0)}, ${BuildMatrixRow(array, 4)}, ${BuildMatrixRow(array, 8)}, ${BuildMatrixRow(array, 12)} )`;\r\n}\r\n\r\nfunction BuildMatrixRow(array: number[], offset: number) {\r\n return `(${array[offset + 0]}, ${array[offset + 1]}, ${array[offset + 2]}, ${array[offset + 3]})`;\r\n}\r\n\r\nfunction BuildXform(mesh: Mesh) {\r\n const name = \"Object_\" + mesh.uniqueId;\r\n const matrix = GetMeshWorldMatrix(mesh);\r\n const transform = BuildMatrix(matrix);\r\n\r\n return `def Xform \"${name}\" (\r\n\tprepend references = @./geometries/Geometry_${mesh.geometry!.uniqueId}.usda@</Geometry>\r\n\tprepend apiSchemas = [\"MaterialBindingAPI\"]\r\n)\r\n{\r\n\tmatrix4d xformOp:transform = ${transform}\r\n\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\t\r\n\r\n rel material:binding = </Materials/Material_${mesh.material!.uniqueId}>\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildMaterials(materials: { [key: string]: Material }, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n const array = [];\r\n\r\n for (const uuid in materials) {\r\n const material = materials[uuid];\r\n\r\n array.push(BuildMaterial(material, textureToExports, options));\r\n }\r\n\r\n return `\r\n def \"Materials\"\r\n{\r\n${array.join(\"\")}\r\n}\r\n\r\n`;\r\n}\r\n\r\nfunction BuildWrapping(wrapping: number) {\r\n switch (wrapping) {\r\n case Constants.TEXTURE_CLAMP_ADDRESSMODE:\r\n return \"clamp\";\r\n case Constants.TEXTURE_MIRROR_ADDRESSMODE:\r\n return \"mirror\";\r\n case Constants.TEXTURE_WRAP_ADDRESSMODE:\r\n default:\r\n return \"repeat\";\r\n }\r\n}\r\n\r\nfunction BuildColor4(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b}, 1.0)`;\r\n}\r\n\r\nfunction BuildVector2(vector: Vector2) {\r\n return `(${vector.x}, ${vector.y})`;\r\n}\r\n\r\nfunction BuildColor(color: Color3) {\r\n return `(${color.r}, ${color.g}, ${color.b})`;\r\n}\r\n\r\nfunction BuildTexture(\r\n texture: Texture,\r\n material: Material,\r\n mapType: string,\r\n color: Nullable<Color3>,\r\n textureToExports: { [key: string]: BaseTexture },\r\n options: IUSDZExportOptions\r\n) {\r\n const id = texture.getInternalTexture()!.uniqueId + \"_\" + texture.invertY;\r\n\r\n textureToExports[id] = texture;\r\n\r\n const uv = texture.coordinatesIndex > 0 ? \"st\" + texture.coordinatesIndex : \"st\";\r\n const repeat = new Vector2(texture.uScale, texture.vScale);\r\n const offset = new Vector2(texture.uOffset, texture.vOffset);\r\n const rotation = texture.wAng;\r\n\r\n // rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\r\n const xRotationOffset = Math.sin(rotation);\r\n const yRotationOffset = Math.cos(rotation);\r\n\r\n // texture coordinates start in the opposite corner, need to correct\r\n offset.y = 1 - offset.y - repeat.y;\r\n\r\n offset.x += xRotationOffset * repeat.x;\r\n offset.y += (1 - yRotationOffset) * repeat.y;\r\n\r\n return `\r\n def Shader \"PrimvarReader_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdPrimvarReader_float2\"\r\n float2 inputs:fallback = (0.0, 0.0)\r\n token inputs:varname = \"${uv}\"\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Transform2d_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdTransform2d\"\r\n token inputs:in.connect = </Materials/Material_${material.uniqueId}/PrimvarReader_${mapType}.outputs:result>\r\n float inputs:rotation = ${(rotation * (180 / Math.PI)).toFixed(options.precision)}\r\n float2 inputs:scale = ${BuildVector2(repeat)}\r\n float2 inputs:translation = ${BuildVector2(offset)}\r\n float2 outputs:result\r\n }\r\n\r\n def Shader \"Texture_${texture.uniqueId}_${mapType}\"\r\n {\r\n uniform token info:id = \"UsdUVTexture\"\r\n asset inputs:file = @textures/Texture_${id}.png@\r\n float2 inputs:st.connect = </Materials/Material_${material.uniqueId}/Transform2d_${mapType}.outputs:result>\r\n ${color ? \"float4 inputs:scale = \" + BuildColor4(color) : \"\"}\r\n token inputs:sourceColorSpace = \"${texture.gammaSpace ? \"raw\" : \"sRGB\"}\"\r\n token inputs:wrapS = \"${BuildWrapping(texture.wrapU)}\"\r\n token inputs:wrapT = \"${BuildWrapping(texture.wrapV)}\"\r\n float outputs:r\r\n float outputs:g\r\n float outputs:b\r\n float3 outputs:rgb\r\n ${material.needAlphaBlending() ? \"float outputs:a\" : \"\"}\r\n }`;\r\n}\r\n\r\nfunction ExtractTextureInformations(material: Material) {\r\n const defaults = {\r\n diffuseMap: null,\r\n diffuse: null,\r\n alphaCutOff: 0,\r\n emissiveMap: null,\r\n emissive: null,\r\n normalMap: null,\r\n roughnessMap: null,\r\n roughnessChannel: \"a\",\r\n roughness: 0,\r\n metalnessMap: null,\r\n metalnessChannel: \"r\",\r\n metalness: 0,\r\n aoMap: null,\r\n aoMapChannel: \"rgb\",\r\n aoMapIntensity: 0,\r\n alphaMap: null,\r\n ior: 1,\r\n clearCoatEnabled: false,\r\n clearCoat: 0,\r\n clearCoatMap: null,\r\n clearCoatRoughness: 0,\r\n clearCoatRoughnessMap: null,\r\n };\r\n\r\n if (material instanceof StandardMaterial) {\r\n return {\r\n ...defaults,\r\n diffuseMap: material.diffuseTexture,\r\n diffuse: material.diffuseColor,\r\n alphaCutOff: material.alphaCutOff,\r\n emissiveMap: material.emissiveTexture,\r\n emissive: material.emissiveColor,\r\n roughness: 1,\r\n alphaMap: material.opacityTexture,\r\n };\r\n }\r\n if (material instanceof PBRBaseMaterial) {\r\n return {\r\n ...defaults,\r\n diffuseMap: material._albedoTexture,\r\n diffuse: material._albedoColor,\r\n alphaCutOff: material._alphaCutOff,\r\n emissiveMap: material._emissiveTexture,\r\n emissive: material._emissiveColor,\r\n normalMap: material._bumpTexture,\r\n roughnessMap: material._metallicTexture,\r\n roughnessChannel: material._useRoughnessFromMetallicTextureAlpha ? \"a\" : \"g\",\r\n roughness: material._roughness ?? 1,\r\n metalnessMap: material._metallicTexture,\r\n metalnessChannel: material._useMetallnessFromMetallicTextureBlue ? \"b\" : \"r\",\r\n metalness: material._metallic ?? 0,\r\n aoMap: material._ambientTexture,\r\n aoMapChannel: material._useAmbientInGrayScale ? \"r\" : \"rgb\",\r\n aoMapIntensity: material._ambientTextureStrength,\r\n alphaMap: material._opacityTexture,\r\n ior: material.subSurface.indexOfRefraction,\r\n clearCoatEnabled: material.clearCoat.isEnabled,\r\n clearCoat: material.clearCoat.intensity,\r\n clearCoatMap: material.clearCoat.texture,\r\n clearCoatRoughness: material.clearCoat.roughness,\r\n clearCoatRoughnessMap: material.clearCoat.useRoughnessFromMainTexture ? material.clearCoat.texture : material.clearCoat.textureRoughness,\r\n };\r\n }\r\n return defaults;\r\n}\r\n\r\nfunction BuildMaterial(material: Material, textureToExports: { [key: string]: BaseTexture }, options: IUSDZExportOptions) {\r\n // https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\r\n\r\n const pad = \"\t\t\t\";\r\n const inputs = [];\r\n const samplers = [];\r\n\r\n const {\r\n diffuseMap,\r\n diffuse,\r\n alphaCutOff,\r\n emissiveMap,\r\n emissive,\r\n normalMap,\r\n roughnessMap,\r\n roughnessChannel,\r\n roughness,\r\n metalnessMap,\r\n metalnessChannel,\r\n metalness,\r\n aoMap,\r\n aoMapChannel,\r\n aoMapIntensity,\r\n alphaMap,\r\n ior,\r\n clearCoatEnabled,\r\n clearCoat,\r\n clearCoatMap,\r\n clearCoatRoughness,\r\n clearCoatRoughnessMap,\r\n } = ExtractTextureInformations(material);\r\n\r\n if (diffuseMap !== null) {\r\n inputs.push(`${pad}color3f inputs:diffuseColor.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:rgb>`);\r\n\r\n if (material.needAlphaBlending()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n } else if (material.needAlphaTesting()) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${diffuseMap.uniqueId}_diffuse.outputs:a>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = ${alphaCutOff}`);\r\n }\r\n\r\n samplers.push(BuildTexture(diffuseMap as Texture, material, \"diffuse\", diffuse, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}color3f inputs:diffuseColor = ${BuildColor(diffuse || Color3.White())}`);\r\n }\r\n\r\n if (emissiveMap !== null) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor.connect = </Materials/Material_${material.uniqueId}/Texture_${emissiveMap.uniqueId}_emissive.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(emissiveMap as Texture, material, \"emissive\", emissive, textureToExports, options));\r\n } else if (emissive && emissive.toLuminance() > 0) {\r\n inputs.push(`${pad}color3f inputs:emissiveColor = ${BuildColor(emissive)}`);\r\n }\r\n\r\n if (normalMap !== null) {\r\n inputs.push(`${pad}normal3f inputs:normal.connect = </Materials/Material_${material.uniqueId}/Texture_${normalMap.uniqueId}_normal.outputs:rgb>`);\r\n\r\n samplers.push(BuildTexture(normalMap as Texture, material, \"normal\", null, textureToExports, options));\r\n }\r\n\r\n if (aoMap !== null) {\r\n inputs.push(`${pad}float inputs:occlusion.connect = </Materials/Material_${material.uniqueId}/Texture_${aoMap.uniqueId}_occlusion.outputs:${aoMapChannel}>`);\r\n\r\n samplers.push(BuildTexture(aoMap as Texture, material, \"occlusion\", new Color3(aoMapIntensity, aoMapIntensity, aoMapIntensity), textureToExports, options));\r\n }\r\n\r\n if (roughnessMap !== null) {\r\n inputs.push(`${pad}float inputs:roughness.connect = </Materials/Material_${material.uniqueId}/Texture_${roughnessMap.uniqueId}_roughness.outputs:${roughnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(roughnessMap as Texture, material, \"roughness\", new Color3(roughness, roughness, roughness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:roughness = ${roughness}`);\r\n }\r\n\r\n if (metalnessMap !== null) {\r\n inputs.push(`${pad}float inputs:metallic.connect = </Materials/Material_${material.uniqueId}/Texture_${metalnessMap.uniqueId}_metallic.outputs:${metalnessChannel}>`);\r\n\r\n samplers.push(BuildTexture(metalnessMap as Texture, material, \"metallic\", new Color3(metalness, metalness, metalness), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:metallic = ${metalness}`);\r\n }\r\n\r\n if (alphaMap !== null) {\r\n inputs.push(`${pad}float inputs:opacity.connect = </Materials/Material_${material.uniqueId}/Texture_${alphaMap.uniqueId}_opacity.outputs:r>`);\r\n inputs.push(`${pad}float inputs:opacityThreshold = 0.0001`);\r\n\r\n samplers.push(BuildTexture(alphaMap as Texture, material, \"opacity\", null, textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:opacity = ${material.alpha}`);\r\n }\r\n\r\n if (clearCoatEnabled) {\r\n if (clearCoatMap !== null) {\r\n inputs.push(`${pad}float inputs:clearcoat.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatMap.uniqueId}_clearcoat.outputs:r>`);\r\n samplers.push(BuildTexture(clearCoatMap as Texture, material, \"clearcoat\", new Color3(clearCoat, clearCoat, clearCoat), textureToExports, options));\r\n } else {\r\n inputs.push(`${pad}float inputs:clearcoat = ${clearCoat}`);\r\n }\r\n\r\n if (clearCoatRoughnessMap !== null) {\r\n inputs.push(\r\n `${pad}float inputs:clearcoatRoughness.connect = </Materials/Material_${material.uniqueId}/Texture_${clearCoatRoughnessMap.uniqueId}_clearcoatRoughness.outputs:g>`\r\n );\r\n samplers.push(\r\n BuildTexture(\r\n clearCoatRoughnessMap as Texture,\r\n material,\r\n \"clearcoatRoughness\",\r\n new Color3(clearCoatRoughness, clearCoatRoughness, clearCoatRoughness),\r\n textureToExports,\r\n options\r\n )\r\n );\r\n } else {\r\n inputs.push(`${pad}float inputs:clearcoatRoughness = ${clearCoatRoughness}`);\r\n }\r\n }\r\n\r\n inputs.push(`${pad}float inputs:ior = ${ior}`);\r\n\r\n return `\r\n\tdef Material \"Material_${material.uniqueId}\"\r\n\t{\r\n\t\tdef Shader \"PreviewSurface\"\r\n\t\t{\r\n\t\t\tuniform token info:id = \"UsdPreviewSurface\"\r\n${inputs.join(\"\\n\")}\r\n\t\t\tint inputs:useSpecularWorkflow = 0\r\n\t\t\ttoken outputs:surface\r\n\t\t}\r\n\r\n\t\ttoken outputs:surface.connect = </Materials/Material_${material.uniqueId}/PreviewSurface.outputs:surface>\r\n\r\n${samplers.join(\"\\n\")}\r\n\r\n\t}\r\n`;\r\n}\r\n\r\nfunction BuildCamera(camera: Camera, options: IUSDZExportOptions) {\r\n const name = \"Camera_\" + camera.uniqueId;\r\n const matrix = Matrix.RotationY(Math.PI).multiply(camera.getWorldMatrix()); // work towards positive z\r\n\r\n const transform = BuildMatrix(matrix);\r\n\r\n if (camera.mode === Constants.ORTHOGRAPHIC_CAMERA) {\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat horizontalAperture = ${((Math.abs(camera.orthoLeft || 1) + Math.abs(camera.orthoRight || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${((Math.abs(camera.orthoTop || 1) + Math.abs(camera.orthoBottom || 1)) * 10).toPrecision(options.precision)}\r\n\t\t\ttoken projection = \"orthographic\"\r\n\t\t}\r\n\t\r\n\t`;\r\n } else {\r\n const aspect = camera.getEngine().getAspectRatio(camera);\r\n const sensorwidth = options.cameraSensorWidth || 35;\r\n\r\n return `def Camera \"${name}\"\r\n\t\t{\r\n\t\t\tmatrix4d xformOp:transform = ${transform}\r\n\t\t\tuniform token[] xformOpOrder = [\"xformOp:transform\"]\r\n\r\n\t\t\tfloat2 clippingRange = (${camera.minZ.toPrecision(options.precision)}, ${camera.maxZ.toPrecision(options.precision)})\r\n\t\t\tfloat focalLength = ${(sensorwidth / (2 * Math.tan(camera.fov * 0.5))).toPrecision(options.precision)}\r\n token projection = \"perspective\"\r\n\t\t\tfloat horizontalAperture = ${(sensorwidth * aspect).toPrecision(options.precision)}\r\n\t\t\tfloat verticalAperture = ${(sensorwidth / aspect).toPrecision(options.precision)} \r\n\t\t}\r\n\t\r\n\t`;\r\n }\r\n}\r\n\r\n/**\r\n *\r\n * @param scene scene to export\r\n * @param options options to configure the export\r\n * @param meshPredicate predicate to filter the meshes to export\r\n * @returns a uint8 array containing the USDZ file\r\n * @see [Simple sphere](https://playground.babylonjs.com/#H2G5XW#6)\r\n * @see [Red sphere](https://playground.babylonjs.com/#H2G5XW#7)\r\n * @see [Boombox](https://playground.babylonjs.com/#5N3RWK#5)\r\n */\r\nexport async function USDZExportAsync(scene: Scene, options: Partial<IUSDZExportOptions>, meshPredicate?: (m: Mesh) => boolean): Promise<Uint8Array> {\r\n const localOptions = {\r\n fflateUrl: \"https://unpkg.com/fflate@0.8.2\",\r\n includeAnchoringProperties: true,\r\n anchoringType: \"plane\",\r\n planeAnchoringAlignment: \"horizontal\",\r\n modelFileName: \"model.usda\",\r\n precision: 5,\r\n exportCamera: false,\r\n cameraSensorWidth: 35,\r\n ...options,\r\n };\r\n\r\n // Get the fflate library\r\n if (typeof fflate === \"undefined\") {\r\n await Tools.LoadScriptAsync(localOptions.fflateUrl);\r\n }\r\n\r\n // Start the export\r\n const files: { [key: string]: any } = {};\r\n\r\n // model file should be first in USDZ archive so we init it here\r\n files[localOptions.modelFileName] = null;\r\n\r\n let output = BuildHeader();\r\n output += BuildSceneStart(localOptions);\r\n\r\n const materialToExports: { [key: string]: Material } = {};\r\n\r\n // Meshes\r\n for (const abstractMesh of scene.meshes) {\r\n if (abstractMesh.getTotalVertices() === 0) {\r\n continue;\r\n }\r\n const mesh = abstractMesh as Mesh;\r\n const geometry = mesh.geometry;\r\n const material = mesh.material;\r\n\r\n if (!material || !geometry || (meshPredicate && !meshPredicate(mesh))) {\r\n continue;\r\n }\r\n\r\n const supportedMaterials = [\"StandardMaterial\", \"PBRMaterial\", \"PBRMetallicRoughnessMaterial\"];\r\n\r\n if (supportedMaterials.indexOf(material.getClassName()) !== -1) {\r\n const geometryFileName = \"geometries/Geometry_\" + geometry.uniqueId + \".usda\";\r\n\r\n if (!(geometryFileName in files)) {\r\n const meshObject = BuildMeshObject(geometry, localOptions);\r\n files[geometryFileName] = BuildUSDFileAsString(meshObject);\r\n }\r\n\r\n if (!(material.uniqueId in materialToExports)) {\r\n materialToExports[material.uniqueId] = material;\r\n }\r\n\r\n output += BuildXform(mesh);\r\n } else {\r\n Tools.Warn(\"USDZExportAsync does not support this material type: \" + material.getClassName());\r\n }\r\n }\r\n\r\n // Camera\r\n if (scene.activeCamera && localOptions.exportCamera) {\r\n output += BuildCamera(scene.activeCamera, localOptions);\r\n }\r\n\r\n // Close scene\r\n output += BuildSceneEnd();\r\n\r\n // Materials\r\n const textureToExports: { [key: string]: BaseTexture } = {};\r\n output += BuildMaterials(materialToExports, textureToExports, localOptions);\r\n\r\n // Compress\r\n files[localOptions.modelFileName] = fflate.strToU8(output);\r\n\r\n // Textures\r\n for (const id in textureToExports) {\r\n const texture = textureToExports[id];\r\n\r\n const size = texture.getSize();\r\n // eslint-disable-next-line no-await-in-loop\r\n const textureData = await texture.readPixels();\r\n\r\n if (!textureData) {\r\n throw new Error(\"Texture data is not available\");\r\n }\r\n\r\n // eslint-disable-next-line no-await-in-loop\r\n const fileContent = await DumpTools.DumpDataAsync(size.width, size.height, textureData, \"image/png\", undefined, false, true);\r\n\r\n files[`textures/Texture_${id}.png`] = new Uint8Array(fileContent as ArrayBuffer).slice(); // This is to avoid getting a link and not a copy\r\n }\r\n\r\n // 64 byte alignment\r\n // https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\r\n\r\n let offset = 0;\r\n\r\n for (const filename in files) {\r\n const file = files[filename];\r\n if (!file) {\r\n continue;\r\n }\r\n const headerSize = 34 + filename.length;\r\n\r\n offset += headerSize;\r\n\r\n const offsetMod64 = offset & 63;\r\n\r\n if (offsetMod64 !== 4) {\r\n const padLength = 64 - offsetMod64;\r\n const padding = new Uint8Array(padLength);\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n files[filename] = [file, { extra: { 12345: padding } }];\r\n }\r\n\r\n offset = file.length;\r\n }\r\n\r\n return fflate.zipSync(files, { level: 0 });\r\n}\r\n"]}
@@ -0,0 +1,6 @@
1
+ import type { Node } from "@babylonjs/core/node.js";
2
+ /**
3
+ * Checks if a node is a "noop" transform node, usually inserted by the glTF loader to correct handedness.
4
+ * @internal
5
+ */
6
+ export declare function IsNoopNode(node: Node, useRightHandedSystem: boolean): boolean;
package/exportUtils.js ADDED
@@ -0,0 +1,37 @@
1
+ import { Matrix, Quaternion, TmpVectors, Vector3 } from "@babylonjs/core/Maths/math.vector.js";
2
+ import { Epsilon } from "@babylonjs/core/Maths/math.constants.js";
3
+ import { TransformNode } from "@babylonjs/core/Meshes/transformNode.js";
4
+ import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh.js";
5
+ /**
6
+ * Matrix that converts handedness on the X-axis. Used to convert from LH to RH and vice versa.
7
+ * @internal
8
+ */
9
+ const ConvertHandednessMatrix = Matrix.Compose(new Vector3(-1, 1, 1), Quaternion.Identity(), Vector3.Zero());
10
+ /**
11
+ * Checks if a node is a "noop" transform node, usually inserted by the glTF loader to correct handedness.
12
+ * @internal
13
+ */
14
+ export function IsNoopNode(node, useRightHandedSystem) {
15
+ if (!(node instanceof TransformNode)) {
16
+ return false;
17
+ }
18
+ // Transform
19
+ if (useRightHandedSystem) {
20
+ const matrix = node.getWorldMatrix();
21
+ if (!matrix.equalsWithEpsilon(Matrix.IdentityReadOnly, Epsilon)) {
22
+ return false;
23
+ }
24
+ }
25
+ else {
26
+ const matrix = node.getWorldMatrix().multiplyToRef(ConvertHandednessMatrix, TmpVectors.Matrix[0]);
27
+ if (!matrix.equalsWithEpsilon(Matrix.IdentityReadOnly, Epsilon)) {
28
+ return false;
29
+ }
30
+ }
31
+ // Geometry
32
+ if (node instanceof AbstractMesh && node.geometry) {
33
+ return false;
34
+ }
35
+ return true;
36
+ }
37
+ //# sourceMappingURL=exportUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportUtils.js","sourceRoot":"","sources":["../../../dev/serializers/src/exportUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,6CAA+B;AACjF,OAAO,EAAE,OAAO,EAAE,gDAAkC;AACpD,OAAO,EAAE,aAAa,EAAE,gDAAkC;AAC1D,OAAO,EAAE,YAAY,EAAE,+CAAiC;AAGxD;;;GAGG;AACH,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAE7G;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,oBAA6B;IAChE,IAAI,CAAC,CAAC,IAAI,YAAY,aAAa,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,YAAY;IACZ,IAAI,oBAAoB,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,uBAAuB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,WAAW;IACX,IAAI,IAAI,YAAY,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import { Matrix, Quaternion, TmpVectors, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Epsilon } from \"core/Maths/math.constants\";\r\nimport { TransformNode } from \"core/Meshes/transformNode\";\r\nimport { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport type { Node } from \"core/node\";\r\n\r\n/**\r\n * Matrix that converts handedness on the X-axis. Used to convert from LH to RH and vice versa.\r\n * @internal\r\n */\r\nconst ConvertHandednessMatrix = Matrix.Compose(new Vector3(-1, 1, 1), Quaternion.Identity(), Vector3.Zero());\r\n\r\n/**\r\n * Checks if a node is a \"noop\" transform node, usually inserted by the glTF loader to correct handedness.\r\n * @internal\r\n */\r\nexport function IsNoopNode(node: Node, useRightHandedSystem: boolean): boolean {\r\n if (!(node instanceof TransformNode)) {\r\n return false;\r\n }\r\n\r\n // Transform\r\n if (useRightHandedSystem) {\r\n const matrix = node.getWorldMatrix();\r\n if (!matrix.equalsWithEpsilon(Matrix.IdentityReadOnly, Epsilon)) {\r\n return false;\r\n }\r\n } else {\r\n const matrix = node.getWorldMatrix().multiplyToRef(ConvertHandednessMatrix, TmpVectors.Matrix[0]);\r\n if (!matrix.equalsWithEpsilon(Matrix.IdentityReadOnly, Epsilon)) {\r\n return false;\r\n }\r\n }\r\n\r\n // Geometry\r\n if (node instanceof AbstractMesh && node.geometry) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n"]}
@@ -9,7 +9,8 @@ import { Engine } from "@babylonjs/core/Engines/engine.js";
9
9
  import { EngineStore } from "@babylonjs/core/Engines/engineStore.js";
10
10
  import { GLTFMaterialExporter } from "./glTFMaterialExporter.js";
11
11
  import { GLTFData } from "./glTFData.js";
12
- import { ConvertToRightHandedPosition, ConvertToRightHandedRotation, DataArrayToUint8Array, GetAccessorType, GetAttributeType, GetMinMax, GetPrimitiveMode, IsNoopNode, IsTriangleFillMode, IsChildCollapsible, FloatsNeed16BitInteger, IsStandardVertexAttribute, IndicesArrayToTypedArray, GetVertexBufferInfo, CollapseChildIntoParent, Rotate180Y, DefaultTranslation, DefaultScale, DefaultRotation, } from "./glTFUtilities.js";
12
+ import { ConvertToRightHandedPosition, ConvertToRightHandedRotation, DataArrayToUint8Array, GetAccessorType, GetAttributeType, GetMinMax, GetPrimitiveMode, IsTriangleFillMode, IsChildCollapsible, FloatsNeed16BitInteger, IsStandardVertexAttribute, IndicesArrayToTypedArray, GetVertexBufferInfo, CollapseChildIntoParent, Rotate180Y, DefaultTranslation, DefaultScale, DefaultRotation, } from "./glTFUtilities.js";
13
+ import { IsNoopNode } from "../../exportUtils.js";
13
14
  import { BufferManager } from "./bufferManager.js";
14
15
  import { Camera } from "@babylonjs/core/Cameras/camera.js";
15
16
  import { MultiMaterial } from "@babylonjs/core/Materials/multiMaterial.js";