Skip to content

Commit a5484ac

Browse files
committed
fix surface vectors on curved meshes
1 parent 648064f commit a5484ac

2 files changed

Lines changed: 45 additions & 5 deletions

File tree

ngsolve_webgpu/shaders/surface_vectors.wgsl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@
1414
fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
1515
let n_trigs = mesh.num_trigs;
1616
for (var trigId = id.x; trigId<n_trigs; trigId+=256*1024) {
17-
let p = loadTriangle(trigId).p;
17+
var p = loadTriangle(trigId).p;
1818

19+
if (mesh.is_curved == 1u) {
20+
p[0] = evalTrigVec3(&mesh.data, trigId, vec2f(1.0, 0.0), mesh.offset_curvature_2d);
21+
p[1] = evalTrigVec3(&mesh.data, trigId, vec2f(0.0, 1.0), mesh.offset_curvature_2d);
22+
p[2] = evalTrigVec3(&mesh.data, trigId, vec2f(0.0, 0.0), mesh.offset_curvature_2d);
23+
}
24+
1925
let gridsize = u_gridsize;
2026

2127
var dir: u32 =0;
@@ -78,9 +84,6 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
7884
let dir_im = v_ri.im / max(val, 1e-10);
7985
#endif SCALE_BY_VALUE
8086
let index = atomicAdd(&count_vectors, 1);
81-
if (mesh.is_curved == 1u) {
82-
cp = evalTrigVec3(&mesh.data, trigId, eval_lam, mesh.offset_curvature_2d);
83-
}
8487
cp += 0.5 * gridsize * normalize(n);
8588

8689
positions[index*3+0] = cp[0];

ngsolve_webgpu/shaders/surface_vectors_count.wgsl

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,48 @@
33
@group(0) @binding(21) var<storage, read_write> count_vectors: atomic<u32>;
44
@group(0) @binding(31) var<uniform> u_gridsize: f32;
55

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+
637
@compute @workgroup_size(256)
738
fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
839
let n_trigs = mesh.num_trigs;
940
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+
}
1148

1249
let gridsize = u_gridsize;
1350

0 commit comments

Comments
 (0)