@ifc-lite/renderer 4.2.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/edge-params.d.ts +43 -0
  2. package/dist/edge-params.d.ts.map +1 -0
  3. package/dist/edge-params.js +63 -0
  4. package/dist/edge-params.js.map +1 -0
  5. package/dist/edge-pass.d.ts +38 -0
  6. package/dist/edge-pass.d.ts.map +1 -0
  7. package/dist/edge-pass.js +111 -0
  8. package/dist/edge-pass.js.map +1 -0
  9. package/dist/index.d.ts +29 -14
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +56 -34
  12. package/dist/index.js.map +1 -1
  13. package/dist/instanced-render.d.ts +3 -3
  14. package/dist/instanced-render.js +3 -3
  15. package/dist/mesh-material.d.ts +26 -0
  16. package/dist/mesh-material.d.ts.map +1 -0
  17. package/dist/mesh-material.js +52 -0
  18. package/dist/mesh-material.js.map +1 -0
  19. package/dist/mesh-rte-uniforms.d.ts +1 -0
  20. package/dist/mesh-rte-uniforms.d.ts.map +1 -1
  21. package/dist/mesh-rte-uniforms.js +1 -0
  22. package/dist/mesh-rte-uniforms.js.map +1 -1
  23. package/dist/overlay-theme-uniforms.d.ts +54 -0
  24. package/dist/overlay-theme-uniforms.d.ts.map +1 -0
  25. package/dist/overlay-theme-uniforms.js +89 -0
  26. package/dist/overlay-theme-uniforms.js.map +1 -0
  27. package/dist/overlay-theme.d.ts +73 -0
  28. package/dist/overlay-theme.d.ts.map +1 -0
  29. package/dist/overlay-theme.js +24 -0
  30. package/dist/overlay-theme.js.map +1 -0
  31. package/dist/pipeline.d.ts +2 -0
  32. package/dist/pipeline.d.ts.map +1 -1
  33. package/dist/pipeline.js +10 -11
  34. package/dist/pipeline.js.map +1 -1
  35. package/dist/post-pass-chain.d.ts +1 -1
  36. package/dist/post-pass-chain.d.ts.map +1 -1
  37. package/dist/post-pass-chain.js +19 -13
  38. package/dist/post-pass-chain.js.map +1 -1
  39. package/dist/renderer-overlays.d.ts +8 -7
  40. package/dist/renderer-overlays.d.ts.map +1 -1
  41. package/dist/renderer-overlays.js +11 -14
  42. package/dist/renderer-overlays.js.map +1 -1
  43. package/dist/scene.d.ts +10 -1
  44. package/dist/scene.d.ts.map +1 -1
  45. package/dist/scene.js.map +1 -1
  46. package/dist/section-plane.d.ts +3 -0
  47. package/dist/section-plane.d.ts.map +1 -1
  48. package/dist/section-plane.js +15 -24
  49. package/dist/section-plane.js.map +1 -1
  50. package/dist/shaders/color-transfer.wgsl.d.ts +5 -3
  51. package/dist/shaders/color-transfer.wgsl.d.ts.map +1 -1
  52. package/dist/shaders/color-transfer.wgsl.js +5 -3
  53. package/dist/shaders/color-transfer.wgsl.js.map +1 -1
  54. package/dist/shaders/edges.wgsl.d.ts +2 -0
  55. package/dist/shaders/edges.wgsl.d.ts.map +1 -0
  56. package/dist/shaders/edges.wgsl.js +158 -0
  57. package/dist/shaders/edges.wgsl.js.map +1 -0
  58. package/dist/shaders/main.wgsl.d.ts +1 -1
  59. package/dist/shaders/main.wgsl.d.ts.map +1 -1
  60. package/dist/shaders/main.wgsl.js +81 -77
  61. package/dist/shaders/main.wgsl.js.map +1 -1
  62. package/dist/shaders/specular.wgsl.d.ts +34 -0
  63. package/dist/shaders/specular.wgsl.d.ts.map +1 -0
  64. package/dist/shaders/specular.wgsl.js +134 -0
  65. package/dist/shaders/specular.wgsl.js.map +1 -0
  66. package/dist/visual-enhancement.d.ts +10 -3
  67. package/dist/visual-enhancement.d.ts.map +1 -1
  68. package/dist/visual-enhancement.js +9 -3
  69. package/dist/visual-enhancement.js.map +1 -1
  70. package/package.json +2 -2
  71. package/dist/post-processor.d.ts +0 -46
  72. package/dist/post-processor.d.ts.map +0 -1
  73. package/dist/post-processor.js +0 -295
  74. package/dist/post-processor.js.map +0 -1
