@babylonjs/core 6.34.0 → 6.34.2

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 (133) hide show
  1. package/Animations/animation.js +1 -1
  2. package/Animations/animation.js.map +1 -1
  3. package/Buffers/storageBuffer.d.ts +2 -1
  4. package/Buffers/storageBuffer.js +3 -2
  5. package/Buffers/storageBuffer.js.map +1 -1
  6. package/Cameras/Inputs/followCameraMouseWheelInput.js +12 -9
  7. package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
  8. package/Cameras/Inputs/followCameraPointersInput.js +28 -9
  9. package/Cameras/Inputs/followCameraPointersInput.js.map +1 -1
  10. package/Cameras/arcRotateCamera.js +1 -1
  11. package/Cameras/arcRotateCamera.js.map +1 -1
  12. package/Cameras/followCameraInputsManager.js +2 -1
  13. package/Cameras/followCameraInputsManager.js.map +1 -1
  14. package/Debug/skeletonViewer.js +2 -1
  15. package/Debug/skeletonViewer.js.map +1 -1
  16. package/Engines/Extensions/engine.storageBuffer.d.ts +2 -1
  17. package/Engines/Extensions/engine.storageBuffer.js.map +1 -1
  18. package/Engines/Processors/shaderCodeInliner.js +15 -14
  19. package/Engines/Processors/shaderCodeInliner.js.map +1 -1
  20. package/Engines/WebGPU/Extensions/engine.computeShader.js +3 -2
  21. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  22. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +14 -5
  23. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  24. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  25. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  26. package/Engines/WebGPU/webgpuTintWASM.js +3 -2
  27. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  28. package/Engines/engine.d.ts +2 -4
  29. package/Engines/engine.js.map +1 -1
  30. package/Engines/nativeEngine.js +4 -2
  31. package/Engines/nativeEngine.js.map +1 -1
  32. package/Engines/thinEngine.js +4 -4
  33. package/Engines/thinEngine.js.map +1 -1
  34. package/Engines/webgpuEngine.js +75 -46
  35. package/Engines/webgpuEngine.js.map +1 -1
  36. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js +2 -1
  37. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js.map +1 -1
  38. package/FlowGraph/flowGraphBlock.js +1 -21
  39. package/FlowGraph/flowGraphBlock.js.map +1 -1
  40. package/FlowGraph/flowGraphExecutionBlock.d.ts +1 -0
  41. package/FlowGraph/flowGraphExecutionBlock.js +20 -0
  42. package/FlowGraph/flowGraphExecutionBlock.js.map +1 -1
  43. package/Gizmos/axisScaleGizmo.d.ts +1 -0
  44. package/Gizmos/axisScaleGizmo.js +12 -0
  45. package/Gizmos/axisScaleGizmo.js.map +1 -1
  46. package/Gizmos/lightGizmo.js +2 -1
  47. package/Gizmos/lightGizmo.js.map +1 -1
  48. package/Gizmos/rotationGizmo.js +1 -1
  49. package/Gizmos/rotationGizmo.js.map +1 -1
  50. package/Lights/Shadows/cascadedShadowGenerator.js +1 -1
  51. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  52. package/Materials/Node/Blocks/Dual/lightBlock.js +2 -1
  53. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  54. package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js +3 -2
  55. package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js.map +1 -1
  56. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +2 -1
  57. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
  58. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +2 -1
  59. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  60. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +2 -1
  61. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  62. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +3 -2
  63. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  64. package/Materials/Node/Blocks/PBR/reflectionBlock.js +2 -1
  65. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  66. package/Materials/Node/nodeMaterial.js +9 -8
  67. package/Materials/Node/nodeMaterial.js.map +1 -1
  68. package/Materials/Node/nodeMaterialBlock.js +2 -1
  69. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  70. package/Materials/Textures/renderTargetTexture.js +1 -2
  71. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  72. package/Meshes/Builders/groundBuilder.d.ts +7 -1
  73. package/Meshes/Builders/groundBuilder.js +17 -8
  74. package/Meshes/Builders/groundBuilder.js.map +1 -1
  75. package/Meshes/Compression/dracoCompression.js.map +1 -1
  76. package/Meshes/Node/nodeGeometryBlock.js +2 -1
  77. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  78. package/Meshes/mesh.d.ts +2 -1
  79. package/Meshes/mesh.js +3 -2
  80. package/Meshes/mesh.js.map +1 -1
  81. package/Misc/assetsManager.js +2 -2
  82. package/Misc/assetsManager.js.map +1 -1
  83. package/Misc/dds.js +1 -1
  84. package/Misc/dds.js.map +1 -1
  85. package/Misc/fileTools.js +4 -0
  86. package/Misc/fileTools.js.map +1 -1
  87. package/Misc/logger.d.ts +3 -3
  88. package/Misc/logger.js +8 -4
  89. package/Misc/logger.js.map +1 -1
  90. package/Misc/sceneSerializer.js +2 -1
  91. package/Misc/sceneSerializer.js.map +1 -1
  92. package/Misc/tools.d.ts +2 -7
  93. package/Misc/tools.js.map +1 -1
  94. package/Navigation/Plugins/recastJSPlugin.js +3 -3
  95. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  96. package/Physics/v2/Plugins/havokPlugin.js +1 -1
  97. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  98. package/Physics/v2/index.d.ts +1 -0
  99. package/Physics/v2/index.js +1 -0
  100. package/Physics/v2/index.js.map +1 -1
  101. package/Physics/v2/physicsBody.d.ts +5 -0
  102. package/Physics/v2/physicsBody.js +7 -0
  103. package/Physics/v2/physicsBody.js.map +1 -1
  104. package/Physics/v2/ragdoll.d.ts +102 -0
  105. package/Physics/v2/ragdoll.js +221 -0
  106. package/Physics/v2/ragdoll.js.map +1 -0
  107. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +2 -2
  108. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  109. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +3 -2
  110. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  111. package/PostProcesses/screenSpaceCurvaturePostProcess.js +1 -1
  112. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  113. package/PostProcesses/screenSpaceReflectionPostProcess.js +3 -2
  114. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  115. package/Rendering/GaussianSplatting/gaussianSplatting.js.map +1 -1
  116. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +3 -2
  117. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  118. package/XR/features/WebXRControllerPhysics.js +2 -2
  119. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  120. package/XR/features/WebXRMeshDetector.js +2 -1
  121. package/XR/features/WebXRMeshDetector.js.map +1 -1
  122. package/XR/features/WebXRWalkingLocomotion.js +1 -1
  123. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  124. package/XR/motionController/webXRMotionControllerManager.js +1 -1
  125. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  126. package/XR/webXRExperienceHelper.js +2 -2
  127. package/XR/webXRExperienceHelper.js.map +1 -1
  128. package/assetContainer.js +2 -2
  129. package/assetContainer.js.map +1 -1
  130. package/package.json +1 -1
  131. package/scene.d.ts +2 -4
  132. package/scene.js +2 -1
  133. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"skeletonViewer.js","sourceRoot":"","sources":["../../../../dev/core/src/Debug/skeletonViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { CreateLineSystem } from \"../Meshes/Builders/linesBuilder\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { DynamicTexture } from \"../Materials/Textures/dynamicTexture\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Effect } from \"../Materials/effect\";\r\n\r\nimport type { ISkeletonViewerOptions, IBoneWeightShaderOptions, ISkeletonMapShaderOptions, ISkeletonMapShaderColorMapKnot } from \"./ISkeletonViewer\";\r\nimport type { Observer } from \"../Misc/observable\";\r\n\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { ExtrudeShapeCustom } from \"../Meshes/Builders/shapeBuilder\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Class used to render a debug view of a given skeleton\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#8\r\n */\r\nexport class SkeletonViewer {\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_LINES */\r\n public static readonly DISPLAY_LINES = 0;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERES */\r\n public static readonly DISPLAY_SPHERES = 1;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERE_AND_SPURS */\r\n public static readonly DISPLAY_SPHERE_AND_SPURS = 2;\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#395\r\n */\r\n static CreateBoneWeightShader(options: IBoneWeightShaderOptions, scene: Scene): ShaderMaterial {\r\n const skeleton: Skeleton = options.skeleton;\r\n const colorBase: Color3 = options.colorBase ?? Color3.Black();\r\n const colorZero: Color3 = options.colorZero ?? Color3.Blue();\r\n const colorQuarter: Color3 = options.colorQuarter ?? Color3.Green();\r\n const colorHalf: Color3 = options.colorHalf ?? Color3.Yellow();\r\n const colorFull: Color3 = options.colorFull ?? Color3.Red();\r\n const targetBoneIndex: number = options.targetBoneIndex ?? 0;\r\n\r\n Effect.ShadersStore[\"boneWeights:\" + skeleton.name + \"VertexShader\"] = `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n #include<bakedVertexAnimationDeclaration>\r\n\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n uniform vec3 colorBase;\r\n uniform vec3 colorZero;\r\n uniform vec3 colorQuarter;\r\n uniform vec3 colorHalf;\r\n uniform vec3 colorFull;\r\n\r\n uniform float targetBoneIndex;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n #include<bakedVertexAnimation>\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n vec3 color = colorBase;\r\n float totalWeight = 0.;\r\n if(matricesIndices[0] == targetBoneIndex && matricesWeights[0] > 0.){\r\n totalWeight += matricesWeights[0];\r\n }\r\n if(matricesIndices[1] == targetBoneIndex && matricesWeights[1] > 0.){\r\n totalWeight += matricesWeights[1];\r\n }\r\n if(matricesIndices[2] == targetBoneIndex && matricesWeights[2] > 0.){\r\n totalWeight += matricesWeights[2];\r\n }\r\n if(matricesIndices[3] == targetBoneIndex && matricesWeights[3] > 0.){\r\n totalWeight += matricesWeights[3];\r\n }\r\n\r\n color = mix(color, colorZero, smoothstep(0., 0.25, totalWeight));\r\n color = mix(color, colorQuarter, smoothstep(0.25, 0.5, totalWeight));\r\n color = mix(color, colorHalf, smoothstep(0.5, 0.75, totalWeight));\r\n color = mix(color, colorFull, smoothstep(0.75, 1.0, totalWeight));\r\n vColor = color;\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`;\r\n Effect.ShadersStore[\"boneWeights:\" + skeleton.name + \"FragmentShader\"] = `\r\n precision highp float;\r\n varying vec3 vPosition;\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4(vColor, 1.0);\r\n gl_FragColor = color;\r\n }\r\n `;\r\n const shader: ShaderMaterial = new ShaderMaterial(\r\n \"boneWeight:\" + skeleton.name,\r\n scene,\r\n {\r\n vertex: \"boneWeights:\" + skeleton.name,\r\n fragment: \"boneWeights:\" + skeleton.name,\r\n },\r\n {\r\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\r\n uniforms: [\r\n \"world\",\r\n \"worldView\",\r\n \"worldViewProjection\",\r\n \"view\",\r\n \"projection\",\r\n \"viewProjection\",\r\n \"colorBase\",\r\n \"colorZero\",\r\n \"colorQuarter\",\r\n \"colorHalf\",\r\n \"colorFull\",\r\n \"targetBoneIndex\",\r\n ],\r\n }\r\n );\r\n\r\n shader.setColor3(\"colorBase\", colorBase);\r\n shader.setColor3(\"colorZero\", colorZero);\r\n shader.setColor3(\"colorQuarter\", colorQuarter);\r\n shader.setColor3(\"colorHalf\", colorHalf);\r\n shader.setColor3(\"colorFull\", colorFull);\r\n shader.setFloat(\"targetBoneIndex\", targetBoneIndex);\r\n\r\n shader.getClassName = (): string => {\r\n return \"BoneWeightShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n */\r\n static CreateSkeletonMapShader(options: ISkeletonMapShaderOptions, scene: Scene) {\r\n const skeleton: Skeleton = options.skeleton;\r\n const colorMap: ISkeletonMapShaderColorMapKnot[] = options.colorMap ?? [\r\n {\r\n color: new Color3(1, 0.38, 0.18),\r\n location: 0,\r\n },\r\n {\r\n color: new Color3(0.59, 0.18, 1.0),\r\n location: 0.2,\r\n },\r\n {\r\n color: new Color3(0.59, 1, 0.18),\r\n location: 0.4,\r\n },\r\n {\r\n color: new Color3(1, 0.87, 0.17),\r\n location: 0.6,\r\n },\r\n {\r\n color: new Color3(1, 0.17, 0.42),\r\n location: 0.8,\r\n },\r\n {\r\n color: new Color3(0.17, 0.68, 1.0),\r\n location: 1.0,\r\n },\r\n ];\r\n\r\n const bufferWidth: number = skeleton.bones.length + 1;\r\n const colorMapBuffer: number[] = SkeletonViewer._CreateBoneMapColorBuffer(bufferWidth, colorMap, scene);\r\n const shader = new ShaderMaterial(\r\n \"boneWeights:\" + skeleton.name,\r\n scene,\r\n {\r\n vertexSource:\r\n `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n uniform float colorMap[` +\r\n skeleton.bones.length * 4 +\r\n `];\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n #include<bakedVertexAnimationDeclaration>\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n #include<bakedVertexAnimation>\r\n\r\n vec3 color = vec3(0.);\r\n bool first = true;\r\n\r\n for (int i = 0; i < 4; i++) {\r\n int boneIdx = int(matricesIndices[i]);\r\n float boneWgt = matricesWeights[i];\r\n\r\n vec3 c = vec3(colorMap[boneIdx * 4 + 0], colorMap[boneIdx * 4 + 1], colorMap[boneIdx * 4 + 2]);\r\n\r\n if (boneWgt > 0.) {\r\n if (first) {\r\n first = false;\r\n color = c;\r\n } else {\r\n color = mix(color, c, boneWgt);\r\n }\r\n }\r\n }\r\n\r\n vColor = color;\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`,\r\n fragmentSource: `\r\n precision highp float;\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4( vColor, 1.0 );\r\n gl_FragColor = color;\r\n }\r\n `,\r\n },\r\n {\r\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\r\n uniforms: [\"world\", \"worldView\", \"worldViewProjection\", \"view\", \"projection\", \"viewProjection\", \"colorMap\"],\r\n }\r\n );\r\n\r\n shader.setFloats(\"colorMap\", colorMapBuffer);\r\n\r\n shader.getClassName = (): string => {\r\n return \"SkeletonMapShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** private static method to create a BoneWeight Shader\r\n * @param size The size of the buffer to create (usually the bone count)\r\n * @param colorMap The gradient data to generate\r\n * @param scene The scene that the shader is scoped to\r\n * @returns an Array of floats from the color gradient values\r\n */\r\n private static _CreateBoneMapColorBuffer(size: number, colorMap: ISkeletonMapShaderColorMapKnot[], scene: Scene) {\r\n const tempGrad = new DynamicTexture(\"temp\", { width: size, height: 1 }, scene, false);\r\n const ctx = tempGrad.getContext();\r\n const grad = ctx.createLinearGradient(0, 0, size, 0);\r\n\r\n colorMap.forEach((stop) => {\r\n grad.addColorStop(stop.location, stop.color.toHexString());\r\n });\r\n\r\n ctx.fillStyle = grad;\r\n ctx.fillRect(0, 0, size, 1);\r\n tempGrad.update();\r\n const buffer: number[] = [];\r\n const data: Uint8ClampedArray = ctx.getImageData(0, 0, size, 1).data;\r\n const rUnit = 1 / 255;\r\n for (let i = 0; i < data.length; i++) {\r\n buffer.push(data[i] * rUnit);\r\n }\r\n tempGrad.dispose();\r\n return buffer;\r\n }\r\n\r\n /** If SkeletonViewer scene scope. */\r\n private _scene: Scene;\r\n\r\n /** Gets or sets the color used to render the skeleton */\r\n public color: Color3 = Color3.White();\r\n\r\n /** Array of the points of the skeleton fo the line view. */\r\n private _debugLines = new Array<Array<Vector3>>();\r\n\r\n /** The SkeletonViewers Mesh. */\r\n private _debugMesh: Nullable<LinesMesh>;\r\n\r\n /** The local axes Meshes. */\r\n private _localAxes: Nullable<LinesMesh> = null;\r\n\r\n /** If SkeletonViewer is enabled. */\r\n private _isEnabled = true;\r\n\r\n /** If SkeletonViewer is ready. */\r\n private _ready: boolean;\r\n\r\n /** SkeletonViewer render observable. */\r\n private _obs: Nullable<Observer<Scene>> = null;\r\n\r\n /** The Utility Layer to render the gizmos in. */\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n\r\n private _boneIndices: Set<number>;\r\n\r\n /** Gets the Scene. */\r\n get scene(): Scene {\r\n return this._scene;\r\n }\r\n /** Gets the utilityLayer. */\r\n get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n /** Checks Ready Status. */\r\n get isReady(): Boolean {\r\n return this._ready;\r\n }\r\n /** Sets Ready Status. */\r\n set ready(value: boolean) {\r\n this._ready = value;\r\n }\r\n /** Gets the debugMesh */\r\n get debugMesh(): Nullable<AbstractMesh> | Nullable<LinesMesh> {\r\n return this._debugMesh;\r\n }\r\n /** Sets the debugMesh */\r\n set debugMesh(value: Nullable<AbstractMesh> | Nullable<LinesMesh>) {\r\n this._debugMesh = value as any;\r\n }\r\n /** Gets the displayMode */\r\n get displayMode(): number {\r\n return this.options.displayMode || SkeletonViewer.DISPLAY_LINES;\r\n }\r\n /** Sets the displayMode */\r\n set displayMode(value: number) {\r\n if (value > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n value = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.options.displayMode = value;\r\n }\r\n /**\r\n * Creates a new SkeletonViewer\r\n * @param skeleton defines the skeleton to render\r\n * @param mesh defines the mesh attached to the skeleton\r\n * @param scene defines the hosting scene\r\n * @param autoUpdateBonesMatrices defines a boolean indicating if bones matrices must be forced to update before rendering (true by default)\r\n * @param renderingGroupId defines the rendering group id to use with the viewer\r\n * @param options All of the extra constructor options for the SkeletonViewer\r\n */\r\n constructor(\r\n /** defines the skeleton to render */\r\n public skeleton: Skeleton,\r\n /** defines the mesh attached to the skeleton */\r\n public mesh: Nullable<AbstractMesh>,\r\n /** The Scene scope*/\r\n scene: Scene,\r\n /** defines a boolean indicating if bones matrices must be forced to update before rendering (true by default) */\r\n public autoUpdateBonesMatrices: boolean = true,\r\n /** defines the rendering group id to use with the viewer */\r\n public renderingGroupId: number = 3,\r\n /** is the options for the viewer */\r\n public options: Partial<ISkeletonViewerOptions> = {}\r\n ) {\r\n this._scene = scene;\r\n this._ready = false;\r\n\r\n //Defaults\r\n options.pauseAnimations = options.pauseAnimations ?? true;\r\n options.returnToRest = options.returnToRest ?? false;\r\n options.displayMode = options.displayMode ?? SkeletonViewer.DISPLAY_LINES;\r\n options.displayOptions = options.displayOptions ?? {};\r\n options.displayOptions.midStep = options.displayOptions.midStep ?? 0.235;\r\n options.displayOptions.midStepFactor = options.displayOptions.midStepFactor ?? 0.155;\r\n options.displayOptions.sphereBaseSize = options.displayOptions.sphereBaseSize ?? 0.15;\r\n options.displayOptions.sphereScaleUnit = options.displayOptions.sphereScaleUnit ?? 2;\r\n options.displayOptions.sphereFactor = options.displayOptions.sphereFactor ?? 0.865;\r\n options.displayOptions.spurFollowsChild = options.displayOptions.spurFollowsChild ?? false;\r\n options.displayOptions.showLocalAxes = options.displayOptions.showLocalAxes ?? false;\r\n options.displayOptions.localAxesSize = options.displayOptions.localAxesSize ?? 0.075;\r\n options.computeBonesUsingShaders = options.computeBonesUsingShaders ?? true;\r\n options.useAllBones = options.useAllBones ?? true;\r\n\r\n this._boneIndices = new Set();\r\n\r\n if (!options.useAllBones) {\r\n const initialMeshBoneIndices = mesh?.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const initialMeshBoneWeights = mesh?.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n\r\n if (initialMeshBoneIndices && initialMeshBoneWeights) {\r\n for (let i = 0; i < initialMeshBoneIndices.length; ++i) {\r\n const index = initialMeshBoneIndices[i],\r\n weight = initialMeshBoneWeights[i];\r\n if (weight !== 0) {\r\n this._boneIndices.add(index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Create Utility Layer */\r\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\r\n\r\n let displayMode = this.options.displayMode || 0;\r\n if (displayMode > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n displayMode = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.displayMode = displayMode;\r\n //Prep the Systems\r\n this.update();\r\n this._bindObs();\r\n }\r\n\r\n /** The Dynamic bindings for the update functions */\r\n private _bindObs(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._obs = this.scene.onBeforeRenderObservable.add(() => {\r\n this._displayLinesUpdate();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used to manually update. */\r\n public update(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._displayLinesUpdate();\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERES: {\r\n this._buildSpheresAndSpurs(true);\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERE_AND_SPURS: {\r\n this._buildSpheresAndSpurs(false);\r\n break;\r\n }\r\n }\r\n\r\n this._buildLocalAxes();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the viewer is enabled */\r\n public set isEnabled(value: boolean) {\r\n if (this.isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (this.debugMesh) {\r\n this.debugMesh.setEnabled(value);\r\n }\r\n\r\n if (value && !this._obs) {\r\n this._bindObs();\r\n } else if (!value && this._obs) {\r\n this.scene.onBeforeRenderObservable.remove(this._obs);\r\n this._obs = null;\r\n }\r\n }\r\n\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n private _getBonePosition(position: Vector3, bone: Bone, meshMat: Matrix, x = 0, y = 0, z = 0): void {\r\n const tmat = TmpVectors.Matrix[0];\r\n const parentBone = bone.getParent();\r\n tmat.copyFrom(bone.getLocalMatrix());\r\n\r\n if (x !== 0 || y !== 0 || z !== 0) {\r\n const tmat2 = TmpVectors.Matrix[1];\r\n Matrix.IdentityToRef(tmat2);\r\n tmat2.setTranslationFromFloats(x, y, z);\r\n tmat2.multiplyToRef(tmat, tmat);\r\n }\r\n\r\n if (parentBone) {\r\n tmat.multiplyToRef(parentBone.getAbsoluteMatrix(), tmat);\r\n }\r\n\r\n tmat.multiplyToRef(meshMat, tmat);\r\n\r\n position.x = tmat.m[12];\r\n position.y = tmat.m[13];\r\n position.z = tmat.m[14];\r\n }\r\n\r\n private _getLinesForBonesWithLength(bones: Bone[], mesh: Nullable<AbstractMesh>): void {\r\n const len = bones.length;\r\n\r\n let matrix;\r\n let meshPos;\r\n if (mesh) {\r\n matrix = mesh.getWorldMatrix();\r\n meshPos = mesh.position;\r\n } else {\r\n matrix = new Matrix();\r\n meshPos = bones[0].position;\r\n }\r\n let idx = 0;\r\n for (let i = 0; i < len; i++) {\r\n const bone = bones[i];\r\n let points = this._debugLines[idx];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[idx] = points;\r\n }\r\n this._getBonePosition(points[0], bone, matrix);\r\n this._getBonePosition(points[1], bone, matrix, 0, bone.length, 0);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n idx++;\r\n }\r\n }\r\n\r\n private _getLinesForBonesNoLength(bones: Bone[]): void {\r\n const len = bones.length;\r\n let boneNum = 0;\r\n\r\n const mesh = this.mesh;\r\n let transformNode;\r\n let meshPos;\r\n if (mesh) {\r\n transformNode = mesh;\r\n meshPos = mesh.position;\r\n } else {\r\n transformNode = new TransformNode(\"\");\r\n meshPos = bones[0].position;\r\n }\r\n for (let i = len - 1; i >= 0; i--) {\r\n const childBone = bones[i];\r\n const parentBone = childBone.getParent();\r\n if (!parentBone || (!this._boneIndices.has(childBone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n let points = this._debugLines[boneNum];\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[boneNum] = points;\r\n }\r\n childBone.getAbsolutePositionToRef(transformNode, points[0]);\r\n parentBone.getAbsolutePositionToRef(transformNode, points[1]);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n boneNum++;\r\n }\r\n if (!mesh) {\r\n transformNode.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * function to revert the mesh and scene back to the initial state.\r\n * @param animationState\r\n */\r\n private _revert(animationState: boolean): void {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = animationState;\r\n this.utilityLayer!.utilityLayerScene!.animationsEnabled = animationState;\r\n }\r\n }\r\n\r\n /**\r\n * function to get the absolute bind pose of a bone by accumulating transformations up the bone hierarchy.\r\n * @param bone\r\n * @param matrix\r\n */\r\n private _getAbsoluteBindPoseToRef(bone: Nullable<Bone>, matrix: Matrix) {\r\n if (bone === null || bone._index === -1) {\r\n matrix.copyFrom(Matrix.Identity());\r\n return;\r\n }\r\n\r\n this._getAbsoluteBindPoseToRef(bone.getParent(), matrix);\r\n bone.getBindMatrix().multiplyToRef(matrix, matrix);\r\n return;\r\n }\r\n\r\n /**\r\n * function to build and bind sphere joint points and spur bone representations.\r\n * @param spheresOnly\r\n */\r\n private _buildSpheresAndSpurs(spheresOnly = true): void {\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n\r\n this._ready = false;\r\n const utilityLayerScene = this.utilityLayer?.utilityLayerScene!;\r\n const bones: Bone[] = this.skeleton.bones;\r\n const spheres: Array<[Mesh, Bone]> = [];\r\n const spurs: Mesh[] = [];\r\n\r\n const animationState = this.scene.animationsEnabled;\r\n\r\n try {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = false;\r\n utilityLayerScene.animationsEnabled = false;\r\n }\r\n\r\n if (this.options.returnToRest) {\r\n this.skeleton.returnToRest();\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteMatrices();\r\n }\r\n\r\n let longestBoneLength = Number.NEGATIVE_INFINITY;\r\n const displayOptions = this.options.displayOptions || {};\r\n\r\n for (let i = 0; i < bones.length; i++) {\r\n const bone = bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n const boneAbsoluteBindPoseTransform = new Matrix();\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n\r\n const anchorPoint = new Vector3();\r\n\r\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, anchorPoint);\r\n\r\n bone.children.forEach((bc) => {\r\n const childAbsoluteBindPoseTransform: Matrix = new Matrix();\r\n bc.getLocalMatrix().multiplyToRef(boneAbsoluteBindPoseTransform, childAbsoluteBindPoseTransform);\r\n const childPoint = new Vector3();\r\n childAbsoluteBindPoseTransform.decompose(undefined, undefined, childPoint);\r\n const distanceFromParent = Vector3.Distance(anchorPoint, childPoint);\r\n if (distanceFromParent > longestBoneLength) {\r\n longestBoneLength = distanceFromParent;\r\n }\r\n if (spheresOnly) {\r\n return;\r\n }\r\n\r\n const dir = childPoint.clone().subtract(anchorPoint.clone());\r\n const h = dir.length();\r\n const up = dir.normalize().scale(h);\r\n\r\n const midStep = displayOptions.midStep || 0.165;\r\n const midStepFactor = displayOptions.midStepFactor || 0.215;\r\n\r\n const up0 = up.scale(midStep);\r\n\r\n const spur = ExtrudeShapeCustom(\r\n \"skeletonViewer\",\r\n {\r\n shape: [new Vector3(1, -1, 0), new Vector3(1, 1, 0), new Vector3(-1, 1, 0), new Vector3(-1, -1, 0), new Vector3(1, -1, 0)],\r\n path: [Vector3.Zero(), up0, up],\r\n scaleFunction: (i: number) => {\r\n switch (i) {\r\n case 0:\r\n case 2:\r\n return 0;\r\n case 1:\r\n return h * midStepFactor;\r\n }\r\n return 0;\r\n },\r\n sideOrientation: Mesh.DEFAULTSIDE,\r\n updatable: false,\r\n },\r\n utilityLayerScene\r\n );\r\n\r\n const numVertices = spur.getTotalVertices();\r\n const mwk: number[] = [],\r\n mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n\r\n // Select verts at end of spur (ie vert 10 to 14) and bind to child\r\n // bone if spurFollowsChild is enabled.\r\n if (displayOptions.spurFollowsChild && i > 9) {\r\n mik.push(bc.getIndex(), 0, 0, 0);\r\n } else {\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n spur.position = anchorPoint.clone();\r\n\r\n spur.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n spur.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n spur.convertToFlatShadedMesh();\r\n\r\n spurs.push(spur);\r\n });\r\n\r\n const sphereBaseSize = displayOptions.sphereBaseSize || 0.2;\r\n\r\n const sphere = CreateSphere(\r\n \"skeletonViewer\",\r\n {\r\n segments: 6,\r\n diameter: sphereBaseSize,\r\n updatable: true,\r\n },\r\n utilityLayerScene\r\n );\r\n\r\n const numVertices = sphere.getTotalVertices();\r\n\r\n const mwk: number[] = [],\r\n mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n\r\n sphere.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n sphere.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n\r\n sphere.position = anchorPoint.clone();\r\n spheres.push([sphere, bone]);\r\n }\r\n\r\n const sphereScaleUnit = displayOptions.sphereScaleUnit || 2;\r\n const sphereFactor = displayOptions.sphereFactor || 0.85;\r\n\r\n const meshes = [];\r\n for (let i = 0; i < spheres.length; i++) {\r\n const [sphere, bone] = spheres[i];\r\n const scale = 1 / (sphereScaleUnit / longestBoneLength);\r\n\r\n let _stepsOut = 0;\r\n let _b = bone;\r\n\r\n while (_b.getParent() && (_b.getParent() as Bone).getIndex() !== -1) {\r\n _stepsOut++;\r\n _b = _b.getParent() as Bone;\r\n }\r\n sphere.scaling.scaleInPlace(scale * Math.pow(sphereFactor, _stepsOut));\r\n meshes.push(sphere);\r\n }\r\n\r\n this.debugMesh = Mesh.MergeMeshes(meshes.concat(spurs), true, true);\r\n if (this.debugMesh) {\r\n this.debugMesh.renderingGroupId = this.renderingGroupId;\r\n this.debugMesh.skeleton = this.skeleton;\r\n this.debugMesh.parent = this.mesh;\r\n this.debugMesh.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n this.debugMesh.alwaysSelectAsActiveMesh = true;\r\n }\r\n\r\n const light = this.utilityLayer!._getSharedGizmoLight();\r\n light.intensity = 0.7;\r\n\r\n this._revert(animationState);\r\n this.ready = true;\r\n } catch (err) {\r\n console.error(err);\r\n this._revert(animationState);\r\n this.dispose();\r\n }\r\n }\r\n\r\n private _buildLocalAxes(): void {\r\n if (this._localAxes) {\r\n this._localAxes.dispose();\r\n }\r\n\r\n this._localAxes = null;\r\n\r\n const displayOptions = this.options.displayOptions || {};\r\n\r\n if (!displayOptions.showLocalAxes) {\r\n return;\r\n }\r\n\r\n const targetScene = this._utilityLayer!.utilityLayerScene;\r\n const size = displayOptions.localAxesSize || 0.075;\r\n const lines = [];\r\n const colors = [];\r\n const red = new Color4(1, 0, 0, 1);\r\n const green = new Color4(0, 1, 0, 1);\r\n const blue = new Color4(0, 0, 1, 1);\r\n\r\n const mwk: number[] = [];\r\n const mik: number[] = [];\r\n const vertsPerBone = 6;\r\n\r\n for (const i in this.skeleton.bones) {\r\n const bone = this.skeleton.bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n const boneAbsoluteBindPoseTransform = new Matrix();\r\n const boneOrigin = new Vector3();\r\n\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n boneAbsoluteBindPoseTransform.decompose(undefined, TmpVectors.Quaternion[0], boneOrigin);\r\n\r\n const m = new Matrix();\r\n TmpVectors.Quaternion[0].toRotationMatrix(m);\r\n\r\n const boneAxisX = Vector3.TransformCoordinates(new Vector3(0 + size, 0, 0), m);\r\n const boneAxisY = Vector3.TransformCoordinates(new Vector3(0, 0 + size, 0), m);\r\n const boneAxisZ = Vector3.TransformCoordinates(new Vector3(0, 0, 0 + size), m);\r\n\r\n const axisX = [boneOrigin, boneOrigin.add(boneAxisX)];\r\n const axisY = [boneOrigin, boneOrigin.add(boneAxisY)];\r\n const axisZ = [boneOrigin, boneOrigin.add(boneAxisZ)];\r\n\r\n const linePoints = [axisX, axisY, axisZ];\r\n const lineColors = [\r\n [red, red],\r\n [green, green],\r\n [blue, blue],\r\n ];\r\n\r\n lines.push(...linePoints);\r\n colors.push(...lineColors);\r\n\r\n for (let j = 0; j < vertsPerBone; j++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n this._localAxes = CreateLineSystem(\"localAxes\", { lines: lines, colors: colors, updatable: true }, targetScene);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n this._localAxes.skeleton = this.skeleton;\r\n this._localAxes.renderingGroupId = this.renderingGroupId + 1;\r\n this._localAxes.parent = this.mesh;\r\n this._localAxes.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used for the line display. */\r\n private _displayLinesUpdate(): void {\r\n if (!this._utilityLayer) {\r\n return;\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteMatrices();\r\n }\r\n\r\n if (this.skeleton.bones[0].length === undefined) {\r\n this._getLinesForBonesNoLength(this.skeleton.bones);\r\n } else {\r\n this._getLinesForBonesWithLength(this.skeleton.bones, this.mesh);\r\n }\r\n\r\n const targetScene = this._utilityLayer.utilityLayerScene;\r\n\r\n if (targetScene) {\r\n if (!this._debugMesh) {\r\n this._debugMesh = CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: null }, targetScene);\r\n this._debugMesh.renderingGroupId = this.renderingGroupId;\r\n } else {\r\n CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: this._debugMesh }, targetScene);\r\n }\r\n if (this.mesh) {\r\n this._debugMesh.position.copyFrom(this.mesh.position);\r\n } else {\r\n this._debugMesh.position.copyFrom(this.skeleton.bones[0].position);\r\n }\r\n this._debugMesh.color = this.color;\r\n }\r\n }\r\n /** Changes the displayMode of the skeleton viewer\r\n * @param mode The displayMode numerical value\r\n */\r\n public changeDisplayMode(mode: number): void {\r\n const wasEnabled = this.isEnabled ? true : false;\r\n if (this.displayMode !== mode) {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.displayMode = mode;\r\n\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n }\r\n\r\n /** Sets a display option of the skeleton viewer\r\n *\r\n * | Option | Type | Default | Description |\r\n * | ---------------- | ------- | ------- | ----------- |\r\n * | midStep | float | 0.235 | A percentage between a bone and its child that determines the widest part of a spur. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | midStepFactor | float | 0.15 | Mid step width expressed as a factor of the length. A value of 0.5 makes the spur width half of the spur length. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereBaseSize | float | 2 | Sphere base size. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereScaleUnit | float | 0.865 | Sphere scale factor used to scale spheres in relation to the longest bone. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | spurFollowsChild | boolean | false | Whether a spur should attach its far end to the child bone. |\r\n * | showLocalAxes | boolean | false | Displays local axes on all bones. |\r\n * | localAxesSize | float | 0.075 | Determines the length of each local axis. |\r\n *\r\n * @param option String of the option name\r\n * @param value The numerical option value\r\n */\r\n public changeDisplayOptions(option: string, value: number): void {\r\n const wasEnabled = this.isEnabled ? true : false;\r\n (this.options.displayOptions as any)[option] = value;\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n\r\n /** Release associated resources */\r\n public dispose(): void {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n }\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n this._utilityLayer = null;\r\n }\r\n\r\n this.ready = false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"skeletonViewer.js","sourceRoot":"","sources":["../../../../dev/core/src/Debug/skeletonViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport type { Skeleton } from \"../Bones/skeleton\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { CreateLineSystem } from \"../Meshes/Builders/linesBuilder\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { DynamicTexture } from \"../Materials/Textures/dynamicTexture\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Effect } from \"../Materials/effect\";\r\n\r\nimport type { ISkeletonViewerOptions, IBoneWeightShaderOptions, ISkeletonMapShaderOptions, ISkeletonMapShaderColorMapKnot } from \"./ISkeletonViewer\";\r\nimport type { Observer } from \"../Misc/observable\";\r\n\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { ExtrudeShapeCustom } from \"../Meshes/Builders/shapeBuilder\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Class used to render a debug view of a given skeleton\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#8\r\n */\r\nexport class SkeletonViewer {\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_LINES */\r\n public static readonly DISPLAY_LINES = 0;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERES */\r\n public static readonly DISPLAY_SPHERES = 1;\r\n /** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERE_AND_SPURS */\r\n public static readonly DISPLAY_SPHERE_AND_SPURS = 2;\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n * @see http://www.babylonjs-playground.com/#1BZJVJ#395\r\n */\r\n static CreateBoneWeightShader(options: IBoneWeightShaderOptions, scene: Scene): ShaderMaterial {\r\n const skeleton: Skeleton = options.skeleton;\r\n const colorBase: Color3 = options.colorBase ?? Color3.Black();\r\n const colorZero: Color3 = options.colorZero ?? Color3.Blue();\r\n const colorQuarter: Color3 = options.colorQuarter ?? Color3.Green();\r\n const colorHalf: Color3 = options.colorHalf ?? Color3.Yellow();\r\n const colorFull: Color3 = options.colorFull ?? Color3.Red();\r\n const targetBoneIndex: number = options.targetBoneIndex ?? 0;\r\n\r\n Effect.ShadersStore[\"boneWeights:\" + skeleton.name + \"VertexShader\"] = `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n #include<bakedVertexAnimationDeclaration>\r\n\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n uniform vec3 colorBase;\r\n uniform vec3 colorZero;\r\n uniform vec3 colorQuarter;\r\n uniform vec3 colorHalf;\r\n uniform vec3 colorFull;\r\n\r\n uniform float targetBoneIndex;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n #include<bakedVertexAnimation>\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n vec3 color = colorBase;\r\n float totalWeight = 0.;\r\n if(matricesIndices[0] == targetBoneIndex && matricesWeights[0] > 0.){\r\n totalWeight += matricesWeights[0];\r\n }\r\n if(matricesIndices[1] == targetBoneIndex && matricesWeights[1] > 0.){\r\n totalWeight += matricesWeights[1];\r\n }\r\n if(matricesIndices[2] == targetBoneIndex && matricesWeights[2] > 0.){\r\n totalWeight += matricesWeights[2];\r\n }\r\n if(matricesIndices[3] == targetBoneIndex && matricesWeights[3] > 0.){\r\n totalWeight += matricesWeights[3];\r\n }\r\n\r\n color = mix(color, colorZero, smoothstep(0., 0.25, totalWeight));\r\n color = mix(color, colorQuarter, smoothstep(0.25, 0.5, totalWeight));\r\n color = mix(color, colorHalf, smoothstep(0.5, 0.75, totalWeight));\r\n color = mix(color, colorFull, smoothstep(0.75, 1.0, totalWeight));\r\n vColor = color;\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`;\r\n Effect.ShadersStore[\"boneWeights:\" + skeleton.name + \"FragmentShader\"] = `\r\n precision highp float;\r\n varying vec3 vPosition;\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4(vColor, 1.0);\r\n gl_FragColor = color;\r\n }\r\n `;\r\n const shader: ShaderMaterial = new ShaderMaterial(\r\n \"boneWeight:\" + skeleton.name,\r\n scene,\r\n {\r\n vertex: \"boneWeights:\" + skeleton.name,\r\n fragment: \"boneWeights:\" + skeleton.name,\r\n },\r\n {\r\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\r\n uniforms: [\r\n \"world\",\r\n \"worldView\",\r\n \"worldViewProjection\",\r\n \"view\",\r\n \"projection\",\r\n \"viewProjection\",\r\n \"colorBase\",\r\n \"colorZero\",\r\n \"colorQuarter\",\r\n \"colorHalf\",\r\n \"colorFull\",\r\n \"targetBoneIndex\",\r\n ],\r\n }\r\n );\r\n\r\n shader.setColor3(\"colorBase\", colorBase);\r\n shader.setColor3(\"colorZero\", colorZero);\r\n shader.setColor3(\"colorQuarter\", colorQuarter);\r\n shader.setColor3(\"colorHalf\", colorHalf);\r\n shader.setColor3(\"colorFull\", colorFull);\r\n shader.setFloat(\"targetBoneIndex\", targetBoneIndex);\r\n\r\n shader.getClassName = (): string => {\r\n return \"BoneWeightShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** public static method to create a BoneWeight Shader\r\n * @param options The constructor options\r\n * @param scene The scene that the shader is scoped to\r\n * @returns The created ShaderMaterial\r\n */\r\n static CreateSkeletonMapShader(options: ISkeletonMapShaderOptions, scene: Scene) {\r\n const skeleton: Skeleton = options.skeleton;\r\n const colorMap: ISkeletonMapShaderColorMapKnot[] = options.colorMap ?? [\r\n {\r\n color: new Color3(1, 0.38, 0.18),\r\n location: 0,\r\n },\r\n {\r\n color: new Color3(0.59, 0.18, 1.0),\r\n location: 0.2,\r\n },\r\n {\r\n color: new Color3(0.59, 1, 0.18),\r\n location: 0.4,\r\n },\r\n {\r\n color: new Color3(1, 0.87, 0.17),\r\n location: 0.6,\r\n },\r\n {\r\n color: new Color3(1, 0.17, 0.42),\r\n location: 0.8,\r\n },\r\n {\r\n color: new Color3(0.17, 0.68, 1.0),\r\n location: 1.0,\r\n },\r\n ];\r\n\r\n const bufferWidth: number = skeleton.bones.length + 1;\r\n const colorMapBuffer: number[] = SkeletonViewer._CreateBoneMapColorBuffer(bufferWidth, colorMap, scene);\r\n const shader = new ShaderMaterial(\r\n \"boneWeights:\" + skeleton.name,\r\n scene,\r\n {\r\n vertexSource:\r\n `precision highp float;\r\n\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n\r\n uniform mat4 view;\r\n uniform mat4 projection;\r\n uniform mat4 worldViewProjection;\r\n uniform float colorMap[` +\r\n skeleton.bones.length * 4 +\r\n `];\r\n\r\n #include<bonesDeclaration>\r\n #if NUM_BONE_INFLUENCERS == 0\r\n attribute vec4 matricesIndices;\r\n attribute vec4 matricesWeights;\r\n #endif\r\n #include<bakedVertexAnimationDeclaration>\r\n #include<instancesDeclaration>\r\n\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec3 positionUpdated = position;\r\n\r\n #include<instancesVertex>\r\n #include<bonesVertex>\r\n #include<bakedVertexAnimation>\r\n\r\n vec3 color = vec3(0.);\r\n bool first = true;\r\n\r\n for (int i = 0; i < 4; i++) {\r\n int boneIdx = int(matricesIndices[i]);\r\n float boneWgt = matricesWeights[i];\r\n\r\n vec3 c = vec3(colorMap[boneIdx * 4 + 0], colorMap[boneIdx * 4 + 1], colorMap[boneIdx * 4 + 2]);\r\n\r\n if (boneWgt > 0.) {\r\n if (first) {\r\n first = false;\r\n color = c;\r\n } else {\r\n color = mix(color, c, boneWgt);\r\n }\r\n }\r\n }\r\n\r\n vColor = color;\r\n\r\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\r\n\r\n gl_Position = projection * view * worldPos;\r\n }`,\r\n fragmentSource: `\r\n precision highp float;\r\n varying vec3 vColor;\r\n\r\n void main() {\r\n vec4 color = vec4( vColor, 1.0 );\r\n gl_FragColor = color;\r\n }\r\n `,\r\n },\r\n {\r\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\r\n uniforms: [\"world\", \"worldView\", \"worldViewProjection\", \"view\", \"projection\", \"viewProjection\", \"colorMap\"],\r\n }\r\n );\r\n\r\n shader.setFloats(\"colorMap\", colorMapBuffer);\r\n\r\n shader.getClassName = (): string => {\r\n return \"SkeletonMapShader\";\r\n };\r\n\r\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\r\n\r\n return shader;\r\n }\r\n\r\n /** private static method to create a BoneWeight Shader\r\n * @param size The size of the buffer to create (usually the bone count)\r\n * @param colorMap The gradient data to generate\r\n * @param scene The scene that the shader is scoped to\r\n * @returns an Array of floats from the color gradient values\r\n */\r\n private static _CreateBoneMapColorBuffer(size: number, colorMap: ISkeletonMapShaderColorMapKnot[], scene: Scene) {\r\n const tempGrad = new DynamicTexture(\"temp\", { width: size, height: 1 }, scene, false);\r\n const ctx = tempGrad.getContext();\r\n const grad = ctx.createLinearGradient(0, 0, size, 0);\r\n\r\n colorMap.forEach((stop) => {\r\n grad.addColorStop(stop.location, stop.color.toHexString());\r\n });\r\n\r\n ctx.fillStyle = grad;\r\n ctx.fillRect(0, 0, size, 1);\r\n tempGrad.update();\r\n const buffer: number[] = [];\r\n const data: Uint8ClampedArray = ctx.getImageData(0, 0, size, 1).data;\r\n const rUnit = 1 / 255;\r\n for (let i = 0; i < data.length; i++) {\r\n buffer.push(data[i] * rUnit);\r\n }\r\n tempGrad.dispose();\r\n return buffer;\r\n }\r\n\r\n /** If SkeletonViewer scene scope. */\r\n private _scene: Scene;\r\n\r\n /** Gets or sets the color used to render the skeleton */\r\n public color: Color3 = Color3.White();\r\n\r\n /** Array of the points of the skeleton fo the line view. */\r\n private _debugLines = new Array<Array<Vector3>>();\r\n\r\n /** The SkeletonViewers Mesh. */\r\n private _debugMesh: Nullable<LinesMesh>;\r\n\r\n /** The local axes Meshes. */\r\n private _localAxes: Nullable<LinesMesh> = null;\r\n\r\n /** If SkeletonViewer is enabled. */\r\n private _isEnabled = true;\r\n\r\n /** If SkeletonViewer is ready. */\r\n private _ready: boolean;\r\n\r\n /** SkeletonViewer render observable. */\r\n private _obs: Nullable<Observer<Scene>> = null;\r\n\r\n /** The Utility Layer to render the gizmos in. */\r\n private _utilityLayer: Nullable<UtilityLayerRenderer>;\r\n\r\n private _boneIndices: Set<number>;\r\n\r\n /** Gets the Scene. */\r\n get scene(): Scene {\r\n return this._scene;\r\n }\r\n /** Gets the utilityLayer. */\r\n get utilityLayer(): Nullable<UtilityLayerRenderer> {\r\n return this._utilityLayer;\r\n }\r\n /** Checks Ready Status. */\r\n get isReady(): Boolean {\r\n return this._ready;\r\n }\r\n /** Sets Ready Status. */\r\n set ready(value: boolean) {\r\n this._ready = value;\r\n }\r\n /** Gets the debugMesh */\r\n get debugMesh(): Nullable<AbstractMesh> | Nullable<LinesMesh> {\r\n return this._debugMesh;\r\n }\r\n /** Sets the debugMesh */\r\n set debugMesh(value: Nullable<AbstractMesh> | Nullable<LinesMesh>) {\r\n this._debugMesh = value as any;\r\n }\r\n /** Gets the displayMode */\r\n get displayMode(): number {\r\n return this.options.displayMode || SkeletonViewer.DISPLAY_LINES;\r\n }\r\n /** Sets the displayMode */\r\n set displayMode(value: number) {\r\n if (value > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n value = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.options.displayMode = value;\r\n }\r\n /**\r\n * Creates a new SkeletonViewer\r\n * @param skeleton defines the skeleton to render\r\n * @param mesh defines the mesh attached to the skeleton\r\n * @param scene defines the hosting scene\r\n * @param autoUpdateBonesMatrices defines a boolean indicating if bones matrices must be forced to update before rendering (true by default)\r\n * @param renderingGroupId defines the rendering group id to use with the viewer\r\n * @param options All of the extra constructor options for the SkeletonViewer\r\n */\r\n constructor(\r\n /** defines the skeleton to render */\r\n public skeleton: Skeleton,\r\n /** defines the mesh attached to the skeleton */\r\n public mesh: Nullable<AbstractMesh>,\r\n /** The Scene scope*/\r\n scene: Scene,\r\n /** defines a boolean indicating if bones matrices must be forced to update before rendering (true by default) */\r\n public autoUpdateBonesMatrices: boolean = true,\r\n /** defines the rendering group id to use with the viewer */\r\n public renderingGroupId: number = 3,\r\n /** is the options for the viewer */\r\n public options: Partial<ISkeletonViewerOptions> = {}\r\n ) {\r\n this._scene = scene;\r\n this._ready = false;\r\n\r\n //Defaults\r\n options.pauseAnimations = options.pauseAnimations ?? true;\r\n options.returnToRest = options.returnToRest ?? false;\r\n options.displayMode = options.displayMode ?? SkeletonViewer.DISPLAY_LINES;\r\n options.displayOptions = options.displayOptions ?? {};\r\n options.displayOptions.midStep = options.displayOptions.midStep ?? 0.235;\r\n options.displayOptions.midStepFactor = options.displayOptions.midStepFactor ?? 0.155;\r\n options.displayOptions.sphereBaseSize = options.displayOptions.sphereBaseSize ?? 0.15;\r\n options.displayOptions.sphereScaleUnit = options.displayOptions.sphereScaleUnit ?? 2;\r\n options.displayOptions.sphereFactor = options.displayOptions.sphereFactor ?? 0.865;\r\n options.displayOptions.spurFollowsChild = options.displayOptions.spurFollowsChild ?? false;\r\n options.displayOptions.showLocalAxes = options.displayOptions.showLocalAxes ?? false;\r\n options.displayOptions.localAxesSize = options.displayOptions.localAxesSize ?? 0.075;\r\n options.computeBonesUsingShaders = options.computeBonesUsingShaders ?? true;\r\n options.useAllBones = options.useAllBones ?? true;\r\n\r\n this._boneIndices = new Set();\r\n\r\n if (!options.useAllBones) {\r\n const initialMeshBoneIndices = mesh?.getVerticesData(VertexBuffer.MatricesIndicesKind);\r\n const initialMeshBoneWeights = mesh?.getVerticesData(VertexBuffer.MatricesWeightsKind);\r\n\r\n if (initialMeshBoneIndices && initialMeshBoneWeights) {\r\n for (let i = 0; i < initialMeshBoneIndices.length; ++i) {\r\n const index = initialMeshBoneIndices[i],\r\n weight = initialMeshBoneWeights[i];\r\n if (weight !== 0) {\r\n this._boneIndices.add(index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /* Create Utility Layer */\r\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\r\n this._utilityLayer.pickUtilitySceneFirst = false;\r\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\r\n\r\n let displayMode = this.options.displayMode || 0;\r\n if (displayMode > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\r\n displayMode = SkeletonViewer.DISPLAY_LINES;\r\n }\r\n this.displayMode = displayMode;\r\n //Prep the Systems\r\n this.update();\r\n this._bindObs();\r\n }\r\n\r\n /** The Dynamic bindings for the update functions */\r\n private _bindObs(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._obs = this.scene.onBeforeRenderObservable.add(() => {\r\n this._displayLinesUpdate();\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used to manually update. */\r\n public update(): void {\r\n switch (this.displayMode) {\r\n case SkeletonViewer.DISPLAY_LINES: {\r\n this._displayLinesUpdate();\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERES: {\r\n this._buildSpheresAndSpurs(true);\r\n break;\r\n }\r\n case SkeletonViewer.DISPLAY_SPHERE_AND_SPURS: {\r\n this._buildSpheresAndSpurs(false);\r\n break;\r\n }\r\n }\r\n\r\n this._buildLocalAxes();\r\n }\r\n\r\n /** Gets or sets a boolean indicating if the viewer is enabled */\r\n public set isEnabled(value: boolean) {\r\n if (this.isEnabled === value) {\r\n return;\r\n }\r\n\r\n this._isEnabled = value;\r\n\r\n if (this.debugMesh) {\r\n this.debugMesh.setEnabled(value);\r\n }\r\n\r\n if (value && !this._obs) {\r\n this._bindObs();\r\n } else if (!value && this._obs) {\r\n this.scene.onBeforeRenderObservable.remove(this._obs);\r\n this._obs = null;\r\n }\r\n }\r\n\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n private _getBonePosition(position: Vector3, bone: Bone, meshMat: Matrix, x = 0, y = 0, z = 0): void {\r\n const tmat = TmpVectors.Matrix[0];\r\n const parentBone = bone.getParent();\r\n tmat.copyFrom(bone.getLocalMatrix());\r\n\r\n if (x !== 0 || y !== 0 || z !== 0) {\r\n const tmat2 = TmpVectors.Matrix[1];\r\n Matrix.IdentityToRef(tmat2);\r\n tmat2.setTranslationFromFloats(x, y, z);\r\n tmat2.multiplyToRef(tmat, tmat);\r\n }\r\n\r\n if (parentBone) {\r\n tmat.multiplyToRef(parentBone.getAbsoluteMatrix(), tmat);\r\n }\r\n\r\n tmat.multiplyToRef(meshMat, tmat);\r\n\r\n position.x = tmat.m[12];\r\n position.y = tmat.m[13];\r\n position.z = tmat.m[14];\r\n }\r\n\r\n private _getLinesForBonesWithLength(bones: Bone[], mesh: Nullable<AbstractMesh>): void {\r\n const len = bones.length;\r\n\r\n let matrix;\r\n let meshPos;\r\n if (mesh) {\r\n matrix = mesh.getWorldMatrix();\r\n meshPos = mesh.position;\r\n } else {\r\n matrix = new Matrix();\r\n meshPos = bones[0].position;\r\n }\r\n let idx = 0;\r\n for (let i = 0; i < len; i++) {\r\n const bone = bones[i];\r\n let points = this._debugLines[idx];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[idx] = points;\r\n }\r\n this._getBonePosition(points[0], bone, matrix);\r\n this._getBonePosition(points[1], bone, matrix, 0, bone.length, 0);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n idx++;\r\n }\r\n }\r\n\r\n private _getLinesForBonesNoLength(bones: Bone[]): void {\r\n const len = bones.length;\r\n let boneNum = 0;\r\n\r\n const mesh = this.mesh;\r\n let transformNode;\r\n let meshPos;\r\n if (mesh) {\r\n transformNode = mesh;\r\n meshPos = mesh.position;\r\n } else {\r\n transformNode = new TransformNode(\"\");\r\n meshPos = bones[0].position;\r\n }\r\n for (let i = len - 1; i >= 0; i--) {\r\n const childBone = bones[i];\r\n const parentBone = childBone.getParent();\r\n if (!parentBone || (!this._boneIndices.has(childBone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n let points = this._debugLines[boneNum];\r\n if (!points) {\r\n points = [Vector3.Zero(), Vector3.Zero()];\r\n this._debugLines[boneNum] = points;\r\n }\r\n childBone.getAbsolutePositionToRef(transformNode, points[0]);\r\n parentBone.getAbsolutePositionToRef(transformNode, points[1]);\r\n points[0].subtractInPlace(meshPos);\r\n points[1].subtractInPlace(meshPos);\r\n boneNum++;\r\n }\r\n if (!mesh) {\r\n transformNode.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * function to revert the mesh and scene back to the initial state.\r\n * @param animationState\r\n */\r\n private _revert(animationState: boolean): void {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = animationState;\r\n this.utilityLayer!.utilityLayerScene!.animationsEnabled = animationState;\r\n }\r\n }\r\n\r\n /**\r\n * function to get the absolute bind pose of a bone by accumulating transformations up the bone hierarchy.\r\n * @param bone\r\n * @param matrix\r\n */\r\n private _getAbsoluteBindPoseToRef(bone: Nullable<Bone>, matrix: Matrix) {\r\n if (bone === null || bone._index === -1) {\r\n matrix.copyFrom(Matrix.Identity());\r\n return;\r\n }\r\n\r\n this._getAbsoluteBindPoseToRef(bone.getParent(), matrix);\r\n bone.getBindMatrix().multiplyToRef(matrix, matrix);\r\n return;\r\n }\r\n\r\n /**\r\n * function to build and bind sphere joint points and spur bone representations.\r\n * @param spheresOnly\r\n */\r\n private _buildSpheresAndSpurs(spheresOnly = true): void {\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n\r\n this._ready = false;\r\n const utilityLayerScene = this.utilityLayer?.utilityLayerScene!;\r\n const bones: Bone[] = this.skeleton.bones;\r\n const spheres: Array<[Mesh, Bone]> = [];\r\n const spurs: Mesh[] = [];\r\n\r\n const animationState = this.scene.animationsEnabled;\r\n\r\n try {\r\n if (this.options.pauseAnimations) {\r\n this.scene.animationsEnabled = false;\r\n utilityLayerScene.animationsEnabled = false;\r\n }\r\n\r\n if (this.options.returnToRest) {\r\n this.skeleton.returnToRest();\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteMatrices();\r\n }\r\n\r\n let longestBoneLength = Number.NEGATIVE_INFINITY;\r\n const displayOptions = this.options.displayOptions || {};\r\n\r\n for (let i = 0; i < bones.length; i++) {\r\n const bone = bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n const boneAbsoluteBindPoseTransform = new Matrix();\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n\r\n const anchorPoint = new Vector3();\r\n\r\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, anchorPoint);\r\n\r\n bone.children.forEach((bc) => {\r\n const childAbsoluteBindPoseTransform: Matrix = new Matrix();\r\n bc.getLocalMatrix().multiplyToRef(boneAbsoluteBindPoseTransform, childAbsoluteBindPoseTransform);\r\n const childPoint = new Vector3();\r\n childAbsoluteBindPoseTransform.decompose(undefined, undefined, childPoint);\r\n const distanceFromParent = Vector3.Distance(anchorPoint, childPoint);\r\n if (distanceFromParent > longestBoneLength) {\r\n longestBoneLength = distanceFromParent;\r\n }\r\n if (spheresOnly) {\r\n return;\r\n }\r\n\r\n const dir = childPoint.clone().subtract(anchorPoint.clone());\r\n const h = dir.length();\r\n const up = dir.normalize().scale(h);\r\n\r\n const midStep = displayOptions.midStep || 0.165;\r\n const midStepFactor = displayOptions.midStepFactor || 0.215;\r\n\r\n const up0 = up.scale(midStep);\r\n\r\n const spur = ExtrudeShapeCustom(\r\n \"skeletonViewer\",\r\n {\r\n shape: [new Vector3(1, -1, 0), new Vector3(1, 1, 0), new Vector3(-1, 1, 0), new Vector3(-1, -1, 0), new Vector3(1, -1, 0)],\r\n path: [Vector3.Zero(), up0, up],\r\n scaleFunction: (i: number) => {\r\n switch (i) {\r\n case 0:\r\n case 2:\r\n return 0;\r\n case 1:\r\n return h * midStepFactor;\r\n }\r\n return 0;\r\n },\r\n sideOrientation: Mesh.DEFAULTSIDE,\r\n updatable: false,\r\n },\r\n utilityLayerScene\r\n );\r\n\r\n const numVertices = spur.getTotalVertices();\r\n const mwk: number[] = [],\r\n mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n\r\n // Select verts at end of spur (ie vert 10 to 14) and bind to child\r\n // bone if spurFollowsChild is enabled.\r\n if (displayOptions.spurFollowsChild && i > 9) {\r\n mik.push(bc.getIndex(), 0, 0, 0);\r\n } else {\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n spur.position = anchorPoint.clone();\r\n\r\n spur.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n spur.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n spur.convertToFlatShadedMesh();\r\n\r\n spurs.push(spur);\r\n });\r\n\r\n const sphereBaseSize = displayOptions.sphereBaseSize || 0.2;\r\n\r\n const sphere = CreateSphere(\r\n \"skeletonViewer\",\r\n {\r\n segments: 6,\r\n diameter: sphereBaseSize,\r\n updatable: true,\r\n },\r\n utilityLayerScene\r\n );\r\n\r\n const numVertices = sphere.getTotalVertices();\r\n\r\n const mwk: number[] = [],\r\n mik: number[] = [];\r\n\r\n for (let i = 0; i < numVertices; i++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n\r\n sphere.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n sphere.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n\r\n sphere.position = anchorPoint.clone();\r\n spheres.push([sphere, bone]);\r\n }\r\n\r\n const sphereScaleUnit = displayOptions.sphereScaleUnit || 2;\r\n const sphereFactor = displayOptions.sphereFactor || 0.85;\r\n\r\n const meshes = [];\r\n for (let i = 0; i < spheres.length; i++) {\r\n const [sphere, bone] = spheres[i];\r\n const scale = 1 / (sphereScaleUnit / longestBoneLength);\r\n\r\n let _stepsOut = 0;\r\n let _b = bone;\r\n\r\n while (_b.getParent() && (_b.getParent() as Bone).getIndex() !== -1) {\r\n _stepsOut++;\r\n _b = _b.getParent() as Bone;\r\n }\r\n sphere.scaling.scaleInPlace(scale * Math.pow(sphereFactor, _stepsOut));\r\n meshes.push(sphere);\r\n }\r\n\r\n this.debugMesh = Mesh.MergeMeshes(meshes.concat(spurs), true, true);\r\n if (this.debugMesh) {\r\n this.debugMesh.renderingGroupId = this.renderingGroupId;\r\n this.debugMesh.skeleton = this.skeleton;\r\n this.debugMesh.parent = this.mesh;\r\n this.debugMesh.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n this.debugMesh.alwaysSelectAsActiveMesh = true;\r\n }\r\n\r\n const light = this.utilityLayer!._getSharedGizmoLight();\r\n light.intensity = 0.7;\r\n\r\n this._revert(animationState);\r\n this.ready = true;\r\n } catch (err) {\r\n Logger.Error(err);\r\n this._revert(animationState);\r\n this.dispose();\r\n }\r\n }\r\n\r\n private _buildLocalAxes(): void {\r\n if (this._localAxes) {\r\n this._localAxes.dispose();\r\n }\r\n\r\n this._localAxes = null;\r\n\r\n const displayOptions = this.options.displayOptions || {};\r\n\r\n if (!displayOptions.showLocalAxes) {\r\n return;\r\n }\r\n\r\n const targetScene = this._utilityLayer!.utilityLayerScene;\r\n const size = displayOptions.localAxesSize || 0.075;\r\n const lines = [];\r\n const colors = [];\r\n const red = new Color4(1, 0, 0, 1);\r\n const green = new Color4(0, 1, 0, 1);\r\n const blue = new Color4(0, 0, 1, 1);\r\n\r\n const mwk: number[] = [];\r\n const mik: number[] = [];\r\n const vertsPerBone = 6;\r\n\r\n for (const i in this.skeleton.bones) {\r\n const bone = this.skeleton.bones[i];\r\n\r\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\r\n continue;\r\n }\r\n\r\n const boneAbsoluteBindPoseTransform = new Matrix();\r\n const boneOrigin = new Vector3();\r\n\r\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\r\n boneAbsoluteBindPoseTransform.decompose(undefined, TmpVectors.Quaternion[0], boneOrigin);\r\n\r\n const m = new Matrix();\r\n TmpVectors.Quaternion[0].toRotationMatrix(m);\r\n\r\n const boneAxisX = Vector3.TransformCoordinates(new Vector3(0 + size, 0, 0), m);\r\n const boneAxisY = Vector3.TransformCoordinates(new Vector3(0, 0 + size, 0), m);\r\n const boneAxisZ = Vector3.TransformCoordinates(new Vector3(0, 0, 0 + size), m);\r\n\r\n const axisX = [boneOrigin, boneOrigin.add(boneAxisX)];\r\n const axisY = [boneOrigin, boneOrigin.add(boneAxisY)];\r\n const axisZ = [boneOrigin, boneOrigin.add(boneAxisZ)];\r\n\r\n const linePoints = [axisX, axisY, axisZ];\r\n const lineColors = [\r\n [red, red],\r\n [green, green],\r\n [blue, blue],\r\n ];\r\n\r\n lines.push(...linePoints);\r\n colors.push(...lineColors);\r\n\r\n for (let j = 0; j < vertsPerBone; j++) {\r\n mwk.push(1, 0, 0, 0);\r\n mik.push(bone.getIndex(), 0, 0, 0);\r\n }\r\n }\r\n\r\n this._localAxes = CreateLineSystem(\"localAxes\", { lines: lines, colors: colors, updatable: true }, targetScene);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\r\n this._localAxes.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\r\n this._localAxes.skeleton = this.skeleton;\r\n this._localAxes.renderingGroupId = this.renderingGroupId + 1;\r\n this._localAxes.parent = this.mesh;\r\n this._localAxes.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\r\n }\r\n\r\n /** Update the viewer to sync with current skeleton state, only used for the line display. */\r\n private _displayLinesUpdate(): void {\r\n if (!this._utilityLayer) {\r\n return;\r\n }\r\n\r\n if (this.autoUpdateBonesMatrices) {\r\n this.skeleton.computeAbsoluteMatrices();\r\n }\r\n\r\n if (this.skeleton.bones[0].length === undefined) {\r\n this._getLinesForBonesNoLength(this.skeleton.bones);\r\n } else {\r\n this._getLinesForBonesWithLength(this.skeleton.bones, this.mesh);\r\n }\r\n\r\n const targetScene = this._utilityLayer.utilityLayerScene;\r\n\r\n if (targetScene) {\r\n if (!this._debugMesh) {\r\n this._debugMesh = CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: null }, targetScene);\r\n this._debugMesh.renderingGroupId = this.renderingGroupId;\r\n } else {\r\n CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: this._debugMesh }, targetScene);\r\n }\r\n if (this.mesh) {\r\n this._debugMesh.position.copyFrom(this.mesh.position);\r\n } else {\r\n this._debugMesh.position.copyFrom(this.skeleton.bones[0].position);\r\n }\r\n this._debugMesh.color = this.color;\r\n }\r\n }\r\n /** Changes the displayMode of the skeleton viewer\r\n * @param mode The displayMode numerical value\r\n */\r\n public changeDisplayMode(mode: number): void {\r\n const wasEnabled = this.isEnabled ? true : false;\r\n if (this.displayMode !== mode) {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.displayMode = mode;\r\n\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n }\r\n\r\n /** Sets a display option of the skeleton viewer\r\n *\r\n * | Option | Type | Default | Description |\r\n * | ---------------- | ------- | ------- | ----------- |\r\n * | midStep | float | 0.235 | A percentage between a bone and its child that determines the widest part of a spur. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | midStepFactor | float | 0.15 | Mid step width expressed as a factor of the length. A value of 0.5 makes the spur width half of the spur length. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereBaseSize | float | 2 | Sphere base size. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | sphereScaleUnit | float | 0.865 | Sphere scale factor used to scale spheres in relation to the longest bone. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\r\n * | spurFollowsChild | boolean | false | Whether a spur should attach its far end to the child bone. |\r\n * | showLocalAxes | boolean | false | Displays local axes on all bones. |\r\n * | localAxesSize | float | 0.075 | Determines the length of each local axis. |\r\n *\r\n * @param option String of the option name\r\n * @param value The numerical option value\r\n */\r\n public changeDisplayOptions(option: string, value: number): void {\r\n const wasEnabled = this.isEnabled ? true : false;\r\n (this.options.displayOptions as any)[option] = value;\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n this.ready = false;\r\n }\r\n this.update();\r\n this._bindObs();\r\n this.isEnabled = wasEnabled;\r\n }\r\n\r\n /** Release associated resources */\r\n public dispose(): void {\r\n this.isEnabled = false;\r\n if (this._debugMesh) {\r\n this._debugMesh.dispose();\r\n this._debugMesh = null;\r\n }\r\n\r\n if (this._utilityLayer) {\r\n this._utilityLayer.dispose();\r\n this._utilityLayer = null;\r\n }\r\n\r\n this.ready = false;\r\n }\r\n}\r\n"]}
