@babylonjs/core 7.26.3 → 7.26.4

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 (52) hide show
  1. package/Animations/animationGroup.d.ts +1 -0
  2. package/Animations/animationGroup.js +1 -0
  3. package/Animations/animationGroup.js.map +1 -1
  4. package/Audio/audioSceneComponent.d.ts +1 -1
  5. package/Audio/audioSceneComponent.js +2 -2
  6. package/Audio/audioSceneComponent.js.map +1 -1
  7. package/Engines/abstractEngine.js +2 -2
  8. package/Engines/abstractEngine.js.map +1 -1
  9. package/Engines/engine.d.ts +2 -67
  10. package/Layers/effectLayerSceneComponent.js +2 -1
  11. package/Layers/effectLayerSceneComponent.js.map +1 -1
  12. package/LensFlares/lensFlareSystemSceneComponent.js +2 -1
  13. package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
  14. package/Lights/Shadows/shadowGeneratorSceneComponent.d.ts +1 -1
  15. package/Lights/Shadows/shadowGeneratorSceneComponent.js +2 -2
  16. package/Lights/Shadows/shadowGeneratorSceneComponent.js.map +1 -1
  17. package/Loading/Plugins/babylonFileLoader.js +3 -3
  18. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  19. package/Loading/Plugins/babylonFileParser.function.d.ts +45 -0
  20. package/Loading/Plugins/babylonFileParser.function.js +61 -0
  21. package/Loading/Plugins/babylonFileParser.function.js.map +1 -0
  22. package/Loading/Plugins/index.d.ts +1 -0
  23. package/Loading/Plugins/index.js +1 -0
  24. package/Loading/Plugins/index.js.map +1 -1
  25. package/Loading/loadingScreen.js +0 -2
  26. package/Loading/loadingScreen.js.map +1 -1
  27. package/Materials/Node/nodeMaterialBuildState.d.ts +3 -3
  28. package/Materials/Textures/videoTexture.js +0 -4
  29. package/Materials/Textures/videoTexture.js.map +1 -1
  30. package/Maths/math.scalar.d.ts +1 -4
  31. package/Meshes/mesh.js +9 -2
  32. package/Meshes/mesh.js.map +1 -1
  33. package/Meshes/meshUtils.js +4 -0
  34. package/Meshes/meshUtils.js.map +1 -1
  35. package/Misc/timingTools.js +1 -0
  36. package/Misc/timingTools.js.map +1 -1
  37. package/Misc/videoRecorder.d.ts +1 -0
  38. package/Misc/videoRecorder.js +4 -4
  39. package/Misc/videoRecorder.js.map +1 -1
  40. package/Particles/particleSystemComponent.js +4 -4
  41. package/Particles/particleSystemComponent.js.map +1 -1
  42. package/Rendering/subSurfaceSceneComponent.js +2 -2
  43. package/Rendering/subSurfaceSceneComponent.js.map +1 -1
  44. package/Sprites/spriteRenderer.js +10 -1
  45. package/Sprites/spriteRenderer.js.map +1 -1
  46. package/abstractScene.d.ts +0 -52
  47. package/abstractScene.js +0 -60
  48. package/abstractScene.js.map +1 -1
  49. package/package.json +1 -1
  50. package/Shaders/blur.fragment.d.ts +0 -5
  51. package/Shaders/blur.fragment.js +0 -14
  52. package/Shaders/blur.fragment.js.map +0 -1
