#version 460 #extension GL_GOOGLE_include_directive : require #include "lovr.glsl" layout(local_size_x = 32, local_size_x_id = 0) in; layout(push_constant) uniform PushConstants { uint baseVertex; uint vertexCount; uint blendShapeCount; uint baseBlendVertex; }; struct ModelVertex { float px, py, pz; float nx, ny, nz; float u, v; uint color; float tx, ty, tz; }; struct BlendVertex { float px, py, pz; float nx, ny, nz; float tx, ty, tz; }; layout(set = 0, binding = 0) buffer restrict readonly VertexIn { ModelVertex vertexIn[]; }; layout(set = 0, binding = 1) buffer restrict writeonly VertexOut { ModelVertex vertexOut[]; }; layout(set = 0, binding = 2) buffer restrict readonly BlendVertices { BlendVertex blendVertex[]; }; layout(set = 0, binding = 3) uniform Weights { vec4 weights[32]; }; void lovrmain() { if (GlobalThreadID.x >= vertexCount) return; uint vertexIndex = baseVertex + GlobalThreadID.x; uint blendVertexIndex = baseBlendVertex + GlobalThreadID.x; vertexOut[vertexIndex] = vertexIn[vertexIndex]; for (uint i = 0; i < blendShapeCount; i++, blendVertexIndex += vertexCount) { float weight = weights[i / 4][i % 4]; if (weight == 0.) { continue; } vertexOut[vertexIndex].px += blendVertex[blendVertexIndex].px * weight; vertexOut[vertexIndex].py += blendVertex[blendVertexIndex].py * weight; vertexOut[vertexIndex].pz += blendVertex[blendVertexIndex].pz * weight; vertexOut[vertexIndex].nx += blendVertex[blendVertexIndex].nx * weight; vertexOut[vertexIndex].ny += blendVertex[blendVertexIndex].ny * weight; vertexOut[vertexIndex].nz += blendVertex[blendVertexIndex].nz * weight; vertexOut[vertexIndex].tx += blendVertex[blendVertexIndex].tx * weight; vertexOut[vertexIndex].ty += blendVertex[blendVertexIndex].ty * weight; vertexOut[vertexIndex].tz += blendVertex[blendVertexIndex].tz * weight; } }