Variable: skin
constskin:object
Defined in: modules/engine/skin/skin.ts:144
Type Declaration
bindingLayout
readonlybindingLayout: readonly [{group:0;name:"skin"; }, {group:0;name:"skinJointMatrices";visibility:1; }]
bindings
readonlybindings:SkinBindings
defines
readonlydefines:object
defines.SKIN_MAX_JOINTS
SKIN_MAX_JOINTS:
64
Fits comfortably inside the minimum portable WebGL uniform-block limit.
dependencies
readonlydependencies: [] =[]
fs
fs:
""
getUniforms
readonlygetUniforms: (props,_previousUniforms?) =>SkinUniforms&SkinBindings
Parameters
props?
SkinProps = {}
_previousUniforms?
Returns
SkinUniforms & SkinBindings
name
readonlyname:"skin"='skin'
props
readonlyprops:SkinProps
source
source: "\nstruct skinUniforms {\n jointMatrix: array<mat4x4<f32>, 64>,\n};\n\n@group(0) @binding(auto) var<uniform> skin: skinUniforms;\n\n#ifdef HAS_INSTANCED_SKIN\n@group(0) @binding(auto) var<storage, read> skinJointMatrices: array<mat4x4<f32>>;\n\nfn getInstancedSkinMatrix(\n weights: vec4f,\n joints: vec4u,\n instanceIndex: u32,\n jointsPerInstance: u32\n) -> mat4x4<f32> {\n let firstJoint = instanceIndex * jointsPerInstance;\n return (weights.x * skinJointMatrices[firstJoint + joints.x])\n + (weights.y * skinJointMatrices[firstJoint + joints.y])\n + (weights.z * skinJointMatrices[firstJoint + joints.z])\n + (weights.w * skinJointMatrices[firstJoint + joints.w]);\n}\n#else\n#ifdef HAS_LARGE_SKIN\n@group(0) @binding(auto) var<storage, read> skinJointMatrices: array<mat4x4<f32>>;\n#endif\n#endif\n\nfn getSkinMatrix(weights: vec4f, joints: vec4u) -> mat4x4<f32> {\n#ifdef HAS_LARGE_SKIN\n return (weights.x * skinJointMatrices[joints.x])\n + (weights.y * skinJointMatrices[joints.y])\n + (weights.z * skinJointMatrices[joints.z])\n + (weights.w * skinJointMatrices[joints.w]);\n#else\n return (weights.x * skin.jointMatrix[joints.x])\n + (weights.y * skin.jointMatrix[joints.y])\n + (weights.z * skin.jointMatrix[joints.z])\n + (weights.w * skin.jointMatrix[joints.w]);\n#endif\n}\n"
uniforms
readonlyuniforms:SkinUniforms
uniformTypes
readonlyuniformTypes:object
uniformTypes.jointMatrix
readonlyjointMatrix: readonly ["mat4x4<f32>",64]
vs
vs: "\nlayout(std140) uniform skinUniforms {\n mat4 jointMatrix[SKIN_MAX_JOINTS];\n} skin;\n\n#ifdef HAS_INSTANCED_SKIN\nuniform highp sampler2D skinJointMatrices;\n\nmat4 getInstancedJointMatrix(uint jointIndex, uint instanceIndex) {\n int firstColumn = int(jointIndex * 4u);\n int row = int(instanceIndex);\n return mat4(\n texelFetch(skinJointMatrices, ivec2(firstColumn, row), 0),\n texelFetch(skinJointMatrices, ivec2(firstColumn + 1, row), 0),\n texelFetch(skinJointMatrices, ivec2(firstColumn + 2, row), 0),\n texelFetch(skinJointMatrices, ivec2(firstColumn + 3, row), 0)\n );\n}\n\nmat4 getInstancedSkinMatrix(\n vec4 weights,\n uvec4 joints,\n uint instanceIndex,\n uint jointsPerInstance\n) {\n return (weights.x * getInstancedJointMatrix(joints.x, instanceIndex))\n + (weights.y * getInstancedJointMatrix(joints.y, instanceIndex))\n + (weights.z * getInstancedJointMatrix(joints.z, instanceIndex))\n + (weights.w * getInstancedJointMatrix(joints.w, instanceIndex));\n}\n#else\n#ifdef HAS_LARGE_SKIN\nuniform highp sampler2D skinJointMatrices;\n\nmat4 getSkinJointMatrix(uint jointIndex) {\n int firstColumn = int(jointIndex * 4u);\n return mat4(\n texelFetch(skinJointMatrices, ivec2(firstColumn, 0), 0),\n texelFetch(skinJointMatrices, ivec2(firstColumn + 1, 0), 0),\n texelFetch(skinJointMatrices, ivec2(firstColumn + 2, 0), 0),\n texelFetch(skinJointMatrices, ivec2(firstColumn + 3, 0), 0)\n );\n}\n#endif\n#endif\n\nmat4 getSkinMatrix(vec4 weights, uvec4 joints) {\n#ifdef HAS_LARGE_SKIN\n return (weights.x * getSkinJointMatrix(joints.x))\n + (weights.y * getSkinJointMatrix(joints.y))\n + (weights.z * getSkinJointMatrix(joints.z))\n + (weights.w * getSkinJointMatrix(joints.w));\n#else\n return (weights.x * skin.jointMatrix[joints.x])\n + (weights.y * skin.jointMatrix[joints.y])\n + (weights.z * skin.jointMatrix[joints.z])\n + (weights.w * skin.jointMatrix[joints.w]);\n#endif\n}\n\n"