df2a69aeac89dd77638670d40bca9f67b40eaacf4092c8779e1bd4648a21f178.json 108 KB

1
  1. {"ast":null,"code":"import { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector.js\";\nimport { Color3, Color4 } from \"../Maths/math.color.js\";\nimport { Mesh } from \"../Meshes/mesh.js\";\nimport { CreateLineSystem } from \"../Meshes/Builders/linesBuilder.js\";\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer.js\";\nimport { Material } from \"../Materials/material.js\";\nimport { ShaderMaterial } from \"../Materials/shaderMaterial.js\";\nimport { DynamicTexture } from \"../Materials/Textures/dynamicTexture.js\";\nimport { VertexBuffer } from \"../Buffers/buffer.js\";\nimport { Effect } from \"../Materials/effect.js\";\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder.js\";\nimport { ExtrudeShapeCustom } from \"../Meshes/Builders/shapeBuilder.js\";\nimport { TransformNode } from \"../Meshes/transformNode.js\";\nimport { Logger } from \"../Misc/logger.js\";\n/**\n * Class used to render a debug view of a given skeleton\n * @see http://www.babylonjs-playground.com/#1BZJVJ#8\n */\nexport class SkeletonViewer {\n /** public static method to create a BoneWeight Shader\n * @param options The constructor options\n * @param scene The scene that the shader is scoped to\n * @returns The created ShaderMaterial\n * @see http://www.babylonjs-playground.com/#1BZJVJ#395\n */\n static CreateBoneWeightShader(options, scene) {\n var _options$colorBase, _options$colorZero, _options$colorQuarter, _options$colorHalf, _options$colorFull, _options$targetBoneIn;\n const skeleton = options.skeleton;\n const colorBase = (_options$colorBase = options.colorBase) !== null && _options$colorBase !== void 0 ? _options$colorBase : Color3.Black();\n const colorZero = (_options$colorZero = options.colorZero) !== null && _options$colorZero !== void 0 ? _options$colorZero : Color3.Blue();\n const colorQuarter = (_options$colorQuarter = options.colorQuarter) !== null && _options$colorQuarter !== void 0 ? _options$colorQuarter : Color3.Green();\n const colorHalf = (_options$colorHalf = options.colorHalf) !== null && _options$colorHalf !== void 0 ? _options$colorHalf : Color3.Yellow();\n const colorFull = (_options$colorFull = options.colorFull) !== null && _options$colorFull !== void 0 ? _options$colorFull : Color3.Red();\n const targetBoneIndex = (_options$targetBoneIn = options.targetBoneIndex) !== null && _options$targetBoneIn !== void 0 ? _options$targetBoneIn : 0;\n Effect.ShadersStore[\"boneWeights:\" + skeleton.name + \"VertexShader\"] = `precision highp float;\n\n attribute vec3 position;\n attribute vec2 uv;\n\n uniform mat4 view;\n uniform mat4 projection;\n uniform mat4 worldViewProjection;\n\n #include<bonesDeclaration>\n #if NUM_BONE_INFLUENCERS == 0\n attribute vec4 matricesIndices;\n attribute vec4 matricesWeights;\n #endif\n #include<bakedVertexAnimationDeclaration>\n\n #include<instancesDeclaration>\n\n varying vec3 vColor;\n\n uniform vec3 colorBase;\n uniform vec3 colorZero;\n uniform vec3 colorQuarter;\n uniform vec3 colorHalf;\n uniform vec3 colorFull;\n\n uniform float targetBoneIndex;\n\n void main() {\n vec3 positionUpdated = position;\n\n #include<instancesVertex>\n #include<bonesVertex>\n #include<bakedVertexAnimation>\n\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\n\n vec3 color = colorBase;\n float totalWeight = 0.;\n if(matricesIndices[0] == targetBoneIndex && matricesWeights[0] > 0.){\n totalWeight += matricesWeights[0];\n }\n if(matricesIndices[1] == targetBoneIndex && matricesWeights[1] > 0.){\n totalWeight += matricesWeights[1];\n }\n if(matricesIndices[2] == targetBoneIndex && matricesWeights[2] > 0.){\n totalWeight += matricesWeights[2];\n }\n if(matricesIndices[3] == targetBoneIndex && matricesWeights[3] > 0.){\n totalWeight += matricesWeights[3];\n }\n\n color = mix(color, colorZero, smoothstep(0., 0.25, totalWeight));\n color = mix(color, colorQuarter, smoothstep(0.25, 0.5, totalWeight));\n color = mix(color, colorHalf, smoothstep(0.5, 0.75, totalWeight));\n color = mix(color, colorFull, smoothstep(0.75, 1.0, totalWeight));\n vColor = color;\n\n gl_Position = projection * view * worldPos;\n }`;\n Effect.ShadersStore[\"boneWeights:\" + skeleton.name + \"FragmentShader\"] = `\n precision highp float;\n varying vec3 vPosition;\n\n varying vec3 vColor;\n\n void main() {\n vec4 color = vec4(vColor, 1.0);\n gl_FragColor = color;\n }\n `;\n const shader = new ShaderMaterial(\"boneWeight:\" + skeleton.name, scene, {\n vertex: \"boneWeights:\" + skeleton.name,\n fragment: \"boneWeights:\" + skeleton.name\n }, {\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\n uniforms: [\"world\", \"worldView\", \"worldViewProjection\", \"view\", \"projection\", \"viewProjection\", \"colorBase\", \"colorZero\", \"colorQuarter\", \"colorHalf\", \"colorFull\", \"targetBoneIndex\"]\n });\n shader.setColor3(\"colorBase\", colorBase);\n shader.setColor3(\"colorZero\", colorZero);\n shader.setColor3(\"colorQuarter\", colorQuarter);\n shader.setColor3(\"colorHalf\", colorHalf);\n shader.setColor3(\"colorFull\", colorFull);\n shader.setFloat(\"targetBoneIndex\", targetBoneIndex);\n shader.getClassName = () => {\n return \"BoneWeightShader\";\n };\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\n return shader;\n }\n /** public static method to create a BoneWeight Shader\n * @param options The constructor options\n * @param scene The scene that the shader is scoped to\n * @returns The created ShaderMaterial\n */\n static CreateSkeletonMapShader(options, scene) {\n var _options$colorMap;\n const skeleton = options.skeleton;\n const colorMap = (_options$colorMap = options.colorMap) !== null && _options$colorMap !== void 0 ? _options$colorMap : [{\n color: new Color3(1, 0.38, 0.18),\n location: 0\n }, {\n color: new Color3(0.59, 0.18, 1.0),\n location: 0.2\n }, {\n color: new Color3(0.59, 1, 0.18),\n location: 0.4\n }, {\n color: new Color3(1, 0.87, 0.17),\n location: 0.6\n }, {\n color: new Color3(1, 0.17, 0.42),\n location: 0.8\n }, {\n color: new Color3(0.17, 0.68, 1.0),\n location: 1.0\n }];\n const bufferWidth = skeleton.bones.length + 1;\n const colorMapBuffer = SkeletonViewer._CreateBoneMapColorBuffer(bufferWidth, colorMap, scene);\n const shader = new ShaderMaterial(\"boneWeights:\" + skeleton.name, scene, {\n vertexSource: `precision highp float;\n\n attribute vec3 position;\n attribute vec2 uv;\n\n uniform mat4 view;\n uniform mat4 projection;\n uniform mat4 worldViewProjection;\n uniform float colorMap[` + skeleton.bones.length * 4 + `];\n\n #include<bonesDeclaration>\n #if NUM_BONE_INFLUENCERS == 0\n attribute vec4 matricesIndices;\n attribute vec4 matricesWeights;\n #endif\n #include<bakedVertexAnimationDeclaration>\n #include<instancesDeclaration>\n\n varying vec3 vColor;\n\n void main() {\n vec3 positionUpdated = position;\n\n #include<instancesVertex>\n #include<bonesVertex>\n #include<bakedVertexAnimation>\n\n vec3 color = vec3(0.);\n bool first = true;\n\n for (int i = 0; i < 4; i++) {\n int boneIdx = int(matricesIndices[i]);\n float boneWgt = matricesWeights[i];\n\n vec3 c = vec3(colorMap[boneIdx * 4 + 0], colorMap[boneIdx * 4 + 1], colorMap[boneIdx * 4 + 2]);\n\n if (boneWgt > 0.) {\n if (first) {\n first = false;\n color = c;\n } else {\n color = mix(color, c, boneWgt);\n }\n }\n }\n\n vColor = color;\n\n vec4 worldPos = finalWorld * vec4(positionUpdated, 1.0);\n\n gl_Position = projection * view * worldPos;\n }`,\n fragmentSource: `\n precision highp float;\n varying vec3 vColor;\n\n void main() {\n vec4 color = vec4( vColor, 1.0 );\n gl_FragColor = color;\n }\n `\n }, {\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\n uniforms: [\"world\", \"worldView\", \"worldViewProjection\", \"view\", \"projection\", \"viewProjection\", \"colorMap\"]\n });\n shader.setFloats(\"colorMap\", colorMapBuffer);\n shader.getClassName = () => {\n return \"SkeletonMapShader\";\n };\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\n return shader;\n }\n /** private static method to create a BoneWeight Shader\n * @param size The size of the buffer to create (usually the bone count)\n * @param colorMap The gradient data to generate\n * @param scene The scene that the shader is scoped to\n * @returns an Array of floats from the color gradient values\n */\n static _CreateBoneMapColorBuffer(size, colorMap, scene) {\n const tempGrad = new DynamicTexture(\"temp\", {\n width: size,\n height: 1\n }, scene, false);\n const ctx = tempGrad.getContext();\n const grad = ctx.createLinearGradient(0, 0, size, 0);\n colorMap.forEach(stop => {\n grad.addColorStop(stop.location, stop.color.toHexString());\n });\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, size, 1);\n tempGrad.update();\n const buffer = [];\n const data = ctx.getImageData(0, 0, size, 1).data;\n const rUnit = 1 / 255;\n for (let i = 0; i < data.length; i++) {\n buffer.push(data[i] * rUnit);\n }\n tempGrad.dispose();\n return buffer;\n }\n /** Gets the Scene. */\n get scene() {\n return this._scene;\n }\n /** Gets the utilityLayer. */\n get utilityLayer() {\n return this._utilityLayer;\n }\n /** Checks Ready Status. */\n get isReady() {\n return this._ready;\n }\n /** Sets Ready Status. */\n set ready(value) {\n this._ready = value;\n }\n /** Gets the debugMesh */\n get debugMesh() {\n return this._debugMesh;\n }\n /** Sets the debugMesh */\n set debugMesh(value) {\n this._debugMesh = value;\n }\n /** Gets the displayMode */\n get displayMode() {\n return this.options.displayMode || SkeletonViewer.DISPLAY_LINES;\n }\n /** Sets the displayMode */\n set displayMode(value) {\n if (value > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\n value = SkeletonViewer.DISPLAY_LINES;\n }\n this.options.displayMode = value;\n }\n /**\n * Creates a new SkeletonViewer\n * @param skeleton defines the skeleton to render\n * @param mesh defines the mesh attached to the skeleton\n * @param scene defines the hosting scene\n * @param autoUpdateBonesMatrices defines a boolean indicating if bones matrices must be forced to update before rendering (true by default)\n * @param renderingGroupId defines the rendering group id to use with the viewer\n * @param options All of the extra constructor options for the SkeletonViewer\n */\n constructor( /** defines the skeleton to render */\n skeleton, /** defines the mesh attached to the skeleton */\n mesh, /** The Scene scope*/\n scene, /** [true] defines a boolean indicating if bones matrices must be forced to update before rendering (true by default) */\n autoUpdateBonesMatrices = true, /** [3] defines the rendering group id to use with the viewer */\n renderingGroupId = 3, /** [Object] is the options for the viewer */\n options = {}) {\n var _options$pauseAnimati, _options$returnToRest, _options$displayMode, _options$displayOptio, _options$displayOptio2, _options$displayOptio3, _options$displayOptio4, _options$displayOptio5, _options$displayOptio6, _options$displayOptio7, _options$displayOptio8, _options$displayOptio9, _options$computeBones, _options$useAllBones;\n this.skeleton = skeleton;\n this.mesh = mesh;\n this.autoUpdateBonesMatrices = autoUpdateBonesMatrices;\n this.renderingGroupId = renderingGroupId;\n this.options = options;\n /** Gets or sets the color used to render the skeleton */\n this.color = Color3.White();\n /** Array of the points of the skeleton fo the line view. */\n this._debugLines = new Array();\n /** The local axes Meshes. */\n this._localAxes = null;\n /** If SkeletonViewer is enabled. */\n this._isEnabled = true;\n /** SkeletonViewer render observable. */\n this._obs = null;\n this._scene = scene;\n this._ready = false;\n //Defaults\n options.pauseAnimations = (_options$pauseAnimati = options.pauseAnimations) !== null && _options$pauseAnimati !== void 0 ? _options$pauseAnimati : true;\n options.returnToRest = (_options$returnToRest = options.returnToRest) !== null && _options$returnToRest !== void 0 ? _options$returnToRest : false;\n options.displayMode = (_options$displayMode = options.displayMode) !== null && _options$displayMode !== void 0 ? _options$displayMode : SkeletonViewer.DISPLAY_LINES;\n options.displayOptions = (_options$displayOptio = options.displayOptions) !== null && _options$displayOptio !== void 0 ? _options$displayOptio : {};\n options.displayOptions.midStep = (_options$displayOptio2 = options.displayOptions.midStep) !== null && _options$displayOptio2 !== void 0 ? _options$displayOptio2 : 0.235;\n options.displayOptions.midStepFactor = (_options$displayOptio3 = options.displayOptions.midStepFactor) !== null && _options$displayOptio3 !== void 0 ? _options$displayOptio3 : 0.155;\n options.displayOptions.sphereBaseSize = (_options$displayOptio4 = options.displayOptions.sphereBaseSize) !== null && _options$displayOptio4 !== void 0 ? _options$displayOptio4 : 0.15;\n options.displayOptions.sphereScaleUnit = (_options$displayOptio5 = options.displayOptions.sphereScaleUnit) !== null && _options$displayOptio5 !== void 0 ? _options$displayOptio5 : 2;\n options.displayOptions.sphereFactor = (_options$displayOptio6 = options.displayOptions.sphereFactor) !== null && _options$displayOptio6 !== void 0 ? _options$displayOptio6 : 0.865;\n options.displayOptions.spurFollowsChild = (_options$displayOptio7 = options.displayOptions.spurFollowsChild) !== null && _options$displayOptio7 !== void 0 ? _options$displayOptio7 : false;\n options.displayOptions.showLocalAxes = (_options$displayOptio8 = options.displayOptions.showLocalAxes) !== null && _options$displayOptio8 !== void 0 ? _options$displayOptio8 : false;\n options.displayOptions.localAxesSize = (_options$displayOptio9 = options.displayOptions.localAxesSize) !== null && _options$displayOptio9 !== void 0 ? _options$displayOptio9 : 0.075;\n options.computeBonesUsingShaders = (_options$computeBones = options.computeBonesUsingShaders) !== null && _options$computeBones !== void 0 ? _options$computeBones : true;\n options.useAllBones = (_options$useAllBones = options.useAllBones) !== null && _options$useAllBones !== void 0 ? _options$useAllBones : true;\n this._boneIndices = new Set();\n if (!options.useAllBones) {\n const initialMeshBoneIndices = mesh === null || mesh === void 0 ? void 0 : mesh.getVerticesData(VertexBuffer.MatricesIndicesKind);\n const initialMeshBoneWeights = mesh === null || mesh === void 0 ? void 0 : mesh.getVerticesData(VertexBuffer.MatricesWeightsKind);\n if (initialMeshBoneIndices && initialMeshBoneWeights) {\n for (let i = 0; i < initialMeshBoneIndices.length; ++i) {\n const index = initialMeshBoneIndices[i],\n weight = initialMeshBoneWeights[i];\n if (weight !== 0) {\n this._boneIndices.add(index);\n }\n }\n }\n }\n /* Create Utility Layer */\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\n this._utilityLayer.pickUtilitySceneFirst = false;\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\n let displayMode = this.options.displayMode || 0;\n if (displayMode > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\n displayMode = SkeletonViewer.DISPLAY_LINES;\n }\n this.displayMode = displayMode;\n //Prep the Systems\n this.update();\n this._bindObs();\n }\n /** The Dynamic bindings for the update functions */\n _bindObs() {\n switch (this.displayMode) {\n case SkeletonViewer.DISPLAY_LINES:\n {\n this._obs = this.scene.onBeforeRenderObservable.add(() => {\n this._displayLinesUpdate();\n });\n break;\n }\n }\n }\n /** Update the viewer to sync with current skeleton state, only used to manually update. */\n update() {\n switch (this.displayMode) {\n case SkeletonViewer.DISPLAY_LINES:\n {\n this._displayLinesUpdate();\n break;\n }\n case SkeletonViewer.DISPLAY_SPHERES:\n {\n this._buildSpheresAndSpurs(true);\n break;\n }\n case SkeletonViewer.DISPLAY_SPHERE_AND_SPURS:\n {\n this._buildSpheresAndSpurs(false);\n break;\n }\n }\n this._buildLocalAxes();\n }\n /** Gets or sets a boolean indicating if the viewer is enabled */\n set isEnabled(value) {\n if (this.isEnabled === value) {\n return;\n }\n this._isEnabled = value;\n if (this.debugMesh) {\n this.debugMesh.setEnabled(value);\n }\n if (value && !this._obs) {\n this._bindObs();\n } else if (!value && this._obs) {\n this.scene.onBeforeRenderObservable.remove(this._obs);\n this._obs = null;\n }\n }\n get isEnabled() {\n return this._isEnabled;\n }\n _getBonePosition(position, bone, meshMat, x = 0, y = 0, z = 0) {\n const tmat = TmpVectors.Matrix[0];\n const parentBone = bone.getParent();\n tmat.copyFrom(bone.getLocalMatrix());\n if (x !== 0 || y !== 0 || z !== 0) {\n const tmat2 = TmpVectors.Matrix[1];\n Matrix.IdentityToRef(tmat2);\n tmat2.setTranslationFromFloats(x, y, z);\n tmat2.multiplyToRef(tmat, tmat);\n }\n if (parentBone) {\n tmat.multiplyToRef(parentBone.getAbsoluteMatrix(), tmat);\n }\n tmat.multiplyToRef(meshMat, tmat);\n position.x = tmat.m[12];\n position.y = tmat.m[13];\n position.z = tmat.m[14];\n }\n _getLinesForBonesWithLength(bones, mesh) {\n const len = bones.length;\n let matrix;\n let meshPos;\n if (mesh) {\n matrix = mesh.getWorldMatrix();\n meshPos = mesh.position;\n } else {\n matrix = new Matrix();\n meshPos = bones[0].position;\n }\n let idx = 0;\n for (let i = 0; i < len; i++) {\n const bone = bones[i];\n let points = this._debugLines[idx];\n if (bone._index === -1 || !this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones) {\n continue;\n }\n if (!points) {\n points = [Vector3.Zero(), Vector3.Zero()];\n this._debugLines[idx] = points;\n }\n this._getBonePosition(points[0], bone, matrix);\n this._getBonePosition(points[1], bone, matrix, 0, bone.length, 0);\n points[0].subtractInPlace(meshPos);\n points[1].subtractInPlace(meshPos);\n idx++;\n }\n }\n _getLinesForBonesNoLength(bones) {\n const len = bones.length;\n let boneNum = 0;\n const mesh = this.mesh;\n let transformNode;\n let meshPos;\n if (mesh) {\n transformNode = mesh;\n meshPos = mesh.position;\n } else {\n transformNode = new TransformNode(\"\");\n meshPos = bones[0].position;\n }\n for (let i = len - 1; i >= 0; i--) {\n const childBone = bones[i];\n const parentBone = childBone.getParent();\n if (!parentBone || !this._boneIndices.has(childBone.getIndex()) && !this.options.useAllBones) {\n continue;\n }\n let points = this._debugLines[boneNum];\n if (!points) {\n points = [Vector3.Zero(), Vector3.Zero()];\n this._debugLines[boneNum] = points;\n }\n childBone.getAbsolutePositionToRef(transformNode, points[0]);\n parentBone.getAbsolutePositionToRef(transformNode, points[1]);\n points[0].subtractInPlace(meshPos);\n points[1].subtractInPlace(meshPos);\n boneNum++;\n }\n if (!mesh) {\n transformNode.dispose();\n }\n }\n /**\n * function to revert the mesh and scene back to the initial state.\n * @param animationState\n */\n _revert(animationState) {\n if (this.options.pauseAnimations) {\n this.scene.animationsEnabled = animationState;\n this.utilityLayer.utilityLayerScene.animationsEnabled = animationState;\n }\n }\n /**\n * function to get the absolute bind pose of a bone by accumulating transformations up the bone hierarchy.\n * @param bone\n * @param matrix\n */\n _getAbsoluteBindPoseToRef(bone, matrix) {\n if (bone === null || bone._index === -1) {\n matrix.copyFrom(Matrix.Identity());\n return;\n }\n this._getAbsoluteBindPoseToRef(bone.getParent(), matrix);\n bone.getBindMatrix().multiplyToRef(matrix, matrix);\n return;\n }\n _createSpur(anchorPoint, bone, childPoint, childBone, displayOptions, utilityLayerScene) {\n const dir = childPoint.subtract(anchorPoint);\n const h = dir.length();\n const up = dir.normalize().scale(h);\n const midStep = displayOptions.midStep || 0.165;\n const midStepFactor = displayOptions.midStepFactor || 0.215;\n const up0 = up.scale(midStep);\n const spur = ExtrudeShapeCustom(\"skeletonViewer\", {\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)],\n path: [Vector3.Zero(), up0, up],\n scaleFunction: i => {\n switch (i) {\n case 0:\n case 2:\n return 0;\n case 1:\n return h * midStepFactor;\n }\n return 0;\n },\n sideOrientation: Mesh.DEFAULTSIDE,\n updatable: false\n }, utilityLayerScene);\n const numVertices = spur.getTotalVertices();\n const mwk = [],\n mik = [];\n for (let i = 0; i < numVertices; i++) {\n mwk.push(1, 0, 0, 0);\n // Select verts at end of spur (ie vert 10 to 14) and bind to child\n // bone if spurFollowsChild is enabled.\n if (childBone && displayOptions.spurFollowsChild && i > 9) {\n mik.push(childBone.getIndex(), 0, 0, 0);\n } else {\n mik.push(bone.getIndex(), 0, 0, 0);\n }\n }\n spur.position = anchorPoint.clone();\n spur.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\n spur.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\n spur.convertToFlatShadedMesh();\n return spur;\n }\n _getBoundingSphereForBone(boneIndex) {\n if (!this.mesh) {\n return null;\n }\n const positions = this.mesh.getVerticesData(VertexBuffer.PositionKind);\n const indices = this.mesh.getIndices();\n const boneWeights = this.mesh.getVerticesData(VertexBuffer.MatricesWeightsKind);\n const boneIndices = this.mesh.getVerticesData(VertexBuffer.MatricesIndicesKind);\n if (!positions || !indices || !boneWeights || !boneIndices) {\n return null;\n }\n const min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n const max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n let found = 0;\n for (let i = 0; i < indices.length; ++i) {\n const vertexIndex = indices[i];\n for (let b = 0; b < 4; ++b) {\n const bIndex = boneIndices[vertexIndex * 4 + b];\n const bWeight = boneWeights[vertexIndex * 4 + b];\n if (bIndex === boneIndex && bWeight > 1e-5) {\n Vector3.FromArrayToRef(positions, vertexIndex * 3, TmpVectors.Vector3[0]);\n min.minimizeInPlace(TmpVectors.Vector3[0]);\n max.maximizeInPlace(TmpVectors.Vector3[0]);\n found++;\n break;\n }\n }\n }\n return found > 1 ? {\n center: Vector3.Center(min, max),\n radius: Vector3.Distance(min, max) / 2\n } : null;\n }\n /**\n * function to build and bind sphere joint points and spur bone representations.\n * @param spheresOnly\n */\n _buildSpheresAndSpurs(spheresOnly = true) {\n var _this$utilityLayer;\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n this.ready = false;\n }\n this._ready = false;\n const utilityLayerScene = (_this$utilityLayer = this.utilityLayer) === null || _this$utilityLayer === void 0 ? void 0 : _this$utilityLayer.utilityLayerScene;\n const bones = this.skeleton.bones;\n const spheres = [];\n const spurs = [];\n const animationState = this.scene.animationsEnabled;\n try {\n if (this.options.pauseAnimations) {\n this.scene.animationsEnabled = false;\n utilityLayerScene.animationsEnabled = false;\n }\n if (this.options.returnToRest) {\n this.skeleton.returnToRest();\n }\n if (this.autoUpdateBonesMatrices) {\n this.skeleton.computeAbsoluteMatrices();\n }\n let longestBoneLength = Number.NEGATIVE_INFINITY;\n const displayOptions = this.options.displayOptions || {};\n for (let i = 0; i < bones.length; i++) {\n const bone = bones[i];\n if (bone._index === -1 || !this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones) {\n continue;\n }\n const boneAbsoluteBindPoseTransform = new Matrix();\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\n const anchorPoint = new Vector3();\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, anchorPoint);\n if (bone.children.length > 0) {\n bone.children.forEach(bc => {\n const childAbsoluteBindPoseTransform = new Matrix();\n bc.getLocalMatrix().multiplyToRef(boneAbsoluteBindPoseTransform, childAbsoluteBindPoseTransform);\n const childPoint = new Vector3();\n childAbsoluteBindPoseTransform.decompose(undefined, undefined, childPoint);\n const distanceFromParent = Vector3.Distance(anchorPoint, childPoint);\n if (distanceFromParent > longestBoneLength) {\n longestBoneLength = distanceFromParent;\n }\n if (spheresOnly) {\n return;\n }\n spurs.push(this._createSpur(anchorPoint, bone, childPoint, bc, displayOptions, utilityLayerScene));\n });\n } else {\n const boundingSphere = this._getBoundingSphereForBone(bone.getIndex());\n if (boundingSphere) {\n if (boundingSphere.radius > longestBoneLength) {\n longestBoneLength = boundingSphere.radius;\n }\n if (!spheresOnly) {\n let childPoint;\n const parentBone = bone.getParent();\n if (parentBone) {\n this._getAbsoluteBindPoseToRef(parentBone, boneAbsoluteBindPoseTransform);\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, TmpVectors.Vector3[0]);\n childPoint = anchorPoint.subtract(TmpVectors.Vector3[0]).normalize().scale(boundingSphere.radius).add(anchorPoint);\n } else {\n childPoint = boundingSphere.center.subtract(anchorPoint).normalize().scale(boundingSphere.radius).add(anchorPoint);\n }\n spurs.push(this._createSpur(anchorPoint, bone, childPoint, null, displayOptions, utilityLayerScene));\n }\n }\n }\n const sphereBaseSize = displayOptions.sphereBaseSize || 0.2;\n const sphere = CreateSphere(\"skeletonViewer\", {\n segments: 6,\n diameter: sphereBaseSize,\n updatable: true\n }, utilityLayerScene);\n const numVertices = sphere.getTotalVertices();\n const mwk = [],\n mik = [];\n for (let i = 0; i < numVertices; i++) {\n mwk.push(1, 0, 0, 0);\n mik.push(bone.getIndex(), 0, 0, 0);\n }\n sphere.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\n sphere.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\n sphere.position = anchorPoint.clone();\n spheres.push([sphere, bone]);\n }\n const sphereScaleUnit = displayOptions.sphereScaleUnit || 2;\n const sphereFactor = displayOptions.sphereFactor || 0.85;\n const meshes = [];\n for (let i = 0; i < spheres.length; i++) {\n const [sphere, bone] = spheres[i];\n const scale = 1 / (sphereScaleUnit / longestBoneLength);\n let _stepsOut = 0;\n let _b = bone;\n while (_b.getParent() && _b.getParent().getIndex() !== -1) {\n _stepsOut++;\n _b = _b.getParent();\n }\n sphere.scaling.scaleInPlace(scale * Math.pow(sphereFactor, _stepsOut));\n meshes.push(sphere);\n }\n this.debugMesh = Mesh.MergeMeshes(meshes.concat(spurs), true, true);\n if (this.debugMesh) {\n var _this$options$compute;\n this.debugMesh.renderingGroupId = this.renderingGroupId;\n this.debugMesh.skeleton = this.skeleton;\n this.debugMesh.parent = this.mesh;\n this.debugMesh.computeBonesUsingShaders = (_this$options$compute = this.options.computeBonesUsingShaders) !== null && _this$options$compute !== void 0 ? _this$options$compute : true;\n this.debugMesh.alwaysSelectAsActiveMesh = true;\n }\n const light = this.utilityLayer._getSharedGizmoLight();\n light.intensity = 0.7;\n this._revert(animationState);\n this.ready = true;\n } catch (err) {\n Logger.Error(err);\n this._revert(animationState);\n this.dispose();\n }\n }\n _buildLocalAxes() {\n var _this$options$compute2;\n if (this._localAxes) {\n this._localAxes.dispose();\n }\n this._localAxes = null;\n const displayOptions = this.options.displayOptions || {};\n if (!displayOptions.showLocalAxes) {\n return;\n }\n const targetScene = this._utilityLayer.utilityLayerScene;\n const size = displayOptions.localAxesSize || 0.075;\n const lines = [];\n const colors = [];\n const red = new Color4(1, 0, 0, 1);\n const green = new Color4(0, 1, 0, 1);\n const blue = new Color4(0, 0, 1, 1);\n const mwk = [];\n const mik = [];\n const vertsPerBone = 6;\n for (const i in this.skeleton.bones) {\n const bone = this.skeleton.bones[i];\n if (bone._index === -1 || !this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones) {\n continue;\n }\n const boneAbsoluteBindPoseTransform = new Matrix();\n const boneOrigin = new Vector3();\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\n boneAbsoluteBindPoseTransform.decompose(undefined, TmpVectors.Quaternion[0], boneOrigin);\n const m = new Matrix();\n TmpVectors.Quaternion[0].toRotationMatrix(m);\n const boneAxisX = Vector3.TransformCoordinates(new Vector3(0 + size, 0, 0), m);\n const boneAxisY = Vector3.TransformCoordinates(new Vector3(0, 0 + size, 0), m);\n const boneAxisZ = Vector3.TransformCoordinates(new Vector3(0, 0, 0 + size), m);\n const axisX = [boneOrigin, boneOrigin.add(boneAxisX)];\n const axisY = [boneOrigin, boneOrigin.add(boneAxisY)];\n const axisZ = [boneOrigin, boneOrigin.add(boneAxisZ)];\n const linePoints = [axisX, axisY, axisZ];\n const lineColors = [[red, red], [green, green], [blue, blue]];\n lines.push(...linePoints);\n colors.push(...lineColors);\n for (let j = 0; j < vertsPerBone; j++) {\n mwk.push(1, 0, 0, 0);\n mik.push(bone.getIndex(), 0, 0, 0);\n }\n }\n this._localAxes = CreateLineSystem(\"localAxes\", {\n lines: lines,\n colors: colors,\n updatable: true\n }, targetScene);\n this._localAxes.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\n this._localAxes.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\n this._localAxes.skeleton = this.skeleton;\n this._localAxes.renderingGroupId = this.renderingGroupId + 1;\n this._localAxes.parent = this.mesh;\n this._localAxes.computeBonesUsingShaders = (_this$options$compute2 = this.options.computeBonesUsingShaders) !== null && _this$options$compute2 !== void 0 ? _this$options$compute2 : true;\n }\n /** Update the viewer to sync with current skeleton state, only used for the line display. */\n _displayLinesUpdate() {\n if (!this._utilityLayer) {\n return;\n }\n if (this.autoUpdateBonesMatrices) {\n this.skeleton.computeAbsoluteMatrices();\n }\n if (this.skeleton.bones[0].length === undefined) {\n this._getLinesForBonesNoLength(this.skeleton.bones);\n } else {\n this._getLinesForBonesWithLength(this.skeleton.bones, this.mesh);\n }\n const targetScene = this._utilityLayer.utilityLayerScene;\n if (targetScene) {\n if (!this._debugMesh) {\n this._debugMesh = CreateLineSystem(\"\", {\n lines: this._debugLines,\n updatable: true,\n instance: null\n }, targetScene);\n this._debugMesh.renderingGroupId = this.renderingGroupId;\n } else {\n CreateLineSystem(\"\", {\n lines: this._debugLines,\n updatable: true,\n instance: this._debugMesh\n }, targetScene);\n }\n if (this.mesh) {\n this._debugMesh.position.copyFrom(this.mesh.position);\n } else {\n this._debugMesh.position.copyFrom(this.skeleton.bones[0].position);\n }\n this._debugMesh.color = this.color;\n }\n }\n /** Changes the displayMode of the skeleton viewer\n * @param mode The displayMode numerical value\n */\n changeDisplayMode(mode) {\n const wasEnabled = this.isEnabled ? true : false;\n if (this.displayMode !== mode) {\n this.isEnabled = false;\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n this.ready = false;\n }\n this.displayMode = mode;\n this.update();\n this._bindObs();\n this.isEnabled = wasEnabled;\n }\n }\n /** Sets a display option of the skeleton viewer\n *\n * | Option | Type | Default | Description |\n * | ---------------- | ------- | ------- | ----------- |\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`. |\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`. |\n * | sphereBaseSize | float | 2 | Sphere base size. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\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`. |\n * | spurFollowsChild | boolean | false | Whether a spur should attach its far end to the child bone. |\n * | showLocalAxes | boolean | false | Displays local axes on all bones. |\n * | localAxesSize | float | 0.075 | Determines the length of each local axis. |\n *\n * @param option String of the option name\n * @param value The numerical option value\n */\n changeDisplayOptions(option, value) {\n const wasEnabled = this.isEnabled ? true : false;\n this.options.displayOptions[option] = value;\n this.isEnabled = false;\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n this.ready = false;\n }\n this.update();\n this._bindObs();\n this.isEnabled = wasEnabled;\n }\n /** Release associated resources */\n dispose() {\n this.isEnabled = false;\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n }\n if (this._utilityLayer) {\n this._utilityLayer.dispose();\n this._utilityLayer = null;\n }\n this.ready = false;\n }\n}\n/** public Display constants BABYLON.SkeletonViewer.DISPLAY_LINES */\nSkeletonViewer.DISPLAY_LINES = 0;\n/** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERES */\nSkeletonViewer.DISPLAY_SPHERES = 1;\n/** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERE_AND_SPURS */\nSkeletonViewer.DISPLAY_SPHERE_AND_SPURS = 2;","map":{"version":3,"names":["Vector3","Matrix","TmpVectors","Color3","Color4","Mesh","CreateLineSystem","UtilityLayerRenderer","Material","ShaderMaterial","DynamicTexture","VertexBuffer","Effect","CreateSphere","ExtrudeShapeCustom","TransformNode","Logger","SkeletonViewer","CreateBoneWeightShader","options","scene","_options$colorBase","_options$colorZero","_options$colorQuarter","_options$colorHalf","_options$colorFull","_options$targetBoneIn","skeleton","colorBase","Black","colorZero","Blue","colorQuarter","Green","colorHalf","Yellow","colorFull","Red","targetBoneIndex","ShadersStore","name","shader","vertex","fragment","attributes","uniforms","setColor3","setFloat","getClassName","transparencyMode","MATERIAL_OPAQUE","CreateSkeletonMapShader","_options$colorMap","colorMap","color","location","bufferWidth","bones","length","colorMapBuffer","_CreateBoneMapColorBuffer","vertexSource","fragmentSource","setFloats","size","tempGrad","width","height","ctx","getContext","grad","createLinearGradient","forEach","stop","addColorStop","toHexString","fillStyle","fillRect","update","buffer","data","getImageData","rUnit","i","push","dispose","_scene","utilityLayer","_utilityLayer","isReady","_ready","ready","value","debugMesh","_debugMesh","displayMode","DISPLAY_LINES","DISPLAY_SPHERE_AND_SPURS","constructor","mesh","autoUpdateBonesMatrices","renderingGroupId","_options$pauseAnimati","_options$returnToRest","_options$displayMode","_options$displayOptio","_options$displayOptio2","_options$displayOptio3","_options$displayOptio4","_options$displayOptio5","_options$displayOptio6","_options$displayOptio7","_options$displayOptio8","_options$displayOptio9","_options$computeBones","_options$useAllBones","White","_debugLines","Array","_localAxes","_isEnabled","_obs","pauseAnimations","returnToRest","displayOptions","midStep","midStepFactor","sphereBaseSize","sphereScaleUnit","sphereFactor","spurFollowsChild","showLocalAxes","localAxesSize","computeBonesUsingShaders","useAllBones","_boneIndices","Set","initialMeshBoneIndices","getVerticesData","MatricesIndicesKind","initialMeshBoneWeights","MatricesWeightsKind","index","weight","add","pickUtilitySceneFirst","utilityLayerScene","autoClearDepthAndStencil","_bindObs","onBeforeRenderObservable","_displayLinesUpdate","DISPLAY_SPHERES","_buildSpheresAndSpurs","_buildLocalAxes","isEnabled","setEnabled","remove","_getBonePosition","position","bone","meshMat","x","y","z","tmat","parentBone","getParent","copyFrom","getLocalMatrix","tmat2","IdentityToRef","setTranslationFromFloats","multiplyToRef","getAbsoluteMatrix","m","_getLinesForBonesWithLength","len","matrix","meshPos","getWorldMatrix","idx","points","_index","has","getIndex","Zero","subtractInPlace","_getLinesForBonesNoLength","boneNum","transformNode","childBone","getAbsolutePositionToRef","_revert","animationState","animationsEnabled","_getAbsoluteBindPoseToRef","Identity","getBindMatrix","_createSpur","anchorPoint","childPoint","dir","subtract","h","up","normalize","scale","up0","spur","shape","path","scaleFunction","sideOrientation","DEFAULTSIDE","updatable","numVertices","getTotalVertices","mwk","mik","clone","setVerticesData","convertToFlatShadedMesh","_getBoundingSphereForBone","boneIndex","positions","PositionKind","indices","getIndices","boneWeights","boneIndices","min","Number","MAX_VALUE","max","found","vertexIndex","b","bIndex","bWeight","FromArrayToRef","minimizeInPlace","maximizeInPlace","center","Center","radius","Distance","spheresOnly","_this$utilityLayer","spheres","spurs","computeAbsoluteMatrices","longestBoneLength","NEGATIVE_INFINITY","boneAbsoluteBindPoseTransform","decompose","undefined","children","bc","childAbsoluteBindPoseTransform","distanceFromParent","boundingSphere","sphere","segments","diameter","meshes","_stepsOut","_b","scaling","scaleInPlace","Math","pow","MergeMeshes","concat","_this$options$compute","parent","alwaysSelectAsActiveMesh","light","_getSharedGizmoLight","intensity","err","Error","_this$options$compute2","targetScene","lines","colors","red","green","blue","vertsPerBone","boneOrigin","Quaternion","toRotationMatrix","boneAxisX","TransformCoordinates","boneAxisY","boneAxisZ","axisX","axisY","axisZ","linePoints","lineColors","j","instance","changeDisplayMode","mode","wasEnabled","changeDisplayOptions","option"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Debug/skeletonViewer.js"],"sourcesContent":["import { Vector3, Matrix, TmpVectors } from \"../Maths/math.vector.js\";\nimport { Color3, Color4 } from \"../Maths/math.color.js\";\nimport { Mesh } from \"../Meshes/mesh.js\";\nimport { CreateLineSystem } from \"../Meshes/Builders/linesBuilder.js\";\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer.js\";\nimport { Material } from \"../Materials/material.js\";\nimport { ShaderMaterial } from \"../Materials/shaderMaterial.js\";\nimport { DynamicTexture } from \"../Materials/Textures/dynamicTexture.js\";\nimport { VertexBuffer } from \"../Buffers/buffer.js\";\nimport { Effect } from \"../Materials/effect.js\";\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder.js\";\nimport { ExtrudeShapeCustom } from \"../Meshes/Builders/shapeBuilder.js\";\nimport { TransformNode } from \"../Meshes/transformNode.js\";\nimport { Logger } from \"../Misc/logger.js\";\n/**\n * Class used to render a debug view of a given skeleton\n * @see http://www.babylonjs-playground.com/#1BZJVJ#8\n */\nexport class SkeletonViewer {\n /** public static method to create a BoneWeight Shader\n * @param options The constructor options\n * @param scene The scene that the shader is scoped to\n * @returns The created ShaderMaterial\n * @see http://www.babylonjs-playground.com/#1BZJVJ#395\n */\n static CreateBoneWeightShader(options, scene) {\n const skeleton = options.skeleton;\n const colorBase = options.colorBase ?? Color3.Black();\n const colorZero = options.colorZero ?? Color3.Blue();\n const colorQuarter = options.colorQuarter ?? Color3.Green();\n const colorHalf = options.colorHalf ?? Color3.Yellow();\n const colorFull = options.colorFull ?? Color3.Red();\n const targetBoneIndex = options.targetBoneIndex ?? 0;\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 }`;\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 `;\n const shader = new ShaderMaterial(\"boneWeight:\" + skeleton.name, scene, {\n vertex: \"boneWeights:\" + skeleton.name,\n fragment: \"boneWeights:\" + skeleton.name,\n }, {\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\n uniforms: [\n \"world\",\n \"worldView\",\n \"worldViewProjection\",\n \"view\",\n \"projection\",\n \"viewProjection\",\n \"colorBase\",\n \"colorZero\",\n \"colorQuarter\",\n \"colorHalf\",\n \"colorFull\",\n \"targetBoneIndex\",\n ],\n });\n shader.setColor3(\"colorBase\", colorBase);\n shader.setColor3(\"colorZero\", colorZero);\n shader.setColor3(\"colorQuarter\", colorQuarter);\n shader.setColor3(\"colorHalf\", colorHalf);\n shader.setColor3(\"colorFull\", colorFull);\n shader.setFloat(\"targetBoneIndex\", targetBoneIndex);\n shader.getClassName = () => {\n return \"BoneWeightShader\";\n };\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\n return shader;\n }\n /** public static method to create a BoneWeight Shader\n * @param options The constructor options\n * @param scene The scene that the shader is scoped to\n * @returns The created ShaderMaterial\n */\n static CreateSkeletonMapShader(options, scene) {\n const skeleton = options.skeleton;\n const colorMap = options.colorMap ?? [\n {\n color: new Color3(1, 0.38, 0.18),\n location: 0,\n },\n {\n color: new Color3(0.59, 0.18, 1.0),\n location: 0.2,\n },\n {\n color: new Color3(0.59, 1, 0.18),\n location: 0.4,\n },\n {\n color: new Color3(1, 0.87, 0.17),\n location: 0.6,\n },\n {\n color: new Color3(1, 0.17, 0.42),\n location: 0.8,\n },\n {\n color: new Color3(0.17, 0.68, 1.0),\n location: 1.0,\n },\n ];\n const bufferWidth = skeleton.bones.length + 1;\n const colorMapBuffer = SkeletonViewer._CreateBoneMapColorBuffer(bufferWidth, colorMap, scene);\n const shader = new ShaderMaterial(\"boneWeights:\" + skeleton.name, scene, {\n vertexSource: `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[` +\n skeleton.bones.length * 4 +\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 }`,\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 `,\n }, {\n attributes: [\"position\", \"normal\", \"matricesIndices\", \"matricesWeights\"],\n uniforms: [\"world\", \"worldView\", \"worldViewProjection\", \"view\", \"projection\", \"viewProjection\", \"colorMap\"],\n });\n shader.setFloats(\"colorMap\", colorMapBuffer);\n shader.getClassName = () => {\n return \"SkeletonMapShader\";\n };\n shader.transparencyMode = Material.MATERIAL_OPAQUE;\n return shader;\n }\n /** private static method to create a BoneWeight Shader\n * @param size The size of the buffer to create (usually the bone count)\n * @param colorMap The gradient data to generate\n * @param scene The scene that the shader is scoped to\n * @returns an Array of floats from the color gradient values\n */\n static _CreateBoneMapColorBuffer(size, colorMap, scene) {\n const tempGrad = new DynamicTexture(\"temp\", { width: size, height: 1 }, scene, false);\n const ctx = tempGrad.getContext();\n const grad = ctx.createLinearGradient(0, 0, size, 0);\n colorMap.forEach((stop) => {\n grad.addColorStop(stop.location, stop.color.toHexString());\n });\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, size, 1);\n tempGrad.update();\n const buffer = [];\n const data = ctx.getImageData(0, 0, size, 1).data;\n const rUnit = 1 / 255;\n for (let i = 0; i < data.length; i++) {\n buffer.push(data[i] * rUnit);\n }\n tempGrad.dispose();\n return buffer;\n }\n /** Gets the Scene. */\n get scene() {\n return this._scene;\n }\n /** Gets the utilityLayer. */\n get utilityLayer() {\n return this._utilityLayer;\n }\n /** Checks Ready Status. */\n get isReady() {\n return this._ready;\n }\n /** Sets Ready Status. */\n set ready(value) {\n this._ready = value;\n }\n /** Gets the debugMesh */\n get debugMesh() {\n return this._debugMesh;\n }\n /** Sets the debugMesh */\n set debugMesh(value) {\n this._debugMesh = value;\n }\n /** Gets the displayMode */\n get displayMode() {\n return this.options.displayMode || SkeletonViewer.DISPLAY_LINES;\n }\n /** Sets the displayMode */\n set displayMode(value) {\n if (value > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\n value = SkeletonViewer.DISPLAY_LINES;\n }\n this.options.displayMode = value;\n }\n /**\n * Creates a new SkeletonViewer\n * @param skeleton defines the skeleton to render\n * @param mesh defines the mesh attached to the skeleton\n * @param scene defines the hosting scene\n * @param autoUpdateBonesMatrices defines a boolean indicating if bones matrices must be forced to update before rendering (true by default)\n * @param renderingGroupId defines the rendering group id to use with the viewer\n * @param options All of the extra constructor options for the SkeletonViewer\n */\n constructor(\n /** defines the skeleton to render */\n skeleton, \n /** defines the mesh attached to the skeleton */\n mesh, \n /** The Scene scope*/\n scene, \n /** [true] defines a boolean indicating if bones matrices must be forced to update before rendering (true by default) */\n autoUpdateBonesMatrices = true, \n /** [3] defines the rendering group id to use with the viewer */\n renderingGroupId = 3, \n /** [Object] is the options for the viewer */\n options = {}) {\n this.skeleton = skeleton;\n this.mesh = mesh;\n this.autoUpdateBonesMatrices = autoUpdateBonesMatrices;\n this.renderingGroupId = renderingGroupId;\n this.options = options;\n /** Gets or sets the color used to render the skeleton */\n this.color = Color3.White();\n /** Array of the points of the skeleton fo the line view. */\n this._debugLines = new Array();\n /** The local axes Meshes. */\n this._localAxes = null;\n /** If SkeletonViewer is enabled. */\n this._isEnabled = true;\n /** SkeletonViewer render observable. */\n this._obs = null;\n this._scene = scene;\n this._ready = false;\n //Defaults\n options.pauseAnimations = options.pauseAnimations ?? true;\n options.returnToRest = options.returnToRest ?? false;\n options.displayMode = options.displayMode ?? SkeletonViewer.DISPLAY_LINES;\n options.displayOptions = options.displayOptions ?? {};\n options.displayOptions.midStep = options.displayOptions.midStep ?? 0.235;\n options.displayOptions.midStepFactor = options.displayOptions.midStepFactor ?? 0.155;\n options.displayOptions.sphereBaseSize = options.displayOptions.sphereBaseSize ?? 0.15;\n options.displayOptions.sphereScaleUnit = options.displayOptions.sphereScaleUnit ?? 2;\n options.displayOptions.sphereFactor = options.displayOptions.sphereFactor ?? 0.865;\n options.displayOptions.spurFollowsChild = options.displayOptions.spurFollowsChild ?? false;\n options.displayOptions.showLocalAxes = options.displayOptions.showLocalAxes ?? false;\n options.displayOptions.localAxesSize = options.displayOptions.localAxesSize ?? 0.075;\n options.computeBonesUsingShaders = options.computeBonesUsingShaders ?? true;\n options.useAllBones = options.useAllBones ?? true;\n this._boneIndices = new Set();\n if (!options.useAllBones) {\n const initialMeshBoneIndices = mesh?.getVerticesData(VertexBuffer.MatricesIndicesKind);\n const initialMeshBoneWeights = mesh?.getVerticesData(VertexBuffer.MatricesWeightsKind);\n if (initialMeshBoneIndices && initialMeshBoneWeights) {\n for (let i = 0; i < initialMeshBoneIndices.length; ++i) {\n const index = initialMeshBoneIndices[i], weight = initialMeshBoneWeights[i];\n if (weight !== 0) {\n this._boneIndices.add(index);\n }\n }\n }\n }\n /* Create Utility Layer */\n this._utilityLayer = new UtilityLayerRenderer(this._scene, false);\n this._utilityLayer.pickUtilitySceneFirst = false;\n this._utilityLayer.utilityLayerScene.autoClearDepthAndStencil = true;\n let displayMode = this.options.displayMode || 0;\n if (displayMode > SkeletonViewer.DISPLAY_SPHERE_AND_SPURS) {\n displayMode = SkeletonViewer.DISPLAY_LINES;\n }\n this.displayMode = displayMode;\n //Prep the Systems\n this.update();\n this._bindObs();\n }\n /** The Dynamic bindings for the update functions */\n _bindObs() {\n switch (this.displayMode) {\n case SkeletonViewer.DISPLAY_LINES: {\n this._obs = this.scene.onBeforeRenderObservable.add(() => {\n this._displayLinesUpdate();\n });\n break;\n }\n }\n }\n /** Update the viewer to sync with current skeleton state, only used to manually update. */\n update() {\n switch (this.displayMode) {\n case SkeletonViewer.DISPLAY_LINES: {\n this._displayLinesUpdate();\n break;\n }\n case SkeletonViewer.DISPLAY_SPHERES: {\n this._buildSpheresAndSpurs(true);\n break;\n }\n case SkeletonViewer.DISPLAY_SPHERE_AND_SPURS: {\n this._buildSpheresAndSpurs(false);\n break;\n }\n }\n this._buildLocalAxes();\n }\n /** Gets or sets a boolean indicating if the viewer is enabled */\n set isEnabled(value) {\n if (this.isEnabled === value) {\n return;\n }\n this._isEnabled = value;\n if (this.debugMesh) {\n this.debugMesh.setEnabled(value);\n }\n if (value && !this._obs) {\n this._bindObs();\n }\n else if (!value && this._obs) {\n this.scene.onBeforeRenderObservable.remove(this._obs);\n this._obs = null;\n }\n }\n get isEnabled() {\n return this._isEnabled;\n }\n _getBonePosition(position, bone, meshMat, x = 0, y = 0, z = 0) {\n const tmat = TmpVectors.Matrix[0];\n const parentBone = bone.getParent();\n tmat.copyFrom(bone.getLocalMatrix());\n if (x !== 0 || y !== 0 || z !== 0) {\n const tmat2 = TmpVectors.Matrix[1];\n Matrix.IdentityToRef(tmat2);\n tmat2.setTranslationFromFloats(x, y, z);\n tmat2.multiplyToRef(tmat, tmat);\n }\n if (parentBone) {\n tmat.multiplyToRef(parentBone.getAbsoluteMatrix(), tmat);\n }\n tmat.multiplyToRef(meshMat, tmat);\n position.x = tmat.m[12];\n position.y = tmat.m[13];\n position.z = tmat.m[14];\n }\n _getLinesForBonesWithLength(bones, mesh) {\n const len = bones.length;\n let matrix;\n let meshPos;\n if (mesh) {\n matrix = mesh.getWorldMatrix();\n meshPos = mesh.position;\n }\n else {\n matrix = new Matrix();\n meshPos = bones[0].position;\n }\n let idx = 0;\n for (let i = 0; i < len; i++) {\n const bone = bones[i];\n let points = this._debugLines[idx];\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\n continue;\n }\n if (!points) {\n points = [Vector3.Zero(), Vector3.Zero()];\n this._debugLines[idx] = points;\n }\n this._getBonePosition(points[0], bone, matrix);\n this._getBonePosition(points[1], bone, matrix, 0, bone.length, 0);\n points[0].subtractInPlace(meshPos);\n points[1].subtractInPlace(meshPos);\n idx++;\n }\n }\n _getLinesForBonesNoLength(bones) {\n const len = bones.length;\n let boneNum = 0;\n const mesh = this.mesh;\n let transformNode;\n let meshPos;\n if (mesh) {\n transformNode = mesh;\n meshPos = mesh.position;\n }\n else {\n transformNode = new TransformNode(\"\");\n meshPos = bones[0].position;\n }\n for (let i = len - 1; i >= 0; i--) {\n const childBone = bones[i];\n const parentBone = childBone.getParent();\n if (!parentBone || (!this._boneIndices.has(childBone.getIndex()) && !this.options.useAllBones)) {\n continue;\n }\n let points = this._debugLines[boneNum];\n if (!points) {\n points = [Vector3.Zero(), Vector3.Zero()];\n this._debugLines[boneNum] = points;\n }\n childBone.getAbsolutePositionToRef(transformNode, points[0]);\n parentBone.getAbsolutePositionToRef(transformNode, points[1]);\n points[0].subtractInPlace(meshPos);\n points[1].subtractInPlace(meshPos);\n boneNum++;\n }\n if (!mesh) {\n transformNode.dispose();\n }\n }\n /**\n * function to revert the mesh and scene back to the initial state.\n * @param animationState\n */\n _revert(animationState) {\n if (this.options.pauseAnimations) {\n this.scene.animationsEnabled = animationState;\n this.utilityLayer.utilityLayerScene.animationsEnabled = animationState;\n }\n }\n /**\n * function to get the absolute bind pose of a bone by accumulating transformations up the bone hierarchy.\n * @param bone\n * @param matrix\n */\n _getAbsoluteBindPoseToRef(bone, matrix) {\n if (bone === null || bone._index === -1) {\n matrix.copyFrom(Matrix.Identity());\n return;\n }\n this._getAbsoluteBindPoseToRef(bone.getParent(), matrix);\n bone.getBindMatrix().multiplyToRef(matrix, matrix);\n return;\n }\n _createSpur(anchorPoint, bone, childPoint, childBone, displayOptions, utilityLayerScene) {\n const dir = childPoint.subtract(anchorPoint);\n const h = dir.length();\n const up = dir.normalize().scale(h);\n const midStep = displayOptions.midStep || 0.165;\n const midStepFactor = displayOptions.midStepFactor || 0.215;\n const up0 = up.scale(midStep);\n const spur = ExtrudeShapeCustom(\"skeletonViewer\", {\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)],\n path: [Vector3.Zero(), up0, up],\n scaleFunction: (i) => {\n switch (i) {\n case 0:\n case 2:\n return 0;\n case 1:\n return h * midStepFactor;\n }\n return 0;\n },\n sideOrientation: Mesh.DEFAULTSIDE,\n updatable: false,\n }, utilityLayerScene);\n const numVertices = spur.getTotalVertices();\n const mwk = [], mik = [];\n for (let i = 0; i < numVertices; i++) {\n mwk.push(1, 0, 0, 0);\n // Select verts at end of spur (ie vert 10 to 14) and bind to child\n // bone if spurFollowsChild is enabled.\n if (childBone && displayOptions.spurFollowsChild && i > 9) {\n mik.push(childBone.getIndex(), 0, 0, 0);\n }\n else {\n mik.push(bone.getIndex(), 0, 0, 0);\n }\n }\n spur.position = anchorPoint.clone();\n spur.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\n spur.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\n spur.convertToFlatShadedMesh();\n return spur;\n }\n _getBoundingSphereForBone(boneIndex) {\n if (!this.mesh) {\n return null;\n }\n const positions = this.mesh.getVerticesData(VertexBuffer.PositionKind);\n const indices = this.mesh.getIndices();\n const boneWeights = this.mesh.getVerticesData(VertexBuffer.MatricesWeightsKind);\n const boneIndices = this.mesh.getVerticesData(VertexBuffer.MatricesIndicesKind);\n if (!positions || !indices || !boneWeights || !boneIndices) {\n return null;\n }\n const min = new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\n const max = new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\n let found = 0;\n for (let i = 0; i < indices.length; ++i) {\n const vertexIndex = indices[i];\n for (let b = 0; b < 4; ++b) {\n const bIndex = boneIndices[vertexIndex * 4 + b];\n const bWeight = boneWeights[vertexIndex * 4 + b];\n if (bIndex === boneIndex && bWeight > 1e-5) {\n Vector3.FromArrayToRef(positions, vertexIndex * 3, TmpVectors.Vector3[0]);\n min.minimizeInPlace(TmpVectors.Vector3[0]);\n max.maximizeInPlace(TmpVectors.Vector3[0]);\n found++;\n break;\n }\n }\n }\n return found > 1\n ? {\n center: Vector3.Center(min, max),\n radius: Vector3.Distance(min, max) / 2,\n }\n : null;\n }\n /**\n * function to build and bind sphere joint points and spur bone representations.\n * @param spheresOnly\n */\n _buildSpheresAndSpurs(spheresOnly = true) {\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n this.ready = false;\n }\n this._ready = false;\n const utilityLayerScene = this.utilityLayer?.utilityLayerScene;\n const bones = this.skeleton.bones;\n const spheres = [];\n const spurs = [];\n const animationState = this.scene.animationsEnabled;\n try {\n if (this.options.pauseAnimations) {\n this.scene.animationsEnabled = false;\n utilityLayerScene.animationsEnabled = false;\n }\n if (this.options.returnToRest) {\n this.skeleton.returnToRest();\n }\n if (this.autoUpdateBonesMatrices) {\n this.skeleton.computeAbsoluteMatrices();\n }\n let longestBoneLength = Number.NEGATIVE_INFINITY;\n const displayOptions = this.options.displayOptions || {};\n for (let i = 0; i < bones.length; i++) {\n const bone = bones[i];\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\n continue;\n }\n const boneAbsoluteBindPoseTransform = new Matrix();\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\n const anchorPoint = new Vector3();\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, anchorPoint);\n if (bone.children.length > 0) {\n bone.children.forEach((bc) => {\n const childAbsoluteBindPoseTransform = new Matrix();\n bc.getLocalMatrix().multiplyToRef(boneAbsoluteBindPoseTransform, childAbsoluteBindPoseTransform);\n const childPoint = new Vector3();\n childAbsoluteBindPoseTransform.decompose(undefined, undefined, childPoint);\n const distanceFromParent = Vector3.Distance(anchorPoint, childPoint);\n if (distanceFromParent > longestBoneLength) {\n longestBoneLength = distanceFromParent;\n }\n if (spheresOnly) {\n return;\n }\n spurs.push(this._createSpur(anchorPoint, bone, childPoint, bc, displayOptions, utilityLayerScene));\n });\n }\n else {\n const boundingSphere = this._getBoundingSphereForBone(bone.getIndex());\n if (boundingSphere) {\n if (boundingSphere.radius > longestBoneLength) {\n longestBoneLength = boundingSphere.radius;\n }\n if (!spheresOnly) {\n let childPoint;\n const parentBone = bone.getParent();\n if (parentBone) {\n this._getAbsoluteBindPoseToRef(parentBone, boneAbsoluteBindPoseTransform);\n boneAbsoluteBindPoseTransform.decompose(undefined, undefined, TmpVectors.Vector3[0]);\n childPoint = anchorPoint.subtract(TmpVectors.Vector3[0]).normalize().scale(boundingSphere.radius).add(anchorPoint);\n }\n else {\n childPoint = boundingSphere.center.subtract(anchorPoint).normalize().scale(boundingSphere.radius).add(anchorPoint);\n }\n spurs.push(this._createSpur(anchorPoint, bone, childPoint, null, displayOptions, utilityLayerScene));\n }\n }\n }\n const sphereBaseSize = displayOptions.sphereBaseSize || 0.2;\n const sphere = CreateSphere(\"skeletonViewer\", {\n segments: 6,\n diameter: sphereBaseSize,\n updatable: true,\n }, utilityLayerScene);\n const numVertices = sphere.getTotalVertices();\n const mwk = [], mik = [];\n for (let i = 0; i < numVertices; i++) {\n mwk.push(1, 0, 0, 0);\n mik.push(bone.getIndex(), 0, 0, 0);\n }\n sphere.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\n sphere.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\n sphere.position = anchorPoint.clone();\n spheres.push([sphere, bone]);\n }\n const sphereScaleUnit = displayOptions.sphereScaleUnit || 2;\n const sphereFactor = displayOptions.sphereFactor || 0.85;\n const meshes = [];\n for (let i = 0; i < spheres.length; i++) {\n const [sphere, bone] = spheres[i];\n const scale = 1 / (sphereScaleUnit / longestBoneLength);\n let _stepsOut = 0;\n let _b = bone;\n while (_b.getParent() && _b.getParent().getIndex() !== -1) {\n _stepsOut++;\n _b = _b.getParent();\n }\n sphere.scaling.scaleInPlace(scale * Math.pow(sphereFactor, _stepsOut));\n meshes.push(sphere);\n }\n this.debugMesh = Mesh.MergeMeshes(meshes.concat(spurs), true, true);\n if (this.debugMesh) {\n this.debugMesh.renderingGroupId = this.renderingGroupId;\n this.debugMesh.skeleton = this.skeleton;\n this.debugMesh.parent = this.mesh;\n this.debugMesh.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\n this.debugMesh.alwaysSelectAsActiveMesh = true;\n }\n const light = this.utilityLayer._getSharedGizmoLight();\n light.intensity = 0.7;\n this._revert(animationState);\n this.ready = true;\n }\n catch (err) {\n Logger.Error(err);\n this._revert(animationState);\n this.dispose();\n }\n }\n _buildLocalAxes() {\n if (this._localAxes) {\n this._localAxes.dispose();\n }\n this._localAxes = null;\n const displayOptions = this.options.displayOptions || {};\n if (!displayOptions.showLocalAxes) {\n return;\n }\n const targetScene = this._utilityLayer.utilityLayerScene;\n const size = displayOptions.localAxesSize || 0.075;\n const lines = [];\n const colors = [];\n const red = new Color4(1, 0, 0, 1);\n const green = new Color4(0, 1, 0, 1);\n const blue = new Color4(0, 0, 1, 1);\n const mwk = [];\n const mik = [];\n const vertsPerBone = 6;\n for (const i in this.skeleton.bones) {\n const bone = this.skeleton.bones[i];\n if (bone._index === -1 || (!this._boneIndices.has(bone.getIndex()) && !this.options.useAllBones)) {\n continue;\n }\n const boneAbsoluteBindPoseTransform = new Matrix();\n const boneOrigin = new Vector3();\n this._getAbsoluteBindPoseToRef(bone, boneAbsoluteBindPoseTransform);\n boneAbsoluteBindPoseTransform.decompose(undefined, TmpVectors.Quaternion[0], boneOrigin);\n const m = new Matrix();\n TmpVectors.Quaternion[0].toRotationMatrix(m);\n const boneAxisX = Vector3.TransformCoordinates(new Vector3(0 + size, 0, 0), m);\n const boneAxisY = Vector3.TransformCoordinates(new Vector3(0, 0 + size, 0), m);\n const boneAxisZ = Vector3.TransformCoordinates(new Vector3(0, 0, 0 + size), m);\n const axisX = [boneOrigin, boneOrigin.add(boneAxisX)];\n const axisY = [boneOrigin, boneOrigin.add(boneAxisY)];\n const axisZ = [boneOrigin, boneOrigin.add(boneAxisZ)];\n const linePoints = [axisX, axisY, axisZ];\n const lineColors = [\n [red, red],\n [green, green],\n [blue, blue],\n ];\n lines.push(...linePoints);\n colors.push(...lineColors);\n for (let j = 0; j < vertsPerBone; j++) {\n mwk.push(1, 0, 0, 0);\n mik.push(bone.getIndex(), 0, 0, 0);\n }\n }\n this._localAxes = CreateLineSystem(\"localAxes\", { lines: lines, colors: colors, updatable: true }, targetScene);\n this._localAxes.setVerticesData(VertexBuffer.MatricesWeightsKind, mwk, false);\n this._localAxes.setVerticesData(VertexBuffer.MatricesIndicesKind, mik, false);\n this._localAxes.skeleton = this.skeleton;\n this._localAxes.renderingGroupId = this.renderingGroupId + 1;\n this._localAxes.parent = this.mesh;\n this._localAxes.computeBonesUsingShaders = this.options.computeBonesUsingShaders ?? true;\n }\n /** Update the viewer to sync with current skeleton state, only used for the line display. */\n _displayLinesUpdate() {\n if (!this._utilityLayer) {\n return;\n }\n if (this.autoUpdateBonesMatrices) {\n this.skeleton.computeAbsoluteMatrices();\n }\n if (this.skeleton.bones[0].length === undefined) {\n this._getLinesForBonesNoLength(this.skeleton.bones);\n }\n else {\n this._getLinesForBonesWithLength(this.skeleton.bones, this.mesh);\n }\n const targetScene = this._utilityLayer.utilityLayerScene;\n if (targetScene) {\n if (!this._debugMesh) {\n this._debugMesh = CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: null }, targetScene);\n this._debugMesh.renderingGroupId = this.renderingGroupId;\n }\n else {\n CreateLineSystem(\"\", { lines: this._debugLines, updatable: true, instance: this._debugMesh }, targetScene);\n }\n if (this.mesh) {\n this._debugMesh.position.copyFrom(this.mesh.position);\n }\n else {\n this._debugMesh.position.copyFrom(this.skeleton.bones[0].position);\n }\n this._debugMesh.color = this.color;\n }\n }\n /** Changes the displayMode of the skeleton viewer\n * @param mode The displayMode numerical value\n */\n changeDisplayMode(mode) {\n const wasEnabled = this.isEnabled ? true : false;\n if (this.displayMode !== mode) {\n this.isEnabled = false;\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n this.ready = false;\n }\n this.displayMode = mode;\n this.update();\n this._bindObs();\n this.isEnabled = wasEnabled;\n }\n }\n /** Sets a display option of the skeleton viewer\n *\n * | Option | Type | Default | Description |\n * | ---------------- | ------- | ------- | ----------- |\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`. |\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`. |\n * | sphereBaseSize | float | 2 | Sphere base size. Only used when `displayMode` is set to `DISPLAY_SPHERE_AND_SPURS`. |\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`. |\n * | spurFollowsChild | boolean | false | Whether a spur should attach its far end to the child bone. |\n * | showLocalAxes | boolean | false | Displays local axes on all bones. |\n * | localAxesSize | float | 0.075 | Determines the length of each local axis. |\n *\n * @param option String of the option name\n * @param value The numerical option value\n */\n changeDisplayOptions(option, value) {\n const wasEnabled = this.isEnabled ? true : false;\n this.options.displayOptions[option] = value;\n this.isEnabled = false;\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n this.ready = false;\n }\n this.update();\n this._bindObs();\n this.isEnabled = wasEnabled;\n }\n /** Release associated resources */\n dispose() {\n this.isEnabled = false;\n if (this._debugMesh) {\n this._debugMesh.dispose();\n this._debugMesh = null;\n }\n if (this._utilityLayer) {\n this._utilityLayer.dispose();\n this._utilityLayer = null;\n }\n this.ready = false;\n }\n}\n/** public Display constants BABYLON.SkeletonViewer.DISPLAY_LINES */\nSkeletonViewer.DISPLAY_LINES = 0;\n/** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERES */\nSkeletonViewer.DISPLAY_SPHERES = 1;\n/** public Display constants BABYLON.SkeletonViewer.DISPLAY_SPHERE_AND_SPURS */\nSkeletonViewer.DISPLAY_SPHERE_AND_SPURS = 2;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}