UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

40 lines (38 loc) 1.38 kB
var skinVS = ` attribute vertex_boneWeights: vec4f; attribute vertex_boneIndices: vec4f; var texture_poseMap: texture_2d<f32>; struct BoneMatrix { v1: vec4f, v2: vec4f, v3: vec4f, } fn getBoneMatrix(width: i32, index: i32) -> BoneMatrix { let v = index / width; let u = index % width; var result: BoneMatrix; result.v1 = textureLoad(texture_poseMap, vec2i(u + 0, v), 0); result.v2 = textureLoad(texture_poseMap, vec2i(u + 1, v), 0); result.v3 = textureLoad(texture_poseMap, vec2i(u + 2, v), 0); return result; } fn getSkinMatrix(indicesFloat: vec4f, weights: vec4f) -> mat4x4f { let width = i32(textureDimensions(texture_poseMap).x); var indices = vec4i(indicesFloat + 0.5) * 3; let boneA = getBoneMatrix(width, indices.x); let boneB = getBoneMatrix(width, indices.y); let boneC = getBoneMatrix(width, indices.z); let boneD = getBoneMatrix(width, indices.w); let v1 = boneA.v1 * weights.x + boneB.v1 * weights.y + boneC.v1 * weights.z + boneD.v1 * weights.w; let v2 = boneA.v2 * weights.x + boneB.v2 * weights.y + boneC.v2 * weights.z + boneD.v2 * weights.w; let v3 = boneA.v3 * weights.x + boneB.v3 * weights.y + boneC.v3 * weights.z + boneD.v3 * weights.w; let one = dot(weights, vec4f(1.0, 1.0, 1.0, 1.0)); return mat4x4f( v1.x, v2.x, v3.x, 0, v1.y, v2.y, v3.y, 0, v1.z, v2.z, v3.z, 0, v1.w, v2.w, v3.w, one ); } `; export { skinVS as default };