@babylonjs/core 8.12.0 → 8.13.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.
Files changed (88) hide show
  1. package/BakedVertexAnimation/vertexAnimationBaker.d.ts +10 -2
  2. package/BakedVertexAnimation/vertexAnimationBaker.js +51 -2
  3. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
  4. package/Cameras/camera.d.ts +6 -0
  5. package/Cameras/camera.js +8 -0
  6. package/Cameras/camera.js.map +1 -1
  7. package/Engines/abstractEngine.js +2 -2
  8. package/Engines/abstractEngine.js.map +1 -1
  9. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.d.ts +1 -1
  10. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.js +27 -18
  11. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.js.map +1 -1
  12. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.d.ts +55 -3
  13. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.js +83 -2
  14. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.js.map +1 -1
  15. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js.map +1 -1
  16. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
  17. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.js.map +1 -1
  18. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js.map +1 -1
  19. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.js.map +1 -1
  20. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.d.ts +1 -0
  21. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js +23 -2
  22. package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js.map +1 -1
  23. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.js +5 -5
  24. package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.js.map +1 -1
  25. package/FlowGraph/Blocks/flowGraphBlockFactory.js +10 -0
  26. package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
  27. package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +5 -0
  28. package/FlowGraph/Blocks/flowGraphBlockNames.js +5 -0
  29. package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
  30. package/FlowGraph/flowGraphRichTypes.js +10 -8
  31. package/FlowGraph/flowGraphRichTypes.js.map +1 -1
  32. package/FlowGraph/utils.d.ts +3 -3
  33. package/FlowGraph/utils.js +5 -4
  34. package/FlowGraph/utils.js.map +1 -1
  35. package/Instrumentation/engineInstrumentation.d.ts +2 -2
  36. package/Instrumentation/engineInstrumentation.js +5 -0
  37. package/Instrumentation/engineInstrumentation.js.map +1 -1
  38. package/Instrumentation/sceneInstrumentation.d.ts +1 -0
  39. package/Instrumentation/sceneInstrumentation.js +5 -0
  40. package/Instrumentation/sceneInstrumentation.js.map +1 -1
  41. package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.d.ts +2 -5
  42. package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js +8 -71
  43. package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js.map +1 -1
  44. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +2 -0
  45. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +7 -8
  46. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  47. package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
  48. package/Materials/Node/Blocks/Fragment/index.js +1 -0
  49. package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
  50. package/Materials/Node/Blocks/Fragment/smartFilterFragmentOutputBlock.d.ts +29 -0
  51. package/Materials/Node/Blocks/Fragment/smartFilterFragmentOutputBlock.js +100 -0
  52. package/Materials/Node/Blocks/Fragment/smartFilterFragmentOutputBlock.js.map +1 -0
  53. package/Materials/Node/nodeMaterial.js +1 -1
  54. package/Materials/Node/nodeMaterial.js.map +1 -1
  55. package/Materials/Node/nodeMaterialBuildState.d.ts +0 -2
  56. package/Materials/Node/nodeMaterialBuildState.js +0 -2
  57. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  58. package/Materials/Node/nodeMaterialDefault.js +2 -1
  59. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  60. package/Maths/math.vector.d.ts +14 -0
  61. package/Maths/math.vector.functions.d.ts +25 -1
  62. package/Maths/math.vector.functions.js +35 -0
  63. package/Maths/math.vector.functions.js.map +1 -1
  64. package/Maths/math.vector.js +28 -0
  65. package/Maths/math.vector.js.map +1 -1
  66. package/Meshes/csg2.js +1 -1
  67. package/Meshes/csg2.js.map +1 -1
  68. package/Meshes/linesMesh.d.ts +2 -1
  69. package/Meshes/linesMesh.js +5 -0
  70. package/Meshes/linesMesh.js.map +1 -1
  71. package/Misc/environmentTextureTools.d.ts +4 -1
  72. package/Misc/environmentTextureTools.js +9 -2
  73. package/Misc/environmentTextureTools.js.map +1 -1
  74. package/Misc/observable.d.ts +1 -1
  75. package/Misc/observable.js.map +1 -1
  76. package/Morph/morphTargetManager.d.ts +5 -0
  77. package/Morph/morphTargetManager.js +8 -0
  78. package/Morph/morphTargetManager.js.map +1 -1
  79. package/Particles/IParticleSystem.d.ts +4 -0
  80. package/Particles/IParticleSystem.js.map +1 -1
  81. package/Particles/Node/nodeParticleSystemSet.d.ts +2 -1
  82. package/Particles/Node/nodeParticleSystemSet.js +2 -1
  83. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  84. package/Particles/baseParticleSystem.d.ts +4 -0
  85. package/Particles/baseParticleSystem.js +6 -0
  86. package/Particles/baseParticleSystem.js.map +1 -1
  87. package/Particles/particleSystem.js.map +1 -1
  88. package/package.json +1 -1
