@ifc-lite/drawing-2d 2.0.0 → 2.1.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.
- package/dist/color-raster.d.ts +95 -0
- package/dist/color-raster.d.ts.map +1 -0
- package/dist/color-raster.js +225 -0
- package/dist/color-raster.js.map +1 -0
- package/dist/drawing-generator.d.ts +12 -0
- package/dist/drawing-generator.d.ts.map +1 -1
- package/dist/drawing-generator.js +13 -4
- package/dist/drawing-generator.js.map +1 -1
- package/dist/edge-extractor.d.ts +17 -0
- package/dist/edge-extractor.d.ts.map +1 -1
- package/dist/edge-extractor.js +95 -0
- package/dist/edge-extractor.js.map +1 -1
- package/dist/half-space-clip.d.ts +77 -0
- package/dist/half-space-clip.d.ts.map +1 -0
- package/dist/half-space-clip.js +257 -0
- package/dist/half-space-clip.js.map +1 -0
- package/dist/hidden-line-raster.d.ts +11 -2
- package/dist/hidden-line-raster.d.ts.map +1 -1
- package/dist/hidden-line-raster.js +7 -58
- package/dist/hidden-line-raster.js.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -1
- package/dist/index.js.map +1 -1
- package/dist/pdf-scale.d.ts +17 -0
- package/dist/pdf-scale.d.ts.map +1 -1
- package/dist/pdf-scale.js +38 -0
- package/dist/pdf-scale.js.map +1 -1
- package/dist/raster-core.d.ts +71 -0
- package/dist/raster-core.d.ts.map +1 -0
- package/dist/raster-core.js +89 -0
- package/dist/raster-core.js.map +1 -0
- package/dist/sheet/index.d.ts +2 -0
- package/dist/sheet/index.d.ts.map +1 -1
- package/dist/sheet/index.js +1 -0
- package/dist/sheet/index.js.map +1 -1
- package/dist/sheet/scale-stamp.d.ts +130 -0
- package/dist/sheet/scale-stamp.d.ts.map +1 -0
- package/dist/sheet/scale-stamp.js +277 -0
- package/dist/sheet/scale-stamp.js.map +1 -0
- package/dist/view-plane.d.ts +99 -0
- package/dist/view-plane.d.ts.map +1 -0
- package/dist/view-plane.js +183 -0
- package/dist/view-plane.js.map +1 -0
- package/dist/world-line-seeds.d.ts +41 -0
- package/dist/world-line-seeds.d.ts.map +1 -0
- package/dist/world-line-seeds.js +43 -0
- package/dist/world-line-seeds.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flat-shaded RGBA raster of a section view - the "solid, coloured" underlay
|
|
3
|
+
* for the to-scale PDF export (issue #2042). The vector line work is drawn on
|
|
4
|
+
* top of it, so everything an engineer measures stays a stroke; the raster
|
|
5
|
+
* only supplies the surfaces the viewport shows and monochrome line work does
|
|
6
|
+
* not.
|
|
7
|
+
*
|
|
8
|
+
* # Frame identity
|
|
9
|
+
* The raster is built in the SAME 2D drawing frame as the lines: projection
|
|
10
|
+
* and depth come from `projectPointForPlane` / `signedDepth`, and
|
|
11
|
+
* {@link ColorRaster.bounds} is the projected extent with NO margin, spanned
|
|
12
|
+
* edge-to-edge by the pixel grid:
|
|
13
|
+
*
|
|
14
|
+
* `u = (x - bounds.min.x) / boundsWidth * width`
|
|
15
|
+
* `v = (bounds.max.y - y) / boundsHeight * height`
|
|
16
|
+
*
|
|
17
|
+
* with pixel `(i, j)` sampled at `(i + 0.5, j + 0.5)`. Row 0 is therefore the
|
|
18
|
+
* TOP of the drawing (world `max.y`), which is also the top of the paper, so
|
|
19
|
+
* no consumer needs a second flip. Placing the image at the rectangle you get
|
|
20
|
+
* by pushing `bounds` through `worldPointToPdfMm` with the transform the
|
|
21
|
+
* strokes use leaves at most half a pixel of registration error.
|
|
22
|
+
*
|
|
23
|
+
* Note this deliberately differs from `hidden-line-raster.ts`, which maps the
|
|
24
|
+
* extent onto `width - 1` (pixel CENTRES at the bounds edges). That is right
|
|
25
|
+
* for sampling a depth buffer and wrong for an image whose rectangle must
|
|
26
|
+
* cover the extent exactly.
|
|
27
|
+
*
|
|
28
|
+
* # Shading
|
|
29
|
+
* Flat per-face Lambert, `0.4 + 0.6 * abs(dot(faceNormal, viewDir))`, off a
|
|
30
|
+
* normal recomputed from the triangle's own positions. Both details are
|
|
31
|
+
* forced by the data: `MeshData.normals` may be absent or stale, and winding
|
|
32
|
+
* is unreliable by design (see `MeshData.indices`), so a signed dot would
|
|
33
|
+
* paint half the surfaces of an ordinary IFC model black.
|
|
34
|
+
*
|
|
35
|
+
* # Transparency
|
|
36
|
+
* Two passes, no sorting: opaque meshes write colour AND depth, then
|
|
37
|
+
* translucent meshes test against that depth buffer without writing it and
|
|
38
|
+
* blend `a * src + (1 - a) * dst`. Translucent-over-translucent therefore
|
|
39
|
+
* composites in mesh iteration order rather than back-to-front, which is an
|
|
40
|
+
* approximation - and one that is strictly closer to the viewport than
|
|
41
|
+
* either treating glass as opaque or dropping it.
|
|
42
|
+
*/
|
|
43
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
44
|
+
import type { Bounds2D, SectionPlaneConfig } from './types.js';
|
|
45
|
+
/** Default dots-per-inch of paper for the shaded underlay. */
|
|
46
|
+
export declare const DEFAULT_SHADING_DPI = 150;
|
|
47
|
+
/** Hard cap on total pixels (2^24): ~67MB RGBA + ~67MB depth while building. */
|
|
48
|
+
export declare const MAX_SHADING_PIXELS = 16777216;
|
|
49
|
+
/** Hard cap per side, chosen to stay inside canvas implementation limits. */
|
|
50
|
+
export declare const MAX_SHADING_DIMENSION_PX = 16384;
|
|
51
|
+
export interface ColorRaster {
|
|
52
|
+
/** RGBA8 straight alpha, row-major, ROW 0 = TOP of the drawing (world max.y). */
|
|
53
|
+
pixels: Uint8ClampedArray;
|
|
54
|
+
width: number;
|
|
55
|
+
height: number;
|
|
56
|
+
/** Drawing-frame 2D rect (metres) the pixel grid spans EXACTLY (no margin). */
|
|
57
|
+
bounds: Bounds2D;
|
|
58
|
+
}
|
|
59
|
+
export interface ColorRasterOptions {
|
|
60
|
+
widthPx: number;
|
|
61
|
+
heightPx: number;
|
|
62
|
+
/** View-depth slack for triangles straddling the cut plane. Default 0.001. */
|
|
63
|
+
depthBias?: number;
|
|
64
|
+
}
|
|
65
|
+
export interface RasterFit {
|
|
66
|
+
widthPx: number;
|
|
67
|
+
heightPx: number;
|
|
68
|
+
/** The dpi actually achieved; equals the requested dpi unless a cap engaged. */
|
|
69
|
+
effectiveDpi: number;
|
|
70
|
+
capped: boolean;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Pixel grid for a drawing of `drawingWidthMm` x `drawingHeightMm` at `dpi`,
|
|
74
|
+
* reduced to fit `maxPixels` in total and `maxDimensionPx` per side.
|
|
75
|
+
*
|
|
76
|
+
* Reduction scales BOTH sides by the same factor, so the aspect ratio (and
|
|
77
|
+
* therefore the placement rectangle, which is derived from world bounds and
|
|
78
|
+
* never from pixel counts) is unaffected: a capped raster is blurrier, never
|
|
79
|
+
* mis-scaled.
|
|
80
|
+
*
|
|
81
|
+
* Pure arithmetic, cheap enough to call per keystroke. Throws on non-finite
|
|
82
|
+
* or non-positive inputs rather than returning a plausible-looking grid, on
|
|
83
|
+
* the same reasoning as `computePdfScaleLayout`.
|
|
84
|
+
*/
|
|
85
|
+
export declare function fitRasterPixels(drawingWidthMm: number, drawingHeightMm: number, dpi: number, maxPixels: number, maxDimensionPx: number): RasterFit;
|
|
86
|
+
/**
|
|
87
|
+
* Rasterize `meshes` into a shaded RGBA image covering their projected extent
|
|
88
|
+
* in the kept half of the section (`viewDepth` in `[0, occluderDepth]`).
|
|
89
|
+
*
|
|
90
|
+
* Returns `null` when nothing lands in that window or the extent is
|
|
91
|
+
* degenerate: there is no rectangle to place an image at, and the caller must
|
|
92
|
+
* fall back to line work only rather than emit a zero-size image.
|
|
93
|
+
*/
|
|
94
|
+
export declare function buildColorRaster(meshes: readonly MeshData[], plane: SectionPlaneConfig, occluderDepth: number, options: ColorRasterOptions): ColorRaster | null;
|
|
95
|
+
//# sourceMappingURL=color-raster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-raster.d.ts","sourceRoot":"","sources":["../src/color-raster.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAQ,MAAM,YAAY,CAAC;AAYrE,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,WAAa,CAAC;AAC7C,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,GACrB,SAAS,CAmCX;AAgBD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,KAAK,EAAE,kBAAkB,EACzB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,kBAAkB,GAC1B,WAAW,GAAG,IAAI,CA8CpB"}
|
|
@@ -0,0 +1,225 @@
|
|
|
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
|
+
import { EPSILON } from './math.js';
|
|
5
|
+
import { signedDepth, projectPointForPlane, getViewDirectionForPlane } from './projection-bands.js';
|
|
6
|
+
import { getVertex, barycentricCoords, computeProjectedBounds } from './raster-core.js';
|
|
7
|
+
/** Alpha at or above which a mesh is rasterized in the opaque pass. */
|
|
8
|
+
const OPAQUE_ALPHA = 0.999;
|
|
9
|
+
/** Ambient term: the darkest a fully edge-on face may go. */
|
|
10
|
+
const AMBIENT = 0.4;
|
|
11
|
+
/** Diffuse term scaling `abs(dot(n, viewDir))`. */
|
|
12
|
+
const DIFFUSE = 0.6;
|
|
13
|
+
/** Default dots-per-inch of paper for the shaded underlay. */
|
|
14
|
+
export const DEFAULT_SHADING_DPI = 150;
|
|
15
|
+
/** Hard cap on total pixels (2^24): ~67MB RGBA + ~67MB depth while building. */
|
|
16
|
+
export const MAX_SHADING_PIXELS = 16_777_216;
|
|
17
|
+
/** Hard cap per side, chosen to stay inside canvas implementation limits. */
|
|
18
|
+
export const MAX_SHADING_DIMENSION_PX = 16_384;
|
|
19
|
+
/**
|
|
20
|
+
* Pixel grid for a drawing of `drawingWidthMm` x `drawingHeightMm` at `dpi`,
|
|
21
|
+
* reduced to fit `maxPixels` in total and `maxDimensionPx` per side.
|
|
22
|
+
*
|
|
23
|
+
* Reduction scales BOTH sides by the same factor, so the aspect ratio (and
|
|
24
|
+
* therefore the placement rectangle, which is derived from world bounds and
|
|
25
|
+
* never from pixel counts) is unaffected: a capped raster is blurrier, never
|
|
26
|
+
* mis-scaled.
|
|
27
|
+
*
|
|
28
|
+
* Pure arithmetic, cheap enough to call per keystroke. Throws on non-finite
|
|
29
|
+
* or non-positive inputs rather than returning a plausible-looking grid, on
|
|
30
|
+
* the same reasoning as `computePdfScaleLayout`.
|
|
31
|
+
*/
|
|
32
|
+
export function fitRasterPixels(drawingWidthMm, drawingHeightMm, dpi, maxPixels, maxDimensionPx) {
|
|
33
|
+
for (const [name, value] of [
|
|
34
|
+
['drawingWidthMm', drawingWidthMm],
|
|
35
|
+
['drawingHeightMm', drawingHeightMm],
|
|
36
|
+
['dpi', dpi],
|
|
37
|
+
['maxPixels', maxPixels],
|
|
38
|
+
['maxDimensionPx', maxDimensionPx],
|
|
39
|
+
]) {
|
|
40
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
41
|
+
throw new Error(`Invalid shading raster ${name}: ${value}. Expected a positive finite number.`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let widthPx = Math.max(1, Math.ceil((drawingWidthMm * dpi) / 25.4));
|
|
45
|
+
let heightPx = Math.max(1, Math.ceil((drawingHeightMm * dpi) / 25.4));
|
|
46
|
+
const requestedPixels = widthPx * heightPx;
|
|
47
|
+
let scale = 1;
|
|
48
|
+
if (requestedPixels > maxPixels) {
|
|
49
|
+
scale = Math.sqrt(maxPixels / requestedPixels);
|
|
50
|
+
}
|
|
51
|
+
if (widthPx * scale > maxDimensionPx) {
|
|
52
|
+
scale = Math.min(scale, maxDimensionPx / widthPx);
|
|
53
|
+
}
|
|
54
|
+
if (heightPx * scale > maxDimensionPx) {
|
|
55
|
+
scale = Math.min(scale, maxDimensionPx / heightPx);
|
|
56
|
+
}
|
|
57
|
+
const capped = scale < 1;
|
|
58
|
+
if (capped) {
|
|
59
|
+
widthPx = Math.max(1, Math.floor(widthPx * scale));
|
|
60
|
+
heightPx = Math.max(1, Math.floor(heightPx * scale));
|
|
61
|
+
}
|
|
62
|
+
return { widthPx, heightPx, effectiveDpi: dpi * scale, capped };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Rasterize `meshes` into a shaded RGBA image covering their projected extent
|
|
66
|
+
* in the kept half of the section (`viewDepth` in `[0, occluderDepth]`).
|
|
67
|
+
*
|
|
68
|
+
* Returns `null` when nothing lands in that window or the extent is
|
|
69
|
+
* degenerate: there is no rectangle to place an image at, and the caller must
|
|
70
|
+
* fall back to line work only rather than emit a zero-size image.
|
|
71
|
+
*/
|
|
72
|
+
export function buildColorRaster(meshes, plane, occluderDepth, options) {
|
|
73
|
+
const width = Math.floor(options.widthPx);
|
|
74
|
+
const height = Math.floor(options.heightPx);
|
|
75
|
+
if (!Number.isFinite(width) || !Number.isFinite(height) || width < 1 || height < 1) {
|
|
76
|
+
throw new Error(`Invalid colour raster size: ${options.widthPx}x${options.heightPx}px. Expected at least 1x1 (use fitRasterPixels).`);
|
|
77
|
+
}
|
|
78
|
+
const bounds = computeProjectedBounds(meshes, plane, occluderDepth, 0);
|
|
79
|
+
const boundsWidth = bounds.max.x - bounds.min.x;
|
|
80
|
+
const boundsHeight = bounds.max.y - bounds.min.y;
|
|
81
|
+
if (!Number.isFinite(boundsWidth) ||
|
|
82
|
+
!Number.isFinite(boundsHeight) ||
|
|
83
|
+
boundsWidth < EPSILON ||
|
|
84
|
+
boundsHeight < EPSILON) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const depthBias = options.depthBias ?? 0.001;
|
|
88
|
+
const target = {
|
|
89
|
+
// Zero-filled: fully transparent, so the paper shows through anywhere no
|
|
90
|
+
// surface projects.
|
|
91
|
+
pixels: new Uint8ClampedArray(width * height * 4),
|
|
92
|
+
depth: new Float32Array(width * height).fill(Infinity),
|
|
93
|
+
width,
|
|
94
|
+
height,
|
|
95
|
+
bounds,
|
|
96
|
+
};
|
|
97
|
+
const viewDir = getViewDirectionForPlane(plane);
|
|
98
|
+
for (const mesh of meshes) {
|
|
99
|
+
if (mesh.color[3] >= OPAQUE_ALPHA) {
|
|
100
|
+
rasterizeShadedMesh(target, mesh, plane, viewDir, occluderDepth, depthBias, false);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
for (const mesh of meshes) {
|
|
104
|
+
if (mesh.color[3] < OPAQUE_ALPHA) {
|
|
105
|
+
rasterizeShadedMesh(target, mesh, plane, viewDir, occluderDepth, depthBias, true);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return { pixels: target.pixels, width, height, bounds };
|
|
109
|
+
}
|
|
110
|
+
function rasterizeShadedMesh(target, mesh, plane, viewDir, occluderDepth, depthBias, blend) {
|
|
111
|
+
const { positions, indices, origin, color } = mesh;
|
|
112
|
+
const triangleCount = Math.floor(indices.length / 3);
|
|
113
|
+
const alpha = color[3];
|
|
114
|
+
for (let t = 0; t < triangleCount; t++) {
|
|
115
|
+
const i0 = indices[t * 3];
|
|
116
|
+
const i1 = indices[t * 3 + 1];
|
|
117
|
+
const i2 = indices[t * 3 + 2];
|
|
118
|
+
// Face normal from LOCAL positions: the differences cancel `origin`, so
|
|
119
|
+
// there is no world fold to do here (unlike depth/projection below).
|
|
120
|
+
const lambert = faceLambert(positions, i0, i1, i2, viewDir);
|
|
121
|
+
if (lambert === null)
|
|
122
|
+
continue; // zero-area triangle
|
|
123
|
+
const v0 = getVertex(positions, i0, origin);
|
|
124
|
+
const v1 = getVertex(positions, i1, origin);
|
|
125
|
+
const v2 = getVertex(positions, i2, origin);
|
|
126
|
+
const d0 = -signedDepth(v0, plane);
|
|
127
|
+
const d1 = -signedDepth(v1, plane);
|
|
128
|
+
const d2 = -signedDepth(v2, plane);
|
|
129
|
+
const inWindow = (d) => d >= 0 && d <= occluderDepth;
|
|
130
|
+
if (!inWindow(d0) && !inWindow(d1) && !inWindow(d2))
|
|
131
|
+
continue;
|
|
132
|
+
const uv0 = projectPointForPlane(v0, plane);
|
|
133
|
+
const uv1 = projectPointForPlane(v1, plane);
|
|
134
|
+
const uv2 = projectPointForPlane(v2, plane);
|
|
135
|
+
const r = Math.round(255 * color[0] * lambert);
|
|
136
|
+
const g = Math.round(255 * color[1] * lambert);
|
|
137
|
+
const b = Math.round(255 * color[2] * lambert);
|
|
138
|
+
rasterizeShadedTriangle(target, { x: uv0.x, y: uv0.y, depth: d0 }, { x: uv1.x, y: uv1.y, depth: d1 }, { x: uv2.x, y: uv2.y, depth: d2 }, r, g, b, alpha, depthBias, blend);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* `0.4 + 0.6 * abs(dot(n, viewDir))` for the triangle's own plane, or `null`
|
|
143
|
+
* when the triangle has no area (no normal exists, nothing to shade).
|
|
144
|
+
*/
|
|
145
|
+
function faceLambert(positions, i0, i1, i2, viewDir) {
|
|
146
|
+
const ax = positions[i1 * 3] - positions[i0 * 3];
|
|
147
|
+
const ay = positions[i1 * 3 + 1] - positions[i0 * 3 + 1];
|
|
148
|
+
const az = positions[i1 * 3 + 2] - positions[i0 * 3 + 2];
|
|
149
|
+
const bx = positions[i2 * 3] - positions[i0 * 3];
|
|
150
|
+
const by = positions[i2 * 3 + 1] - positions[i0 * 3 + 1];
|
|
151
|
+
const bz = positions[i2 * 3 + 2] - positions[i0 * 3 + 2];
|
|
152
|
+
const nx = ay * bz - az * by;
|
|
153
|
+
const ny = az * bx - ax * bz;
|
|
154
|
+
const nz = ax * by - ay * bx;
|
|
155
|
+
const len = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
156
|
+
if (!(len > 0))
|
|
157
|
+
return null;
|
|
158
|
+
const dot = (nx * viewDir.x + ny * viewDir.y + nz * viewDir.z) / len;
|
|
159
|
+
return AMBIENT + DIFFUSE * Math.abs(dot);
|
|
160
|
+
}
|
|
161
|
+
function rasterizeShadedTriangle(target, p0, p1, p2, r, g, b, alpha, depthBias, blend) {
|
|
162
|
+
const { pixels, depth, width, height, bounds } = target;
|
|
163
|
+
const boundsWidth = bounds.max.x - bounds.min.x;
|
|
164
|
+
const boundsHeight = bounds.max.y - bounds.min.y;
|
|
165
|
+
// Edge-to-edge mapping (see the module docblock): the grid spans `bounds`
|
|
166
|
+
// exactly, and row 0 is the TOP (world max.y).
|
|
167
|
+
const toPixelX = (x) => ((x - bounds.min.x) / boundsWidth) * width;
|
|
168
|
+
const toPixelY = (y) => ((bounds.max.y - y) / boundsHeight) * height;
|
|
169
|
+
const px0 = { x: toPixelX(p0.x), y: toPixelY(p0.y) };
|
|
170
|
+
const px1 = { x: toPixelX(p1.x), y: toPixelY(p1.y) };
|
|
171
|
+
const px2 = { x: toPixelX(p2.x), y: toPixelY(p2.y) };
|
|
172
|
+
const minX = Math.max(0, Math.floor(Math.min(px0.x, px1.x, px2.x)));
|
|
173
|
+
const maxX = Math.min(width - 1, Math.ceil(Math.max(px0.x, px1.x, px2.x)));
|
|
174
|
+
const minY = Math.max(0, Math.floor(Math.min(px0.y, px1.y, px2.y)));
|
|
175
|
+
const maxY = Math.min(height - 1, Math.ceil(Math.max(px0.y, px1.y, px2.y)));
|
|
176
|
+
for (let py = minY; py <= maxY; py++) {
|
|
177
|
+
for (let px = minX; px <= maxX; px++) {
|
|
178
|
+
const bary = barycentricCoords(px + 0.5, py + 0.5, px0, px1, px2);
|
|
179
|
+
if (bary.u < 0 || bary.v < 0 || bary.w < 0)
|
|
180
|
+
continue;
|
|
181
|
+
const d = bary.u * p0.depth + bary.v * p1.depth + bary.w * p2.depth;
|
|
182
|
+
// The above-cut portion of a straddling triangle is cut away by the
|
|
183
|
+
// section and must not paint anything in the kept half.
|
|
184
|
+
if (d < -depthBias)
|
|
185
|
+
continue;
|
|
186
|
+
const idx = py * width + px;
|
|
187
|
+
const o = idx * 4;
|
|
188
|
+
if (!blend) {
|
|
189
|
+
if (d >= depth[idx])
|
|
190
|
+
continue;
|
|
191
|
+
depth[idx] = d;
|
|
192
|
+
pixels[o] = r;
|
|
193
|
+
pixels[o + 1] = g;
|
|
194
|
+
pixels[o + 2] = b;
|
|
195
|
+
pixels[o + 3] = 255;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
// Translucent pass: tested against the opaque depth buffer, never
|
|
199
|
+
// writing it, so glass in front of a wall composites over the wall and
|
|
200
|
+
// glass behind it is dropped.
|
|
201
|
+
if (d > depth[idx] + depthBias)
|
|
202
|
+
continue;
|
|
203
|
+
// STRAIGHT-alpha "over", not the premultiplied form. `pixels` is declared
|
|
204
|
+
// straight alpha (see ColorRaster), and the premultiplied formula
|
|
205
|
+
// `a*src + (1-a)*dst` applied to straight values silently scales the
|
|
206
|
+
// colour by alpha a SECOND time when the destination is transparent
|
|
207
|
+
// paper: a 0.5-alpha glass pane over nothing stored 0.5*colour with
|
|
208
|
+
// alpha 0.5, and the PDF then composited that again, printing the glass
|
|
209
|
+
// about twice as dark as the viewport shows it. Over an OPAQUE wall
|
|
210
|
+
// (dstA = 255) the two formulas agree, which is why it looked right
|
|
211
|
+
// wherever there was something behind the glass.
|
|
212
|
+
const dstA = pixels[o + 3] / 255;
|
|
213
|
+
const outA = alpha + dstA * (1 - alpha);
|
|
214
|
+
if (outA <= 0)
|
|
215
|
+
continue;
|
|
216
|
+
const srcW = alpha / outA;
|
|
217
|
+
const dstW = (dstA * (1 - alpha)) / outA;
|
|
218
|
+
pixels[o] = Math.round(srcW * r + dstW * pixels[o]);
|
|
219
|
+
pixels[o + 1] = Math.round(srcW * g + dstW * pixels[o + 1]);
|
|
220
|
+
pixels[o + 2] = Math.round(srcW * b + dstW * pixels[o + 2]);
|
|
221
|
+
pixels[o + 3] = Math.round(outA * 255);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=color-raster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-raster.js","sourceRoot":"","sources":["../src/color-raster.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,18 @@ export interface GeneratorOptions {
|
|
|
35
35
|
* instead (PR #2644 review).
|
|
36
36
|
*/
|
|
37
37
|
outlineProvider?: (mesh: MeshData, axis: SectionAxis, flipped: boolean) => MeshOutline2D | null;
|
|
38
|
+
/**
|
|
39
|
+
* Pre-projected lines merged in BEFORE the hidden-line stage (issue #2042):
|
|
40
|
+
* the section RIM of a CPU half-space clip. Build them with
|
|
41
|
+
* `projectWorldLineSeeds`, never a hand-rolled projection — they must share
|
|
42
|
+
* this config's plane basis and view-depth convention.
|
|
43
|
+
*
|
|
44
|
+
* They are classified alongside the projection lines even though they carry
|
|
45
|
+
* `category: 'cut'`: cutter-produced cut lines sit in the plane at view
|
|
46
|
+
* depth 0 and can never be occluded, but on an oblique 3D view a rim edge
|
|
47
|
+
* can sit behind other geometry and must print dashed.
|
|
48
|
+
*/
|
|
49
|
+
extraLines?: DrawingLine[];
|
|
38
50
|
/** Progress callback */
|
|
39
51
|
onProgress?: (stage: string, progress: number) => void;
|
|
40
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawing-generator.d.ts","sourceRoot":"","sources":["../src/drawing-generator.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EACX,SAAS,EACT,WAAW,EAKX,YAAY,EAEZ,aAAa,EACd,MAAM,YAAY,CAAC;AASpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoB1D,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,qCAAqC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,6DAA6D;IAC7D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,4CAA4C;IAC5C,YAAY,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,KAAK,aAAa,GAAG,IAAI,CAAC;IAChG,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAUD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,oBAAoB,CAAkD;IAC9E,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,WAAW,CAAqB;IAExC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACG,UAAU,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,QAAQ,EAAE,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,OAAO,CAAC,gBAAgB,CAAM,EACvC,QAAQ,CAAC,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"drawing-generator.d.ts","sourceRoot":"","sources":["../src/drawing-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -194,8 +194,12 @@ export class Drawing2DGenerator {
|
|
|
194
194
|
// ─────────────────────────────────────────────────────────────────────────
|
|
195
195
|
// STAGE 5: Hidden Line Removal
|
|
196
196
|
// ─────────────────────────────────────────────────────────────────────────
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
// Caller-supplied rim lines (issue #2042) are classifiable like projection
|
|
198
|
+
// lines despite their 'cut' category — see `GeneratorOptions.extraLines`.
|
|
199
|
+
const extraLines = opts.extraLines ?? [];
|
|
200
|
+
const classifiable = [...extraLines, ...projectionLines];
|
|
201
|
+
let allLines = [...cutLines, ...classifiable];
|
|
202
|
+
if (opts.includeHiddenLines && classifiable.length > 0) {
|
|
199
203
|
report('hidden', 0);
|
|
200
204
|
// Compute bounds for depth buffer
|
|
201
205
|
const bounds = this.computeBounds(allLines);
|
|
@@ -220,8 +224,13 @@ export class Drawing2DGenerator {
|
|
|
220
224
|
// already-dashed OVERHEAD line. So classify the visible (below-cut)
|
|
221
225
|
// projection lines and pass overhead lines through unchanged — otherwise
|
|
222
226
|
// an unoccluded overhead beam would be re-marked 'visible' (solid).
|
|
223
|
-
|
|
224
|
-
|
|
227
|
+
//
|
|
228
|
+
// The split is by SOURCE (`classifiable` vs the cutter's own
|
|
229
|
+
// `cutLines`), not by category: `extraLines` carry `category: 'cut'`
|
|
230
|
+
// yet must be classified. Filtering `allLines` on `category !== 'cut'`
|
|
231
|
+
// would both skip them AND drop them from the recombination below.
|
|
232
|
+
const toClassify = classifiable.filter((l) => l.visibility === 'visible');
|
|
233
|
+
const passthrough = classifiable.filter((l) => l.visibility !== 'visible');
|
|
225
234
|
const classifiedLines = this.hiddenLineClassifier.applyVisibility(toClassify);
|
|
226
235
|
// Recombine with cut lines (always visible) + overhead pass-through.
|
|
227
236
|
allLines = [...cutLines, ...classifiedLines, ...passthrough];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawing-generator.js","sourceRoot":"","sources":["../src/drawing-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drawing-generator.js","sourceRoot":"","sources":["../src/drawing-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/edge-extractor.d.ts
CHANGED
|
@@ -36,6 +36,23 @@ export declare class EdgeExtractor {
|
|
|
36
36
|
*/
|
|
37
37
|
edgesToProjectionLines(edges: EdgeData[], plane: SectionPlaneConfig, depths: ProjectionBandDepths): DrawingLine[];
|
|
38
38
|
private getVertex;
|
|
39
|
+
/**
|
|
40
|
+
* `-1` when the mesh is a closed solid wound INWARD, `+1` otherwise
|
|
41
|
+
* (issue #2682).
|
|
42
|
+
*
|
|
43
|
+
* Six times the enclosed signed volume is `Σ v0 · (v1 × v2)`, positive for
|
|
44
|
+
* outward winding. It is translation-invariant for a closed mesh, so the sum
|
|
45
|
+
* is taken relative to the first vertex to keep the terms small and the
|
|
46
|
+
* cancellation honest on RTC-shifted coordinates.
|
|
47
|
+
*
|
|
48
|
+
* `+1` is the deliberate answer whenever the test is inconclusive — an open
|
|
49
|
+
* shell, a flat sheet, or an inconsistently wound mesh integrates to ~0 (or
|
|
50
|
+
* to an arbitrary number) and gets the pre-existing behaviour rather than a
|
|
51
|
+
* coin-flip reorientation. Positions are read directly rather than through
|
|
52
|
+
* `getVertex` because the per-element `origin` is a pure translation and
|
|
53
|
+
* therefore cannot change the result.
|
|
54
|
+
*/
|
|
55
|
+
private windingSign;
|
|
39
56
|
private computeFaceNormal;
|
|
40
57
|
private registerEdge;
|
|
41
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-extractor.d.ts","sourceRoot":"","sources":["../src/edge-extractor.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA4BlF,OAAO,EACL,KAAK,oBAAoB,EAK1B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"edge-extractor.d.ts","sourceRoot":"","sources":["../src/edge-extractor.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA4BlF,OAAO,EACL,KAAK,oBAAoB,EAK1B,MAAM,uBAAuB,CAAC;AA+D/B,qBAAa,aAAa;IACxB,wCAAwC;IACxC,OAAO,CAAC,WAAW,CAAS;gBAEhB,kBAAkB,GAAE,MAAW;IAI3C;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE;IA+FxC;;;OAGG;IACH,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,GAAG,QAAQ,EAAE;IA6BtE;;;;;;;;;;;OAWG;IACH,sBAAsB,CACpB,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,oBAAoB,GAC3B,WAAW,EAAE;IAyDhB,OAAO,CAAC,SAAS;IAejB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,WAAW;IA6CnB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,YAAY;CAoBrB"}
|
package/dist/edge-extractor.js
CHANGED
|
@@ -37,6 +37,29 @@ import { classifySegmentBand, bandVisibility, projectPointForPlane, signedDepth,
|
|
|
37
37
|
* without excluding any genuinely tilted face (e.g. a pitched roof).
|
|
38
38
|
*/
|
|
39
39
|
const SILHOUETTE_EPSILON = 1e-4;
|
|
40
|
+
/**
|
|
41
|
+
* Scale-relative floor for trusting the signed-volume winding test (issue
|
|
42
|
+
* #2682).
|
|
43
|
+
*
|
|
44
|
+
* The silhouette test is NOT symmetric under a global winding flip: it keeps
|
|
45
|
+
* an edge whose faces differ in "is front-facing", and the deadband lumps
|
|
46
|
+
* perpendicular faces in with back-facing ones. For an outward-wound box in
|
|
47
|
+
* plan that yields the TOP rim (the face pointing at the viewer against the
|
|
48
|
+
* four perpendicular sides); flip the winding and the same test yields the
|
|
49
|
+
* BOTTOM rim instead — the far side of the solid. Both project to the same
|
|
50
|
+
* square, so the defect hides until the far rim falls outside the projection
|
|
51
|
+
* band, at which point the line work is simply GONE (a blank sheet, produced
|
|
52
|
+
* successfully). See `windingSign`.
|
|
53
|
+
*
|
|
54
|
+
* The fix orients the mesh by its signed volume before classifying, which is
|
|
55
|
+
* only meaningful when the volume is decisively non-zero. An open shell or a
|
|
56
|
+
* flat sheet integrates to ~0 and an inconsistently wound mesh to something
|
|
57
|
+
* arbitrary, so the sign is only trusted when |V| clears this fraction of the
|
|
58
|
+
* mesh's bounding-box volume (diagonal³). A closed box sits around 0.19 of
|
|
59
|
+
* that; a 1 mm sheet spanning 4 m sits near 1e-4. 1e-6 is far below any real
|
|
60
|
+
* solid and far above f32 integration noise.
|
|
61
|
+
*/
|
|
62
|
+
const WINDING_VOLUME_EPSILON = 1e-6;
|
|
40
63
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
41
64
|
// EDGE EXTRACTOR CLASS
|
|
42
65
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -73,6 +96,20 @@ export class EdgeExtractor {
|
|
|
73
96
|
this.registerEdge(edgeMap, i1, i2, t);
|
|
74
97
|
this.registerEdge(edgeMap, i2, i0, t);
|
|
75
98
|
}
|
|
99
|
+
// Orient the face normals OUTWARD before classification (issue #2682).
|
|
100
|
+
// ifc-lite's winding is explicitly unreliable (see `MeshData.indices`), and
|
|
101
|
+
// the silhouette test is winding-sensitive, so an inward-wound solid
|
|
102
|
+
// silhouettes its far side and can lose its line work entirely. Negating
|
|
103
|
+
// every normal is exactly what reversing every triangle does, so a mesh and
|
|
104
|
+
// its reversed twin now classify identically. Crease classification is
|
|
105
|
+
// unaffected: the dihedral angle between two normals is invariant under
|
|
106
|
+
// negating both.
|
|
107
|
+
if (this.windingSign(positions, indices) < 0) {
|
|
108
|
+
for (let f = 0; f < faceNormals.length; f++) {
|
|
109
|
+
const n = faceNormals[f];
|
|
110
|
+
faceNormals[f] = vec3(-n.x, -n.y, -n.z);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
76
113
|
// Second pass: classify edges
|
|
77
114
|
const edges = [];
|
|
78
115
|
for (const [, edgeInfo] of edgeMap) {
|
|
@@ -209,6 +246,64 @@ export class EdgeExtractor {
|
|
|
209
246
|
? vec3(positions[base] + origin[0], positions[base + 1] + origin[1], positions[base + 2] + origin[2])
|
|
210
247
|
: vec3(positions[base], positions[base + 1], positions[base + 2]);
|
|
211
248
|
}
|
|
249
|
+
/**
|
|
250
|
+
* `-1` when the mesh is a closed solid wound INWARD, `+1` otherwise
|
|
251
|
+
* (issue #2682).
|
|
252
|
+
*
|
|
253
|
+
* Six times the enclosed signed volume is `Σ v0 · (v1 × v2)`, positive for
|
|
254
|
+
* outward winding. It is translation-invariant for a closed mesh, so the sum
|
|
255
|
+
* is taken relative to the first vertex to keep the terms small and the
|
|
256
|
+
* cancellation honest on RTC-shifted coordinates.
|
|
257
|
+
*
|
|
258
|
+
* `+1` is the deliberate answer whenever the test is inconclusive — an open
|
|
259
|
+
* shell, a flat sheet, or an inconsistently wound mesh integrates to ~0 (or
|
|
260
|
+
* to an arbitrary number) and gets the pre-existing behaviour rather than a
|
|
261
|
+
* coin-flip reorientation. Positions are read directly rather than through
|
|
262
|
+
* `getVertex` because the per-element `origin` is a pure translation and
|
|
263
|
+
* therefore cannot change the result.
|
|
264
|
+
*/
|
|
265
|
+
windingSign(positions, indices) {
|
|
266
|
+
const triangleCount = Math.floor(indices.length / 3);
|
|
267
|
+
if (triangleCount === 0 || positions.length < 3)
|
|
268
|
+
return 1;
|
|
269
|
+
const rx = positions[indices[0] * 3];
|
|
270
|
+
const ry = positions[indices[0] * 3 + 1];
|
|
271
|
+
const rz = positions[indices[0] * 3 + 2];
|
|
272
|
+
let volume6 = 0;
|
|
273
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
274
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
275
|
+
const track = (x, y, z) => {
|
|
276
|
+
if (x < minX)
|
|
277
|
+
minX = x;
|
|
278
|
+
if (x > maxX)
|
|
279
|
+
maxX = x;
|
|
280
|
+
if (y < minY)
|
|
281
|
+
minY = y;
|
|
282
|
+
if (y > maxY)
|
|
283
|
+
maxY = y;
|
|
284
|
+
if (z < minZ)
|
|
285
|
+
minZ = z;
|
|
286
|
+
if (z > maxZ)
|
|
287
|
+
maxZ = z;
|
|
288
|
+
};
|
|
289
|
+
for (let t = 0; t < triangleCount; t++) {
|
|
290
|
+
const b0 = indices[t * 3] * 3;
|
|
291
|
+
const b1 = indices[t * 3 + 1] * 3;
|
|
292
|
+
const b2 = indices[t * 3 + 2] * 3;
|
|
293
|
+
const ax = positions[b0] - rx, ay = positions[b0 + 1] - ry, az = positions[b0 + 2] - rz;
|
|
294
|
+
const bx = positions[b1] - rx, by = positions[b1 + 1] - ry, bz = positions[b1 + 2] - rz;
|
|
295
|
+
const cx = positions[b2] - rx, cy = positions[b2 + 1] - ry, cz = positions[b2 + 2] - rz;
|
|
296
|
+
// a · (b × c)
|
|
297
|
+
volume6 += ax * (by * cz - bz * cy) + ay * (bz * cx - bx * cz) + az * (bx * cy - by * cx);
|
|
298
|
+
track(ax, ay, az);
|
|
299
|
+
track(bx, by, bz);
|
|
300
|
+
track(cx, cy, cz);
|
|
301
|
+
}
|
|
302
|
+
const dx = maxX - minX, dy = maxY - minY, dz = maxZ - minZ;
|
|
303
|
+
const diagonal = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
304
|
+
const floor = WINDING_VOLUME_EPSILON * diagonal * diagonal * diagonal;
|
|
305
|
+
return volume6 / 6 < -floor ? -1 : 1;
|
|
306
|
+
}
|
|
212
307
|
computeFaceNormal(v0, v1, v2) {
|
|
213
308
|
const edge1 = vec3Sub(v1, v0);
|
|
214
309
|
const edge2 = vec3Sub(v2, v0);
|