@@ -145,6 +145,10 @@ export function computeMaxExtents(meshes, animationGroup = null, animationStep =
145
145
  const updateMaxExtents = () => {
146
146
  for (let i = 0; i < meshes.length; i++) {
147
147
  const mesh = meshes[i];
148
+ const positions = mesh.getVerticesData(VertexBuffer.PositionKind);
149
+ if (!positions) {
150
+ continue;
151
+ }
148
152
  const worldMatrix = mesh.computeWorldMatrix(true);
149
153
  const skeleton = mesh.skeleton;
150
154
  if (skeleton) {
@@ -1 +1 @@
1
- {"version":3,"file":"meshUtils.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnimationGroup } from \"../Animations/animationGroup\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { TmpVectors, Vector3 } from \"../Maths/math.vector\";\r\nimport type { FloatArray, Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\n\r\nfunction getExtentCorners(extent: { minimum: Vector3; maximum: Vector3 }): Array<Vector3> {\r\n const minX = extent.minimum.x;\r\n const minY = extent.minimum.y;\r\n const minZ = extent.minimum.z;\r\n const maxX = extent.maximum.x;\r\n const maxY = extent.maximum.y;\r\n const maxZ = extent.maximum.z;\r\n return [\r\n new Vector3(minX, minY, minZ),\r\n new Vector3(maxX, maxY, maxZ),\r\n new Vector3(maxX, minY, minZ),\r\n new Vector3(minX, maxY, minZ),\r\n new Vector3(minX, minY, maxZ),\r\n new Vector3(maxX, maxY, minZ),\r\n new Vector3(minX, maxY, maxZ),\r\n new Vector3(maxX, minY, maxZ),\r\n ];\r\n}\r\n\r\n/**\r\n * Computes the maximum extents of the given meshes considering animation, skeleton, and morph targets.\r\n * @param meshes The array of meshes to compute\r\n * @param animationGroup An optional animation group to animate (must be started to take effect)\r\n * @param animationStep An optional value indicating the number of seconds to step while looping through the given animation group\r\n * @returns An array of world space extents corresponding to the given meshes\r\n */\r\nexport function computeMaxExtents(\r\n meshes: Array<AbstractMesh>,\r\n animationGroup: Nullable<AnimationGroup> = null,\r\n animationStep = 1 / 6\r\n): Array<{ minimum: Vector3; maximum: Vector3 }> {\r\n // Local vector to avoid allocations.\r\n const position = TmpVectors.Vector3[0];\r\n\r\n const meshExtents = new Map<number, { minimum: Vector3; maximum: Vector3 }>();\r\n const skinnedMeshExtents = new Map<number, Map<number, { minimum: Vector3; maximum: Vector3 }>>();\r\n\r\n // Compute the non-skinned and skinned mesh extents.\r\n const maxLength = meshes.reduce((previous, current) => Math.max(previous, current.getTotalVertices()), 0);\r\n const minPositions = Array.from({ length: maxLength }, () => new Vector3());\r\n const maxPositions = Array.from({ length: maxLength }, () => new Vector3());\r\n for (const mesh of meshes) {\r\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n if (!positions) {\r\n continue;\r\n }\r\n\r\n // Initialize min/max positions with the original positions.\r\n const numVertices = mesh.getTotalVertices();\r\n minPositions.length = Math.max(minPositions.length, numVertices);\r\n maxPositions.length = Math.max(minPositions.length, numVertices);\r\n for (let i = 0, j = 0; i < numVertices; i++, j += 3) {\r\n position.set(positions[j], positions[j + 1], positions[j + 2]);\r\n minPositions[i].copyFrom(position);\r\n maxPositions[i].copyFrom(position);\r\n }\r\n\r\n // Apply morph targets to the min/max positions.\r\n const morphTargetManager = mesh.morphTargetManager;\r\n if (morphTargetManager) {\r\n for (let targetIndex = 0; targetIndex < morphTargetManager.numTargets; ++targetIndex) {\r\n const target = morphTargetManager.getTarget(targetIndex);\r\n const positions = target.getPositions();\r\n if (positions) {\r\n for (let i = 0, j = 0; i < numVertices; i++, j += 3) {\r\n position.set(positions[j], positions[j + 1], positions[j + 2]);\r\n minPositions[i].minimizeInPlace(position);\r\n maxPositions[i].maximizeInPlace(position);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Compute extent per mesh.\r\n const skeleton = mesh.skeleton;\r\n const weights = skeleton ? mesh.getVerticesData(VertexBuffer.MatricesWeightsKind) : null;\r\n const indices = skeleton ? mesh.getVerticesData(VertexBuffer.MatricesIndicesKind) : null;\r\n if (weights && indices) {\r\n // Compute extent per bone for skinned meshes.\r\n const needsExtra = mesh.numBoneInfluencers > 4;\r\n const weightsExtra = needsExtra ? mesh.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n const indicesExtra = needsExtra ? mesh.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n\r\n const perBoneExtents = skinnedMeshExtents.get(mesh.uniqueId) || new Map<number, { minimum: Vector3; maximum: Vector3 }>();\r\n skinnedMeshExtents.set(mesh.uniqueId, perBoneExtents);\r\n\r\n const updateExtents = (i: number, j: number, weights: FloatArray, indices: FloatArray): void => {\r\n for (let k = j; k < j + 4; k++) {\r\n if (weights[k] > 0) {\r\n const boneIndex = indices[k];\r\n\r\n const extent = perBoneExtents.get(boneIndex);\r\n if (extent) {\r\n extent.minimum.minimizeInPlace(minPositions[i]);\r\n extent.maximum.maximizeInPlace(maxPositions[i]);\r\n } else {\r\n perBoneExtents.set(boneIndex, {\r\n minimum: minPositions[i].clone(),\r\n maximum: maxPositions[i].clone(),\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n for (let i = 0, j = 0; i < numVertices; i++, j += 4) {\r\n updateExtents(i, j, weights, indices);\r\n\r\n if (weightsExtra && indicesExtra) {\r\n updateExtents(i, j, weightsExtra, indicesExtra);\r\n }\r\n }\r\n } else {\r\n // Compute extent for the whole mesh for non-skinned meshes.\r\n const extent = meshExtents.get(mesh.uniqueId) || {\r\n minimum: new Vector3().setAll(Number.POSITIVE_INFINITY),\r\n maximum: new Vector3().setAll(Number.NEGATIVE_INFINITY),\r\n };\r\n meshExtents.set(mesh.uniqueId, extent);\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n extent.minimum.minimizeInPlace(minPositions[i]);\r\n extent.maximum.maximizeInPlace(maxPositions[i]);\r\n }\r\n }\r\n }\r\n\r\n // Create the 8 corners of each non-skinned and skinned extent.\r\n const meshCorners = new Map<number, Array<Vector3>>();\r\n const skinnedMeshCorners = new Map<number, Map<number, Array<Vector3>>>();\r\n for (const mesh of meshes) {\r\n const extent = meshExtents.get(mesh.uniqueId);\r\n if (extent) {\r\n meshCorners.set(mesh.uniqueId, getExtentCorners(extent));\r\n } else {\r\n const perBoneExtents = skinnedMeshExtents.get(mesh.uniqueId);\r\n if (perBoneExtents) {\r\n const bones = mesh.skeleton!.bones;\r\n\r\n const perBoneCorners = new Map<number, Array<Vector3>>();\r\n skinnedMeshCorners.set(mesh.uniqueId, perBoneCorners);\r\n\r\n perBoneExtents.forEach((extent, boneIndex) => {\r\n const corners = getExtentCorners(extent);\r\n\r\n // Transform the coordinates of the corners for skinned meshes to bone space.\r\n const inverseBindMatrix = bones[boneIndex].getAbsoluteInverseBindMatrix();\r\n for (const corner of corners) {\r\n Vector3.TransformCoordinatesToRef(corner, inverseBindMatrix, corner);\r\n }\r\n\r\n perBoneCorners.set(boneIndex, corners);\r\n });\r\n }\r\n }\r\n }\r\n\r\n const maxExtents = Array.from({ length: meshes.length }, () => ({\r\n minimum: new Vector3().setAll(Number.POSITIVE_INFINITY),\r\n maximum: new Vector3().setAll(Number.NEGATIVE_INFINITY),\r\n }));\r\n\r\n const updateMaxExtents = (): void => {\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n\r\n const worldMatrix = mesh.computeWorldMatrix(true);\r\n\r\n const skeleton = mesh.skeleton;\r\n if (skeleton) {\r\n skeleton.prepare(true);\r\n\r\n const bones = skeleton.bones;\r\n const perBoneCorners = skinnedMeshCorners.get(mesh.uniqueId)!;\r\n perBoneCorners.forEach((corners, boneIndex) => {\r\n // Transform the per-bone corners into world space and update the max extent for each corner.\r\n for (const corner of corners) {\r\n const matrix = bones[boneIndex].getFinalMatrix().multiplyToRef(worldMatrix, TmpVectors.Matrix[0]);\r\n Vector3.TransformCoordinatesToRef(corner, matrix, position);\r\n maxExtents[i].minimum.minimizeInPlace(position);\r\n maxExtents[i].maximum.maximizeInPlace(position);\r\n }\r\n });\r\n } else {\r\n // Transform the corners into world space and update the max extent for each corner.\r\n for (const corner of meshCorners.get(mesh.uniqueId)!) {\r\n Vector3.TransformCoordinatesToRef(corner, worldMatrix, position);\r\n maxExtents[i].minimum.minimizeInPlace(position);\r\n maxExtents[i].maximum.maximizeInPlace(position);\r\n }\r\n }\r\n }\r\n };\r\n\r\n if (animationGroup && animationGroup.isStarted) {\r\n const step = animationStep / animationGroup.getLength(0, 1);\r\n for (let frame = animationGroup.from; frame <= animationGroup.to; frame += step) {\r\n animationGroup.goToFrame(frame);\r\n updateMaxExtents();\r\n }\r\n } else {\r\n updateMaxExtents();\r\n }\r\n\r\n return maxExtents;\r\n}\r\n"]}
1
+ {"version":3,"file":"meshUtils.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnimationGroup } from \"../Animations/animationGroup\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { TmpVectors, Vector3 } from \"../Maths/math.vector\";\r\nimport type { FloatArray, Nullable } from \"../types\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\n\r\nfunction getExtentCorners(extent: { minimum: Vector3; maximum: Vector3 }): Array<Vector3> {\r\n const minX = extent.minimum.x;\r\n const minY = extent.minimum.y;\r\n const minZ = extent.minimum.z;\r\n const maxX = extent.maximum.x;\r\n const maxY = extent.maximum.y;\r\n const maxZ = extent.maximum.z;\r\n return [\r\n new Vector3(minX, minY, minZ),\r\n new Vector3(maxX, maxY, maxZ),\r\n new Vector3(maxX, minY, minZ),\r\n new Vector3(minX, maxY, minZ),\r\n new Vector3(minX, minY, maxZ),\r\n new Vector3(maxX, maxY, minZ),\r\n new Vector3(minX, maxY, maxZ),\r\n new Vector3(maxX, minY, maxZ),\r\n ];\r\n}\r\n\r\n/**\r\n * Computes the maximum extents of the given meshes considering animation, skeleton, and morph targets.\r\n * @param meshes The array of meshes to compute\r\n * @param animationGroup An optional animation group to animate (must be started to take effect)\r\n * @param animationStep An optional value indicating the number of seconds to step while looping through the given animation group\r\n * @returns An array of world space extents corresponding to the given meshes\r\n */\r\nexport function computeMaxExtents(\r\n meshes: Array<AbstractMesh>,\r\n animationGroup: Nullable<AnimationGroup> = null,\r\n animationStep = 1 / 6\r\n): Array<{ minimum: Vector3; maximum: Vector3 }> {\r\n // Local vector to avoid allocations.\r\n const position = TmpVectors.Vector3[0];\r\n\r\n const meshExtents = new Map<number, { minimum: Vector3; maximum: Vector3 }>();\r\n const skinnedMeshExtents = new Map<number, Map<number, { minimum: Vector3; maximum: Vector3 }>>();\r\n\r\n // Compute the non-skinned and skinned mesh extents.\r\n const maxLength = meshes.reduce((previous, current) => Math.max(previous, current.getTotalVertices()), 0);\r\n const minPositions = Array.from({ length: maxLength }, () => new Vector3());\r\n const maxPositions = Array.from({ length: maxLength }, () => new Vector3());\r\n for (const mesh of meshes) {\r\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n if (!positions) {\r\n continue;\r\n }\r\n\r\n // Initialize min/max positions with the original positions.\r\n const numVertices = mesh.getTotalVertices();\r\n minPositions.length = Math.max(minPositions.length, numVertices);\r\n maxPositions.length = Math.max(minPositions.length, numVertices);\r\n for (let i = 0, j = 0; i < numVertices; i++, j += 3) {\r\n position.set(positions[j], positions[j + 1], positions[j + 2]);\r\n minPositions[i].copyFrom(position);\r\n maxPositions[i].copyFrom(position);\r\n }\r\n\r\n // Apply morph targets to the min/max positions.\r\n const morphTargetManager = mesh.morphTargetManager;\r\n if (morphTargetManager) {\r\n for (let targetIndex = 0; targetIndex < morphTargetManager.numTargets; ++targetIndex) {\r\n const target = morphTargetManager.getTarget(targetIndex);\r\n const positions = target.getPositions();\r\n if (positions) {\r\n for (let i = 0, j = 0; i < numVertices; i++, j += 3) {\r\n position.set(positions[j], positions[j + 1], positions[j + 2]);\r\n minPositions[i].minimizeInPlace(position);\r\n maxPositions[i].maximizeInPlace(position);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Compute extent per mesh.\r\n const skeleton = mesh.skeleton;\r\n const weights = skeleton ? mesh.getVerticesData(VertexBuffer.MatricesWeightsKind) : null;\r\n const indices = skeleton ? mesh.getVerticesData(VertexBuffer.MatricesIndicesKind) : null;\r\n if (weights && indices) {\r\n // Compute extent per bone for skinned meshes.\r\n const needsExtra = mesh.numBoneInfluencers > 4;\r\n const weightsExtra = needsExtra ? mesh.getVerticesData(VertexBuffer.MatricesWeightsExtraKind) : null;\r\n const indicesExtra = needsExtra ? mesh.getVerticesData(VertexBuffer.MatricesIndicesExtraKind) : null;\r\n\r\n const perBoneExtents = skinnedMeshExtents.get(mesh.uniqueId) || new Map<number, { minimum: Vector3; maximum: Vector3 }>();\r\n skinnedMeshExtents.set(mesh.uniqueId, perBoneExtents);\r\n\r\n const updateExtents = (i: number, j: number, weights: FloatArray, indices: FloatArray): void => {\r\n for (let k = j; k < j + 4; k++) {\r\n if (weights[k] > 0) {\r\n const boneIndex = indices[k];\r\n\r\n const extent = perBoneExtents.get(boneIndex);\r\n if (extent) {\r\n extent.minimum.minimizeInPlace(minPositions[i]);\r\n extent.maximum.maximizeInPlace(maxPositions[i]);\r\n } else {\r\n perBoneExtents.set(boneIndex, {\r\n minimum: minPositions[i].clone(),\r\n maximum: maxPositions[i].clone(),\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n for (let i = 0, j = 0; i < numVertices; i++, j += 4) {\r\n updateExtents(i, j, weights, indices);\r\n\r\n if (weightsExtra && indicesExtra) {\r\n updateExtents(i, j, weightsExtra, indicesExtra);\r\n }\r\n }\r\n } else {\r\n // Compute extent for the whole mesh for non-skinned meshes.\r\n const extent = meshExtents.get(mesh.uniqueId) || {\r\n minimum: new Vector3().setAll(Number.POSITIVE_INFINITY),\r\n maximum: new Vector3().setAll(Number.NEGATIVE_INFINITY),\r\n };\r\n meshExtents.set(mesh.uniqueId, extent);\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n extent.minimum.minimizeInPlace(minPositions[i]);\r\n extent.maximum.maximizeInPlace(maxPositions[i]);\r\n }\r\n }\r\n }\r\n\r\n // Create the 8 corners of each non-skinned and skinned extent.\r\n const meshCorners = new Map<number, Array<Vector3>>();\r\n const skinnedMeshCorners = new Map<number, Map<number, Array<Vector3>>>();\r\n for (const mesh of meshes) {\r\n const extent = meshExtents.get(mesh.uniqueId);\r\n if (extent) {\r\n meshCorners.set(mesh.uniqueId, getExtentCorners(extent));\r\n } else {\r\n const perBoneExtents = skinnedMeshExtents.get(mesh.uniqueId);\r\n if (perBoneExtents) {\r\n const bones = mesh.skeleton!.bones;\r\n\r\n const perBoneCorners = new Map<number, Array<Vector3>>();\r\n skinnedMeshCorners.set(mesh.uniqueId, perBoneCorners);\r\n\r\n perBoneExtents.forEach((extent, boneIndex) => {\r\n const corners = getExtentCorners(extent);\r\n\r\n // Transform the coordinates of the corners for skinned meshes to bone space.\r\n const inverseBindMatrix = bones[boneIndex].getAbsoluteInverseBindMatrix();\r\n for (const corner of corners) {\r\n Vector3.TransformCoordinatesToRef(corner, inverseBindMatrix, corner);\r\n }\r\n\r\n perBoneCorners.set(boneIndex, corners);\r\n });\r\n }\r\n }\r\n }\r\n\r\n const maxExtents = Array.from({ length: meshes.length }, () => ({\r\n minimum: new Vector3().setAll(Number.POSITIVE_INFINITY),\r\n maximum: new Vector3().setAll(Number.NEGATIVE_INFINITY),\r\n }));\r\n\r\n const updateMaxExtents = (): void => {\r\n for (let i = 0; i < meshes.length; i++) {\r\n const mesh = meshes[i];\r\n const positions = mesh.getVerticesData(VertexBuffer.PositionKind);\r\n if (!positions) {\r\n continue;\r\n }\r\n\r\n const worldMatrix = mesh.computeWorldMatrix(true);\r\n\r\n const skeleton = mesh.skeleton;\r\n if (skeleton) {\r\n skeleton.prepare(true);\r\n\r\n const bones = skeleton.bones;\r\n const perBoneCorners = skinnedMeshCorners.get(mesh.uniqueId)!;\r\n perBoneCorners.forEach((corners, boneIndex) => {\r\n // Transform the per-bone corners into world space and update the max extent for each corner.\r\n for (const corner of corners) {\r\n const matrix = bones[boneIndex].getFinalMatrix().multiplyToRef(worldMatrix, TmpVectors.Matrix[0]);\r\n Vector3.TransformCoordinatesToRef(corner, matrix, position);\r\n maxExtents[i].minimum.minimizeInPlace(position);\r\n maxExtents[i].maximum.maximizeInPlace(position);\r\n }\r\n });\r\n } else {\r\n // Transform the corners into world space and update the max extent for each corner.\r\n for (const corner of meshCorners.get(mesh.uniqueId)!) {\r\n Vector3.TransformCoordinatesToRef(corner, worldMatrix, position);\r\n maxExtents[i].minimum.minimizeInPlace(position);\r\n maxExtents[i].maximum.maximizeInPlace(position);\r\n }\r\n }\r\n }\r\n };\r\n\r\n if (animationGroup && animationGroup.isStarted) {\r\n const step = animationStep / animationGroup.getLength(0, 1);\r\n for (let frame = animationGroup.from; frame <= animationGroup.to; frame += step) {\r\n animationGroup.goToFrame(frame);\r\n updateMaxExtents();\r\n }\r\n } else {\r\n updateMaxExtents();\r\n }\r\n\r\n return maxExtents;\r\n}\r\n"]}
@@ -9,6 +9,7 @@ export class TimingTools {
9
9
  */
10
10
  static SetImmediate(action) {
11
11
  if (IsWindowObjectExist() && window.setImmediate) {
12
+ // Note - deprecated and should not be used directly. Not supported in any browser.
12
13
  window.setImmediate(action);
13
14
  }
14
15
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"timingTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/timingTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAO,WAAW;IACpB;;;OAGG;IACI,MAAM,CAAC,YAAY,CAAC,MAAkB;QACzC,IAAI,mBAAmB,EAAE,IAAI,MAAM,CAAC,YAAY,EAAE;YAC9C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;SAC/B;aAAM;YACH,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACzB;IACL,CAAC;CACJ","sourcesContent":["import { IsWindowObjectExist } from \"./domManagement\";\r\n\r\n/**\r\n * Class used to provide helper for timing\r\n */\r\nexport class TimingTools {\r\n /**\r\n * Polyfill for setImmediate\r\n * @param action defines the action to execute after the current execution block\r\n */\r\n public static SetImmediate(action: () => void) {\r\n if (IsWindowObjectExist() && window.setImmediate) {\r\n window.setImmediate(action);\r\n } else {\r\n setTimeout(action, 1);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"timingTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/timingTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAO,WAAW;IACpB;;;OAGG;IACI,MAAM,CAAC,YAAY,CAAC,MAAkB;QACzC,IAAI,mBAAmB,EAAE,IAAI,MAAM,CAAC,YAAY,EAAE;YAC9C,mFAAmF;YACnF,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;SAC/B;aAAM;YACH,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACzB;IACL,CAAC;CACJ","sourcesContent":["import { IsWindowObjectExist } from \"./domManagement\";\r\n\r\n/**\r\n * Class used to provide helper for timing\r\n */\r\nexport class TimingTools {\r\n /**\r\n * Polyfill for setImmediate\r\n * @param action defines the action to execute after the current execution block\r\n */\r\n public static SetImmediate(action: () => void) {\r\n if (IsWindowObjectExist() && window.setImmediate) {\r\n // Note - deprecated and should not be used directly. Not supported in any browser.\r\n window.setImmediate(action);\r\n } else {\r\n setTimeout(action, 1);\r\n }\r\n }\r\n}\r\n"]}
@@ -37,6 +37,7 @@ export declare class VideoRecorder {
37
37
  private _fileName;
38
38
  private _resolve;
39
39
  private _reject;
40
+ private _isRecording;
40
41
  /**
41
42
  * True when a recording is already in progress.
42
43
  */
@@ -20,7 +20,7 @@ export class VideoRecorder {
20
20
  * True when a recording is already in progress.
21
21
  */
22
22
  get isRecording() {
23
- return !!this._canvas && this._canvas.isRecording;
23
+ return !!this._canvas && this._isRecording;
24
24
  }
25
25
  /**
26
26
  * Create a new VideoCapture object which can help converting what you see in Babylon to a video file.
@@ -38,7 +38,7 @@ export class VideoRecorder {
38
38
  throw "The babylon engine must have a canvas to be recorded";
39
39
  }
40
40
  this._canvas = canvas;
41
- this._canvas.isRecording = false;
41
+ this._isRecording = false;
42
42
  this._options = {
43
43
  ...VideoRecorder._DefaultOptions,
44
44
  ...options,
@@ -64,7 +64,7 @@ export class VideoRecorder {
64
64
  if (!this.isRecording) {
65
65
  return;
66
66
  }
67
- this._canvas.isRecording = false;
67
+ this._isRecording = false;
68
68
  this._mediaRecorder.stop();
69
69
  }
70
70
  /**
@@ -93,7 +93,7 @@ export class VideoRecorder {
93
93
  this._recordedChunks = [];
94
94
  this._resolve = null;
95
95
  this._reject = null;
96
- this._canvas.isRecording = true;
96
+ this._isRecording = true;
97
97
  this._mediaRecorder.start(this._options.recordChunckSize);
98
98
  return new Promise((resolve, reject) => {
99
99
  this._resolve = resolve;
@@ -1 +1 @@
1
- {"version":3,"file":"videoRecorder.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/videoRecorder.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable no-var */\r\nimport type { Nullable } from \"../types\";\r\nimport { Tools } from \"./tools\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\ninterface MediaRecorder {\r\n /** Starts recording */\r\n start(timeSlice: number): void;\r\n /** Stops recording */\r\n stop(): void;\r\n\r\n /** Event raised when an error arised. */\r\n onerror: (event: ErrorEvent) => void;\r\n /** Event raised when the recording stops. */\r\n onstop: (event: Event) => void;\r\n /** Event raised when a new chunk of data is available and should be tracked. */\r\n ondataavailable: (event: Event) => void;\r\n}\r\n\r\ninterface MediaRecorderOptions {\r\n /** The mime type you want to use as the recording container for the new MediaRecorder. */\r\n mimeType?: string;\r\n /** The chosen bitrate for the audio component of the media. */\r\n audioBitsPerSecond?: number;\r\n /** The chosen bitrate for the video component of the media. */\r\n videoBitsPerSecond?: number;\r\n /** The chosen bitrate for the audio and video components of the media. This can be specified instead of the above two properties.\r\n * If this is specified along with one or the other of the above properties, this will be used for the one that isn't specified. */\r\n bitsPerSecond?: number;\r\n}\r\n\r\ninterface MediaRecorderConstructor {\r\n /**\r\n * A reference to the prototype.\r\n */\r\n readonly prototype: MediaRecorder;\r\n\r\n /**\r\n * Creates a new MediaRecorder.\r\n * @param stream Defines the stream to record.\r\n * @param options Defines the options for the recorder available in the type MediaRecorderOptions.\r\n */\r\n new (stream: MediaStream, options?: MediaRecorderOptions): MediaRecorder;\r\n}\r\n\r\n/**\r\n * MediaRecorder object available in some browsers.\r\n */\r\ndeclare var MediaRecorder: MediaRecorderConstructor;\r\n\r\n/**\r\n * This represents the different options available for the video capture.\r\n */\r\nexport interface VideoRecorderOptions {\r\n /** The canvas you want to record */\r\n canvas?: HTMLCanvasElement;\r\n /** Defines the mime type of the video. */\r\n mimeType: string;\r\n /** Defines the FPS the video should be recorded at. */\r\n fps: number;\r\n /** Defines the chunk size for the recording data. */\r\n recordChunckSize: number;\r\n /** The audio tracks to attach to the recording. */\r\n audioTracks?: MediaStreamTrack[];\r\n}\r\n\r\n/**\r\n * This can help with recording videos from BabylonJS.\r\n * This is based on the available WebRTC functionalities of the browser.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToVideo\r\n */\r\nexport class VideoRecorder {\r\n private static readonly _DefaultOptions = {\r\n mimeType: \"video/webm\",\r\n fps: 25,\r\n recordChunckSize: 3000,\r\n };\r\n\r\n /**\r\n * Returns whether or not the VideoRecorder is available in your browser.\r\n * @param engine Defines the Babylon Engine.\r\n * @param canvas Defines the canvas to record. If not provided, the engine canvas will be used.\r\n * @returns true if supported otherwise false.\r\n */\r\n public static IsSupported(engine: AbstractEngine, canvas?: HTMLCanvasElement): boolean {\r\n const targetCanvas = canvas ?? engine.getRenderingCanvas();\r\n return !!targetCanvas && typeof (<any>targetCanvas).captureStream === \"function\";\r\n }\r\n\r\n private readonly _options: VideoRecorderOptions;\r\n private _canvas: Nullable<HTMLCanvasElement>;\r\n private _mediaRecorder: Nullable<MediaRecorder>;\r\n\r\n private _recordedChunks: any[];\r\n private _fileName: Nullable<string>;\r\n private _resolve: Nullable<(blob: Blob) => void>;\r\n private _reject: Nullable<(error: any) => void>;\r\n\r\n /**\r\n * True when a recording is already in progress.\r\n */\r\n public get isRecording(): boolean {\r\n return !!this._canvas && this._canvas.isRecording;\r\n }\r\n\r\n /**\r\n * Create a new VideoCapture object which can help converting what you see in Babylon to a video file.\r\n * @param engine Defines the BabylonJS Engine you wish to record.\r\n * @param options Defines options that can be used to customize the capture.\r\n */\r\n constructor(engine: AbstractEngine, options: Partial<VideoRecorderOptions> = {}) {\r\n if (!VideoRecorder.IsSupported(engine, options.canvas)) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Your browser does not support recording so far.\";\r\n }\r\n\r\n const canvas = options.canvas ?? engine.getRenderingCanvas();\r\n if (!canvas) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"The babylon engine must have a canvas to be recorded\";\r\n }\r\n\r\n this._canvas = canvas;\r\n this._canvas.isRecording = false;\r\n\r\n this._options = {\r\n ...VideoRecorder._DefaultOptions,\r\n ...options,\r\n };\r\n\r\n const stream = this._canvas.captureStream(this._options.fps);\r\n if (this._options.audioTracks) {\r\n for (const track of this._options.audioTracks) {\r\n stream.addTrack(track);\r\n }\r\n }\r\n\r\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: this._options.mimeType });\r\n this._mediaRecorder.ondataavailable = (evt: Event) => this._handleDataAvailable(evt);\r\n this._mediaRecorder.onerror = (evt: ErrorEvent) => this._handleError(evt);\r\n this._mediaRecorder.onstop = () => this._handleStop();\r\n }\r\n\r\n /**\r\n * Stops the current recording before the default capture timeout passed in the startRecording function.\r\n */\r\n public stopRecording(): void {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (!this.isRecording) {\r\n return;\r\n }\r\n\r\n this._canvas.isRecording = false;\r\n this._mediaRecorder.stop();\r\n }\r\n\r\n /**\r\n * Starts recording the canvas for a max duration specified in parameters.\r\n * @param fileName Defines the name of the file to be downloaded when the recording stop.\r\n * If null no automatic download will start and you can rely on the promise to get the data back.\r\n * @param maxDuration Defines the maximum recording time in seconds.\r\n * It defaults to 7 seconds. A value of zero will not stop automatically, you would need to call stopRecording manually.\r\n * @returns A promise callback at the end of the recording with the video data in Blob.\r\n */\r\n public startRecording(fileName: Nullable<string> = \"babylonjs.webm\", maxDuration = 7): Promise<Blob> {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recorder has already been disposed\";\r\n }\r\n\r\n if (this.isRecording) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recording already in progress\";\r\n }\r\n\r\n if (maxDuration > 0) {\r\n setTimeout(() => {\r\n this.stopRecording();\r\n }, maxDuration * 1000);\r\n }\r\n\r\n this._fileName = fileName;\r\n this._recordedChunks = [];\r\n this._resolve = null;\r\n this._reject = null;\r\n\r\n this._canvas.isRecording = true;\r\n this._mediaRecorder.start(this._options.recordChunckSize);\r\n\r\n return new Promise<Blob>((resolve, reject) => {\r\n this._resolve = resolve;\r\n this._reject = reject;\r\n });\r\n }\r\n\r\n /**\r\n * Releases internal resources used during the recording.\r\n */\r\n public dispose() {\r\n this._canvas = null;\r\n this._mediaRecorder = null;\r\n\r\n this._recordedChunks = [];\r\n this._fileName = null;\r\n this._resolve = null;\r\n this._reject = null;\r\n }\r\n\r\n private _handleDataAvailable(event: any): void {\r\n if (event.data.size > 0) {\r\n this._recordedChunks.push(event.data);\r\n }\r\n }\r\n\r\n private _handleError(event: ErrorEvent): void {\r\n this.stopRecording();\r\n\r\n if (this._reject) {\r\n this._reject(event.error);\r\n } else {\r\n throw new event.error();\r\n }\r\n }\r\n\r\n private _handleStop(): void {\r\n this.stopRecording();\r\n\r\n const superBuffer = new Blob(this._recordedChunks);\r\n if (this._resolve) {\r\n this._resolve(superBuffer);\r\n }\r\n\r\n window.URL.createObjectURL(superBuffer);\r\n\r\n if (this._fileName) {\r\n Tools.Download(superBuffer, this._fileName);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"videoRecorder.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/videoRecorder.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable no-var */\r\nimport type { Nullable } from \"../types\";\r\nimport { Tools } from \"./tools\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\ninterface MediaRecorder {\r\n /** Starts recording */\r\n start(timeSlice: number): void;\r\n /** Stops recording */\r\n stop(): void;\r\n\r\n /** Event raised when an error arised. */\r\n onerror: (event: ErrorEvent) => void;\r\n /** Event raised when the recording stops. */\r\n onstop: (event: Event) => void;\r\n /** Event raised when a new chunk of data is available and should be tracked. */\r\n ondataavailable: (event: Event) => void;\r\n}\r\n\r\ninterface MediaRecorderOptions {\r\n /** The mime type you want to use as the recording container for the new MediaRecorder. */\r\n mimeType?: string;\r\n /** The chosen bitrate for the audio component of the media. */\r\n audioBitsPerSecond?: number;\r\n /** The chosen bitrate for the video component of the media. */\r\n videoBitsPerSecond?: number;\r\n /** The chosen bitrate for the audio and video components of the media. This can be specified instead of the above two properties.\r\n * If this is specified along with one or the other of the above properties, this will be used for the one that isn't specified. */\r\n bitsPerSecond?: number;\r\n}\r\n\r\ninterface MediaRecorderConstructor {\r\n /**\r\n * A reference to the prototype.\r\n */\r\n readonly prototype: MediaRecorder;\r\n\r\n /**\r\n * Creates a new MediaRecorder.\r\n * @param stream Defines the stream to record.\r\n * @param options Defines the options for the recorder available in the type MediaRecorderOptions.\r\n */\r\n new (stream: MediaStream, options?: MediaRecorderOptions): MediaRecorder;\r\n}\r\n\r\n/**\r\n * MediaRecorder object available in some browsers.\r\n */\r\ndeclare var MediaRecorder: MediaRecorderConstructor;\r\n\r\n/**\r\n * This represents the different options available for the video capture.\r\n */\r\nexport interface VideoRecorderOptions {\r\n /** The canvas you want to record */\r\n canvas?: HTMLCanvasElement;\r\n /** Defines the mime type of the video. */\r\n mimeType: string;\r\n /** Defines the FPS the video should be recorded at. */\r\n fps: number;\r\n /** Defines the chunk size for the recording data. */\r\n recordChunckSize: number;\r\n /** The audio tracks to attach to the recording. */\r\n audioTracks?: MediaStreamTrack[];\r\n}\r\n\r\n/**\r\n * This can help with recording videos from BabylonJS.\r\n * This is based on the available WebRTC functionalities of the browser.\r\n *\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToVideo\r\n */\r\nexport class VideoRecorder {\r\n private static readonly _DefaultOptions = {\r\n mimeType: \"video/webm\",\r\n fps: 25,\r\n recordChunckSize: 3000,\r\n };\r\n\r\n /**\r\n * Returns whether or not the VideoRecorder is available in your browser.\r\n * @param engine Defines the Babylon Engine.\r\n * @param canvas Defines the canvas to record. If not provided, the engine canvas will be used.\r\n * @returns true if supported otherwise false.\r\n */\r\n public static IsSupported(engine: AbstractEngine, canvas?: HTMLCanvasElement): boolean {\r\n const targetCanvas = canvas ?? engine.getRenderingCanvas();\r\n return !!targetCanvas && typeof (<any>targetCanvas).captureStream === \"function\";\r\n }\r\n\r\n private readonly _options: VideoRecorderOptions;\r\n private _canvas: Nullable<HTMLCanvasElement>;\r\n private _mediaRecorder: Nullable<MediaRecorder>;\r\n\r\n private _recordedChunks: any[];\r\n private _fileName: Nullable<string>;\r\n private _resolve: Nullable<(blob: Blob) => void>;\r\n private _reject: Nullable<(error: any) => void>;\r\n\r\n private _isRecording: boolean;\r\n\r\n /**\r\n * True when a recording is already in progress.\r\n */\r\n public get isRecording(): boolean {\r\n return !!this._canvas && this._isRecording;\r\n }\r\n\r\n /**\r\n * Create a new VideoCapture object which can help converting what you see in Babylon to a video file.\r\n * @param engine Defines the BabylonJS Engine you wish to record.\r\n * @param options Defines options that can be used to customize the capture.\r\n */\r\n constructor(engine: AbstractEngine, options: Partial<VideoRecorderOptions> = {}) {\r\n if (!VideoRecorder.IsSupported(engine, options.canvas)) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Your browser does not support recording so far.\";\r\n }\r\n\r\n const canvas = options.canvas ?? engine.getRenderingCanvas();\r\n if (!canvas) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"The babylon engine must have a canvas to be recorded\";\r\n }\r\n\r\n this._canvas = canvas;\r\n this._isRecording = false;\r\n\r\n this._options = {\r\n ...VideoRecorder._DefaultOptions,\r\n ...options,\r\n };\r\n\r\n const stream = this._canvas.captureStream(this._options.fps);\r\n if (this._options.audioTracks) {\r\n for (const track of this._options.audioTracks) {\r\n stream.addTrack(track);\r\n }\r\n }\r\n\r\n this._mediaRecorder = new MediaRecorder(stream, { mimeType: this._options.mimeType });\r\n this._mediaRecorder.ondataavailable = (evt: Event) => this._handleDataAvailable(evt);\r\n this._mediaRecorder.onerror = (evt: ErrorEvent) => this._handleError(evt);\r\n this._mediaRecorder.onstop = () => this._handleStop();\r\n }\r\n\r\n /**\r\n * Stops the current recording before the default capture timeout passed in the startRecording function.\r\n */\r\n public stopRecording(): void {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (!this.isRecording) {\r\n return;\r\n }\r\n\r\n this._isRecording = false;\r\n this._mediaRecorder.stop();\r\n }\r\n\r\n /**\r\n * Starts recording the canvas for a max duration specified in parameters.\r\n * @param fileName Defines the name of the file to be downloaded when the recording stop.\r\n * If null no automatic download will start and you can rely on the promise to get the data back.\r\n * @param maxDuration Defines the maximum recording time in seconds.\r\n * It defaults to 7 seconds. A value of zero will not stop automatically, you would need to call stopRecording manually.\r\n * @returns A promise callback at the end of the recording with the video data in Blob.\r\n */\r\n public startRecording(fileName: Nullable<string> = \"babylonjs.webm\", maxDuration = 7): Promise<Blob> {\r\n if (!this._canvas || !this._mediaRecorder) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recorder has already been disposed\";\r\n }\r\n\r\n if (this.isRecording) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"Recording already in progress\";\r\n }\r\n\r\n if (maxDuration > 0) {\r\n setTimeout(() => {\r\n this.stopRecording();\r\n }, maxDuration * 1000);\r\n }\r\n\r\n this._fileName = fileName;\r\n this._recordedChunks = [];\r\n this._resolve = null;\r\n this._reject = null;\r\n\r\n this._isRecording = true;\r\n this._mediaRecorder.start(this._options.recordChunckSize);\r\n\r\n return new Promise<Blob>((resolve, reject) => {\r\n this._resolve = resolve;\r\n this._reject = reject;\r\n });\r\n }\r\n\r\n /**\r\n * Releases internal resources used during the recording.\r\n */\r\n public dispose() {\r\n this._canvas = null;\r\n this._mediaRecorder = null;\r\n\r\n this._recordedChunks = [];\r\n this._fileName = null;\r\n this._resolve = null;\r\n this._reject = null;\r\n }\r\n\r\n private _handleDataAvailable(event: any): void {\r\n if (event.data.size > 0) {\r\n this._recordedChunks.push(event.data);\r\n }\r\n }\r\n\r\n private _handleError(event: ErrorEvent): void {\r\n this.stopRecording();\r\n\r\n if (this._reject) {\r\n this._reject(event.error);\r\n } else {\r\n throw new event.error();\r\n }\r\n }\r\n\r\n private _handleStop(): void {\r\n this.stopRecording();\r\n\r\n const superBuffer = new Blob(this._recordedChunks);\r\n if (this._resolve) {\r\n this._resolve(superBuffer);\r\n }\r\n\r\n window.URL.createObjectURL(superBuffer);\r\n\r\n if (this._fileName) {\r\n Tools.Download(superBuffer, this._fileName);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,12 +1,12 @@
1
1
  import { Mesh } from "../Meshes/mesh.js";
2
2
  import { GPUParticleSystem } from "./gpuParticleSystem.js";
3
- import { AbstractScene } from "../abstractScene.js";
4
3
  import { ParticleSystem } from "./particleSystem.js";
5
4
  import { SceneComponentConstants } from "../sceneComponent.js";
6
5
  import { AbstractEngine } from "../Engines/abstractEngine.js";
6
+ import { AddParser, AddIndividualParser, GetIndividualParser } from "../Loading/Plugins/babylonFileParser.function.js";
7
7
  // Adds the parsers to the scene parsers.
8
- AbstractScene.AddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData, scene, container, rootUrl) => {
9
- const individualParser = AbstractScene.GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);
8
+ AddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData, scene, container, rootUrl) => {
9
+ const individualParser = GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);
10
10
  if (!individualParser) {
11
11
  return;
12
12
  }
@@ -18,7 +18,7 @@ AbstractScene.AddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData
18
18
  }
19
19
  }
20
20
  });
