summaryrefslogtreecommitdiff
path: root/client/src/shaders/vertex_world_skin.wgsl
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/shaders/vertex_world_skin.wgsl')
-rw-r--r--client/src/shaders/vertex_world_skin.wgsl17
1 files changed, 12 insertions, 5 deletions
diff --git a/client/src/shaders/vertex_world_skin.wgsl b/client/src/shaders/vertex_world_skin.wgsl
index 633f06b..6e2b308 100644
--- a/client/src/shaders/vertex_world_skin.wgsl
+++ b/client/src/shaders/vertex_world_skin.wgsl
@@ -31,7 +31,7 @@ struct VertexOut {
struct PushConst {
modelviewproject: mat4x4<f32>,
- modelview: mat4x4<f32>,
+ model: mat4x4<f32>,
}
@group(3) @binding(0) var<uniform> joints: array<mat4x4<f32>, 128>;
@@ -39,13 +39,20 @@ var<push_constant> pc: PushConst;
@vertex
fn main(vi: VertexIn) -> VertexOut {
- let clip = pc.modelview * vec4(vi.position, 1.);
+ let pos_in = vec4(vi.position, 1.);
+ let j0 = vi.joint_weight.x * (joints[vi.joint_index.x] * pos_in);
+ let j1 = vi.joint_weight.y * (joints[vi.joint_index.y] * pos_in);
+ let j2 = vi.joint_weight.z * (joints[vi.joint_index.z] * pos_in);
+ let j3 = vi.joint_weight.w * (joints[vi.joint_index.w] * pos_in);
+ let position = j0 + j1 + j2 + j3;
+
+ let clip = pc.modelviewproject * position;
let vo = VertexOut(
clip,
- normalize((pc.modelview * vec4(vi.normal, 0.)).xyz),
- normalize((pc.modelview * vec4(vi.tangent, 0.)).xyz),
+ normalize((pc.model * vec4(vi.normal, 0.)).xyz),
+ normalize((pc.model * vec4(vi.tangent, 0.)).xyz),
vi.texcoord,
- (pc.modelview * vec4(vi.position, 1.)).xyz,
+ (pc.model * vec4(vi.position, 1.)).xyz,
);
return vo;
}