@@ -25,9 +25,10 @@ declare module "../../Engines/thinEngine" {
25
25
  * @param offset The offset in the storage buffer to start reading from (default: 0)
26
26
  * @param size The number of bytes to read from the storage buffer (default: capacity of the buffer)
27
27
  * @param buffer The buffer to write the data we have read from the storage buffer to (optional)
28
+ * @param noDelay If true, a call to flushFramebuffer will be issued so that the data can be read back immediately and not in engine.onEndFrameObservable. This can speed up data retrieval, at the cost of a small perf penalty (default: false).
28
29
  * @returns If not undefined, returns the (promise) buffer (as provided by the 4th parameter) filled with the data, else it returns a (promise) Uint8Array with the data read from the storage buffer
29
30
  */
30
- readFromStorageBuffer(storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView): Promise<ArrayBufferView>;
31
+ readFromStorageBuffer(storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView, noDelay?: boolean): Promise<ArrayBufferView>;
31
32
  /**
32
33
  * Sets a storage buffer in the shader
33
34
  * @param name Defines the name of the storage buffer as defined in the shader
@@ -1 +1 @@
1
- {"version":3,"file":"engine.storageBuffer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Extensions/engine.storageBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AA6CtD,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,IAAwB,EAAE,aAAqB;IAChG,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,MAAkB,EAAE,IAAe,EAAE,UAAmB,EAAE,UAAmB,IAAS,CAAC,CAAC;AAE7I,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,aAAyB,EAAE,MAAe,EAAE,IAAa,EAAE,MAAwB;IACtI,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,IAAY,EAAE,MAA+B;IAC3F,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC5E,CAAC,CAAC","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport type { DataArray, Nullable } from \"../../types\";\r\n\r\nimport type { StorageBuffer } from \"../../Buffers/storageBuffer\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a storage buffer\r\n * @param data the data for the storage buffer or the size of the buffer\r\n * @param creationFlags flags to use when creating the buffer (see Constants.BUFFER_CREATIONFLAG_XXX). The BUFFER_CREATIONFLAG_STORAGE flag will be automatically added\r\n * @param label defines the label of the buffer (for debug purpose)\r\n * @returns the new buffer\r\n */\r\n createStorageBuffer(data: DataArray | number, creationFlags: number, label?: string): DataBuffer;\r\n\r\n /**\r\n * Updates a storage buffer\r\n * @param buffer the storage buffer to update\r\n * @param data the data used to update the storage buffer\r\n * @param byteOffset the byte offset of the data\r\n * @param byteLength the byte length of the data\r\n */\r\n updateStorageBuffer(buffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void;\r\n\r\n /**\r\n * Read data from a storage buffer\r\n * @param storageBuffer The storage buffer to read from\r\n * @param offset The offset in the storage buffer to start reading from (default: 0)\r\n * @param size The number of bytes to read from the storage buffer (default: capacity of the buffer)\r\n * @param buffer The buffer to write the data we have read from the storage buffer to (optional)\r\n * @returns If not undefined, returns the (promise) buffer (as provided by the 4th parameter) filled with the data, else it returns a (promise) Uint8Array with the data read from the storage buffer\r\n */\r\n readFromStorageBuffer(storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView): Promise<ArrayBufferView>;\r\n\r\n /**\r\n * Sets a storage buffer in the shader\r\n * @param name Defines the name of the storage buffer as defined in the shader\r\n * @param buffer Defines the value to give to the uniform\r\n */\r\n setStorageBuffer(name: string, buffer: Nullable<StorageBuffer>): void;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.createStorageBuffer = function (data: DataArray | number, creationFlags: number): DataBuffer {\r\n throw new Error(\"createStorageBuffer: Unsupported method in this engine!\");\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.updateStorageBuffer = function (buffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void {};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.readFromStorageBuffer = function (storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView): Promise<ArrayBufferView> {\r\n throw new Error(\"readFromStorageBuffer: Unsupported method in this engine!\");\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.setStorageBuffer = function (name: string, buffer: Nullable<StorageBuffer>): void {\r\n throw new Error(\"setStorageBuffer: Unsupported method in this engine!\");\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.storageBuffer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Extensions/engine.storageBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AA8CtD,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,IAAwB,EAAE,aAAqB;IAChG,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,MAAkB,EAAE,IAAe,EAAE,UAAmB,EAAE,UAAmB,IAAS,CAAC,CAAC;AAE7I,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,aAAyB,EAAE,MAAe,EAAE,IAAa,EAAE,MAAwB;IACtI,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF,6DAA6D;AAC7D,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,IAAY,EAAE,MAA+B;IAC3F,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC5E,CAAC,CAAC","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport type { DataArray, Nullable } from \"../../types\";\r\n\r\nimport type { StorageBuffer } from \"../../Buffers/storageBuffer\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Creates a storage buffer\r\n * @param data the data for the storage buffer or the size of the buffer\r\n * @param creationFlags flags to use when creating the buffer (see Constants.BUFFER_CREATIONFLAG_XXX). The BUFFER_CREATIONFLAG_STORAGE flag will be automatically added\r\n * @param label defines the label of the buffer (for debug purpose)\r\n * @returns the new buffer\r\n */\r\n createStorageBuffer(data: DataArray | number, creationFlags: number, label?: string): DataBuffer;\r\n\r\n /**\r\n * Updates a storage buffer\r\n * @param buffer the storage buffer to update\r\n * @param data the data used to update the storage buffer\r\n * @param byteOffset the byte offset of the data\r\n * @param byteLength the byte length of the data\r\n */\r\n updateStorageBuffer(buffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void;\r\n\r\n /**\r\n * Read data from a storage buffer\r\n * @param storageBuffer The storage buffer to read from\r\n * @param offset The offset in the storage buffer to start reading from (default: 0)\r\n * @param size The number of bytes to read from the storage buffer (default: capacity of the buffer)\r\n * @param buffer The buffer to write the data we have read from the storage buffer to (optional)\r\n * @param noDelay If true, a call to flushFramebuffer will be issued so that the data can be read back immediately and not in engine.onEndFrameObservable. This can speed up data retrieval, at the cost of a small perf penalty (default: false).\r\n * @returns If not undefined, returns the (promise) buffer (as provided by the 4th parameter) filled with the data, else it returns a (promise) Uint8Array with the data read from the storage buffer\r\n */\r\n readFromStorageBuffer(storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView, noDelay?: boolean): Promise<ArrayBufferView>;\r\n\r\n /**\r\n * Sets a storage buffer in the shader\r\n * @param name Defines the name of the storage buffer as defined in the shader\r\n * @param buffer Defines the value to give to the uniform\r\n */\r\n setStorageBuffer(name: string, buffer: Nullable<StorageBuffer>): void;\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.createStorageBuffer = function (data: DataArray | number, creationFlags: number): DataBuffer {\r\n throw new Error(\"createStorageBuffer: Unsupported method in this engine!\");\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.updateStorageBuffer = function (buffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void {};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.readFromStorageBuffer = function (storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView): Promise<ArrayBufferView> {\r\n throw new Error(\"readFromStorageBuffer: Unsupported method in this engine!\");\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nThinEngine.prototype.setStorageBuffer = function (name: string, buffer: Nullable<StorageBuffer>): void {\r\n throw new Error(\"setStorageBuffer: Unsupported method in this engine!\");\r\n};\r\n"]}
@@ -1,3 +1,4 @@
1
+ import { Logger } from "../../Misc/logger.js";
1
2
  import { EscapeRegExp, ExtractBetweenMarkers, FindBackward, IsIdentifierChar, RemoveComments, SkipWhitespaces } from "../../Misc/codeStringParsingTools.js";
2
3
  /**
3
4
  * Class used to inline functions in shader code
@@ -25,12 +26,12 @@ export class ShaderCodeInliner {
25
26
  */
26
27
  processCode() {
27
28
  if (this.debug) {
28
- console.log(`Start inlining process (code size=${this._sourceCode.length})...`);
29
+ Logger.Log(`Start inlining process (code size=${this._sourceCode.length})...`);
29
30
  }
30
31
  this._collectFunctions();
31
32
  this._processInlining(this._numMaxIterations);
32
33
  if (this.debug) {
33
- console.log("End of inlining process.");
34
+ Logger.Log("End of inlining process.");
34
35
  }
35
36
  }
36
37
  _collectFunctions() {
@@ -44,7 +45,7 @@ export class ShaderCodeInliner {
44
45
  const funcParamsStartIndex = this._sourceCode.indexOf("(", inlineTokenIndex + this.inlineToken.length);
45
46
  if (funcParamsStartIndex < 0) {
46
47
  if (this.debug) {
47
- console.warn(`Could not find the opening parenthesis after the token. startIndex=${startIndex}`);
48
+ Logger.Warn(`Could not find the opening parenthesis after the token. startIndex=${startIndex}`);
48
49
  }
49
50
  startIndex = inlineTokenIndex + this.inlineToken.length;
50
51
  continue;
@@ -52,7 +53,7 @@ export class ShaderCodeInliner {
52
53
  const funcNameMatch = ShaderCodeInliner._RegexpFindFunctionNameAndType.exec(this._sourceCode.substring(inlineTokenIndex + this.inlineToken.length, funcParamsStartIndex));
53
54
  if (!funcNameMatch) {
54
55
  if (this.debug) {
55
- console.warn(`Could not extract the name/type of the function from: ${this._sourceCode.substring(inlineTokenIndex + this.inlineToken.length, funcParamsStartIndex)}`);
56
+ Logger.Warn(`Could not extract the name/type of the function from: ${this._sourceCode.substring(inlineTokenIndex + this.inlineToken.length, funcParamsStartIndex)}`);
56
57
  }
57
58
  startIndex = inlineTokenIndex + this.inlineToken.length;
58
59
  continue;
@@ -62,7 +63,7 @@ export class ShaderCodeInliner {
62
63
  const funcParamsEndIndex = ExtractBetweenMarkers("(", ")", this._sourceCode, funcParamsStartIndex);
63
64
  if (funcParamsEndIndex < 0) {
64
65
  if (this.debug) {
65
- console.warn(`Could not extract the parameters the function '${funcName}' (type=${funcType}). funcParamsStartIndex=${funcParamsStartIndex}`);
66
+ Logger.Warn(`Could not extract the parameters the function '${funcName}' (type=${funcType}). funcParamsStartIndex=${funcParamsStartIndex}`);
66
67
  }
67
68
  startIndex = inlineTokenIndex + this.inlineToken.length;
68
69
  continue;
@@ -72,7 +73,7 @@ export class ShaderCodeInliner {
72
73
  const funcBodyStartIndex = SkipWhitespaces(this._sourceCode, funcParamsEndIndex + 1);
73
74
  if (funcBodyStartIndex === this._sourceCode.length) {
74
75
  if (this.debug) {
75
- console.warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcParamsEndIndex=${funcParamsEndIndex}`);
76
+ Logger.Warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcParamsEndIndex=${funcParamsEndIndex}`);
76
77
  }
77
78
  startIndex = inlineTokenIndex + this.inlineToken.length;
78
79
  continue;
@@ -80,7 +81,7 @@ export class ShaderCodeInliner {
80
81
  const funcBodyEndIndex = ExtractBetweenMarkers("{", "}", this._sourceCode, funcBodyStartIndex);
81
82
  if (funcBodyEndIndex < 0) {
82
83
  if (this.debug) {
83
- console.warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcBodyStartIndex=${funcBodyStartIndex}`);
84
+ Logger.Warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcBodyStartIndex=${funcBodyStartIndex}`);
84
85
  }
85
86
  startIndex = inlineTokenIndex + this.inlineToken.length;
86
87
  continue;
@@ -116,7 +117,7 @@ export class ShaderCodeInliner {
116
117
  startIndex -= funcBodyEndIndex + 1 - inlineTokenIndex;
117
118
  }
118
119
  if (this.debug) {
119
- console.log(`Collect functions: ${this._functionDescr.length} functions found. functionDescr=`, this._functionDescr);
120
+ Logger.Log(`Collect functions: ${this._functionDescr.length} functions found. functionDescr=${this._functionDescr}`);
120
121
  }
121
122
  }
122
123
  _processInlining(numMaxIterations = 20) {
@@ -126,7 +127,7 @@ export class ShaderCodeInliner {
126
127
  }
127
128
  }
128
129
  if (this.debug) {
129
- console.log(`numMaxIterations is ${numMaxIterations} after inlining process`);
130
+ Logger.Log(`numMaxIterations is ${numMaxIterations} after inlining process`);
130
131
  }
131
132
  return numMaxIterations >= 0;
132
133
  }
@@ -156,7 +157,7 @@ export class ShaderCodeInliner {
156
157
  const callParamsEndIndex = ExtractBetweenMarkers("(", ")", this._sourceCode, callParamsStartIndex);
157
158
  if (callParamsEndIndex < 0) {
158
159
  if (this.debug) {
159
- console.warn(`Could not extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}`);
160
+ Logger.Warn(`Could not extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}`);
160
161
  }
161
162
  startIndex = functionCallIndex + name.length;
162
163
  continue;
@@ -190,7 +191,7 @@ export class ShaderCodeInliner {
190
191
  const params = splitParameterCall(RemoveComments(callParams));
191
192
  if (params === null) {
192
193
  if (this.debug) {
193
- console.warn(`Invalid function call: can't extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}, callParams=` +
194
+ Logger.Warn(`Invalid function call: can't extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}, callParams=` +
194
195
  callParams);
195
196
  }
196
197
  startIndex = functionCallIndex + name.length;
@@ -207,7 +208,7 @@ export class ShaderCodeInliner {
207
208
  }
208
209
  if (paramNames.length !== parameters.length) {
209
210
  if (this.debug) {
210
- console.warn(`Invalid function call: not the same number of parameters for the call than the number expected by the function. Function '${name}' (type=${type}). function parameters=${parameters}, call parameters=${paramNames}`);
211
+ Logger.Warn(`Invalid function call: not the same number of parameters for the call than the number expected by the function. Function '${name}' (type=${type}). function parameters=${parameters}, call parameters=${paramNames}`);
211
212
  }
212
213
  startIndex = functionCallIndex + name.length;
213
214
  continue;
@@ -227,7 +228,7 @@ export class ShaderCodeInliner {
227
228
  const partBetween = this._sourceCode.substring(injectDeclarationIndex + 1, functionCallIndex);
228
229
  this._sourceCode = partBefore + type + " " + retParamName + ";\n" + funcBody + "\n" + partBetween + retParamName + partAfter;
229
230
  if (this.debug) {
230
- console.log(`Replace function call by code. Function '${name}' (type=${type}). injectDeclarationIndex=${injectDeclarationIndex}, call parameters=${paramNames}`);
231
+ Logger.Log(`Replace function call by code. Function '${name}' (type=${type}). injectDeclarationIndex=${injectDeclarationIndex}, call parameters=${paramNames}`);
231
232
  }
232
233
  }
233
234
  else {
@@ -235,7 +236,7 @@ export class ShaderCodeInliner {
235
236
  this._sourceCode = partBefore + funcBody + partAfter;
236
237
  startIndex += funcBody.length - (callParamsEndIndex + 1 - functionCallIndex);
237
238
  if (this.debug) {
238
- console.log(`Replace function call by code. Function '${name}' (type=${type}). functionCallIndex=${functionCallIndex}, call parameters=${paramNames}`);
239
+ Logger.Log(`Replace function call by code. Function '${name}' (type=${type}). functionCallIndex=${functionCallIndex}, call parameters=${paramNames}`);
239
240
  }
240
241
  }
241
242
  doAgain = true;
@@ -1 +1 @@
1
- {"version":3,"file":"shaderCodeInliner.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Processors/shaderCodeInliner.ts"],"names":[],"mappings":"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","sourcesContent":["import { EscapeRegExp, ExtractBetweenMarkers, FindBackward, IsIdentifierChar, RemoveComments, SkipWhitespaces } from \"../../Misc/codeStringParsingTools\";\r\n\r\ninterface IInlineFunctionDescr {\r\n name: string;\r\n type: string;\r\n parameters: string[];\r\n body: string;\r\n callIndex: number;\r\n}\r\n\r\n/**\r\n * Class used to inline functions in shader code\r\n */\r\nexport class ShaderCodeInliner {\r\n private static readonly _RegexpFindFunctionNameAndType = /((\\s+?)(\\w+)\\s+(\\w+)\\s*?)$/;\r\n\r\n private _sourceCode: string;\r\n private _functionDescr: IInlineFunctionDescr[];\r\n private _numMaxIterations: number;\r\n\r\n /** Gets or sets the token used to mark the functions to inline */\r\n public inlineToken: string;\r\n\r\n /** Gets or sets the debug mode */\r\n public debug: boolean = false;\r\n\r\n /** Gets the code after the inlining process */\r\n public get code(): string {\r\n return this._sourceCode;\r\n }\r\n\r\n /**\r\n * Initializes the inliner\r\n * @param sourceCode shader code source to inline\r\n * @param numMaxIterations maximum number of iterations (used to detect recursive calls)\r\n */\r\n constructor(sourceCode: string, numMaxIterations = 20) {\r\n this._sourceCode = sourceCode;\r\n this._numMaxIterations = numMaxIterations;\r\n this._functionDescr = [];\r\n this.inlineToken = \"#define inline\";\r\n }\r\n\r\n /**\r\n * Start the processing of the shader code\r\n */\r\n public processCode() {\r\n if (this.debug) {\r\n console.log(`Start inlining process (code size=${this._sourceCode.length})...`);\r\n }\r\n this._collectFunctions();\r\n this._processInlining(this._numMaxIterations);\r\n if (this.debug) {\r\n console.log(\"End of inlining process.\");\r\n }\r\n }\r\n\r\n private _collectFunctions() {\r\n let startIndex = 0;\r\n\r\n while (startIndex < this._sourceCode.length) {\r\n // locate the function to inline and extract its name\r\n const inlineTokenIndex = this._sourceCode.indexOf(this.inlineToken, startIndex);\r\n if (inlineTokenIndex < 0) {\r\n break;\r\n }\r\n\r\n const funcParamsStartIndex = this._sourceCode.indexOf(\"(\", inlineTokenIndex + this.inlineToken.length);\r\n if (funcParamsStartIndex < 0) {\r\n if (this.debug) {\r\n console.warn(`Could not find the opening parenthesis after the token. startIndex=${startIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n\r\n const funcNameMatch = ShaderCodeInliner._RegexpFindFunctionNameAndType.exec(\r\n this._sourceCode.substring(inlineTokenIndex + this.inlineToken.length, funcParamsStartIndex)\r\n );\r\n if (!funcNameMatch) {\r\n if (this.debug) {\r\n console.warn(\r\n `Could not extract the name/type of the function from: ${this._sourceCode.substring(inlineTokenIndex + this.inlineToken.length, funcParamsStartIndex)}`\r\n );\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n const [funcType, funcName] = [funcNameMatch[3], funcNameMatch[4]];\r\n\r\n // extract the parameters of the function as a whole string (without the leading / trailing parenthesis)\r\n const funcParamsEndIndex = ExtractBetweenMarkers(\"(\", \")\", this._sourceCode, funcParamsStartIndex);\r\n if (funcParamsEndIndex < 0) {\r\n if (this.debug) {\r\n console.warn(`Could not extract the parameters the function '${funcName}' (type=${funcType}). funcParamsStartIndex=${funcParamsStartIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n const funcParams = this._sourceCode.substring(funcParamsStartIndex + 1, funcParamsEndIndex);\r\n\r\n // extract the body of the function (with the curly brackets)\r\n const funcBodyStartIndex = SkipWhitespaces(this._sourceCode, funcParamsEndIndex + 1);\r\n if (funcBodyStartIndex === this._sourceCode.length) {\r\n if (this.debug) {\r\n console.warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcParamsEndIndex=${funcParamsEndIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n\r\n const funcBodyEndIndex = ExtractBetweenMarkers(\"{\", \"}\", this._sourceCode, funcBodyStartIndex);\r\n if (funcBodyEndIndex < 0) {\r\n if (this.debug) {\r\n console.warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcBodyStartIndex=${funcBodyStartIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n const funcBody = this._sourceCode.substring(funcBodyStartIndex, funcBodyEndIndex + 1);\r\n\r\n // process the parameters: extract each names\r\n const params = RemoveComments(funcParams).split(\",\");\r\n const paramNames = [];\r\n\r\n for (let p = 0; p < params.length; ++p) {\r\n const param = params[p].trim();\r\n const idx = param.lastIndexOf(\" \");\r\n\r\n if (idx >= 0) {\r\n paramNames.push(param.substring(idx + 1));\r\n }\r\n }\r\n\r\n if (funcType !== \"void\") {\r\n // for functions that return a value, we will replace \"return\" by \"tempvarname = \", tempvarname being a unique generated name\r\n paramNames.push(\"return\");\r\n }\r\n\r\n // collect the function\r\n this._functionDescr.push({\r\n name: funcName,\r\n type: funcType,\r\n parameters: paramNames,\r\n body: funcBody,\r\n callIndex: 0,\r\n });\r\n\r\n startIndex = funcBodyEndIndex + 1;\r\n\r\n // remove the function from the source code\r\n const partBefore = inlineTokenIndex > 0 ? this._sourceCode.substring(0, inlineTokenIndex) : \"\";\r\n const partAfter = funcBodyEndIndex + 1 < this._sourceCode.length - 1 ? this._sourceCode.substring(funcBodyEndIndex + 1) : \"\";\r\n\r\n this._sourceCode = partBefore + partAfter;\r\n\r\n startIndex -= funcBodyEndIndex + 1 - inlineTokenIndex;\r\n }\r\n\r\n if (this.debug) {\r\n console.log(`Collect functions: ${this._functionDescr.length} functions found. functionDescr=`, this._functionDescr);\r\n }\r\n }\r\n\r\n private _processInlining(numMaxIterations: number = 20): boolean {\r\n while (numMaxIterations-- >= 0) {\r\n if (!this._replaceFunctionCallsByCode()) {\r\n break;\r\n }\r\n }\r\n\r\n if (this.debug) {\r\n console.log(`numMaxIterations is ${numMaxIterations} after inlining process`);\r\n }\r\n\r\n return numMaxIterations >= 0;\r\n }\r\n\r\n private _replaceFunctionCallsByCode(): boolean {\r\n let doAgain = false;\r\n\r\n for (const func of this._functionDescr) {\r\n const { name, type, parameters, body } = func;\r\n\r\n let startIndex = 0;\r\n\r\n while (startIndex < this._sourceCode.length) {\r\n // Look for the function name in the source code\r\n const functionCallIndex = this._sourceCode.indexOf(name, startIndex);\r\n\r\n if (functionCallIndex < 0) {\r\n break;\r\n }\r\n\r\n // Make sure \"name\" is not part of a bigger string\r\n if (functionCallIndex === 0 || IsIdentifierChar(this._sourceCode.charAt(functionCallIndex - 1))) {\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n // Find the opening parenthesis\r\n const callParamsStartIndex = SkipWhitespaces(this._sourceCode, functionCallIndex + name.length);\r\n if (callParamsStartIndex === this._sourceCode.length || this._sourceCode.charAt(callParamsStartIndex) !== \"(\") {\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n // extract the parameters of the function call as a whole string (without the leading / trailing parenthesis)\r\n const callParamsEndIndex = ExtractBetweenMarkers(\"(\", \")\", this._sourceCode, callParamsStartIndex);\r\n if (callParamsEndIndex < 0) {\r\n if (this.debug) {\r\n console.warn(`Could not extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}`);\r\n }\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n const callParams = this._sourceCode.substring(callParamsStartIndex + 1, callParamsEndIndex);\r\n\r\n // process the parameter call: extract each names\r\n\r\n // this function split the parameter list used in the function call at ',' boundaries by taking care of potential parenthesis like in:\r\n // myfunc(a, vec2(1., 0.), 4.)\r\n const splitParameterCall = (s: string) => {\r\n const parameters = [];\r\n let curIdx = 0,\r\n startParamIdx = 0;\r\n while (curIdx < s.length) {\r\n if (s.charAt(curIdx) === \"(\") {\r\n const idx2 = ExtractBetweenMarkers(\"(\", \")\", s, curIdx);\r\n if (idx2 < 0) {\r\n return null;\r\n }\r\n curIdx = idx2;\r\n } else if (s.charAt(curIdx) === \",\") {\r\n parameters.push(s.substring(startParamIdx, curIdx));\r\n startParamIdx = curIdx + 1;\r\n }\r\n curIdx++;\r\n }\r\n if (startParamIdx < curIdx) {\r\n parameters.push(s.substring(startParamIdx, curIdx));\r\n }\r\n return parameters;\r\n };\r\n\r\n const params = splitParameterCall(RemoveComments(callParams));\r\n\r\n if (params === null) {\r\n if (this.debug) {\r\n console.warn(\r\n `Invalid function call: can't extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}, callParams=` +\r\n callParams\r\n );\r\n }\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n const paramNames = [];\r\n\r\n for (let p = 0; p < params.length; ++p) {\r\n const param = params[p].trim();\r\n paramNames.push(param);\r\n }\r\n\r\n const retParamName = type !== \"void\" ? name + \"_\" + func.callIndex++ : null;\r\n\r\n if (retParamName) {\r\n paramNames.push(retParamName + \" =\");\r\n }\r\n\r\n if (paramNames.length !== parameters.length) {\r\n if (this.debug) {\r\n console.warn(\r\n `Invalid function call: not the same number of parameters for the call than the number expected by the function. Function '${name}' (type=${type}). function parameters=${parameters}, call parameters=${paramNames}`\r\n );\r\n }\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n startIndex = callParamsEndIndex + 1;\r\n\r\n // replace the function call by the body function\r\n const funcBody = this._replaceNames(body, parameters, paramNames);\r\n\r\n let partBefore = functionCallIndex > 0 ? this._sourceCode.substring(0, functionCallIndex) : \"\";\r\n const partAfter = callParamsEndIndex + 1 < this._sourceCode.length - 1 ? this._sourceCode.substring(callParamsEndIndex + 1) : \"\";\r\n\r\n if (retParamName) {\r\n // case where the function returns a value. We generate:\r\n // FUNCTYPE retParamName;\r\n // {function body}\r\n // and replace the function call by retParamName\r\n const injectDeclarationIndex = FindBackward(this._sourceCode, functionCallIndex - 1, \"\\n\", \"{\");\r\n\r\n partBefore = this._sourceCode.substring(0, injectDeclarationIndex + 1);\r\n const partBetween = this._sourceCode.substring(injectDeclarationIndex + 1, functionCallIndex);\r\n\r\n this._sourceCode = partBefore + type + \" \" + retParamName + \";\\n\" + funcBody + \"\\n\" + partBetween + retParamName + partAfter;\r\n\r\n if (this.debug) {\r\n console.log(\r\n `Replace function call by code. Function '${name}' (type=${type}). injectDeclarationIndex=${injectDeclarationIndex}, call parameters=${paramNames}`\r\n );\r\n }\r\n } else {\r\n // simple case where the return value of the function is \"void\"\r\n this._sourceCode = partBefore + funcBody + partAfter;\r\n\r\n startIndex += funcBody.length - (callParamsEndIndex + 1 - functionCallIndex);\r\n\r\n if (this.debug) {\r\n console.log(`Replace function call by code. Function '${name}' (type=${type}). functionCallIndex=${functionCallIndex}, call parameters=${paramNames}`);\r\n }\r\n }\r\n\r\n doAgain = true;\r\n }\r\n }\r\n\r\n return doAgain;\r\n }\r\n\r\n private _replaceNames(code: string, sources: string[], destinations: string[]): string {\r\n for (let i = 0; i < sources.length; ++i) {\r\n const source = new RegExp(EscapeRegExp(sources[i]), \"g\"),\r\n sourceLen = sources[i].length,\r\n destination = destinations[i];\r\n\r\n code = code.replace(source, (match, ...args) => {\r\n const offset: number = args[0];\r\n // Make sure \"source\" is not part of a bigger identifier (for eg, if source=view and we matched it with viewDirection)\r\n if (IsIdentifierChar(code.charAt(offset - 1)) || IsIdentifierChar(code.charAt(offset + sourceLen))) {\r\n return sources[i];\r\n }\r\n return destination;\r\n });\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"shaderCodeInliner.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/Processors/shaderCodeInliner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,6BAAyB;AAC1C,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAUzJ;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAa1B,+CAA+C;IAC/C,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,YAAY,UAAkB,EAAE,gBAAgB,GAAG,EAAE;QAbrD,kCAAkC;QAC3B,UAAK,GAAY,KAAK,CAAC;QAa1B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC;IACxC,CAAC;IAED;;OAEG;IACI,WAAW;QACd,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,MAAM,CAAC,GAAG,CAAC,qCAAqC,IAAI,CAAC,WAAW,CAAC,MAAM,MAAM,CAAC,CAAC;SAClF;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;SAC1C;IACL,CAAC;IAEO,iBAAiB;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,OAAO,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YACzC,qDAAqD;YACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAChF,IAAI,gBAAgB,GAAG,CAAC,EAAE;gBACtB,MAAM;aACT;YAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACvG,IAAI,oBAAoB,GAAG,CAAC,EAAE;gBAC1B,IAAI,IAAI,CAAC,KAAK,EAAE;oBACZ,MAAM,CAAC,IAAI,CAAC,sEAAsE,UAAU,EAAE,CAAC,CAAC;iBACnG;gBACD,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACxD,SAAS;aACZ;YAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,IAAI,CACvE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAC/F,CAAC;YACF,IAAI,CAAC,aAAa,EAAE;gBAChB,IAAI,IAAI,CAAC,KAAK,EAAE;oBACZ,MAAM,CAAC,IAAI,CACP,yDAAyD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,CAC1J,CAAC;iBACL;gBACD,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACxD,SAAS;aACZ;YACD,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAElE,wGAAwG;YACxG,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;YACnG,IAAI,kBAAkB,GAAG,CAAC,EAAE;gBACxB,IAAI,IAAI,CAAC,KAAK,EAAE;oBACZ,MAAM,CAAC,IAAI,CAAC,kDAAkD,QAAQ,WAAW,QAAQ,2BAA2B,oBAAoB,EAAE,CAAC,CAAC;iBAC/I;gBACD,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACxD,SAAS;aACZ;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,oBAAoB,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAE5F,6DAA6D;YAC7D,MAAM,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAC;YACrF,IAAI,kBAAkB,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBAChD,IAAI,IAAI,CAAC,KAAK,EAAE;oBACZ,MAAM,CAAC,IAAI,CAAC,+CAA+C,QAAQ,WAAW,QAAQ,yBAAyB,kBAAkB,EAAE,CAAC,CAAC;iBACxI;gBACD,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACxD,SAAS;aACZ;YAED,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;YAC/F,IAAI,gBAAgB,GAAG,CAAC,EAAE;gBACtB,IAAI,IAAI,CAAC,KAAK,EAAE;oBACZ,MAAM,CAAC,IAAI,CAAC,+CAA+C,QAAQ,WAAW,QAAQ,yBAAyB,kBAAkB,EAAE,CAAC,CAAC;iBACxI;gBACD,UAAU,GAAG,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACxD,SAAS;aACZ;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,GAAG,CAAC,CAAC,CAAC;YAEtF,6CAA6C;YAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,EAAE,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;gBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAEnC,IAAI,GAAG,IAAI,CAAC,EAAE;oBACV,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC7C;aACJ;YAED,IAAI,QAAQ,KAAK,MAAM,EAAE;gBACrB,6HAA6H;gBAC7H,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC7B;YAED,uBAAuB;YACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBACrB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,UAAU;gBACtB,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,CAAC;aACf,CAAC,CAAC;YAEH,UAAU,GAAG,gBAAgB,GAAG,CAAC,CAAC;YAElC,2CAA2C;YAC3C,MAAM,UAAU,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7H,IAAI,CAAC,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;YAE1C,UAAU,IAAI,gBAAgB,GAAG,CAAC,GAAG,gBAAgB,CAAC;SACzD;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,MAAM,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,cAAc,CAAC,MAAM,mCAAmC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;SACxH;IACL,CAAC;IAEO,gBAAgB,CAAC,mBAA2B,EAAE;QAClD,OAAO,gBAAgB,EAAE,IAAI,CAAC,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE;gBACrC,MAAM;aACT;SACJ;QAED,IAAI,IAAI,CAAC,KAAK,EAAE;YACZ,MAAM,CAAC,GAAG,CAAC,uBAAuB,gBAAgB,yBAAyB,CAAC,CAAC;SAChF;QAED,OAAO,gBAAgB,IAAI,CAAC,CAAC;IACjC,CAAC;IAEO,2BAA2B;QAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE;YACpC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;YAE9C,IAAI,UAAU,GAAG,CAAC,CAAC;YAEnB,OAAO,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;gBACzC,gDAAgD;gBAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAErE,IAAI,iBAAiB,GAAG,CAAC,EAAE;oBACvB,MAAM;iBACT;gBAED,kDAAkD;gBAClD,IAAI,iBAAiB,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC7F,UAAU,GAAG,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC7C,SAAS;iBACZ;gBAED,+BAA+B;gBAC/B,MAAM,oBAAoB,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChG,IAAI,oBAAoB,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,GAAG,EAAE;oBAC3G,UAAU,GAAG,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC7C,SAAS;iBACZ;gBAED,6GAA6G;gBAC7G,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;gBACnG,IAAI,kBAAkB,GAAG,CAAC,EAAE;oBACxB,IAAI,IAAI,CAAC,KAAK,EAAE;wBACZ,MAAM,CAAC,IAAI,CAAC,oEAAoE,IAAI,WAAW,IAAI,2BAA2B,oBAAoB,EAAE,CAAC,CAAC;qBACzJ;oBACD,UAAU,GAAG,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC7C,SAAS;iBACZ;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,oBAAoB,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;gBAE5F,iDAAiD;gBAEjD,sIAAsI;gBACtI,mCAAmC;gBACnC,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAE,EAAE;oBACrC,MAAM,UAAU,GAAG,EAAE,CAAC;oBACtB,IAAI,MAAM,GAAG,CAAC,EACV,aAAa,GAAG,CAAC,CAAC;oBACtB,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE;wBACtB,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;4BAC1B,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;4BACxD,IAAI,IAAI,GAAG,CAAC,EAAE;gCACV,OAAO,IAAI,CAAC;6BACf;4BACD,MAAM,GAAG,IAAI,CAAC;yBACjB;6BAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;4BACjC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;4BACpD,aAAa,GAAG,MAAM,GAAG,CAAC,CAAC;yBAC9B;wBACD,MAAM,EAAE,CAAC;qBACZ;oBACD,IAAI,aAAa,GAAG,MAAM,EAAE;wBACxB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;qBACvD;oBACD,OAAO,UAAU,CAAC;gBACtB,CAAC,CAAC;gBAEF,MAAM,MAAM,GAAG,kBAAkB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;gBAE9D,IAAI,MAAM,KAAK,IAAI,EAAE;oBACjB,IAAI,IAAI,CAAC,KAAK,EAAE;wBACZ,MAAM,CAAC,IAAI,CACP,uFAAuF,IAAI,WAAW,IAAI,2BAA2B,oBAAoB,eAAe;4BACpK,UAAU,CACjB,CAAC;qBACL;oBACD,UAAU,GAAG,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC7C,SAAS;iBACZ;gBAED,MAAM,UAAU,GAAG,EAAE,CAAC;gBAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;oBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBAC1B;gBAED,MAAM,YAAY,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAE5E,IAAI,YAAY,EAAE;oBACd,UAAU,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;iBACxC;gBAED,IAAI,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE;oBACzC,IAAI,IAAI,CAAC,KAAK,EAAE;wBACZ,MAAM,CAAC,IAAI,CACP,6HAA6H,IAAI,WAAW,IAAI,0BAA0B,UAAU,qBAAqB,UAAU,EAAE,CACxN,CAAC;qBACL;oBACD,UAAU,GAAG,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC7C,SAAS;iBACZ;gBAED,UAAU,GAAG,kBAAkB,GAAG,CAAC,CAAC;gBAEpC,iDAAiD;gBACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBAElE,IAAI,UAAU,GAAG,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/F,MAAM,SAAS,GAAG,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEjI,IAAI,YAAY,EAAE;oBACd,wDAAwD;oBACxD,yBAAyB;oBACzB,kBAAkB;oBAClB,gDAAgD;oBAChD,MAAM,sBAAsB,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;oBAEhG,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,sBAAsB,GAAG,CAAC,CAAC,CAAC;oBACvE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,sBAAsB,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;oBAE9F,IAAI,CAAC,WAAW,GAAG,UAAU,GAAG,IAAI,GAAG,GAAG,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;oBAE7H,IAAI,IAAI,CAAC,KAAK,EAAE;wBACZ,MAAM,CAAC,GAAG,CACN,4CAA4C,IAAI,WAAW,IAAI,6BAA6B,sBAAsB,qBAAqB,UAAU,EAAE,CACtJ,CAAC;qBACL;iBACJ;qBAAM;oBACH,+DAA+D;oBAC/D,IAAI,CAAC,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;oBAErD,UAAU,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,kBAAkB,GAAG,CAAC,GAAG,iBAAiB,CAAC,CAAC;oBAE7E,IAAI,IAAI,CAAC,KAAK,EAAE;wBACZ,MAAM,CAAC,GAAG,CAAC,4CAA4C,IAAI,WAAW,IAAI,wBAAwB,iBAAiB,qBAAqB,UAAU,EAAE,CAAC,CAAC;qBACzJ;iBACJ;gBAED,OAAO,GAAG,IAAI,CAAC;aAClB;SACJ;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,aAAa,CAAC,IAAY,EAAE,OAAiB,EAAE,YAAsB;QACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EACpD,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAC7B,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAElC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE;gBAC3C,MAAM,MAAM,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC/B,sHAAsH;gBACtH,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,EAAE;oBAChG,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;iBACrB;gBACD,OAAO,WAAW,CAAC;YACvB,CAAC,CAAC,CAAC;SACN;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AAvUuB,gDAA8B,GAAG,4BAA4B,AAA/B,CAAgC","sourcesContent":["import { Logger } from \"core/Misc/logger\";\r\nimport { EscapeRegExp, ExtractBetweenMarkers, FindBackward, IsIdentifierChar, RemoveComments, SkipWhitespaces } from \"../../Misc/codeStringParsingTools\";\r\n\r\ninterface IInlineFunctionDescr {\r\n name: string;\r\n type: string;\r\n parameters: string[];\r\n body: string;\r\n callIndex: number;\r\n}\r\n\r\n/**\r\n * Class used to inline functions in shader code\r\n */\r\nexport class ShaderCodeInliner {\r\n private static readonly _RegexpFindFunctionNameAndType = /((\\s+?)(\\w+)\\s+(\\w+)\\s*?)$/;\r\n\r\n private _sourceCode: string;\r\n private _functionDescr: IInlineFunctionDescr[];\r\n private _numMaxIterations: number;\r\n\r\n /** Gets or sets the token used to mark the functions to inline */\r\n public inlineToken: string;\r\n\r\n /** Gets or sets the debug mode */\r\n public debug: boolean = false;\r\n\r\n /** Gets the code after the inlining process */\r\n public get code(): string {\r\n return this._sourceCode;\r\n }\r\n\r\n /**\r\n * Initializes the inliner\r\n * @param sourceCode shader code source to inline\r\n * @param numMaxIterations maximum number of iterations (used to detect recursive calls)\r\n */\r\n constructor(sourceCode: string, numMaxIterations = 20) {\r\n this._sourceCode = sourceCode;\r\n this._numMaxIterations = numMaxIterations;\r\n this._functionDescr = [];\r\n this.inlineToken = \"#define inline\";\r\n }\r\n\r\n /**\r\n * Start the processing of the shader code\r\n */\r\n public processCode() {\r\n if (this.debug) {\r\n Logger.Log(`Start inlining process (code size=${this._sourceCode.length})...`);\r\n }\r\n this._collectFunctions();\r\n this._processInlining(this._numMaxIterations);\r\n if (this.debug) {\r\n Logger.Log(\"End of inlining process.\");\r\n }\r\n }\r\n\r\n private _collectFunctions() {\r\n let startIndex = 0;\r\n\r\n while (startIndex < this._sourceCode.length) {\r\n // locate the function to inline and extract its name\r\n const inlineTokenIndex = this._sourceCode.indexOf(this.inlineToken, startIndex);\r\n if (inlineTokenIndex < 0) {\r\n break;\r\n }\r\n\r\n const funcParamsStartIndex = this._sourceCode.indexOf(\"(\", inlineTokenIndex + this.inlineToken.length);\r\n if (funcParamsStartIndex < 0) {\r\n if (this.debug) {\r\n Logger.Warn(`Could not find the opening parenthesis after the token. startIndex=${startIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n\r\n const funcNameMatch = ShaderCodeInliner._RegexpFindFunctionNameAndType.exec(\r\n this._sourceCode.substring(inlineTokenIndex + this.inlineToken.length, funcParamsStartIndex)\r\n );\r\n if (!funcNameMatch) {\r\n if (this.debug) {\r\n Logger.Warn(\r\n `Could not extract the name/type of the function from: ${this._sourceCode.substring(inlineTokenIndex + this.inlineToken.length, funcParamsStartIndex)}`\r\n );\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n const [funcType, funcName] = [funcNameMatch[3], funcNameMatch[4]];\r\n\r\n // extract the parameters of the function as a whole string (without the leading / trailing parenthesis)\r\n const funcParamsEndIndex = ExtractBetweenMarkers(\"(\", \")\", this._sourceCode, funcParamsStartIndex);\r\n if (funcParamsEndIndex < 0) {\r\n if (this.debug) {\r\n Logger.Warn(`Could not extract the parameters the function '${funcName}' (type=${funcType}). funcParamsStartIndex=${funcParamsStartIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n const funcParams = this._sourceCode.substring(funcParamsStartIndex + 1, funcParamsEndIndex);\r\n\r\n // extract the body of the function (with the curly brackets)\r\n const funcBodyStartIndex = SkipWhitespaces(this._sourceCode, funcParamsEndIndex + 1);\r\n if (funcBodyStartIndex === this._sourceCode.length) {\r\n if (this.debug) {\r\n Logger.Warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcParamsEndIndex=${funcParamsEndIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n\r\n const funcBodyEndIndex = ExtractBetweenMarkers(\"{\", \"}\", this._sourceCode, funcBodyStartIndex);\r\n if (funcBodyEndIndex < 0) {\r\n if (this.debug) {\r\n Logger.Warn(`Could not extract the body of the function '${funcName}' (type=${funcType}). funcBodyStartIndex=${funcBodyStartIndex}`);\r\n }\r\n startIndex = inlineTokenIndex + this.inlineToken.length;\r\n continue;\r\n }\r\n const funcBody = this._sourceCode.substring(funcBodyStartIndex, funcBodyEndIndex + 1);\r\n\r\n // process the parameters: extract each names\r\n const params = RemoveComments(funcParams).split(\",\");\r\n const paramNames = [];\r\n\r\n for (let p = 0; p < params.length; ++p) {\r\n const param = params[p].trim();\r\n const idx = param.lastIndexOf(\" \");\r\n\r\n if (idx >= 0) {\r\n paramNames.push(param.substring(idx + 1));\r\n }\r\n }\r\n\r\n if (funcType !== \"void\") {\r\n // for functions that return a value, we will replace \"return\" by \"tempvarname = \", tempvarname being a unique generated name\r\n paramNames.push(\"return\");\r\n }\r\n\r\n // collect the function\r\n this._functionDescr.push({\r\n name: funcName,\r\n type: funcType,\r\n parameters: paramNames,\r\n body: funcBody,\r\n callIndex: 0,\r\n });\r\n\r\n startIndex = funcBodyEndIndex + 1;\r\n\r\n // remove the function from the source code\r\n const partBefore = inlineTokenIndex > 0 ? this._sourceCode.substring(0, inlineTokenIndex) : \"\";\r\n const partAfter = funcBodyEndIndex + 1 < this._sourceCode.length - 1 ? this._sourceCode.substring(funcBodyEndIndex + 1) : \"\";\r\n\r\n this._sourceCode = partBefore + partAfter;\r\n\r\n startIndex -= funcBodyEndIndex + 1 - inlineTokenIndex;\r\n }\r\n\r\n if (this.debug) {\r\n Logger.Log(`Collect functions: ${this._functionDescr.length} functions found. functionDescr=${this._functionDescr}`);\r\n }\r\n }\r\n\r\n private _processInlining(numMaxIterations: number = 20): boolean {\r\n while (numMaxIterations-- >= 0) {\r\n if (!this._replaceFunctionCallsByCode()) {\r\n break;\r\n }\r\n }\r\n\r\n if (this.debug) {\r\n Logger.Log(`numMaxIterations is ${numMaxIterations} after inlining process`);\r\n }\r\n\r\n return numMaxIterations >= 0;\r\n }\r\n\r\n private _replaceFunctionCallsByCode(): boolean {\r\n let doAgain = false;\r\n\r\n for (const func of this._functionDescr) {\r\n const { name, type, parameters, body } = func;\r\n\r\n let startIndex = 0;\r\n\r\n while (startIndex < this._sourceCode.length) {\r\n // Look for the function name in the source code\r\n const functionCallIndex = this._sourceCode.indexOf(name, startIndex);\r\n\r\n if (functionCallIndex < 0) {\r\n break;\r\n }\r\n\r\n // Make sure \"name\" is not part of a bigger string\r\n if (functionCallIndex === 0 || IsIdentifierChar(this._sourceCode.charAt(functionCallIndex - 1))) {\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n // Find the opening parenthesis\r\n const callParamsStartIndex = SkipWhitespaces(this._sourceCode, functionCallIndex + name.length);\r\n if (callParamsStartIndex === this._sourceCode.length || this._sourceCode.charAt(callParamsStartIndex) !== \"(\") {\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n // extract the parameters of the function call as a whole string (without the leading / trailing parenthesis)\r\n const callParamsEndIndex = ExtractBetweenMarkers(\"(\", \")\", this._sourceCode, callParamsStartIndex);\r\n if (callParamsEndIndex < 0) {\r\n if (this.debug) {\r\n Logger.Warn(`Could not extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}`);\r\n }\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n const callParams = this._sourceCode.substring(callParamsStartIndex + 1, callParamsEndIndex);\r\n\r\n // process the parameter call: extract each names\r\n\r\n // this function split the parameter list used in the function call at ',' boundaries by taking care of potential parenthesis like in:\r\n // myfunc(a, vec2(1., 0.), 4.)\r\n const splitParameterCall = (s: string) => {\r\n const parameters = [];\r\n let curIdx = 0,\r\n startParamIdx = 0;\r\n while (curIdx < s.length) {\r\n if (s.charAt(curIdx) === \"(\") {\r\n const idx2 = ExtractBetweenMarkers(\"(\", \")\", s, curIdx);\r\n if (idx2 < 0) {\r\n return null;\r\n }\r\n curIdx = idx2;\r\n } else if (s.charAt(curIdx) === \",\") {\r\n parameters.push(s.substring(startParamIdx, curIdx));\r\n startParamIdx = curIdx + 1;\r\n }\r\n curIdx++;\r\n }\r\n if (startParamIdx < curIdx) {\r\n parameters.push(s.substring(startParamIdx, curIdx));\r\n }\r\n return parameters;\r\n };\r\n\r\n const params = splitParameterCall(RemoveComments(callParams));\r\n\r\n if (params === null) {\r\n if (this.debug) {\r\n Logger.Warn(\r\n `Invalid function call: can't extract the parameters of the function call. Function '${name}' (type=${type}). callParamsStartIndex=${callParamsStartIndex}, callParams=` +\r\n callParams\r\n );\r\n }\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n const paramNames = [];\r\n\r\n for (let p = 0; p < params.length; ++p) {\r\n const param = params[p].trim();\r\n paramNames.push(param);\r\n }\r\n\r\n const retParamName = type !== \"void\" ? name + \"_\" + func.callIndex++ : null;\r\n\r\n if (retParamName) {\r\n paramNames.push(retParamName + \" =\");\r\n }\r\n\r\n if (paramNames.length !== parameters.length) {\r\n if (this.debug) {\r\n Logger.Warn(\r\n `Invalid function call: not the same number of parameters for the call than the number expected by the function. Function '${name}' (type=${type}). function parameters=${parameters}, call parameters=${paramNames}`\r\n );\r\n }\r\n startIndex = functionCallIndex + name.length;\r\n continue;\r\n }\r\n\r\n startIndex = callParamsEndIndex + 1;\r\n\r\n // replace the function call by the body function\r\n const funcBody = this._replaceNames(body, parameters, paramNames);\r\n\r\n let partBefore = functionCallIndex > 0 ? this._sourceCode.substring(0, functionCallIndex) : \"\";\r\n const partAfter = callParamsEndIndex + 1 < this._sourceCode.length - 1 ? this._sourceCode.substring(callParamsEndIndex + 1) : \"\";\r\n\r\n if (retParamName) {\r\n // case where the function returns a value. We generate:\r\n // FUNCTYPE retParamName;\r\n // {function body}\r\n // and replace the function call by retParamName\r\n const injectDeclarationIndex = FindBackward(this._sourceCode, functionCallIndex - 1, \"\\n\", \"{\");\r\n\r\n partBefore = this._sourceCode.substring(0, injectDeclarationIndex + 1);\r\n const partBetween = this._sourceCode.substring(injectDeclarationIndex + 1, functionCallIndex);\r\n\r\n this._sourceCode = partBefore + type + \" \" + retParamName + \";\\n\" + funcBody + \"\\n\" + partBetween + retParamName + partAfter;\r\n\r\n if (this.debug) {\r\n Logger.Log(\r\n `Replace function call by code. Function '${name}' (type=${type}). injectDeclarationIndex=${injectDeclarationIndex}, call parameters=${paramNames}`\r\n );\r\n }\r\n } else {\r\n // simple case where the return value of the function is \"void\"\r\n this._sourceCode = partBefore + funcBody + partAfter;\r\n\r\n startIndex += funcBody.length - (callParamsEndIndex + 1 - functionCallIndex);\r\n\r\n if (this.debug) {\r\n Logger.Log(`Replace function call by code. Function '${name}' (type=${type}). functionCallIndex=${functionCallIndex}, call parameters=${paramNames}`);\r\n }\r\n }\r\n\r\n doAgain = true;\r\n }\r\n }\r\n\r\n return doAgain;\r\n }\r\n\r\n private _replaceNames(code: string, sources: string[], destinations: string[]): string {\r\n for (let i = 0; i < sources.length; ++i) {\r\n const source = new RegExp(EscapeRegExp(sources[i]), \"g\"),\r\n sourceLen = sources[i].length,\r\n destination = destinations[i];\r\n\r\n code = code.replace(source, (match, ...args) => {\r\n const offset: number = args[0];\r\n // Make sure \"source\" is not part of a bigger identifier (for eg, if source=view and we matched it with viewDirection)\r\n if (IsIdentifierChar(code.charAt(offset - 1)) || IsIdentifierChar(code.charAt(offset + sourceLen))) {\r\n return sources[i];\r\n }\r\n return destination;\r\n });\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n"]}