21
- AbstractScene.AddIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedParticleSystem, scene, rootUrl) => {
21
+ AddIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedParticleSystem, scene, rootUrl) => {
22
22
  if (parsedParticleSystem.activeParticleCount) {
23
23
  const ps = GPUParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);
24
24
  return ps;
@@ -1 +1 @@
1
- {"version":3,"file":"particleSystemComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/particleSystemComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,yCAAyC;AACzC,aAAa,CAAC,SAAS,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,CAAC,UAAe,EAAE,KAAY,EAAE,SAAyB,EAAE,OAAe,EAAE,EAAE;IAC/I,MAAM,gBAAgB,GAAG,aAAa,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;IAExG,IAAI,CAAC,gBAAgB,EAAE;QACnB,OAAO;KACV;IAED,oBAAoB;IACpB,IAAI,UAAU,CAAC,eAAe,KAAK,SAAS,IAAI,UAAU,CAAC,eAAe,KAAK,IAAI,EAAE;QACjF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE;YACnF,MAAM,oBAAoB,GAAG,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC/D,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;SAC1F;KACJ;AACL,CAAC,CAAC,CAAC;AAEH,aAAa,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,CAAC,oBAAyB,EAAE,KAAY,EAAE,OAAe,EAAE,EAAE;IACxI,IAAI,oBAAoB,CAAC,mBAAmB,EAAE;QAC1C,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACzE,OAAO,EAAE,CAAC;KACb;SAAM;QACH,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,EAAE,CAAC;KACb;AACL,CAAC,CAAC,CAAC;AAiCH,cAAc,CAAC,SAAS,CAAC,wBAAwB,GAAG,UAChD,YAAoB,EACpB,gBAA0B,EAAE,EAC5B,WAAqB,EAAE,EACvB,OAAO,GAAG,EAAE,EACZ,SAA2B,EAC3B,UAAqC,EACrC,OAAkD,EAClD,cAAgC,EAChC,cAAc,8BAAsB;IAEpC,IAAI,wBAAwB,GAAkB,EAAE,CAAC;IACjD,IAAI,oBAAoB,GAAkB,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAkB,EAAE,CAAC;IAEtC,IAAI,cAAc,EAAE;QAChB,cAAc,CAAC,qCAAqC,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,WAAW,CAAC,CAAC;KACrH;SAAM;QACH,wBAAwB,GAAG,cAAc,CAAC,2BAA2B,EAAE,CAAC;QACxE,oBAAoB,GAAG,cAAc,CAAC,yBAAyB,EAAE,CAAC;KACrE;IAED,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE;QACtC,OAAO,IAAI,uBAAuB,CAAC;KACtC;IAED,IAAI,cAAc,EAAE,uBAAuB,EAAE;QACzC,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE;YACzC,OAAO,IAAI,0BAA0B,CAAC;SACzC;KACJ;IAED,IAAI,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE;QAC3C,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACnC;IAED,OAAO,IAAI,CAAC,YAAY,CACpB;QACI,MAAM,EAAE,cAAc,EAAE,gBAAgB,IAAI,WAAW;QACvD,eAAe,EAAE,YAAY;KAChC,EACD,wBAAwB,EACxB,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC,EAC1C,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,UAAU,EACV,OAAO,EACP,SAAS,EACT,cAAc,EACd,KAAK,IAAI,EAAE;QACP,IAAI,cAAc,gCAAwB,EAAE;YACxC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;SAC/C;aAAM;YACH,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;SACnD;IACL,CAAC,CACJ,CAAC;AACN,CAAC,CAAC;AAkBF,IAAI,CAAC,SAAS,CAAC,yBAAyB,GAAG;IACvC,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACzE,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI,EAAE;YACjC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAChC;KACJ;IACD,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,IAAI,CAAC,SAAS,CAAC,kCAAkC,GAAG;IAChD,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACzE,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAQ,cAAc,CAAC,OAAO,CAAC;QAE5C,IAAI,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE;YACzD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAChC;KACJ;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC","sourcesContent":["import { Mesh } from \"../Meshes/mesh\";\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { GPUParticleSystem } from \"./gpuParticleSystem\";\r\nimport { AbstractScene } from \"../abstractScene\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ParticleSystem } from \"./particleSystem\";\r\nimport type { Scene } from \"../scene\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport type { AssetContainer } from \"../assetContainer\";\r\nimport type { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n// Adds the parsers to the scene parsers.\r\nAbstractScene.AddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => {\r\n const individualParser = AbstractScene.GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\r\n\r\n if (!individualParser) {\r\n return;\r\n }\r\n\r\n // Particles Systems\r\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\r\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\r\n const parsedParticleSystem = parsedData.particleSystems[index];\r\n container.particleSystems.push(individualParser(parsedParticleSystem, scene, rootUrl));\r\n }\r\n }\r\n});\r\n\r\nAbstractScene.AddIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedParticleSystem: any, scene: Scene, rootUrl: string) => {\r\n if (parsedParticleSystem.activeParticleCount) {\r\n const ps = GPUParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n } else {\r\n const ps = ParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n }\r\n});\r\n\r\ndeclare module \"../Engines/abstractEngine\" {\r\n export interface AbstractEngine {\r\n /**\r\n * Create an effect to use with particle systems.\r\n * Please note that some parameters like animation sheets or not being billboard are not supported in this configuration, except if you pass\r\n * the particle system for which you want to create a custom effect in the last parameter\r\n * @param fragmentName defines the base name of the effect (The name of file without .fragment.fx)\r\n * @param uniformsNames defines a list of attribute names\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param particleSystem the particle system you want to create the effect for\r\n * @param shaderLanguage defines the shader language to use\r\n * @returns the new Effect\r\n */\r\n createEffectForParticles(\r\n fragmentName: string,\r\n uniformsNames: string[],\r\n samplers: string[],\r\n defines: string,\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem,\r\n shaderLanguage?: ShaderLanguage\r\n ): Effect;\r\n }\r\n}\r\n\r\nAbstractEngine.prototype.createEffectForParticles = function (\r\n fragmentName: string,\r\n uniformsNames: string[] = [],\r\n samplers: string[] = [],\r\n defines = \"\",\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem,\r\n shaderLanguage = ShaderLanguage.GLSL\r\n): Effect {\r\n let attributesNamesOrOptions: Array<string> = [];\r\n let effectCreationOption: Array<string> = [];\r\n const allSamplers: Array<string> = [];\r\n\r\n if (particleSystem) {\r\n particleSystem.fillUniformsAttributesAndSamplerNames(effectCreationOption, attributesNamesOrOptions, allSamplers);\r\n } else {\r\n attributesNamesOrOptions = ParticleSystem._GetAttributeNamesOrOptions();\r\n effectCreationOption = ParticleSystem._GetEffectCreationOptions();\r\n }\r\n\r\n if (defines.indexOf(\" BILLBOARD\") === -1) {\r\n defines += \"\\n#define BILLBOARD\\n\";\r\n }\r\n\r\n if (particleSystem?.isAnimationSheetEnabled) {\r\n if (defines.indexOf(\" ANIMATESHEET\") === -1) {\r\n defines += \"\\n#define ANIMATESHEET\\n\";\r\n }\r\n }\r\n\r\n if (samplers.indexOf(\"diffuseSampler\") === -1) {\r\n samplers.push(\"diffuseSampler\");\r\n }\r\n\r\n return this.createEffect(\r\n {\r\n vertex: particleSystem?.vertexShaderName ?? \"particles\",\r\n fragmentElement: fragmentName,\r\n },\r\n attributesNamesOrOptions,\r\n effectCreationOption.concat(uniformsNames),\r\n allSamplers.concat(samplers),\r\n defines,\r\n fallbacks,\r\n onCompiled,\r\n onError,\r\n undefined,\r\n shaderLanguage,\r\n async () => {\r\n if (shaderLanguage === ShaderLanguage.GLSL) {\r\n await import(\"../Shaders/particles.vertex\");\r\n } else {\r\n await import(\"../ShadersWGSL/particles.vertex\");\r\n }\r\n }\r\n );\r\n};\r\n\r\ndeclare module \"../Meshes/mesh\" {\r\n export interface Mesh {\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh is the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getEmittedParticleSystems(): IParticleSystem[];\r\n\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh or its children are the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getHierarchyEmittedParticleSystems(): IParticleSystem[];\r\n }\r\n}\r\n\r\nMesh.prototype.getEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n if (particleSystem.emitter === this) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nMesh.prototype.getHierarchyEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n const descendants = this.getDescendants();\r\n descendants.push(this);\r\n\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (emitter.position && descendants.indexOf(emitter) !== -1) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n\r\n return results;\r\n};\r\n"]}
1
+ {"version":3,"file":"particleSystemComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Particles/particleSystemComponent.ts"],"names":[],"mappings":"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","sourcesContent":["import { Mesh } from \"../Meshes/mesh\";\r\nimport type { IParticleSystem } from \"./IParticleSystem\";\r\nimport { GPUParticleSystem } from \"./gpuParticleSystem\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { ParticleSystem } from \"./particleSystem\";\r\nimport type { Scene } from \"../scene\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport type { AssetContainer } from \"../assetContainer\";\r\nimport type { EffectFallbacks } from \"../Materials/effectFallbacks\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { AddParser, AddIndividualParser, GetIndividualParser } from \"core/Loading/Plugins/babylonFileParser.function\";\r\n\r\n// Adds the parsers to the scene parsers.\r\nAddParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => {\r\n const individualParser = GetIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM);\r\n\r\n if (!individualParser) {\r\n return;\r\n }\r\n\r\n // Particles Systems\r\n if (parsedData.particleSystems !== undefined && parsedData.particleSystems !== null) {\r\n for (let index = 0, cache = parsedData.particleSystems.length; index < cache; index++) {\r\n const parsedParticleSystem = parsedData.particleSystems[index];\r\n container.particleSystems.push(individualParser(parsedParticleSystem, scene, rootUrl));\r\n }\r\n }\r\n});\r\n\r\nAddIndividualParser(SceneComponentConstants.NAME_PARTICLESYSTEM, (parsedParticleSystem: any, scene: Scene, rootUrl: string) => {\r\n if (parsedParticleSystem.activeParticleCount) {\r\n const ps = GPUParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n } else {\r\n const ps = ParticleSystem.Parse(parsedParticleSystem, scene, rootUrl);\r\n return ps;\r\n }\r\n});\r\n\r\ndeclare module \"../Engines/abstractEngine\" {\r\n export interface AbstractEngine {\r\n /**\r\n * Create an effect to use with particle systems.\r\n * Please note that some parameters like animation sheets or not being billboard are not supported in this configuration, except if you pass\r\n * the particle system for which you want to create a custom effect in the last parameter\r\n * @param fragmentName defines the base name of the effect (The name of file without .fragment.fx)\r\n * @param uniformsNames defines a list of attribute names\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param particleSystem the particle system you want to create the effect for\r\n * @param shaderLanguage defines the shader language to use\r\n * @returns the new Effect\r\n */\r\n createEffectForParticles(\r\n fragmentName: string,\r\n uniformsNames: string[],\r\n samplers: string[],\r\n defines: string,\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem,\r\n shaderLanguage?: ShaderLanguage\r\n ): Effect;\r\n }\r\n}\r\n\r\nAbstractEngine.prototype.createEffectForParticles = function (\r\n fragmentName: string,\r\n uniformsNames: string[] = [],\r\n samplers: string[] = [],\r\n defines = \"\",\r\n fallbacks?: EffectFallbacks,\r\n onCompiled?: (effect: Effect) => void,\r\n onError?: (effect: Effect, errors: string) => void,\r\n particleSystem?: IParticleSystem,\r\n shaderLanguage = ShaderLanguage.GLSL\r\n): Effect {\r\n let attributesNamesOrOptions: Array<string> = [];\r\n let effectCreationOption: Array<string> = [];\r\n const allSamplers: Array<string> = [];\r\n\r\n if (particleSystem) {\r\n particleSystem.fillUniformsAttributesAndSamplerNames(effectCreationOption, attributesNamesOrOptions, allSamplers);\r\n } else {\r\n attributesNamesOrOptions = ParticleSystem._GetAttributeNamesOrOptions();\r\n effectCreationOption = ParticleSystem._GetEffectCreationOptions();\r\n }\r\n\r\n if (defines.indexOf(\" BILLBOARD\") === -1) {\r\n defines += \"\\n#define BILLBOARD\\n\";\r\n }\r\n\r\n if (particleSystem?.isAnimationSheetEnabled) {\r\n if (defines.indexOf(\" ANIMATESHEET\") === -1) {\r\n defines += \"\\n#define ANIMATESHEET\\n\";\r\n }\r\n }\r\n\r\n if (samplers.indexOf(\"diffuseSampler\") === -1) {\r\n samplers.push(\"diffuseSampler\");\r\n }\r\n\r\n return this.createEffect(\r\n {\r\n vertex: particleSystem?.vertexShaderName ?? \"particles\",\r\n fragmentElement: fragmentName,\r\n },\r\n attributesNamesOrOptions,\r\n effectCreationOption.concat(uniformsNames),\r\n allSamplers.concat(samplers),\r\n defines,\r\n fallbacks,\r\n onCompiled,\r\n onError,\r\n undefined,\r\n shaderLanguage,\r\n async () => {\r\n if (shaderLanguage === ShaderLanguage.GLSL) {\r\n await import(\"../Shaders/particles.vertex\");\r\n } else {\r\n await import(\"../ShadersWGSL/particles.vertex\");\r\n }\r\n }\r\n );\r\n};\r\n\r\ndeclare module \"../Meshes/mesh\" {\r\n export interface Mesh {\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh is the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getEmittedParticleSystems(): IParticleSystem[];\r\n\r\n /**\r\n * Returns an array populated with IParticleSystem objects whose the mesh or its children are the emitter\r\n * @returns an array of IParticleSystem\r\n */\r\n getHierarchyEmittedParticleSystems(): IParticleSystem[];\r\n }\r\n}\r\n\r\nMesh.prototype.getEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n if (particleSystem.emitter === this) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n return results;\r\n};\r\n\r\nMesh.prototype.getHierarchyEmittedParticleSystems = function (): IParticleSystem[] {\r\n const results: IParticleSystem[] = [];\r\n const descendants = this.getDescendants();\r\n descendants.push(this);\r\n\r\n for (let index = 0; index < this.getScene().particleSystems.length; index++) {\r\n const particleSystem = this.getScene().particleSystems[index];\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (emitter.position && descendants.indexOf(emitter) !== -1) {\r\n results.push(particleSystem);\r\n }\r\n }\r\n\r\n return results;\r\n};\r\n"]}
@@ -1,10 +1,10 @@
1
1
  import { Scene } from "../scene.js";
