@pascal-app/viewer 1.0.7 → 1.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/README.md +54 -21
- package/dist/components/viewer/glb-replace-instances.d.ts +6 -3
- package/dist/components/viewer/glb-replace-instances.d.ts.map +1 -1
- package/dist/components/viewer/glb-replace-instances.js +5 -4
- package/dist/components/viewer/glb-scene.d.ts +3 -1
- package/dist/components/viewer/glb-scene.d.ts.map +1 -1
- package/dist/components/viewer/glb-scene.js +2 -1
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +8 -4
- package/dist/components/viewer/registered-systems.d.ts.map +1 -1
- package/dist/components/viewer/registered-systems.js +2 -2
- package/dist/components/viewer/unsupported-gpu-fallback.d.ts.map +1 -1
- package/dist/components/viewer/unsupported-gpu-fallback.js +21 -1
- package/dist/components/viewer/use-daylight-rooms.d.ts.map +1 -1
- package/dist/components/viewer/use-daylight-rooms.js +75 -33
- package/dist/hooks/use-gltf-ktx2.d.ts.map +1 -1
- package/dist/hooks/use-gltf-ktx2.js +2 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/lib/asset-url.d.ts +0 -1
- package/dist/lib/asset-url.d.ts.map +1 -1
- package/dist/lib/asset-url.js +3 -3
- package/dist/lib/daylight/room-context.d.ts.map +1 -1
- package/dist/lib/daylight/room-context.js +3 -2
- package/dist/lib/daylight/room-map.d.ts +124 -0
- package/dist/lib/daylight/room-map.d.ts.map +1 -0
- package/dist/lib/daylight/room-map.js +630 -0
- package/dist/lib/daylight/room-scene.d.ts +4 -2
- package/dist/lib/daylight/room-scene.d.ts.map +1 -1
- package/dist/lib/daylight/room-scene.js +72 -37
- package/dist/lib/daylight/rooms.d.ts +60 -30
- package/dist/lib/daylight/rooms.d.ts.map +1 -1
- package/dist/lib/daylight/rooms.js +331 -286
- package/dist/lib/ktx2-loader.d.ts.map +1 -1
- package/dist/lib/ktx2-loader.js +2 -1
- package/dist/lib/measurement-label.d.ts +4 -0
- package/dist/lib/measurement-label.d.ts.map +1 -0
- package/dist/lib/measurement-label.js +54 -0
- package/dist/lib/measurement-presentation.d.ts +5 -0
- package/dist/lib/measurement-presentation.d.ts.map +1 -0
- package/dist/lib/measurement-presentation.js +8 -0
- package/dist/lib/pointer-events.d.ts.map +1 -1
- package/dist/lib/pointer-events.js +3 -3
- package/dist/lib/texture-reference.d.ts.map +1 -1
- package/dist/lib/texture-reference.js +4 -3
- package/dist/lib/viewer-config.d.ts +21 -0
- package/dist/lib/viewer-config.d.ts.map +1 -0
- package/dist/lib/viewer-config.js +21 -0
- package/dist/lib/viewer-preference-storage.d.ts +7 -0
- package/dist/lib/viewer-preference-storage.d.ts.map +1 -0
- package/dist/lib/viewer-preference-storage.js +23 -0
- package/dist/store/use-viewer.d.ts +2 -56
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +3 -1
- package/dist/systems/elevator/elevator-interaction-system.d.ts +16 -2
- package/dist/systems/elevator/elevator-interaction-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-interaction-system.js +41 -8
- package/dist/systems/geometry/geometry-status.d.ts +8 -0
- package/dist/systems/geometry/geometry-status.d.ts.map +1 -0
- package/dist/systems/geometry/geometry-status.js +24 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -1
- package/dist/systems/roof/roof-system.js +107 -65
- package/dist/systems/wall/wall-system.d.ts +11 -0
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +56 -10
- package/package.json +3 -3
|
@@ -76,18 +76,35 @@ function meshesOf(root, skip) {
|
|
|
76
76
|
visit(root, true);
|
|
77
77
|
return out;
|
|
78
78
|
}
|
|
79
|
+
/** Every live level, in one stable order: its building and assembled world floor height. */
|
|
80
|
+
function liveLevels() {
|
|
81
|
+
const { nodes } = useScene.getState();
|
|
82
|
+
const elevations = getLevelElevations(nodes);
|
|
83
|
+
const buildings = new Map();
|
|
84
|
+
const ids = [];
|
|
85
|
+
const levels = [];
|
|
86
|
+
for (const node of Object.values(nodes)) {
|
|
87
|
+
if (node?.type !== 'level')
|
|
88
|
+
continue;
|
|
89
|
+
const elevation = elevations.get(node.id);
|
|
90
|
+
const buildingId = elevation?.buildingId ?? null;
|
|
91
|
+
if (!buildings.has(buildingId))
|
|
92
|
+
buildings.set(buildingId, buildings.size);
|
|
93
|
+
const building = buildingId ? nodes[buildingId] : undefined;
|
|
94
|
+
const siteY = building?.type === 'building' ? building.position[1] : 0;
|
|
95
|
+
ids.push(node.id);
|
|
96
|
+
levels.push({ y: siteY + (elevation?.baseY ?? 0), building: buildings.get(buildingId) });
|
|
97
|
+
}
|
|
98
|
+
return { ids, levels };
|
|
99
|
+
}
|
|
79
100
|
/** The live parametric scene (registry + node data), or null while it has no zones. */
|
|
80
101
|
export function liveRoomScene(virtualLampsOn) {
|
|
81
102
|
const zoneIds = sceneRegistry.byType.zone;
|
|
82
103
|
if (!zoneIds || zoneIds.size === 0)
|
|
83
104
|
return null;
|
|
84
105
|
const { nodes } = useScene.getState();
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
.filter((node) => node?.type === 'level')
|
|
88
|
-
.map((node) => ({ id: node.id, y: elevations.get(node.id)?.baseY ?? 0 }))
|
|
89
|
-
.sort((a, b) => a.y - b.y);
|
|
90
|
-
const levelIndex = new Map(levels.map((level, index) => [level.id, index]));
|
|
106
|
+
const { ids, levels } = liveLevels();
|
|
107
|
+
const levelIndex = new Map(ids.map((id, index) => [id, index]));
|
|
91
108
|
const zones = [];
|
|
92
109
|
const point = new Vector3();
|
|
93
110
|
for (const id of zoneIds) {
|
|
@@ -96,11 +113,16 @@ export function liveRoomScene(virtualLampsOn) {
|
|
|
96
113
|
if (!node?.polygon || node.polygon.length < 3 || !object || node.visible === false)
|
|
97
114
|
continue;
|
|
98
115
|
object.updateWorldMatrix(true, false);
|
|
99
|
-
const
|
|
116
|
+
const toWorld = (ring) => ring.map(([x, z]) => {
|
|
100
117
|
object.localToWorld(point.set(x, 0, z));
|
|
101
118
|
return [point.x, point.z];
|
|
102
119
|
});
|
|
103
|
-
zones.push({
|
|
120
|
+
zones.push({
|
|
121
|
+
id,
|
|
122
|
+
polygon: toWorld(node.polygon),
|
|
123
|
+
holes: (node.holes ?? []).filter((hole) => hole.length >= 3).map(toWorld),
|
|
124
|
+
levelIndex: levelIndex.get(node.parentId ?? '') ?? 0,
|
|
125
|
+
});
|
|
104
126
|
}
|
|
105
127
|
if (!zones.length)
|
|
106
128
|
return null;
|
|
@@ -134,7 +156,7 @@ export function liveRoomScene(virtualLampsOn) {
|
|
|
134
156
|
bounds.expandByPoint(point.set(x, 0, z));
|
|
135
157
|
return {
|
|
136
158
|
bounds,
|
|
137
|
-
|
|
159
|
+
levels,
|
|
138
160
|
zones,
|
|
139
161
|
covers,
|
|
140
162
|
walls,
|
|
@@ -144,15 +166,33 @@ export function liveRoomScene(virtualLampsOn) {
|
|
|
144
166
|
configureRaycaster: (raycaster) => setSurfaceRaycastLayers(raycaster.layers),
|
|
145
167
|
};
|
|
146
168
|
}
|
|
147
|
-
/** Live level objects in the room system's level order (
|
|
169
|
+
/** Live level objects in the room system's level order (explode offsets, visibility, focus). */
|
|
148
170
|
export function liveLevelObjects() {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
171
|
+
return liveLevels().ids.map((id) => sceneRegistry.nodes.get(id));
|
|
172
|
+
}
|
|
173
|
+
/** A baked artifact's levels: their objects and, per level, its building and floor height. */
|
|
174
|
+
function bakedLevels(root) {
|
|
175
|
+
const objects = [];
|
|
176
|
+
root.traverse((object) => {
|
|
177
|
+
if (object.userData.kind === 'level')
|
|
178
|
+
objects.push(object);
|
|
179
|
+
});
|
|
180
|
+
root.updateWorldMatrix(true, true);
|
|
181
|
+
const buildings = new Map();
|
|
182
|
+
const point = new Vector3();
|
|
183
|
+
const levels = objects.map((object) => {
|
|
184
|
+
let building = object.parent;
|
|
185
|
+
while (building && building.userData.kind !== 'building')
|
|
186
|
+
building = building.parent;
|
|
187
|
+
if (!buildings.has(building))
|
|
188
|
+
buildings.set(building, buildings.size);
|
|
189
|
+
return { y: object.getWorldPosition(point).y, building: buildings.get(building) };
|
|
190
|
+
});
|
|
191
|
+
return { objects, levels };
|
|
192
|
+
}
|
|
193
|
+
/** A baked artifact's level objects in the room system's level order. */
|
|
194
|
+
export function bakedLevelObjects(root) {
|
|
195
|
+
return root ? bakedLevels(root).objects : [];
|
|
156
196
|
}
|
|
157
197
|
/** How open a live door is (0 closed … 1 fully open), the transient state first. */
|
|
158
198
|
export function liveDoorOpenness(id) {
|
|
@@ -164,7 +204,6 @@ export function liveDoorOpenness(id) {
|
|
|
164
204
|
}
|
|
165
205
|
/** A baked artifact's identity tree (levels, zones, covers, walls, openings), or null. */
|
|
166
206
|
export function bakedRoomScene(root, virtualLampsOn) {
|
|
167
|
-
const levelObjects = [];
|
|
168
207
|
const zoneObjects = [];
|
|
169
208
|
const covers = [];
|
|
170
209
|
const wallRoots = [];
|
|
@@ -172,9 +211,6 @@ export function bakedRoomScene(root, virtualLampsOn) {
|
|
|
172
211
|
root.traverse((object) => {
|
|
173
212
|
const extras = object.userData;
|
|
174
213
|
switch (extras.kind) {
|
|
175
|
-
case 'level':
|
|
176
|
-
levelObjects.push(object);
|
|
177
|
-
break;
|
|
178
214
|
case 'zone':
|
|
179
215
|
zoneObjects.push(object);
|
|
180
216
|
break;
|
|
@@ -195,34 +231,33 @@ export function bakedRoomScene(root, virtualLampsOn) {
|
|
|
195
231
|
});
|
|
196
232
|
if (!zoneObjects.length)
|
|
197
233
|
return null;
|
|
198
|
-
root
|
|
199
|
-
const levels = levelObjects
|
|
200
|
-
.map((object) => ({ object, y: object.getWorldPosition(new Vector3()).y }))
|
|
201
|
-
.sort((a, b) => a.y - b.y);
|
|
234
|
+
const levels = bakedLevels(root);
|
|
202
235
|
const levelOf = (object) => {
|
|
203
236
|
for (let x = object; x; x = x.parent) {
|
|
204
|
-
const index = levels.
|
|
237
|
+
const index = levels.objects.indexOf(x);
|
|
205
238
|
if (index >= 0)
|
|
206
|
-
return index;
|
|
239
|
+
return { index, frame: x };
|
|
207
240
|
}
|
|
208
|
-
return 0;
|
|
241
|
+
return { index: 0, frame: null };
|
|
209
242
|
};
|
|
210
243
|
const point = new Vector3();
|
|
211
244
|
const zones = [];
|
|
212
245
|
for (const object of zoneObjects) {
|
|
213
|
-
const polygon = object.userData
|
|
246
|
+
const { polygon, holes } = object.userData;
|
|
214
247
|
if (!polygon || polygon.length < 3)
|
|
215
248
|
continue;
|
|
216
|
-
const
|
|
249
|
+
const level = levelOf(object);
|
|
217
250
|
// Polygons are level-local [x, z]: bring them to world XZ through the level's frame.
|
|
218
|
-
const frame =
|
|
251
|
+
const frame = level.frame ?? object.parent ?? object;
|
|
252
|
+
const toWorld = (ring) => ring.map(([x, z]) => {
|
|
253
|
+
point.set(x, 0, z).applyMatrix4(frame.matrixWorld);
|
|
254
|
+
return [point.x, point.z];
|
|
255
|
+
});
|
|
219
256
|
zones.push({
|
|
220
257
|
id: object.userData.pascalId ?? object.uuid,
|
|
221
|
-
polygon: polygon
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
}),
|
|
225
|
-
levelIndex,
|
|
258
|
+
polygon: toWorld(polygon),
|
|
259
|
+
holes: (holes ?? []).filter((hole) => hole.length >= 3).map(toWorld),
|
|
260
|
+
levelIndex: level.index,
|
|
226
261
|
});
|
|
227
262
|
}
|
|
228
263
|
if (!zones.length)
|
|
@@ -238,7 +273,7 @@ export function bakedRoomScene(root, virtualLampsOn) {
|
|
|
238
273
|
bounds.expandByPoint(point.set(x, 0, z));
|
|
239
274
|
return {
|
|
240
275
|
bounds,
|
|
241
|
-
|
|
276
|
+
levels: levels.levels,
|
|
242
277
|
zones,
|
|
243
278
|
covers,
|
|
244
279
|
walls,
|
|
@@ -1,4 +1,25 @@
|
|
|
1
1
|
import { Box3, type Camera, Color, type Object3D, Raycaster, Vector2, Vector3 } from 'three';
|
|
2
|
+
import { type MapLevel, RoomMap } from './room-map';
|
|
3
|
+
/**
|
|
4
|
+
* "Room-aware" interior light, the game-engine way (ported from the enhanced viewer):
|
|
5
|
+
*
|
|
6
|
+
* - Zone polygons are rasterized per level into a top-down room-id map (10 cm cells). A fragment
|
|
7
|
+
* finds its room by looking up `p + n·0.18` — a wall face looks *into* the room it faces, so
|
|
8
|
+
* light never leaks through walls and there are no shadow maps to pay for.
|
|
9
|
+
* - Each room owns its lamps and window "portals": glass rectangles that emit sky (+ ground
|
|
10
|
+
* bounce) radiance inwards with an analytic rectangle form factor, plus the internally
|
|
11
|
+
* reflected component (split-flux) and the sky patch on the floor. Enclosed rooms see only
|
|
12
|
+
* a tenth of the sky environment.
|
|
13
|
+
* - Openings between rooms (doorways, arches, open plan) carry light from the neighbour and
|
|
14
|
+
* crossfade room-wide terms at the threshold.
|
|
15
|
+
* - At night, lit rooms throw light out through their windows (a gobo of the main lamp + the
|
|
16
|
+
* pane glow), and lamps outside every room light exterior surfaces analytically.
|
|
17
|
+
*
|
|
18
|
+
* Everything feeds the material lighting through `getGI` / `getAO` contexts: real diffuse
|
|
19
|
+
* irradiance (× albedo, × AO), not a post overlay. Shader inputs are uniforms and data textures,
|
|
20
|
+
* so rebuilding after an edit never recompiles a material.
|
|
21
|
+
*/
|
|
22
|
+
type N = any;
|
|
2
23
|
export type RoomLamp = {
|
|
3
24
|
position: Vector3;
|
|
4
25
|
color: Color;
|
|
@@ -25,6 +46,7 @@ export type RoomZone = {
|
|
|
25
46
|
id: string;
|
|
26
47
|
/** World XZ. */
|
|
27
48
|
polygon: [number, number][];
|
|
49
|
+
holes?: [number, number][][];
|
|
28
50
|
levelIndex: number;
|
|
29
51
|
};
|
|
30
52
|
export type RoomOpeningRoot = {
|
|
@@ -35,8 +57,8 @@ export type RoomOpeningRoot = {
|
|
|
35
57
|
/** What the room system needs from a scene (live parametric or baked artifact). */
|
|
36
58
|
export type RoomSceneInput = {
|
|
37
59
|
bounds: Box3;
|
|
38
|
-
/**
|
|
39
|
-
|
|
60
|
+
/** Every level: assembled (not exploded) world Y of its floor and its building's index. */
|
|
61
|
+
levels: MapLevel[];
|
|
40
62
|
zones: RoomZone[];
|
|
41
63
|
/** Ceilings, roofs and slabs (enclosure rays) with their kind. */
|
|
42
64
|
covers: {
|
|
@@ -100,13 +122,10 @@ export declare class RoomLighting {
|
|
|
100
122
|
exteriorLamps: RoomLamp[];
|
|
101
123
|
portals: Portal[];
|
|
102
124
|
openings: Opening[];
|
|
103
|
-
|
|
125
|
+
levels: MapLevel[];
|
|
126
|
+
/** Which room a point is in (tiled per level; see `room-map.ts`). */
|
|
127
|
+
readonly map: RoomMap;
|
|
104
128
|
private data;
|
|
105
|
-
private map;
|
|
106
|
-
private origin;
|
|
107
|
-
private gridW;
|
|
108
|
-
private gridH;
|
|
109
|
-
private levels;
|
|
110
129
|
private lampTexel;
|
|
111
130
|
private lastSky;
|
|
112
131
|
readonly portalGain: import("three/webgpu").UniformNode<"float", number>;
|
|
@@ -127,18 +146,12 @@ export declare class RoomLighting {
|
|
|
127
146
|
readonly skyPatch: import("three/webgpu").UniformNode<"float", number>;
|
|
128
147
|
/** Light through interior openings + threshold crossfade (off on the Low tier). */
|
|
129
148
|
readonly softRooms: import("three/webgpu").UniformNode<"float", number>;
|
|
149
|
+
/** Camera world Y (live). */
|
|
130
150
|
readonly cameraY: import("three/webgpu").UniformNode<"float", number>;
|
|
131
|
-
readonly focusedLevel: import("three/webgpu").UniformNode<"int", number>;
|
|
132
|
-
/**
|
|
133
|
-
* The level arrays live in one shared group, uploaded when a level moves: an array uniform in
|
|
134
|
-
* the default (per-object) group is re-sent for every object in every pass, whether it changed
|
|
135
|
-
* or not — some 760 uploads a frame in a furnished flat.
|
|
136
|
-
*/
|
|
137
|
-
private readonly levelGroup;
|
|
138
151
|
private readonly u;
|
|
139
152
|
/** Rebuild from a scene: rooms, lamps, portals, openings, room-id map. */
|
|
140
153
|
build(input: RoomSceneInput): void;
|
|
141
|
-
/** CPU-side room lookup (same rule as the shader, without the normal offset). */
|
|
154
|
+
/** CPU-side room lookup in assembled space (same rule as the shader, without the normal offset). */
|
|
142
155
|
roomAt(p: Vector3): number;
|
|
143
156
|
/**
|
|
144
157
|
* Whether each level is on screen. A camera over a level whose upper floors are hidden stands
|
|
@@ -146,6 +159,10 @@ export declare class RoomLighting {
|
|
|
146
159
|
* such, not as a lamplit room it cannot see.
|
|
147
160
|
*/
|
|
148
161
|
levelShown: boolean[];
|
|
162
|
+
/** Per level: focused (its rooms open from above when the camera is over their cover). */
|
|
163
|
+
levelFocused: boolean[];
|
|
164
|
+
/** Per level: the highest one shown in its building (its rooms seen from above). */
|
|
165
|
+
private levelTopShown;
|
|
149
166
|
/**
|
|
150
167
|
* What the lit rooms in view add to an outside camera's meter: a blend of the exterior reading
|
|
151
168
|
* and the rooms' own irradiance (their indoor meter), weighted by the share of the frame each
|
|
@@ -164,8 +181,13 @@ export declare class RoomLighting {
|
|
|
164
181
|
room: number;
|
|
165
182
|
inside: boolean;
|
|
166
183
|
};
|
|
167
|
-
/**
|
|
168
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Live level presentation, per level: explode offset (live world Y − assembled), whether it is
|
|
186
|
+
* shown, and whether it is the selected level of a cutaway (solo / levels above hidden). A shown
|
|
187
|
+
* level is focused — its rooms open from above — when selected so, or when every level over it
|
|
188
|
+
* in its building is hidden.
|
|
189
|
+
*/
|
|
190
|
+
setLevelPresentation(offsets: number[], shown: boolean[], selected: boolean[]): void;
|
|
169
191
|
/** Re-run the light transfer (after a quality-tier change of the soft room map). */
|
|
170
192
|
refresh(): void;
|
|
171
193
|
/** Lamp switches changed: rewrite lamp texels (+ the light carried through openings). */
|
|
@@ -196,22 +218,27 @@ export declare class RoomLighting {
|
|
|
196
218
|
* over the lit few at night, not over every window of the building.
|
|
197
219
|
*/
|
|
198
220
|
private writeActiveLists;
|
|
199
|
-
private uploadMap;
|
|
200
221
|
private markData;
|
|
201
222
|
private writeLamp;
|
|
202
223
|
/** Interior portals emit the neighbour room's average radiance: L = E_avg·ρ/π (lamps + daylight). */
|
|
203
224
|
private writeInteriorPortals;
|
|
204
225
|
private set;
|
|
205
226
|
/**
|
|
206
|
-
* Walk every boundary between two room cells (or a room and outside) on
|
|
207
|
-
* short horizontal rays against the walls at 0.35 m and 1.6 m: open at both heights = a
|
|
208
|
-
* opening (doorway, arch, open-plan edge). Windows don't count (sills are above 0.35 m).
|
|
227
|
+
* Walk every boundary between two room cells (or a room and outside) on each level's grid and
|
|
228
|
+
* cast short horizontal rays against the walls at 0.35 m and 1.6 m: open at both heights = a
|
|
229
|
+
* walkable opening (doorway, arch, open-plan edge). Windows don't count (sills are above 0.35 m).
|
|
230
|
+
* `walk` runs per level while its grid exists; `finish` clusters the samples into openings.
|
|
231
|
+
*/
|
|
232
|
+
private openingSearch;
|
|
233
|
+
/** One opening from its boundary samples: measured along their own line, facing room b. */
|
|
234
|
+
private openingFromRun;
|
|
235
|
+
/** Room index (−1 outside) at a world-space position (live heights). */
|
|
236
|
+
roomAtNode: import("three/tsl").FnNode<[any], import("three/webgpu").VarNode<"int", import("three/webgpu").ConstNode<"int", number>>>;
|
|
237
|
+
/**
|
|
238
|
+
* The room a surface faces (probed 18 cm off it along its normal). One node per material: its
|
|
239
|
+
* lighting and its exterior mask share the lookup.
|
|
209
240
|
*/
|
|
210
|
-
|
|
211
|
-
/** Level index for a world-space height (live, explode-offset level heights). */
|
|
212
|
-
private levelOfNode;
|
|
213
|
-
/** Room index (−1 outside) at a world-space position. */
|
|
214
|
-
roomAtNode: import("three/tsl").FnNode<[any], import("three/webgpu").Node<"int">>;
|
|
241
|
+
probeRoomNode(): N;
|
|
215
242
|
/** E' = Emax·(1 − e^(−E/Emax)), on luminance, hue kept — near-field hot spots compress, never blow out. */
|
|
216
243
|
private softClampLamps;
|
|
217
244
|
/**
|
|
@@ -219,7 +246,8 @@ export declare class RoomLighting {
|
|
|
219
246
|
* topmost cover and that cover is hidden from there: a ceiling (hidden from above), or anything
|
|
220
247
|
* once its level is focused (the levels over it hidden). From inside, under the cover, the room
|
|
221
248
|
* stays enclosed whatever is focused: it must not take the full sky on top of its windows.
|
|
222
|
-
* `h2` is the room's third header texel: [coverY, roof, level, 0]
|
|
249
|
+
* `h2` is the room's third header texel: [coverY, roof, level, 0]; `level` its level's
|
|
250
|
+
* [th, entryOffset, offset, flags] (flag 1: focused).
|
|
223
251
|
*/
|
|
224
252
|
private openToSky;
|
|
225
253
|
private texel;
|
|
@@ -228,7 +256,7 @@ export declare class RoomLighting {
|
|
|
228
256
|
* irradiance — lamp + portal + bounce diffuse irradiance (linear)
|
|
229
257
|
* enclosure — multiplier for the sky IBL (1 outdoors, `indoorEnv` in enclosed rooms)
|
|
230
258
|
*/
|
|
231
|
-
lightingNode: import("three/tsl").FnNode<[], import("three/webgpu").JoinNode<"vec4">>;
|
|
259
|
+
lightingNode: import("three/tsl").FnNode<[any], import("three/webgpu").JoinNode<"vec4">>;
|
|
232
260
|
/**
|
|
233
261
|
* Light thrown *out* of lit rooms through their windows onto exterior surfaces (ground,
|
|
234
262
|
* terraces, balconies, reveals). Two terms per exterior portal:
|
|
@@ -246,7 +274,7 @@ export declare class RoomLighting {
|
|
|
246
274
|
*/
|
|
247
275
|
exteriorLampsNode: import("three/tsl").FnNode<[any, any], any>;
|
|
248
276
|
/** 1 where exterior lights may shine (outside, or rooms open to the sky), 0 inside. */
|
|
249
|
-
exteriorMaskNode: import("three/tsl").FnNode<[], import("three/webgpu").VarNode<"float", import("three/webgpu").ConstNode<"float", number>>>;
|
|
277
|
+
exteriorMaskNode: import("three/tsl").FnNode<[any], import("three/webgpu").VarNode<"float", import("three/webgpu").ConstNode<"float", number>>>;
|
|
250
278
|
/** Linear lamp radiance of a room (its lit lamps) — the night tint of its window panes. */
|
|
251
279
|
roomGlowNode: import("three/tsl").FnNode<[any], import("three/webgpu").Node<"vec3">>;
|
|
252
280
|
}
|
|
@@ -255,6 +283,8 @@ export declare function polygonPerimeter(poly: [number, number][]): number;
|
|
|
255
283
|
export declare function polygonArea(poly: [number, number][]): number;
|
|
256
284
|
export declare function polygonCentroid(poly: [number, number][]): Vector2;
|
|
257
285
|
/** Tanner Helland blackbody fit → linear RGB. */
|
|
286
|
+
/** A point inside the polygon and outside its holes: the centroid when it is, else a scan. */
|
|
287
|
+
export declare function interiorPoint(poly: [number, number][], holes?: [number, number][][]): Vector2;
|
|
258
288
|
export declare function kelvin(k: number): Color;
|
|
259
289
|
/** The daylight look's room system (one viewer canvas at a time). */
|
|
260
290
|
export declare const daylightRooms: RoomLighting;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../../src/lib/daylight/rooms.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,
|
|
1
|
+
{"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../../src/lib/daylight/rooms.ts"],"names":[],"mappings":"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"}
|