forked from 1b-agent/opencadstudio-upstream
feat(web): render hatches on WebGL2 via a texture-backed renderer
WebGL2 has no vertex/fragment storage buffers, so the batched storage-buffer hatch renderer (hatch_gpu) is disabled on wasm and real hatch fills never rendered on the web build — the pick highlighted the boundary and the command then appeared to cancel (issue #204). Add a wasm-only per-hatch renderer (hatch_web_gpu + hatch_web.wgsl) that packs the variable-length boundary / family / dash arrays into one RGBA32F data texture read with textureLoad, instead of the fixed-size uniforms of the wipeout path. This removes the MAX_FAMILIES (16) / MAX_HATCH_BOUNDARY_VERTS (1024) / MAX_DASHES (128) caps, so every hatch — solid, gradient, and arbitrarily complex line patterns — renders on the web. The fill algorithm (in_polygon, per-family line/dash/dot, gradient, LOD, double-single vertex transform) is identical to the desktop path; only the array ACCESS changes. Pattern phase is anchored at world_origin with the boundary stored raw, and scale / gradient-range clamped, to match the desktop batched renderer exactly. Native (hatch_gpu + hatch.wgsl) and the wipeout mask renderer are untouched; the new module and pipeline are gated on target_arch = "wasm32". Also silence the resulting (and pre-existing) wasm-only dead-code warnings for native-only paths so both the native and web builds compile clean. Closes #204. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
9b1a495549
commit
a4fc34c6a2
11 files changed
+745
-13
No files matched your search
@@ -319,10 +319,10 @@ impl shader::Primitive for Primitive {
|
||||
let sel_changed = vp.selected_sig != inner.cached_epoch.2;
|
||||
if geo_changed || sel_changed {
|
||||
if fill_mode {
|
||||
inner.upload_hatches(device, &vp.hatches[..]);
|
||||
inner.upload_hatches(device, queue, &vp.hatches[..]);
|
||||
inner.upload_wipeouts(device, &vp.wipeout_hatches[..]);
|
||||
} else {
|
||||
inner.upload_hatches(device, &[]);
|
||||
inner.upload_hatches(device, queue, &[]);
|
||||
inner.upload_wipeouts(device, &[]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user