2
2
  import { SceneComponentConstants } from "../sceneComponent.js";
3
3
  import { SubSurfaceConfiguration } from "./subSurfaceConfiguration.js";
4
- import { AbstractScene } from "../abstractScene.js";
5
4
  import { Color3 } from "../Maths/math.color.js";
5
+ import { AddParser } from "../Loading/Plugins/babylonFileParser.function.js";
6
6
  // Adds the parser to the scene parsers.
7
- AbstractScene.AddParser(SceneComponentConstants.NAME_SUBSURFACE, (parsedData, scene) => {
7
+ AddParser(SceneComponentConstants.NAME_SUBSURFACE, (parsedData, scene) => {
8
8
  // Diffusion profiles
9
9
  if (parsedData.ssDiffusionProfileColors !== undefined && parsedData.ssDiffusionProfileColors !== null) {
10
10
  scene.enableSubSurfaceForPrePass();
@@ -1 +1 @@
1
- {"version":3,"file":"subSurfaceSceneComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/subSurfaceSceneComponent.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport type { ISceneSerializableComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { SubSurfaceConfiguration } from \"./subSurfaceConfiguration\";\r\nimport { AbstractScene } from \"../abstractScene\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\n\r\n// Adds the parser to the scene parsers.\r\nAbstractScene.AddParser(SceneComponentConstants.NAME_SUBSURFACE, (parsedData: any, scene: Scene) => {\r\n // Diffusion profiles\r\n if (parsedData.ssDiffusionProfileColors !== undefined && parsedData.ssDiffusionProfileColors !== null) {\r\n scene.enableSubSurfaceForPrePass();\r\n if (scene.subSurfaceConfiguration) {\r\n for (let index = 0, cache = parsedData.ssDiffusionProfileColors.length; index < cache; index++) {\r\n const color = parsedData.ssDiffusionProfileColors[index];\r\n scene.subSurfaceConfiguration.addDiffusionProfile(new Color3(color.r, color.g, color.b));\r\n }\r\n }\r\n }\r\n});\r\n\r\ndeclare module \"../abstractScene\" {\r\n export interface AbstractScene {\r\n /** @internal (Backing field) */\r\n _subSurfaceConfiguration: Nullable<SubSurfaceConfiguration>;\r\n\r\n /**\r\n * Gets or Sets the current prepass renderer associated to the scene.\r\n */\r\n subSurfaceConfiguration: Nullable<SubSurfaceConfiguration>;\r\n\r\n /**\r\n * Enables the subsurface effect for prepass\r\n * @returns the SubSurfaceConfiguration\r\n */\r\n enableSubSurfaceForPrePass(): Nullable<SubSurfaceConfiguration>;\r\n\r\n /**\r\n * Disables the subsurface effect for prepass\r\n */\r\n disableSubSurfaceForPrePass(): void;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"subSurfaceConfiguration\", {\r\n get: function (this: Scene) {\r\n return this._subSurfaceConfiguration;\r\n },\r\n set: function (this: Scene, value: Nullable<SubSurfaceConfiguration>) {\r\n if (value) {\r\n if (this.enablePrePassRenderer()) {\r\n this._subSurfaceConfiguration = value;\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nScene.prototype.enableSubSurfaceForPrePass = function (): Nullable<SubSurfaceConfiguration> {\r\n if (this._subSurfaceConfiguration) {\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n const prePassRenderer = this.enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n this._subSurfaceConfiguration = new SubSurfaceConfiguration(this);\r\n prePassRenderer.addEffectConfiguration(this._subSurfaceConfiguration);\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n return null;\r\n};\r\n\r\nScene.prototype.disableSubSurfaceForPrePass = function (): void {\r\n if (!this._subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n this._subSurfaceConfiguration.dispose();\r\n this._subSurfaceConfiguration = null;\r\n};\r\n\r\n/**\r\n * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful\r\n * in several rendering techniques.\r\n */\r\nexport class SubSurfaceSceneComponent implements ISceneSerializableComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_PREPASSRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {}\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n public serialize(serializationObject: any): void {\r\n if (!this.scene.subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n const ssDiffusionProfileColors = this.scene.subSurfaceConfiguration.ssDiffusionProfileColors;\r\n serializationObject.ssDiffusionProfileColors = [];\r\n\r\n for (let i = 0; i < ssDiffusionProfileColors.length; i++) {\r\n serializationObject.ssDiffusionProfileColors.push({\r\n r: ssDiffusionProfileColors[i].r,\r\n g: ssDiffusionProfileColors[i].g,\r\n b: ssDiffusionProfileColors[i].b,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adds all the elements from the container to the scene\r\n */\r\n public addFromContainer(): void {\r\n // Nothing to do\r\n }\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n */\r\n public removeFromContainer(): void {\r\n // Make sure nothing will be serialized\r\n if (!this.scene.prePassRenderer) {\r\n return;\r\n }\r\n\r\n if (this.scene.subSurfaceConfiguration) {\r\n this.scene.subSurfaceConfiguration.clearAllDiffusionProfiles();\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n // Nothing to do for this component\r\n }\r\n}\r\n\r\nSubSurfaceConfiguration._SceneComponentInitialization = (scene: Scene) => {\r\n // Register the G Buffer component to the scene.\r\n let component = scene._getComponent(SceneComponentConstants.NAME_SUBSURFACE) as SubSurfaceSceneComponent;\r\n if (!component) {\r\n component = new SubSurfaceSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n};\r\n"]}
1
+ {"version":3,"file":"subSurfaceSceneComponent.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/subSurfaceSceneComponent.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport type { ISceneSerializableComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { SubSurfaceConfiguration } from \"./subSurfaceConfiguration\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { AddParser } from \"core/Loading/Plugins/babylonFileParser.function\";\r\n\r\n// Adds the parser to the scene parsers.\r\nAddParser(SceneComponentConstants.NAME_SUBSURFACE, (parsedData: any, scene: Scene) => {\r\n // Diffusion profiles\r\n if (parsedData.ssDiffusionProfileColors !== undefined && parsedData.ssDiffusionProfileColors !== null) {\r\n scene.enableSubSurfaceForPrePass();\r\n if (scene.subSurfaceConfiguration) {\r\n for (let index = 0, cache = parsedData.ssDiffusionProfileColors.length; index < cache; index++) {\r\n const color = parsedData.ssDiffusionProfileColors[index];\r\n scene.subSurfaceConfiguration.addDiffusionProfile(new Color3(color.r, color.g, color.b));\r\n }\r\n }\r\n }\r\n});\r\n\r\ndeclare module \"../abstractScene\" {\r\n export interface AbstractScene {\r\n /** @internal (Backing field) */\r\n _subSurfaceConfiguration: Nullable<SubSurfaceConfiguration>;\r\n\r\n /**\r\n * Gets or Sets the current prepass renderer associated to the scene.\r\n */\r\n subSurfaceConfiguration: Nullable<SubSurfaceConfiguration>;\r\n\r\n /**\r\n * Enables the subsurface effect for prepass\r\n * @returns the SubSurfaceConfiguration\r\n */\r\n enableSubSurfaceForPrePass(): Nullable<SubSurfaceConfiguration>;\r\n\r\n /**\r\n * Disables the subsurface effect for prepass\r\n */\r\n disableSubSurfaceForPrePass(): void;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"subSurfaceConfiguration\", {\r\n get: function (this: Scene) {\r\n return this._subSurfaceConfiguration;\r\n },\r\n set: function (this: Scene, value: Nullable<SubSurfaceConfiguration>) {\r\n if (value) {\r\n if (this.enablePrePassRenderer()) {\r\n this._subSurfaceConfiguration = value;\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n});\r\n\r\nScene.prototype.enableSubSurfaceForPrePass = function (): Nullable<SubSurfaceConfiguration> {\r\n if (this._subSurfaceConfiguration) {\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n const prePassRenderer = this.enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n this._subSurfaceConfiguration = new SubSurfaceConfiguration(this);\r\n prePassRenderer.addEffectConfiguration(this._subSurfaceConfiguration);\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n return null;\r\n};\r\n\r\nScene.prototype.disableSubSurfaceForPrePass = function (): void {\r\n if (!this._subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n this._subSurfaceConfiguration.dispose();\r\n this._subSurfaceConfiguration = null;\r\n};\r\n\r\n/**\r\n * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful\r\n * in several rendering techniques.\r\n */\r\nexport class SubSurfaceSceneComponent implements ISceneSerializableComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_PREPASSRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {}\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n public serialize(serializationObject: any): void {\r\n if (!this.scene.subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n const ssDiffusionProfileColors = this.scene.subSurfaceConfiguration.ssDiffusionProfileColors;\r\n serializationObject.ssDiffusionProfileColors = [];\r\n\r\n for (let i = 0; i < ssDiffusionProfileColors.length; i++) {\r\n serializationObject.ssDiffusionProfileColors.push({\r\n r: ssDiffusionProfileColors[i].r,\r\n g: ssDiffusionProfileColors[i].g,\r\n b: ssDiffusionProfileColors[i].b,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adds all the elements from the container to the scene\r\n */\r\n public addFromContainer(): void {\r\n // Nothing to do\r\n }\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n */\r\n public removeFromContainer(): void {\r\n // Make sure nothing will be serialized\r\n if (!this.scene.prePassRenderer) {\r\n return;\r\n }\r\n\r\n if (this.scene.subSurfaceConfiguration) {\r\n this.scene.subSurfaceConfiguration.clearAllDiffusionProfiles();\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n // Nothing to do for this component\r\n }\r\n}\r\n\r\nSubSurfaceConfiguration._SceneComponentInitialization = (scene: Scene) => {\r\n // Register the G Buffer component to the scene.\r\n let component = scene._getComponent(SceneComponentConstants.NAME_SUBSURFACE) as SubSurfaceSceneComponent;\r\n if (!component) {\r\n component = new SubSurfaceSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n};\r\n"]}
@@ -118,7 +118,16 @@ export class SpriteRenderer {
118
118
  let offset = 6;
119
119
  let offsets;
120
120
  if (this._useInstancing) {
121
- const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);
121
+ const spriteData = new Float32Array([
122
+ this._epsilon,
123
+ this._epsilon,
124
+ 1 - this._epsilon,
125
+ this._epsilon,
126
+ this._epsilon,
127
+ 1 - this._epsilon,
128
+ 1 - this._epsilon,
129
+ 1 - this._epsilon,
130
+ ]);
122
131
  this._spriteBuffer = new Buffer(engine, spriteData, false, 2);
123
132
  offsets = this._spriteBuffer.createVertexBuffer("offsets", 0, 2);
124
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"spriteRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Sprites/spriteRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { IMatrixLike } from \"../Maths/math.like\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\n\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { BindLogDepth } from \"core/Materials/materialHelper.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Class used to render sprites.\r\n *\r\n * It can be used either to render Sprites or ThinSprites with ThinEngine only.\r\n */\r\nexport class SpriteRenderer {\r\n /**\r\n * Force all the sprites to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n /**\r\n * Defines the texture of the spritesheet\r\n */\r\n public texture: Nullable<ThinTexture>;\r\n\r\n /**\r\n * Defines the default width of a cell in the spritesheet\r\n */\r\n public cellWidth: number;\r\n\r\n /**\r\n * Defines the default height of a cell in the spritesheet\r\n */\r\n public cellHeight: number;\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public blendMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if alpha mode is automatically\r\n * reset.\r\n */\r\n public autoResetAlpha = true;\r\n\r\n /**\r\n * Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public disableDepthWrite: boolean = false;\r\n\r\n private _fogEnabled = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the manager must consider scene fog when rendering\r\n */\r\n public get fogEnabled() {\r\n return this._fogEnabled;\r\n }\r\n\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n\r\n this._fogEnabled = value;\r\n this._createEffects();\r\n }\r\n\r\n protected _useLogarithmicDepth: boolean;\r\n\r\n /**\r\n * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)\r\n * You can try switching to logarithmic depth.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer\r\n */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n const fragmentDepthSupported = !!this._scene?.getEngine().getCaps().fragmentDepthSupported;\r\n\r\n if (value && !fragmentDepthSupported) {\r\n Logger.Warn(\"Logarithmic depth has been requested for a sprite renderer on a device that doesn't support it.\");\r\n }\r\n\r\n this._useLogarithmicDepth = value && fragmentDepthSupported;\r\n this._createEffects();\r\n }\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._capacity;\r\n }\r\n\r\n private _pixelPerfect = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\r\n * Note that pixel perfect mode is not supported in WebGL 1\r\n */\r\n public get pixelPerfect() {\r\n return this._pixelPerfect;\r\n }\r\n\r\n public set pixelPerfect(value: boolean) {\r\n if (this._pixelPerfect === value) {\r\n return;\r\n }\r\n\r\n this._pixelPerfect = value;\r\n this._createEffects();\r\n }\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private readonly _engine: AbstractEngine;\r\n private readonly _useVAO: boolean = false;\r\n private readonly _useInstancing: boolean = false;\r\n private readonly _scene: Nullable<Scene>;\r\n\r\n private readonly _capacity: number;\r\n private readonly _epsilon: number;\r\n\r\n private _vertexBufferSize: number;\r\n private _vertexData: Float32Array;\r\n private _buffer: Buffer;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _indexBuffer: DataBuffer;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _drawWrapperDepth: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Creates a new sprite Renderer\r\n * @param engine defines the engine the renderer works with\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(engine: AbstractEngine, capacity: number, epsilon: number = 0.01, scene: Nullable<Scene> = null) {\r\n this._capacity = capacity;\r\n this._epsilon = epsilon;\r\n\r\n this._engine = engine;\r\n this._useInstancing = engine.getCaps().instancedArrays && engine._features.supportSpriteInstancing;\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n this._scene = scene;\r\n\r\n if (!this._useInstancing) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // VBO\r\n // 18 floats per sprite (x, y, z, angle, sizeX, sizeY, offsetX, offsetY, invertU, invertV, cellLeft, cellTop, cellWidth, cellHeight, color r, color g, color b, color a)\r\n // 16 when using instances\r\n this._vertexBufferSize = this._useInstancing ? 16 : 18;\r\n this._vertexData = new Float32Array(capacity * this._vertexBufferSize * (this._useInstancing ? 1 : 4));\r\n this._buffer = new Buffer(engine, this._vertexData, true, this._vertexBufferSize);\r\n\r\n const positions = this._buffer.createVertexBuffer(VertexBuffer.PositionKind, 0, 4, this._vertexBufferSize, this._useInstancing);\r\n const options = this._buffer.createVertexBuffer(\"options\", 4, 2, this._vertexBufferSize, this._useInstancing);\r\n\r\n let offset = 6;\r\n let offsets: VertexBuffer;\r\n\r\n if (this._useInstancing) {\r\n const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n offsets = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n } else {\r\n offsets = this._buffer.createVertexBuffer(\"offsets\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n offset += 2;\r\n }\r\n\r\n const inverts = this._buffer.createVertexBuffer(\"inverts\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n const cellInfo = this._buffer.createVertexBuffer(\"cellInfo\", offset + 2, 4, this._vertexBufferSize, this._useInstancing);\r\n const colors = this._buffer.createVertexBuffer(VertexBuffer.ColorKind, offset + 6, 4, this._vertexBufferSize, this._useInstancing);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = positions;\r\n this._vertexBuffers[\"options\"] = options;\r\n this._vertexBuffers[\"offsets\"] = offsets;\r\n this._vertexBuffers[\"inverts\"] = inverts;\r\n this._vertexBuffers[\"cellInfo\"] = cellInfo;\r\n this._vertexBuffers[VertexBuffer.ColorKind] = colors;\r\n\r\n this._initShaderSourceAsync();\r\n }\r\n\r\n private _shadersLoaded = false;\r\n\r\n private async _initShaderSourceAsync() {\r\n const engine = this._engine;\r\n\r\n if (engine.isWebGPU && !SpriteRenderer.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n\r\n await Promise.all([import(\"../ShadersWGSL/sprites.vertex\"), import(\"../ShadersWGSL/sprites.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/sprites.vertex\"), import(\"../Shaders/sprites.fragment\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\r\n this._createEffects();\r\n }\r\n\r\n private _createEffects() {\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n\r\n this._drawWrapperBase?.dispose();\r\n this._drawWrapperDepth?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n this._drawWrapperDepth = new DrawWrapper(this._engine, false);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperDepth.drawContext) {\r\n this._drawWrapperDepth.drawContext.useInstancing = this._useInstancing;\r\n }\r\n\r\n let defines = \"\";\r\n\r\n if (this._pixelPerfect) {\r\n defines += \"#define PIXEL_PERFECT\\n\";\r\n }\r\n if (this._scene && this._scene.fogEnabled && this._scene.fogMode !== 0 && this._fogEnabled) {\r\n defines += \"#define FOG\\n\";\r\n }\r\n if (this._useLogarithmicDepth) {\r\n defines += \"#define LOGARITHMICDEPTH\\n\";\r\n }\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n \"sprites\",\r\n [VertexBuffer.PositionKind, \"options\", \"offsets\", \"inverts\", \"cellInfo\", VertexBuffer.ColorKind],\r\n [\"view\", \"projection\", \"textureInfos\", \"alphaTest\", \"vFogInfos\", \"vFogColor\", \"logarithmicDepthConstant\"],\r\n [\"diffuseSampler\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n );\r\n\r\n this._drawWrapperDepth.effect = this._drawWrapperBase.effect;\r\n this._drawWrapperDepth.materialContext = this._drawWrapperBase.materialContext;\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n * @param sprites defines the list of sprites to render\r\n * @param deltaTime defines the time since last frame\r\n * @param viewMatrix defines the viewMatrix to use to render the sprites\r\n * @param projectionMatrix defines the projectionMatrix to use to render the sprites\r\n * @param customSpriteUpdate defines a custom function to update the sprites data before they render\r\n */\r\n public render(\r\n sprites: ThinSprite[],\r\n deltaTime: number,\r\n viewMatrix: IMatrixLike,\r\n projectionMatrix: IMatrixLike,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void> = null\r\n ): void {\r\n if (!this._shadersLoaded || !this.texture || !this.texture.isReady() || !sprites.length) {\r\n return;\r\n }\r\n\r\n const drawWrapper = this._drawWrapperBase;\r\n const drawWrapperDepth = this._drawWrapperDepth;\r\n const shouldRenderFog = this.fogEnabled && this._scene && this._scene.fogEnabled && this._scene.fogMode !== 0;\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const useRightHandedSystem = !!(this._scene && this._scene.useRightHandedSystem);\r\n\r\n // Sprites\r\n const max = Math.min(this._capacity, sprites.length);\r\n\r\n let offset = 0;\r\n let noSprite = true;\r\n for (let index = 0; index < max; index++) {\r\n const sprite = sprites[index];\r\n if (!sprite || !sprite.isVisible) {\r\n continue;\r\n }\r\n\r\n noSprite = false;\r\n sprite._animate(deltaTime);\r\n const baseSize = this.texture.getBaseSize(); // This could be change by the user inside the animate callback (like onAnimationEnd)\r\n\r\n this._appendSpriteVertex(offset++, sprite, 0, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n if (!this._useInstancing) {\r\n this._appendSpriteVertex(offset++, sprite, 1, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 1, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 0, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n }\r\n }\r\n\r\n if (noSprite) {\r\n return;\r\n }\r\n\r\n this._buffer.update(this._vertexData);\r\n\r\n const culling = !!engine.depthCullingState.cull;\r\n const zOffset = engine.depthCullingState.zOffset;\r\n const zOffsetUnits = engine.depthCullingState.zOffsetUnits;\r\n\r\n engine.setState(culling, zOffset, false, false, undefined, undefined, zOffsetUnits);\r\n\r\n // Render\r\n engine.enableEffect(drawWrapper);\r\n\r\n effect.setTexture(\"diffuseSampler\", this.texture);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n\r\n // Scene Info\r\n if (shouldRenderFog) {\r\n const scene = this._scene!;\r\n\r\n // Fog\r\n effect.setFloat4(\"vFogInfos\", scene.fogMode, scene.fogStart, scene.fogEnd, scene.fogDensity);\r\n effect.setColor3(\"vFogColor\", scene.fogColor);\r\n }\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth && this._scene) {\r\n BindLogDepth(drawWrapper.defines, effect, this._scene);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n (engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, this._indexBuffer);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n // Draw order\r\n engine.depthCullingState.depthFunc = engine.useReverseDepthBuffer ? Constants.GEQUAL : Constants.LEQUAL;\r\n if (!this.disableDepthWrite) {\r\n effect.setBool(\"alphaTest\", true);\r\n engine.setColorWrite(false);\r\n engine.enableEffect(drawWrapperDepth);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n engine.enableEffect(drawWrapper);\r\n engine.setColorWrite(true);\r\n effect.setBool(\"alphaTest\", false);\r\n }\r\n\r\n engine.setAlphaMode(this.blendMode);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n\r\n if (this.autoResetAlpha) {\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Right Handed\r\n if (useRightHandedSystem) {\r\n this._scene!.getEngine().setState(culling, zOffset, false, true, undefined, undefined, zOffsetUnits);\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n private _appendSpriteVertex(\r\n index: number,\r\n sprite: ThinSprite,\r\n offsetX: number,\r\n offsetY: number,\r\n baseSize: ISize,\r\n useRightHandedSystem: boolean,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void>\r\n ): void {\r\n let arrayOffset = index * this._vertexBufferSize;\r\n\r\n if (offsetX === 0) {\r\n offsetX = this._epsilon;\r\n } else if (offsetX === 1) {\r\n offsetX = 1 - this._epsilon;\r\n }\r\n\r\n if (offsetY === 0) {\r\n offsetY = this._epsilon;\r\n } else if (offsetY === 1) {\r\n offsetY = 1 - this._epsilon;\r\n }\r\n\r\n if (customSpriteUpdate) {\r\n customSpriteUpdate(sprite, baseSize);\r\n } else {\r\n if (!sprite.cellIndex) {\r\n sprite.cellIndex = 0;\r\n }\r\n\r\n const rowSize = baseSize.width / this.cellWidth;\r\n const offset = (sprite.cellIndex / rowSize) >> 0;\r\n sprite._xOffset = ((sprite.cellIndex - offset * rowSize) * this.cellWidth) / baseSize.width;\r\n sprite._yOffset = (offset * this.cellHeight) / baseSize.height;\r\n sprite._xSize = this.cellWidth;\r\n sprite._ySize = this.cellHeight;\r\n }\r\n\r\n // Positions\r\n this._vertexData[arrayOffset] = sprite.position.x;\r\n this._vertexData[arrayOffset + 1] = sprite.position.y;\r\n this._vertexData[arrayOffset + 2] = sprite.position.z;\r\n this._vertexData[arrayOffset + 3] = sprite.angle;\r\n // Options\r\n this._vertexData[arrayOffset + 4] = sprite.width;\r\n this._vertexData[arrayOffset + 5] = sprite.height;\r\n\r\n if (!this._useInstancing) {\r\n this._vertexData[arrayOffset + 6] = offsetX;\r\n this._vertexData[arrayOffset + 7] = offsetY;\r\n } else {\r\n arrayOffset -= 2;\r\n }\r\n\r\n // Inverts according to Right Handed\r\n if (useRightHandedSystem) {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 0 : 1;\r\n } else {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 1 : 0;\r\n }\r\n\r\n this._vertexData[arrayOffset + 9] = sprite.invertV ? 1 : 0;\r\n\r\n this._vertexData[arrayOffset + 10] = sprite._xOffset;\r\n this._vertexData[arrayOffset + 11] = sprite._yOffset;\r\n this._vertexData[arrayOffset + 12] = sprite._xSize / baseSize.width;\r\n this._vertexData[arrayOffset + 13] = sprite._ySize / baseSize.height;\r\n\r\n // Color\r\n this._vertexData[arrayOffset + 14] = sprite.color.r;\r\n this._vertexData[arrayOffset + 15] = sprite.color.g;\r\n this._vertexData[arrayOffset + 16] = sprite.color.b;\r\n this._vertexData[arrayOffset + 17] = sprite.color.a;\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n const indices = [];\r\n let index = 0;\r\n for (let count = 0; count < this._capacity; count++) {\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index + 2);\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 3);\r\n index += 4;\r\n }\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Rebuilds the renderer (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n if (this._indexBuffer) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n if (this._useVAO) {\r\n this._vertexArrayObject = undefined as any;\r\n }\r\n\r\n this._buffer._rebuild();\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = <VertexBuffer>this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n\r\n this._spriteBuffer?._rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._buffer) {\r\n this._buffer.dispose();\r\n (<any>this._buffer) = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n (<any>this._spriteBuffer) = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n (<any>this._indexBuffer) = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n (<any>this.texture) = null;\r\n }\r\n this._drawWrapperBase?.dispose();\r\n this._drawWrapperDepth?.dispose();\r\n this._isDisposed = true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"spriteRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Sprites/spriteRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { IMatrixLike } from \"../Maths/math.like\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport type { ThinSprite } from \"./thinSprite\";\r\nimport type { ISize } from \"../Maths/math.size\";\r\n\r\nimport type { ThinTexture } from \"../Materials/Textures/thinTexture\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { ThinEngine } from \"../Engines/thinEngine\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { BindLogDepth } from \"core/Materials/materialHelper.functions\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * Class used to render sprites.\r\n *\r\n * It can be used either to render Sprites or ThinSprites with ThinEngine only.\r\n */\r\nexport class SpriteRenderer {\r\n /**\r\n * Force all the sprites to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n /**\r\n * Defines the texture of the spritesheet\r\n */\r\n public texture: Nullable<ThinTexture>;\r\n\r\n /**\r\n * Defines the default width of a cell in the spritesheet\r\n */\r\n public cellWidth: number;\r\n\r\n /**\r\n * Defines the default height of a cell in the spritesheet\r\n */\r\n public cellHeight: number;\r\n\r\n /**\r\n * Blend mode use to render the particle, it can be any of\r\n * the static Constants.ALPHA_x properties provided in this class.\r\n * Default value is Constants.ALPHA_COMBINE\r\n */\r\n public blendMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if alpha mode is automatically\r\n * reset.\r\n */\r\n public autoResetAlpha = true;\r\n\r\n /**\r\n * Disables writing to the depth buffer when rendering the sprites.\r\n * It can be handy to disable depth writing when using textures without alpha channel\r\n * and setting some specific blend modes.\r\n */\r\n public disableDepthWrite: boolean = false;\r\n\r\n private _fogEnabled = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the manager must consider scene fog when rendering\r\n */\r\n public get fogEnabled() {\r\n return this._fogEnabled;\r\n }\r\n\r\n public set fogEnabled(value: boolean) {\r\n if (this._fogEnabled === value) {\r\n return;\r\n }\r\n\r\n this._fogEnabled = value;\r\n this._createEffects();\r\n }\r\n\r\n protected _useLogarithmicDepth: boolean;\r\n\r\n /**\r\n * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)\r\n * You can try switching to logarithmic depth.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer\r\n */\r\n public get useLogarithmicDepth(): boolean {\r\n return this._useLogarithmicDepth;\r\n }\r\n\r\n public set useLogarithmicDepth(value: boolean) {\r\n const fragmentDepthSupported = !!this._scene?.getEngine().getCaps().fragmentDepthSupported;\r\n\r\n if (value && !fragmentDepthSupported) {\r\n Logger.Warn(\"Logarithmic depth has been requested for a sprite renderer on a device that doesn't support it.\");\r\n }\r\n\r\n this._useLogarithmicDepth = value && fragmentDepthSupported;\r\n this._createEffects();\r\n }\r\n\r\n /**\r\n * Gets the capacity of the manager\r\n */\r\n public get capacity() {\r\n return this._capacity;\r\n }\r\n\r\n private _pixelPerfect = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering\r\n * Note that pixel perfect mode is not supported in WebGL 1\r\n */\r\n public get pixelPerfect() {\r\n return this._pixelPerfect;\r\n }\r\n\r\n public set pixelPerfect(value: boolean) {\r\n if (this._pixelPerfect === value) {\r\n return;\r\n }\r\n\r\n this._pixelPerfect = value;\r\n this._createEffects();\r\n }\r\n\r\n /** Shader language used by the material */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private readonly _engine: AbstractEngine;\r\n private readonly _useVAO: boolean = false;\r\n private readonly _useInstancing: boolean = false;\r\n private readonly _scene: Nullable<Scene>;\r\n\r\n private readonly _capacity: number;\r\n private readonly _epsilon: number;\r\n\r\n private _vertexBufferSize: number;\r\n private _vertexData: Float32Array;\r\n private _buffer: Buffer;\r\n private _vertexBuffers: { [key: string]: VertexBuffer } = {};\r\n private _spriteBuffer: Nullable<Buffer>;\r\n private _indexBuffer: DataBuffer;\r\n private _drawWrapperBase: DrawWrapper;\r\n private _drawWrapperDepth: DrawWrapper;\r\n private _vertexArrayObject: WebGLVertexArrayObject;\r\n private _isDisposed = false;\r\n\r\n /**\r\n * Creates a new sprite Renderer\r\n * @param engine defines the engine the renderer works with\r\n * @param capacity defines the maximum allowed number of sprites\r\n * @param epsilon defines the epsilon value to align texture (0.01 by default)\r\n * @param scene defines the hosting scene\r\n */\r\n constructor(engine: AbstractEngine, capacity: number, epsilon: number = 0.01, scene: Nullable<Scene> = null) {\r\n this._capacity = capacity;\r\n this._epsilon = epsilon;\r\n\r\n this._engine = engine;\r\n this._useInstancing = engine.getCaps().instancedArrays && engine._features.supportSpriteInstancing;\r\n this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects;\r\n this._scene = scene;\r\n\r\n if (!this._useInstancing) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // VBO\r\n // 18 floats per sprite (x, y, z, angle, sizeX, sizeY, offsetX, offsetY, invertU, invertV, cellLeft, cellTop, cellWidth, cellHeight, color r, color g, color b, color a)\r\n // 16 when using instances\r\n this._vertexBufferSize = this._useInstancing ? 16 : 18;\r\n this._vertexData = new Float32Array(capacity * this._vertexBufferSize * (this._useInstancing ? 1 : 4));\r\n this._buffer = new Buffer(engine, this._vertexData, true, this._vertexBufferSize);\r\n\r\n const positions = this._buffer.createVertexBuffer(VertexBuffer.PositionKind, 0, 4, this._vertexBufferSize, this._useInstancing);\r\n const options = this._buffer.createVertexBuffer(\"options\", 4, 2, this._vertexBufferSize, this._useInstancing);\r\n\r\n let offset = 6;\r\n let offsets: VertexBuffer;\r\n\r\n if (this._useInstancing) {\r\n const spriteData = new Float32Array([\r\n this._epsilon,\r\n this._epsilon,\r\n 1 - this._epsilon,\r\n this._epsilon,\r\n this._epsilon,\r\n 1 - this._epsilon,\r\n 1 - this._epsilon,\r\n 1 - this._epsilon,\r\n ]);\r\n this._spriteBuffer = new Buffer(engine, spriteData, false, 2);\r\n offsets = this._spriteBuffer.createVertexBuffer(\"offsets\", 0, 2);\r\n } else {\r\n offsets = this._buffer.createVertexBuffer(\"offsets\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n offset += 2;\r\n }\r\n\r\n const inverts = this._buffer.createVertexBuffer(\"inverts\", offset, 2, this._vertexBufferSize, this._useInstancing);\r\n const cellInfo = this._buffer.createVertexBuffer(\"cellInfo\", offset + 2, 4, this._vertexBufferSize, this._useInstancing);\r\n const colors = this._buffer.createVertexBuffer(VertexBuffer.ColorKind, offset + 6, 4, this._vertexBufferSize, this._useInstancing);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = positions;\r\n this._vertexBuffers[\"options\"] = options;\r\n this._vertexBuffers[\"offsets\"] = offsets;\r\n this._vertexBuffers[\"inverts\"] = inverts;\r\n this._vertexBuffers[\"cellInfo\"] = cellInfo;\r\n this._vertexBuffers[VertexBuffer.ColorKind] = colors;\r\n\r\n this._initShaderSourceAsync();\r\n }\r\n\r\n private _shadersLoaded = false;\r\n\r\n private async _initShaderSourceAsync() {\r\n const engine = this._engine;\r\n\r\n if (engine.isWebGPU && !SpriteRenderer.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n\r\n await Promise.all([import(\"../ShadersWGSL/sprites.vertex\"), import(\"../ShadersWGSL/sprites.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/sprites.vertex\"), import(\"../Shaders/sprites.fragment\")]);\r\n }\r\n\r\n this._shadersLoaded = true;\r\n this._createEffects();\r\n }\r\n\r\n private _createEffects() {\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n\r\n this._drawWrapperBase?.dispose();\r\n this._drawWrapperDepth?.dispose();\r\n\r\n this._drawWrapperBase = new DrawWrapper(this._engine);\r\n this._drawWrapperDepth = new DrawWrapper(this._engine, false);\r\n\r\n if (this._drawWrapperBase.drawContext) {\r\n this._drawWrapperBase.drawContext.useInstancing = this._useInstancing;\r\n }\r\n if (this._drawWrapperDepth.drawContext) {\r\n this._drawWrapperDepth.drawContext.useInstancing = this._useInstancing;\r\n }\r\n\r\n let defines = \"\";\r\n\r\n if (this._pixelPerfect) {\r\n defines += \"#define PIXEL_PERFECT\\n\";\r\n }\r\n if (this._scene && this._scene.fogEnabled && this._scene.fogMode !== 0 && this._fogEnabled) {\r\n defines += \"#define FOG\\n\";\r\n }\r\n if (this._useLogarithmicDepth) {\r\n defines += \"#define LOGARITHMICDEPTH\\n\";\r\n }\r\n\r\n this._drawWrapperBase.effect = this._engine.createEffect(\r\n \"sprites\",\r\n [VertexBuffer.PositionKind, \"options\", \"offsets\", \"inverts\", \"cellInfo\", VertexBuffer.ColorKind],\r\n [\"view\", \"projection\", \"textureInfos\", \"alphaTest\", \"vFogInfos\", \"vFogColor\", \"logarithmicDepthConstant\"],\r\n [\"diffuseSampler\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage\r\n );\r\n\r\n this._drawWrapperDepth.effect = this._drawWrapperBase.effect;\r\n this._drawWrapperDepth.materialContext = this._drawWrapperBase.materialContext;\r\n }\r\n\r\n /**\r\n * Render all child sprites\r\n * @param sprites defines the list of sprites to render\r\n * @param deltaTime defines the time since last frame\r\n * @param viewMatrix defines the viewMatrix to use to render the sprites\r\n * @param projectionMatrix defines the projectionMatrix to use to render the sprites\r\n * @param customSpriteUpdate defines a custom function to update the sprites data before they render\r\n */\r\n public render(\r\n sprites: ThinSprite[],\r\n deltaTime: number,\r\n viewMatrix: IMatrixLike,\r\n projectionMatrix: IMatrixLike,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void> = null\r\n ): void {\r\n if (!this._shadersLoaded || !this.texture || !this.texture.isReady() || !sprites.length) {\r\n return;\r\n }\r\n\r\n const drawWrapper = this._drawWrapperBase;\r\n const drawWrapperDepth = this._drawWrapperDepth;\r\n const shouldRenderFog = this.fogEnabled && this._scene && this._scene.fogEnabled && this._scene.fogMode !== 0;\r\n\r\n const effect = drawWrapper.effect!;\r\n\r\n // Check\r\n if (!effect.isReady()) {\r\n return;\r\n }\r\n\r\n const engine = this._engine;\r\n const useRightHandedSystem = !!(this._scene && this._scene.useRightHandedSystem);\r\n\r\n // Sprites\r\n const max = Math.min(this._capacity, sprites.length);\r\n\r\n let offset = 0;\r\n let noSprite = true;\r\n for (let index = 0; index < max; index++) {\r\n const sprite = sprites[index];\r\n if (!sprite || !sprite.isVisible) {\r\n continue;\r\n }\r\n\r\n noSprite = false;\r\n sprite._animate(deltaTime);\r\n const baseSize = this.texture.getBaseSize(); // This could be change by the user inside the animate callback (like onAnimationEnd)\r\n\r\n this._appendSpriteVertex(offset++, sprite, 0, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n if (!this._useInstancing) {\r\n this._appendSpriteVertex(offset++, sprite, 1, 0, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 1, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n this._appendSpriteVertex(offset++, sprite, 0, 1, baseSize, useRightHandedSystem, customSpriteUpdate);\r\n }\r\n }\r\n\r\n if (noSprite) {\r\n return;\r\n }\r\n\r\n this._buffer.update(this._vertexData);\r\n\r\n const culling = !!engine.depthCullingState.cull;\r\n const zOffset = engine.depthCullingState.zOffset;\r\n const zOffsetUnits = engine.depthCullingState.zOffsetUnits;\r\n\r\n engine.setState(culling, zOffset, false, false, undefined, undefined, zOffsetUnits);\r\n\r\n // Render\r\n engine.enableEffect(drawWrapper);\r\n\r\n effect.setTexture(\"diffuseSampler\", this.texture);\r\n effect.setMatrix(\"view\", viewMatrix);\r\n effect.setMatrix(\"projection\", projectionMatrix);\r\n\r\n // Scene Info\r\n if (shouldRenderFog) {\r\n const scene = this._scene!;\r\n\r\n // Fog\r\n effect.setFloat4(\"vFogInfos\", scene.fogMode, scene.fogStart, scene.fogEnd, scene.fogDensity);\r\n effect.setColor3(\"vFogColor\", scene.fogColor);\r\n }\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth && this._scene) {\r\n BindLogDepth(drawWrapper.defines, effect, this._scene);\r\n }\r\n\r\n if (this._useVAO) {\r\n if (!this._vertexArrayObject) {\r\n this._vertexArrayObject = (engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n (engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, this._indexBuffer);\r\n } else {\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n }\r\n\r\n // Draw order\r\n engine.depthCullingState.depthFunc = engine.useReverseDepthBuffer ? Constants.GEQUAL : Constants.LEQUAL;\r\n if (!this.disableDepthWrite) {\r\n effect.setBool(\"alphaTest\", true);\r\n engine.setColorWrite(false);\r\n engine.enableEffect(drawWrapperDepth);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n engine.enableEffect(drawWrapper);\r\n engine.setColorWrite(true);\r\n effect.setBool(\"alphaTest\", false);\r\n }\r\n\r\n engine.setAlphaMode(this.blendMode);\r\n if (this._useInstancing) {\r\n engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, offset);\r\n } else {\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, (offset / 4) * 6);\r\n }\r\n\r\n if (this.autoResetAlpha) {\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n // Restore Right Handed\r\n if (useRightHandedSystem) {\r\n this._scene!.getEngine().setState(culling, zOffset, false, true, undefined, undefined, zOffsetUnits);\r\n }\r\n\r\n engine.unbindInstanceAttributes();\r\n }\r\n\r\n private _appendSpriteVertex(\r\n index: number,\r\n sprite: ThinSprite,\r\n offsetX: number,\r\n offsetY: number,\r\n baseSize: ISize,\r\n useRightHandedSystem: boolean,\r\n customSpriteUpdate: Nullable<(sprite: ThinSprite, baseSize: ISize) => void>\r\n ): void {\r\n let arrayOffset = index * this._vertexBufferSize;\r\n\r\n if (offsetX === 0) {\r\n offsetX = this._epsilon;\r\n } else if (offsetX === 1) {\r\n offsetX = 1 - this._epsilon;\r\n }\r\n\r\n if (offsetY === 0) {\r\n offsetY = this._epsilon;\r\n } else if (offsetY === 1) {\r\n offsetY = 1 - this._epsilon;\r\n }\r\n\r\n if (customSpriteUpdate) {\r\n customSpriteUpdate(sprite, baseSize);\r\n } else {\r\n if (!sprite.cellIndex) {\r\n sprite.cellIndex = 0;\r\n }\r\n\r\n const rowSize = baseSize.width / this.cellWidth;\r\n const offset = (sprite.cellIndex / rowSize) >> 0;\r\n sprite._xOffset = ((sprite.cellIndex - offset * rowSize) * this.cellWidth) / baseSize.width;\r\n sprite._yOffset = (offset * this.cellHeight) / baseSize.height;\r\n sprite._xSize = this.cellWidth;\r\n sprite._ySize = this.cellHeight;\r\n }\r\n\r\n // Positions\r\n this._vertexData[arrayOffset] = sprite.position.x;\r\n this._vertexData[arrayOffset + 1] = sprite.position.y;\r\n this._vertexData[arrayOffset + 2] = sprite.position.z;\r\n this._vertexData[arrayOffset + 3] = sprite.angle;\r\n // Options\r\n this._vertexData[arrayOffset + 4] = sprite.width;\r\n this._vertexData[arrayOffset + 5] = sprite.height;\r\n\r\n if (!this._useInstancing) {\r\n this._vertexData[arrayOffset + 6] = offsetX;\r\n this._vertexData[arrayOffset + 7] = offsetY;\r\n } else {\r\n arrayOffset -= 2;\r\n }\r\n\r\n // Inverts according to Right Handed\r\n if (useRightHandedSystem) {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 0 : 1;\r\n } else {\r\n this._vertexData[arrayOffset + 8] = sprite.invertU ? 1 : 0;\r\n }\r\n\r\n this._vertexData[arrayOffset + 9] = sprite.invertV ? 1 : 0;\r\n\r\n this._vertexData[arrayOffset + 10] = sprite._xOffset;\r\n this._vertexData[arrayOffset + 11] = sprite._yOffset;\r\n this._vertexData[arrayOffset + 12] = sprite._xSize / baseSize.width;\r\n this._vertexData[arrayOffset + 13] = sprite._ySize / baseSize.height;\r\n\r\n // Color\r\n this._vertexData[arrayOffset + 14] = sprite.color.r;\r\n this._vertexData[arrayOffset + 15] = sprite.color.g;\r\n this._vertexData[arrayOffset + 16] = sprite.color.b;\r\n this._vertexData[arrayOffset + 17] = sprite.color.a;\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n const indices = [];\r\n let index = 0;\r\n for (let count = 0; count < this._capacity; count++) {\r\n indices.push(index);\r\n indices.push(index + 1);\r\n indices.push(index + 2);\r\n indices.push(index);\r\n indices.push(index + 2);\r\n indices.push(index + 3);\r\n index += 4;\r\n }\r\n\r\n this._indexBuffer = this._engine.createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Rebuilds the renderer (after a context lost, for eg)\r\n */\r\n public rebuild(): void {\r\n if (this._indexBuffer) {\r\n this._buildIndexBuffer();\r\n }\r\n\r\n if (this._useVAO) {\r\n this._vertexArrayObject = undefined as any;\r\n }\r\n\r\n this._buffer._rebuild();\r\n\r\n for (const key in this._vertexBuffers) {\r\n const vertexBuffer = <VertexBuffer>this._vertexBuffers[key];\r\n vertexBuffer._rebuild();\r\n }\r\n\r\n this._spriteBuffer?._rebuild();\r\n }\r\n\r\n /**\r\n * Release associated resources\r\n */\r\n public dispose(): void {\r\n if (this._buffer) {\r\n this._buffer.dispose();\r\n (<any>this._buffer) = null;\r\n }\r\n\r\n if (this._spriteBuffer) {\r\n this._spriteBuffer.dispose();\r\n (<any>this._spriteBuffer) = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._engine._releaseBuffer(this._indexBuffer);\r\n (<any>this._indexBuffer) = null;\r\n }\r\n\r\n if (this._vertexArrayObject) {\r\n (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject);\r\n (<any>this._vertexArrayObject) = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n (<any>this.texture) = null;\r\n }\r\n this._drawWrapperBase?.dispose();\r\n this._drawWrapperDepth?.dispose();\r\n this._isDisposed = true;\r\n }\r\n}\r\n"]}