@@ -17,6 +17,13 @@ export declare class VertexAnimationBaker {
17
17
  * @param meshOrSkeleton Defines the skeleton or the mesh from which to retrieve the skeleton from.
18
18
  */
19
19
  constructor(scene: Scene, meshOrSkeleton: Mesh | Skeleton);
20
+ /**
21
+ *
22
+ * @param ranges Defines the ranges in the animation that will be baked.
23
+ * @param halfFloat If true, the vertex data will be returned as half-float (Uint16Array), otherwise as full float (Float32Array).
24
+ * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array or Uint16Array.
25
+ */
26
+ bakeVertexDataSync(ranges: AnimationRange[], halfFloat: boolean): Float32Array | Uint16Array;
20
27
  /**
21
28
  * Bakes the animation into the texture. This should be called once, when the
22
29
  * scene starts, so the VAT is generated and associated to the mesh.
@@ -35,10 +42,11 @@ export declare class VertexAnimationBaker {
35
42
  private _executeAnimationFrameAsync;
36
43
  /**
37
44
  * Builds a vertex animation texture given the vertexData in an array.
38
- * @param vertexData The vertex animation data. You can generate it with bakeVertexData().
45
+ * @param vertexData The vertex animation data. You can generate it with bakeVertexData(). You can pass in a Float32Array to return a full precision texture, or a Uint16Array to return a half-float texture.
46
+ * If you pass in a Uint16Array, make sure your device supports half-float textures
39
47
  * @returns The vertex animation texture to be used with BakedVertexAnimationManager.
40
48
  */
41
- textureFromBakedVertexData(vertexData: Float32Array): RawTexture;
49
+ textureFromBakedVertexData(vertexData: Float32Array | Uint16Array): RawTexture;
42
50
  /**
43
51
  * Serializes our vertexData to an object, with a nice string for the vertexData.
44
52
  * @param vertexData The vertex array data.
@@ -3,6 +3,8 @@ import { Texture } from "../Materials/Textures/texture.js";
3
3
  import { EncodeArrayBufferToBase64, DecodeBase64ToBinary } from "../Misc/stringTools.js";
4
4
 
5
5
  import { Skeleton } from "../Bones/skeleton.js";
6
+ import { ToHalfFloat } from "../Misc/textureTools.js";
7
+ import { Logger } from "../Misc/logger.js";
6
8
  /**
7
9
  * Class to bake vertex animation textures.
8
10
  * @since 5.0
@@ -24,6 +26,47 @@ export class VertexAnimationBaker {
24
26
  this._skeleton = meshOrSkeleton.skeleton;
25
27
  }
26
28
  }
29
+ /**
30
+ *
31
+ * @param ranges Defines the ranges in the animation that will be baked.
32
+ * @param halfFloat If true, the vertex data will be returned as half-float (Uint16Array), otherwise as full float (Float32Array).
33
+ * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array or Uint16Array.
34
+ */
35
+ bakeVertexDataSync(ranges, halfFloat) {
36
+ if (!this._skeleton) {
37
+ throw new Error("No skeleton provided.");
38
+ }
39
+ const bones = this._skeleton.bones.length;
40
+ const floatsPerFrame = (bones + 1) * 16;
41
+ const totalFrames = ranges.reduce((sum, r) => sum + (Math.floor(r.to) - Math.floor(r.from) + 1), 0);
42
+ const vertexData = halfFloat ? new Uint16Array(floatsPerFrame * totalFrames) : new Float32Array(floatsPerFrame * totalFrames);
43
+ let offset = 0;
44
+ const matrices = this._skeleton.getTransformMatrices(this._mesh);
45
+ this._skeleton.returnToRest();
46
+ if (halfFloat) {
47
+ for (const { from, to } of ranges) {
48
+ for (let f = Math.floor(from); f <= Math.floor(to); ++f) {
49
+ this._scene.beginAnimation(this._skeleton, f, f, false, 1.0);
50
+ this._skeleton.computeAbsoluteMatrices(true);
51
+ for (let i = 0; i < floatsPerFrame; ++i) {
52
+ vertexData[offset + i] = ToHalfFloat(matrices[i]);
53
+ }
54
+ offset += floatsPerFrame;
55
+ }
56
+ }
57
+ }
58
+ else {
59
+ for (const { from, to } of ranges) {
60
+ for (let f = Math.floor(from); f <= Math.floor(to); ++f) {
61
+ this._scene.beginAnimation(this._skeleton, f, f, false, 1.0);
62
+ this._skeleton.computeAbsoluteMatrices(true);
63
+ vertexData.set(matrices, offset);
64
+ offset += floatsPerFrame;
65
+ }
66
+ }
67
+ }
68
+ return vertexData;
69
+ }
27
70
  /**
28
71
  * Bakes the animation into the texture. This should be called once, when the
29
72
  * scene starts, so the VAT is generated and associated to the mesh.
@@ -77,7 +120,8 @@ export class VertexAnimationBaker {
77
120
  }
78
121
  /**
79
122
  * Builds a vertex animation texture given the vertexData in an array.
80
- * @param vertexData The vertex animation data. You can generate it with bakeVertexData().
123
+ * @param vertexData The vertex animation data. You can generate it with bakeVertexData(). You can pass in a Float32Array to return a full precision texture, or a Uint16Array to return a half-float texture.
124
+ * If you pass in a Uint16Array, make sure your device supports half-float textures
81
125
  * @returns The vertex animation texture to be used with BakedVertexAnimationManager.
82
126
  */
83
127
  textureFromBakedVertexData(vertexData) {
@@ -85,7 +129,12 @@ export class VertexAnimationBaker {
85
129
  throw new Error("No skeleton provided.");
86
130
  }
87
131
  const boneCount = this._skeleton.bones.length;
88
- const texture = RawTexture.CreateRGBATexture(vertexData, (boneCount + 1) * 4, vertexData.length / ((boneCount + 1) * 4 * 4), this._scene, false, false, Texture.NEAREST_NEAREST, 1);
132
+ if (vertexData instanceof Uint16Array) {
133
+ if (!this._scene.getEngine().getCaps().textureHalfFloatRender) {
134
+ Logger.Warn("VertexAnimationBaker: Half-float textures are not supported on this device");
135
+ }
136
+ }
137
+ const texture = RawTexture.CreateRGBATexture(vertexData, (boneCount + 1) * 4, vertexData.length / ((boneCount + 1) * 4 * 4), this._scene, false, false, Texture.NEAREST_NEAREST, vertexData instanceof Float32Array ? 1 : 2);
89
138
  texture.name = "VAT" + this._skeleton.name;
90
139
  return texture;
91
140
  }
@@ -1 +1 @@
1
- {"version":3,"file":"vertexAnimationBaker.js","sourceRoot":"","sources":["../../../../dev/core/src/BakedVertexAnimation/vertexAnimationBaker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnimationRange } from \"../Animations/animationRange\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { EncodeArrayBufferToBase64, DecodeBase64ToBinary } from \"../Misc/stringTools\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Skeleton } from \"core/Bones/skeleton\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\n/**\r\n * Class to bake vertex animation textures.\r\n * @since 5.0\r\n */\r\nexport class VertexAnimationBaker {\r\n private _scene: Scene;\r\n private _mesh: Nullable<Mesh>;\r\n private _skeleton: Nullable<Skeleton>;\r\n\r\n /**\r\n * Create a new VertexAnimationBaker object which can help baking animations into a texture.\r\n * @param scene Defines the scene the VAT belongs to\r\n * @param meshOrSkeleton Defines the skeleton or the mesh from which to retrieve the skeleton from.\r\n */\r\n constructor(scene: Scene, meshOrSkeleton: Mesh | Skeleton) {\r\n this._scene = scene;\r\n if (meshOrSkeleton instanceof Skeleton) {\r\n this._skeleton = meshOrSkeleton;\r\n this._mesh = null;\r\n } else {\r\n this._mesh = meshOrSkeleton;\r\n this._skeleton = meshOrSkeleton.skeleton;\r\n }\r\n }\r\n\r\n /**\r\n * Bakes the animation into the texture. This should be called once, when the\r\n * scene starts, so the VAT is generated and associated to the mesh.\r\n * @param ranges Defines the ranges in the animation that will be baked.\r\n * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array.\r\n */\r\n // async function, without Async suffix, to avoid breaking the API\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async bakeVertexData(ranges: AnimationRange[]): Promise<Float32Array> {\r\n if (!this._skeleton) {\r\n throw new Error(\"No skeleton provided.\");\r\n }\r\n const boneCount = this._skeleton.bones.length;\r\n\r\n /** total number of frames in our animations */\r\n const frameCount = ranges.reduce((previous: number, current: AnimationRange) => previous + current.to - current.from + 1, 0);\r\n\r\n if (isNaN(frameCount)) {\r\n throw new Error(\"Invalid animation ranges.\");\r\n }\r\n\r\n // reset our loop data\r\n let textureIndex = 0;\r\n const textureSize = (boneCount + 1) * 4 * 4 * frameCount;\r\n const vertexData = new Float32Array(textureSize);\r\n this._scene.stopAnimation(this._skeleton);\r\n this._skeleton.returnToRest();\r\n\r\n // render all frames from our slices\r\n for (const range of ranges) {\r\n for (let frameIndex = range.from; frameIndex <= range.to; frameIndex++) {\r\n // eslint-disable-next-line no-await-in-loop\r\n await this._executeAnimationFrameAsync(vertexData, frameIndex, textureIndex++);\r\n }\r\n }\r\n\r\n return vertexData;\r\n }\r\n\r\n /**\r\n * Runs an animation frame and stores its vertex data\r\n *\r\n * @param vertexData The array to save data to.\r\n * @param frameIndex Current frame in the skeleton animation to render.\r\n * @param textureIndex Current index of the texture data.\r\n * @returns A promise that resolves when the animation frame is done.\r\n */\r\n private async _executeAnimationFrameAsync(vertexData: Float32Array, frameIndex: number, textureIndex: number): Promise<void> {\r\n return await new Promise<void>((resolve, _reject) => {\r\n this._scene.beginAnimation(this._skeleton, frameIndex, frameIndex, false, 1.0, () => {\r\n // generate matrices\r\n const skeletonMatrices = this._skeleton!.getTransformMatrices(this._mesh);\r\n vertexData.set(skeletonMatrices, textureIndex * skeletonMatrices.length);\r\n\r\n resolve();\r\n });\r\n });\r\n }\r\n /**\r\n * Builds a vertex animation texture given the vertexData in an array.\r\n * @param vertexData The vertex animation data. You can generate it with bakeVertexData().\r\n * @returns The vertex animation texture to be used with BakedVertexAnimationManager.\r\n */\r\n public textureFromBakedVertexData(vertexData: Float32Array): RawTexture {\r\n if (!this._skeleton) {\r\n throw new Error(\"No skeleton provided.\");\r\n }\r\n const boneCount = this._skeleton.bones.length;\r\n\r\n const texture = RawTexture.CreateRGBATexture(\r\n vertexData,\r\n (boneCount + 1) * 4,\r\n vertexData.length / ((boneCount + 1) * 4 * 4),\r\n this._scene,\r\n false,\r\n false,\r\n Texture.NEAREST_NEAREST,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n texture.name = \"VAT\" + this._skeleton.name;\r\n return texture;\r\n }\r\n /**\r\n * Serializes our vertexData to an object, with a nice string for the vertexData.\r\n * @param vertexData The vertex array data.\r\n * @returns This object serialized to a JS dict.\r\n */\r\n public serializeBakedVertexDataToObject(vertexData: Float32Array): Record<string, any> {\r\n if (!this._skeleton) {\r\n throw new Error(\"No skeleton provided.\");\r\n }\r\n\r\n // this converts the float array to a serialized base64 string, ~1.3x larger\r\n // than the original.\r\n const boneCount = this._skeleton.bones.length;\r\n const width = (boneCount + 1) * 4;\r\n const height = vertexData.length / ((boneCount + 1) * 4 * 4);\r\n const data = {\r\n vertexData: EncodeArrayBufferToBase64(vertexData),\r\n width,\r\n height,\r\n };\r\n return data;\r\n }\r\n /**\r\n * Loads previously baked data.\r\n * @param data The object as serialized by serializeBakedVertexDataToObject()\r\n * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array.\r\n */\r\n public loadBakedVertexDataFromObject(data: Record<string, any>): Float32Array {\r\n return new Float32Array(DecodeBase64ToBinary(data.vertexData));\r\n }\r\n /**\r\n * Serializes our vertexData to a JSON string, with a nice string for the vertexData.\r\n * Should be called right after bakeVertexData().\r\n * @param vertexData The vertex array data.\r\n * @returns This object serialized to a safe string.\r\n */\r\n public serializeBakedVertexDataToJSON(vertexData: Float32Array): string {\r\n return JSON.stringify(this.serializeBakedVertexDataToObject(vertexData));\r\n }\r\n /**\r\n * Loads previously baked data in string format.\r\n * @param json The json string as serialized by serializeBakedVertexDataToJSON().\r\n * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array.\r\n */\r\n public loadBakedVertexDataFromJSON(json: string): Float32Array {\r\n return this.loadBakedVertexDataFromObject(JSON.parse(json));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"vertexAnimationBaker.js","sourceRoot":"","sources":["../../../../dev/core/src/BakedVertexAnimation/vertexAnimationBaker.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnimationRange } from \"../Animations/animationRange\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { EncodeArrayBufferToBase64, DecodeBase64ToBinary } from \"../Misc/stringTools\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Skeleton } from \"core/Bones/skeleton\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { ToHalfFloat } from \"../Misc/textureTools\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\n/**\r\n * Class to bake vertex animation textures.\r\n * @since 5.0\r\n */\r\nexport class VertexAnimationBaker {\r\n private _scene: Scene;\r\n private _mesh: Nullable<Mesh>;\r\n private _skeleton: Nullable<Skeleton>;\r\n\r\n /**\r\n * Create a new VertexAnimationBaker object which can help baking animations into a texture.\r\n * @param scene Defines the scene the VAT belongs to\r\n * @param meshOrSkeleton Defines the skeleton or the mesh from which to retrieve the skeleton from.\r\n */\r\n constructor(scene: Scene, meshOrSkeleton: Mesh | Skeleton) {\r\n this._scene = scene;\r\n if (meshOrSkeleton instanceof Skeleton) {\r\n this._skeleton = meshOrSkeleton;\r\n this._mesh = null;\r\n } else {\r\n this._mesh = meshOrSkeleton;\r\n this._skeleton = meshOrSkeleton.skeleton;\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param ranges Defines the ranges in the animation that will be baked.\r\n * @param halfFloat If true, the vertex data will be returned as half-float (Uint16Array), otherwise as full float (Float32Array).\r\n * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array or Uint16Array.\r\n */\r\n public bakeVertexDataSync(ranges: AnimationRange[], halfFloat: boolean): Float32Array | Uint16Array {\r\n if (!this._skeleton) {\r\n throw new Error(\"No skeleton provided.\");\r\n }\r\n const bones = this._skeleton.bones.length;\r\n const floatsPerFrame = (bones + 1) * 16;\r\n const totalFrames = ranges.reduce((sum, r) => sum + (Math.floor(r.to) - Math.floor(r.from) + 1), 0);\r\n\r\n const vertexData = halfFloat ? new Uint16Array(floatsPerFrame * totalFrames) : new Float32Array(floatsPerFrame * totalFrames);\r\n\r\n let offset = 0;\r\n const matrices = this._skeleton.getTransformMatrices(this._mesh);\r\n\r\n this._skeleton.returnToRest();\r\n\r\n if (halfFloat) {\r\n for (const { from, to } of ranges) {\r\n for (let f = Math.floor(from); f <= Math.floor(to); ++f) {\r\n this._scene.beginAnimation(this._skeleton, f, f, false, 1.0);\r\n this._skeleton.computeAbsoluteMatrices(true);\r\n for (let i = 0; i < floatsPerFrame; ++i) {\r\n vertexData[offset + i] = ToHalfFloat(matrices[i]);\r\n }\r\n offset += floatsPerFrame;\r\n }\r\n }\r\n } else {\r\n for (const { from, to } of ranges) {\r\n for (let f = Math.floor(from); f <= Math.floor(to); ++f) {\r\n this._scene.beginAnimation(this._skeleton, f, f, false, 1.0);\r\n this._skeleton.computeAbsoluteMatrices(true);\r\n vertexData.set(matrices, offset);\r\n offset += floatsPerFrame;\r\n }\r\n }\r\n }\r\n\r\n return vertexData;\r\n }\r\n\r\n /**\r\n * Bakes the animation into the texture. This should be called once, when the\r\n * scene starts, so the VAT is generated and associated to the mesh.\r\n * @param ranges Defines the ranges in the animation that will be baked.\r\n * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array.\r\n */\r\n // async function, without Async suffix, to avoid breaking the API\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async bakeVertexData(ranges: AnimationRange[]): Promise<Float32Array> {\r\n if (!this._skeleton) {\r\n throw new Error(\"No skeleton provided.\");\r\n }\r\n const boneCount = this._skeleton.bones.length;\r\n\r\n /** total number of frames in our animations */\r\n const frameCount = ranges.reduce((previous: number, current: AnimationRange) => previous + current.to - current.from + 1, 0);\r\n\r\n if (isNaN(frameCount)) {\r\n throw new Error(\"Invalid animation ranges.\");\r\n }\r\n\r\n // reset our loop data\r\n let textureIndex = 0;\r\n const textureSize = (boneCount + 1) * 4 * 4 * frameCount;\r\n const vertexData = new Float32Array(textureSize);\r\n this._scene.stopAnimation(this._skeleton);\r\n this._skeleton.returnToRest();\r\n\r\n // render all frames from our slices\r\n for (const range of ranges) {\r\n for (let frameIndex = range.from; frameIndex <= range.to; frameIndex++) {\r\n // eslint-disable-next-line no-await-in-loop\r\n await this._executeAnimationFrameAsync(vertexData, frameIndex, textureIndex++);\r\n }\r\n }\r\n\r\n return vertexData;\r\n }\r\n\r\n /**\r\n * Runs an animation frame and stores its vertex data\r\n *\r\n * @param vertexData The array to save data to.\r\n * @param frameIndex Current frame in the skeleton animation to render.\r\n * @param textureIndex Current index of the texture data.\r\n * @returns A promise that resolves when the animation frame is done.\r\n */\r\n private async _executeAnimationFrameAsync(vertexData: Float32Array, frameIndex: number, textureIndex: number): Promise<void> {\r\n return await new Promise<void>((resolve, _reject) => {\r\n this._scene.beginAnimation(this._skeleton, frameIndex, frameIndex, false, 1.0, () => {\r\n // generate matrices\r\n const skeletonMatrices = this._skeleton!.getTransformMatrices(this._mesh);\r\n vertexData.set(skeletonMatrices, textureIndex * skeletonMatrices.length);\r\n\r\n resolve();\r\n });\r\n });\r\n }\r\n /**\r\n * Builds a vertex animation texture given the vertexData in an array.\r\n * @param vertexData The vertex animation data. You can generate it with bakeVertexData(). You can pass in a Float32Array to return a full precision texture, or a Uint16Array to return a half-float texture.\r\n * If you pass in a Uint16Array, make sure your device supports half-float textures\r\n * @returns The vertex animation texture to be used with BakedVertexAnimationManager.\r\n */\r\n public textureFromBakedVertexData(vertexData: Float32Array | Uint16Array): RawTexture {\r\n if (!this._skeleton) {\r\n throw new Error(\"No skeleton provided.\");\r\n }\r\n const boneCount = this._skeleton.bones.length;\r\n\r\n if (vertexData instanceof Uint16Array) {\r\n if (!this._scene.getEngine().getCaps().textureHalfFloatRender) {\r\n Logger.Warn(\"VertexAnimationBaker: Half-float textures are not supported on this device\");\r\n }\r\n }\r\n\r\n const texture = RawTexture.CreateRGBATexture(\r\n vertexData,\r\n (boneCount + 1) * 4,\r\n vertexData.length / ((boneCount + 1) * 4 * 4),\r\n this._scene,\r\n false,\r\n false,\r\n Texture.NEAREST_NEAREST,\r\n vertexData instanceof Float32Array ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_HALF_FLOAT\r\n );\r\n texture.name = \"VAT\" + this._skeleton.name;\r\n return texture;\r\n }\r\n /**\r\n * Serializes our vertexData to an object, with a nice string for the vertexData.\r\n * @param vertexData The vertex array data.\r\n * @returns This object serialized to a JS dict.\r\n */\r\n public serializeBakedVertexDataToObject(vertexData: Float32Array): Record<string, any> {\r\n if (!this._skeleton) {\r\n throw new Error(\"No skeleton provided.\");\r\n }\r\n\r\n // this converts the float array to a serialized base64 string, ~1.3x larger\r\n // than the original.\r\n const boneCount = this._skeleton.bones.length;\r\n const width = (boneCount + 1) * 4;\r\n const height = vertexData.length / ((boneCount + 1) * 4 * 4);\r\n const data = {\r\n vertexData: EncodeArrayBufferToBase64(vertexData),\r\n width,\r\n height,\r\n };\r\n return data;\r\n }\r\n /**\r\n * Loads previously baked data.\r\n * @param data The object as serialized by serializeBakedVertexDataToObject()\r\n * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array.\r\n */\r\n public loadBakedVertexDataFromObject(data: Record<string, any>): Float32Array {\r\n return new Float32Array(DecodeBase64ToBinary(data.vertexData));\r\n }\r\n /**\r\n * Serializes our vertexData to a JSON string, with a nice string for the vertexData.\r\n * Should be called right after bakeVertexData().\r\n * @param vertexData The vertex array data.\r\n * @returns This object serialized to a safe string.\r\n */\r\n public serializeBakedVertexDataToJSON(vertexData: Float32Array): string {\r\n return JSON.stringify(this.serializeBakedVertexDataToObject(vertexData));\r\n }\r\n /**\r\n * Loads previously baked data in string format.\r\n * @param json The json string as serialized by serializeBakedVertexDataToJSON().\r\n * @returns The array of matrix transforms for each vertex (columns) and frame (rows), as a Float32Array.\r\n */\r\n public loadBakedVertexDataFromJSON(json: string): Float32Array {\r\n return this.loadBakedVertexDataFromObject(JSON.parse(json));\r\n }\r\n}\r\n"]}
@@ -150,6 +150,12 @@ export declare class Camera extends Node {
150
150
  * Field Of View is set in Radians. (default is 0.8)
151
151
  */
152
152
  fov: number;
153
+ /**
154
+ * Sets the camera's field of view in radians based on the focal length and sensor size.
155
+ * @param value the focal length of the camera in mm.
156
+ * @param sensorSize the sensor width size of the camera in mm. (default is 36mm, which is a full frame sensor)
157
+ */
158
+ setFocalLength(value: number, sensorSize?: number): void;
153
159
  /**
154
160
  * Projection plane tilt around the X axis (horizontal), set in Radians. (default is 0)
155
161
  * Can be used to make vertical lines in world space actually vertical on the screen.
package/Cameras/camera.js CHANGED
@@ -112,6 +112,14 @@ export class Camera extends Node {
112
112
  get orthoTop() {
113
113
  return this._orthoTop;
114
114
  }
115
+ /**
116
+ * Sets the camera's field of view in radians based on the focal length and sensor size.
117
+ * @param value the focal length of the camera in mm.
118
+ * @param sensorSize the sensor width size of the camera in mm. (default is 36mm, which is a full frame sensor)
119
+ */
120
+ setFocalLength(value, sensorSize = 36) {
121
+ this.fov = 2 * Math.atan(sensorSize / (2 * value));
122
+ }
115
123
  /**
116
124
  * Define the mode of the camera (Camera.PERSPECTIVE_CAMERA or Camera.ORTHOGRAPHIC_CAMERA)
117
125
  */