@@ -1,295 +0,0 @@
1
- /* This Source Code Form is subject to the terms of the Mozilla Public
2
- * License, v. 2.0. If a copy of the MPL was not distributed with this
3
- * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
- export class PostProcessor {
5
- _device;
6
- colorFormat;
7
- isMultisampled;
8
- uniformBuffer;
9
- uniformStaging;
10
- uniformF32;
11
- uniformU32;
12
- bindGroupLayout;
13
- pipeline;
14
- cachedBindGroup = null;
15
- cachedDepthView = null;
16
- cachedObjectIdView = null;
17
- constructor(device, sampleCount) {
18
- this._device = device.getDevice();
19
- this.colorFormat = device.getFormat();
20
- this.isMultisampled = sampleCount > 1;
21
- this.uniformStaging = new ArrayBuffer(16);
22
- this.uniformF32 = new Float32Array(this.uniformStaging);
23
- this.uniformU32 = new Uint32Array(this.uniformStaging);
24
- this.uniformBuffer = this._device.createBuffer({
25
- size: 16,
26
- usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
27
- });
28
- this.bindGroupLayout = this._device.createBindGroupLayout({
29
- entries: [
30
- {
31
- binding: 0,
32
- visibility: GPUShaderStage.FRAGMENT,
33
- texture: { sampleType: 'depth', viewDimension: '2d', multisampled: this.isMultisampled },
34
- },
35
- {
36
- binding: 1,
37
- visibility: GPUShaderStage.FRAGMENT,
38
- texture: { sampleType: 'unfilterable-float', viewDimension: '2d', multisampled: this.isMultisampled },
39
- },
40
- {
41
- binding: 2,
42
- visibility: GPUShaderStage.FRAGMENT,
43
- buffer: { type: 'uniform' },
44
- },
45
- ],
46
- });
47
- const depthTexDecl = this.isMultisampled
48
- ? '@group(0) @binding(0) var depthTex: texture_depth_multisampled_2d;'
49
- : '@group(0) @binding(0) var depthTex: texture_depth_2d;';
50
- const idTexDecl = this.isMultisampled
51
- ? '@group(0) @binding(1) var idTex: texture_multisampled_2d<f32>;'
52
- : '@group(0) @binding(1) var idTex: texture_2d<f32>;';
53
- const depthLoadExpr = this.isMultisampled
54
- ? 'textureLoad(depthTex, c, 0u)'
55
- : 'textureLoad(depthTex, c, 0)';
56
- const idLoadExpr = this.isMultisampled
57
- ? 'textureLoad(idTex, c, 0u)'
58
- : 'textureLoad(idTex, c, 0)';
59
- const shader = this._device.createShaderModule({
60
- code: `
61
- struct Params {
62
- seamRadiusPx: f32,
63
- seamIntensity: f32,
64
- highQuality: u32,
65
- _pad: u32,
66
- }
67
-
68
- ${depthTexDecl}
69
- ${idTexDecl}
70
- @group(0) @binding(2) var<uniform> params: Params;
71
-
72
- struct VsOut {
73
- @builtin(position) pos: vec4<f32>,
74
- }
75
-
76
- @vertex
77
- fn vs_main(@builtin(vertex_index) v: u32) -> VsOut {
78
- var o: VsOut;
79
- var p = array<vec2<f32>, 3>(
80
- vec2<f32>(-1.0, -3.0),
81
- vec2<f32>(-1.0, 1.0),
82
- vec2<f32>( 3.0, 1.0)
83
- );
84
- o.pos = vec4<f32>(p[v], 0.0, 1.0);
85
- return o;
86
- }
87
-
88
- fn sampleDepthClamped(ip: vec2<i32>, dims: vec2<i32>) -> f32 {
89
- let c = vec2<i32>(clamp(ip.x, 0, dims.x - 1), clamp(ip.y, 0, dims.y - 1));
90
- return ${depthLoadExpr};
91
- }
92
-
93
- fn decodeId24(encoded: vec4<f32>) -> u32 {
94
- let r = u32(round(encoded.r * 255.0)) & 255u;
95
- let g = u32(round(encoded.g * 255.0)) & 255u;
96
- let b = u32(round(encoded.b * 255.0)) & 255u;
97
- return (r << 16u) | (g << 8u) | b;
98
- }
99
-
100
- fn sampleIdClamped(ip: vec2<i32>, dims: vec2<i32>) -> u32 {
101
- let c = vec2<i32>(clamp(ip.x, 0, dims.x - 1), clamp(ip.y, 0, dims.y - 1));
102
- return decodeId24(${idLoadExpr});
103
- }
104
-
105
- @fragment
106
- fn fs_main(@builtin(position) fragPos: vec4<f32>) -> @location(0) vec4<f32> {
107
- let dimsU = textureDimensions(depthTex);
108
- let dims = vec2<i32>(i32(dimsU.x), i32(dimsU.y));
109
- let p = vec2<i32>(i32(fragPos.x), i32(fragPos.y));
110
-
111
- let center = sampleDepthClamped(p, dims);
112
- if (center <= 0.00001) {
113
- return vec4<f32>(0.0, 0.0, 0.0, 0.0);
114
- }
115
-
116
- var seam = 0.0;
117
- {
118
- let idCenter = sampleIdClamped(p, dims);
119
- if (idCenter != 0u) {
120
- let rs = max(1, i32(params.seamRadiusPx));
121
- let idX1 = sampleIdClamped(p + vec2<i32>( rs, 0), dims);
122
- let idX0 = sampleIdClamped(p + vec2<i32>(-rs, 0), dims);
123
- let idY1 = sampleIdClamped(p + vec2<i32>(0, rs), dims);
124
- let idY0 = sampleIdClamped(p + vec2<i32>(0, -rs), dims);
125
-
126
- // Sample depths at same positions to filter coplanar entity boundaries.
127
- // Coplanar surfaces from different entities only differ by the z-hash
128
- // anti-z-fighting offset (~2.5e-4 relative). Two complementary gates:
129
- // - slope-aware first difference: depth-DISCONTINUOUS edges
130
- // (silhouettes, one surface occluding another).
131
- // - per-axis second difference > 3e-4: depth-CONTINUOUS creases
132
- // (wall/wall and floor/wall corners). At a corner the depth slope
133
- // changes across the seam, so |d(+r) + d(-r) - 2*center| measures
134
- // the slope mismatch; it stays at the z-hash offset (<= 2.55e-4)
135
- // for coplanar continuations. The old first-difference-only gate
136
- // flickered around its threshold along corners -> DASHED lines.
137
- // Known accepted edges of this gate: a coplanar feature narrower than
138
- // 2*rs px puts BOTH taps on the other entity (sum of two hash offsets,
139
- // up to 5.1e-4, can fire) — narrow inter-entity features deserve a seam
140
- // line anyway. In ortho the z-hash offset shrinks with the scene-fitted
141
- // far-near range, so large ortho views fall back to the 5e-4 gate.
142
- let sX1 = sampleDepthClamped(p + vec2<i32>( rs, 0), dims);
143
- let sX0 = sampleDepthClamped(p + vec2<i32>(-rs, 0), dims);
144
- let sY1 = sampleDepthClamped(p + vec2<i32>(0, rs), dims);
145
- let sY0 = sampleDepthClamped(p + vec2<i32>(0, -rs), dims);
146
- let depthRef = max(center, 0.0001);
147
- let depthRelThreshold = 5e-4;
148
- let creaseRelThreshold = 3e-4;
149
- let creaseX = abs(sX1 + sX0 - 2.0 * center) / depthRef > creaseRelThreshold;
150
- let creaseY = abs(sY1 + sY0 - 2.0 * center) / depthRef > creaseRelThreshold;
151
-
152
- // Discontinuity gate, slope-aware: a depth jump only counts as an
153
- // occlusion edge when it clearly exceeds the in-plane slope measured
154
- // on the OPPOSITE side of the pixel (2x asymmetry) on top of the
155
- // absolute floor. A flush coplanar joint viewed at a grazing angle
156
- // carries a huge per-pixel slope that used to trip the absolute
157
- // threshold and draw noisy dashed lines across floors/walls; its
158
- // jumps are symmetric, so the asymmetry test suppresses it. Genuine
159
- // silhouettes jump far beyond the opposite-side slope. Features whose
160
- // depth step shrinks below the local slope are sub-pixel at that
161
- // angle anyway, so fading their line out is the correct behaviour.
162
- let jX1 = abs(sX1 - center) / depthRef;
163
- let jX0 = abs(sX0 - center) / depthRef;
164
- let jY1 = abs(sY1 - center) / depthRef;
165
- let jY0 = abs(sY0 - center) / depthRef;
166
- let discX1 = jX1 > max(depthRelThreshold, 2.0 * jX0);
167
- let discX0 = jX0 > max(depthRelThreshold, 2.0 * jX1);
168
- let discY1 = jY1 > max(depthRelThreshold, 2.0 * jY0);
169
- let discY0 = jY0 > max(depthRelThreshold, 2.0 * jY1);
170
-
171
- let edge4Count =
172
- f32(idX1 != idCenter && idX1 != 0u && (creaseX || discX1)) +
173
- f32(idX0 != idCenter && idX0 != 0u && (creaseX || discX0)) +
174
- f32(idY1 != idCenter && idY1 != 0u && (creaseY || discY1)) +
175
- f32(idY0 != idCenter && idY0 != 0u && (creaseY || discY0));
176
- seam = edge4Count * 0.25;
177
-
178
- if (params.highQuality == 1u) {
179
- let idD1 = sampleIdClamped(p + vec2<i32>( rs, rs), dims);
180
- let idD2 = sampleIdClamped(p + vec2<i32>(-rs, rs), dims);
181
- let idD3 = sampleIdClamped(p + vec2<i32>( rs, -rs), dims);
182
- let idD4 = sampleIdClamped(p + vec2<i32>(-rs, -rs), dims);
183
- let sD1 = sampleDepthClamped(p + vec2<i32>( rs, rs), dims);
184
- let sD2 = sampleDepthClamped(p + vec2<i32>(-rs, rs), dims);
185
- let sD3 = sampleDepthClamped(p + vec2<i32>( rs, -rs), dims);
186
- let sD4 = sampleDepthClamped(p + vec2<i32>(-rs, -rs), dims);
187
- // Same crease + slope-aware discontinuity gates along the diagonals.
188
- let creaseD1 = abs(sD1 + sD4 - 2.0 * center) / depthRef > creaseRelThreshold;
189
- let creaseD2 = abs(sD2 + sD3 - 2.0 * center) / depthRef > creaseRelThreshold;
190
- let jD1 = abs(sD1 - center) / depthRef;
191
- let jD2 = abs(sD2 - center) / depthRef;
192
- let jD3 = abs(sD3 - center) / depthRef;
193
- let jD4 = abs(sD4 - center) / depthRef;
194
- let discD1 = jD1 > max(depthRelThreshold, 2.0 * jD4);
195
- let discD4 = jD4 > max(depthRelThreshold, 2.0 * jD1);
196
- let discD2 = jD2 > max(depthRelThreshold, 2.0 * jD3);
197
- let discD3 = jD3 > max(depthRelThreshold, 2.0 * jD2);
198
- let edgeDiagCount =
199
- f32(idD1 != idCenter && idD1 != 0u && (creaseD1 || discD1)) +
200
- f32(idD2 != idCenter && idD2 != 0u && (creaseD2 || discD2)) +
201
- f32(idD3 != idCenter && idD3 != 0u && (creaseD2 || discD3)) +
202
- f32(idD4 != idCenter && idD4 != 0u && (creaseD1 || discD4));
203
- let edgeDiag = edgeDiagCount * 0.25;
204
- seam = max(seam, (seam + edgeDiag) * 0.5);
205
- }
206
- }
207
- }
208
-
209
- let seamDarken = clamp(seam * params.seamIntensity, 0.0, 0.35);
210
- return vec4<f32>(0.0, 0.0, 0.0, seamDarken);
211
- }
212
- `,
213
- });
214
- this.pipeline = this._device.createRenderPipeline({
215
- layout: this._device.createPipelineLayout({ bindGroupLayouts: [this.bindGroupLayout] }),
216
- vertex: {
217
- module: shader,
218
- entryPoint: 'vs_main',
219
- },
220
- fragment: {
221
- module: shader,
222
- entryPoint: 'fs_main',
223
- targets: [{
224
- format: this.colorFormat,
225
- blend: {
226
- color: {
227
- srcFactor: 'zero',
228
- dstFactor: 'one-minus-src-alpha',
229
- },
230
- alpha: {
231
- srcFactor: 'zero',
232
- dstFactor: 'one',
233
- },
234
- },
235
- }],
236
- },
237
- primitive: {
238
- topology: 'triangle-list',
239
- cullMode: 'none',
240
- },
241
- });
242
- }
243
- /**
244
- * Draw the separation lines over `targetView` in a fullscreen overlay pass.
245
- */
246
- apply(commandEncoder, options) {
247
- if (this.destroyed)
248
- return;
249
- const highQuality = options.quality === 'high';
250
- this.uniformF32[0] = highQuality ? options.radius : 1.0;
251
- this.uniformF32[1] = options.intensity;
252
- this.uniformU32[2] = highQuality ? 1 : 0;
253
- this.uniformU32[3] = 0;
254
- this._device.queue.writeBuffer(this.uniformBuffer, 0, this.uniformStaging);
255
- if (this.cachedDepthView !== options.depthView || this.cachedObjectIdView !== options.objectIdView || this.cachedBindGroup === null) {
256
- this.cachedBindGroup = this._device.createBindGroup({
257
- layout: this.bindGroupLayout,
258
- entries: [
259
- { binding: 0, resource: options.depthView },
260
- { binding: 1, resource: options.objectIdView },
261
- { binding: 2, resource: { buffer: this.uniformBuffer } },
262
- ],
263
- });
264
- this.cachedDepthView = options.depthView;
265
- this.cachedObjectIdView = options.objectIdView;
266
- }
267
- const pass = commandEncoder.beginRenderPass({
268
- colorAttachments: [{
269
- view: options.targetView,
270
- loadOp: 'load',
271
- storeOp: 'store',
272
- }],
273
- });
274
- pass.setPipeline(this.pipeline);
275
- pass.setBindGroup(0, this.cachedBindGroup);
276
- pass.draw(3, 1, 0, 0);
277
- pass.end();
278
- }
279
- destroyed = false;
280
- /**
281
- * Destroy all GPU resources held by this post-processor.
282
- * After calling this method the post-processor is no longer usable.
283
- * Safe to call multiple times.
284
- */
285
- destroy() {
286
- if (this.destroyed)
287
- return;
288
- this.destroyed = true;
289
- this.uniformBuffer.destroy();
290
- this.cachedBindGroup = null;
291
- this.cachedDepthView = null;
292
- this.cachedObjectIdView = null;
293
- }
294
- }
295
- //# sourceMappingURL=post-processor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"post-processor.js","sourceRoot":"","sources":["../src/post-processor.ts"],"names":[],"mappings":"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"}