|
3 | 3 | @group(0) @binding(21) var<storage, read_write> count_vectors: atomic<u32>; |
4 | 4 | @group(0) @binding(31) var<uniform> u_gridsize: f32; |
5 | 5 |
|
| 6 | +// Inline curved position evaluation using mesh curvature data (de Casteljau). |
| 7 | +// Avoids importing eval/trig which would declare extra storage bindings. |
| 8 | +fn evalCurvedPos(id: u32, lam: vec2f) -> vec3f { |
| 9 | + let offset_ = mesh.offset_curvature_2d; |
| 10 | + let order = i32(mesh.data[offset_ + 1]); |
| 11 | + let ncomp = u32(mesh.data[offset_ + 0]); |
| 12 | + let ndof = u32((order + 1) * (order + 2) / 2); |
| 13 | + let stride = ncomp; |
| 14 | + let offset = offset_ + ndof * id * stride + 3u; |
| 15 | + let b = vec3f(lam.x, lam.y, 1.0 - lam.x - lam.y); |
| 16 | + let dy = order + 1; |
| 17 | + |
| 18 | + var w: array<vec3f, 15>; |
| 19 | + for (var i: u32 = 0u; i < min(ndof, 15u); i++) { |
| 20 | + w[i] = vec3f(mesh.data[offset + i * stride], |
| 21 | + mesh.data[offset + i * stride + 1], |
| 22 | + mesh.data[offset + i * stride + 2]); |
| 23 | + } |
| 24 | + |
| 25 | + for (var n = order; n > 0; n--) { |
| 26 | + var i0 = 0; |
| 27 | + for (var iy = 0; iy < n; iy++) { |
| 28 | + for (var ix = 0; ix < n - iy; ix++) { |
| 29 | + w[i0 + ix] = mat3x3<f32>(w[i0 + ix], w[i0 + ix + 1], w[i0 + ix + dy - iy]) * b; |
| 30 | + } |
| 31 | + i0 += dy - iy; |
| 32 | + } |
| 33 | + } |
| 34 | + return w[0]; |
| 35 | +} |
| 36 | + |
6 | 37 | @compute @workgroup_size(256) |
7 | 38 | fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) { |
8 | 39 | let n_trigs = mesh.num_trigs; |
9 | 40 | for (var trigId = id.x; trigId<n_trigs; trigId+=256*1024) { |
10 | | - let p = loadTriangle(trigId).p; |
| 41 | + var p = loadTriangle(trigId).p; |
| 42 | + |
| 43 | + if (mesh.is_curved == 1u) { |
| 44 | + p[0] = evalCurvedPos(trigId, vec2f(1.0, 0.0)); |
| 45 | + p[1] = evalCurvedPos(trigId, vec2f(0.0, 1.0)); |
| 46 | + p[2] = evalCurvedPos(trigId, vec2f(0.0, 0.0)); |
| 47 | + } |
11 | 48 |
|
12 | 49 | let gridsize = u_gridsize; |
13 | 50 |
|
|
0 commit comments