@pascal-app/viewer 0.6.0 → 0.7.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/components/error-boundary.d.ts +7 -3
- package/dist/components/error-boundary.d.ts.map +1 -1
- package/dist/components/error-boundary.js +3 -1
- package/dist/components/renderers/ceiling/ceiling-renderer.d.ts.map +1 -1
- package/dist/components/renderers/ceiling/ceiling-renderer.js +19 -3
- package/dist/components/renderers/column/column-renderer.d.ts +5 -0
- package/dist/components/renderers/column/column-renderer.d.ts.map +1 -0
- package/dist/components/renderers/column/column-renderer.js +594 -0
- package/dist/components/renderers/door/door-renderer.d.ts.map +1 -1
- package/dist/components/renderers/door/door-renderer.js +4 -9
- package/dist/components/renderers/fence/fence-renderer.d.ts.map +1 -1
- package/dist/components/renderers/guide/guide-renderer.js +1 -1
- package/dist/components/renderers/item/item-renderer.d.ts.map +1 -1
- package/dist/components/renderers/item/item-renderer.js +2 -1
- package/dist/components/renderers/node-renderer.d.ts.map +1 -1
- package/dist/components/renderers/node-renderer.js +3 -1
- package/dist/components/renderers/roof/roof-renderer.d.ts.map +1 -1
- package/dist/components/renderers/roof/roof-renderer.js +1 -13
- package/dist/components/renderers/roof-segment/roof-segment-renderer.d.ts.map +1 -1
- package/dist/components/renderers/roof-segment/roof-segment-renderer.js +5 -20
- package/dist/components/renderers/slab/slab-renderer.d.ts.map +1 -1
- package/dist/components/renderers/slab/slab-renderer.js +39 -27
- package/dist/components/renderers/spawn/spawn-renderer.d.ts +5 -0
- package/dist/components/renderers/spawn/spawn-renderer.d.ts.map +1 -0
- package/dist/components/renderers/spawn/spawn-renderer.js +32 -0
- package/dist/components/renderers/stair/stair-renderer.d.ts.map +1 -1
- package/dist/components/renderers/stair/stair-renderer.js +5 -23
- package/dist/components/renderers/stair-segment/stair-segment-renderer.d.ts.map +1 -1
- package/dist/components/renderers/stair-segment/stair-segment-renderer.js +5 -22
- package/dist/components/viewer/index.d.ts +2 -0
- package/dist/components/viewer/index.d.ts.map +1 -1
- package/dist/components/viewer/index.js +88 -18
- package/dist/components/viewer/post-processing.d.ts +13 -1
- package/dist/components/viewer/post-processing.d.ts.map +1 -1
- package/dist/components/viewer/post-processing.js +71 -14
- package/dist/components/viewer/selection-manager.d.ts.map +1 -1
- package/dist/components/viewer/selection-manager.js +19 -2
- package/dist/hooks/use-node-events.d.ts +9 -1
- package/dist/hooks/use-node-events.d.ts.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/lib/materials.d.ts +3 -0
- package/dist/lib/materials.d.ts.map +1 -1
- package/dist/lib/materials.js +14 -0
- package/dist/lib/merged-outline-node.d.ts +2 -0
- package/dist/lib/merged-outline-node.d.ts.map +1 -1
- package/dist/lib/merged-outline-node.js +25 -5
- package/dist/store/use-viewer.d.ts +4 -4
- package/dist/store/use-viewer.d.ts.map +1 -1
- package/dist/store/use-viewer.js +2 -2
- package/dist/systems/ceiling/ceiling-system.d.ts +8 -0
- package/dist/systems/ceiling/ceiling-system.d.ts.map +1 -0
- package/dist/systems/ceiling/ceiling-system.js +91 -0
- package/dist/systems/column/column-geometry.d.ts +22 -0
- package/dist/systems/column/column-geometry.d.ts.map +1 -0
- package/dist/systems/column/column-geometry.js +108 -0
- package/dist/systems/door/door-animation-system.d.ts +2 -0
- package/dist/systems/door/door-animation-system.d.ts.map +1 -0
- package/dist/systems/door/door-animation-system.js +53 -0
- package/dist/systems/door/door-system.d.ts +2 -0
- package/dist/systems/door/door-system.d.ts.map +1 -0
- package/dist/systems/door/door-system.js +867 -0
- package/dist/systems/fence/fence-system.d.ts +2 -0
- package/dist/systems/fence/fence-system.d.ts.map +1 -0
- package/dist/systems/fence/fence-system.js +185 -0
- package/dist/systems/item/item-system.d.ts +2 -0
- package/dist/systems/item/item-system.d.ts.map +1 -0
- package/dist/systems/item/item-system.js +44 -0
- package/dist/systems/item-mesh-metadata/compute-item-mesh-metadata.d.ts +14 -0
- package/dist/systems/item-mesh-metadata/compute-item-mesh-metadata.d.ts.map +1 -0
- package/dist/systems/item-mesh-metadata/compute-item-mesh-metadata.js +155 -0
- package/dist/systems/item-mesh-metadata/item-mesh-metadata-system.d.ts +6 -0
- package/dist/systems/item-mesh-metadata/item-mesh-metadata-system.d.ts.map +1 -0
- package/dist/systems/item-mesh-metadata/item-mesh-metadata-system.js +75 -0
- package/dist/systems/item-mesh-metadata/sync-request.d.ts +7 -0
- package/dist/systems/item-mesh-metadata/sync-request.d.ts.map +1 -0
- package/dist/systems/item-mesh-metadata/sync-request.js +25 -0
- package/dist/systems/roof/roof-materials.d.ts.map +1 -1
- package/dist/systems/roof/roof-materials.js +18 -1
- package/dist/systems/roof/roof-system.d.ts +16 -0
- package/dist/systems/roof/roof-system.d.ts.map +1 -0
- package/dist/systems/roof/roof-system.js +797 -0
- package/dist/systems/slab/slab-system.d.ts +8 -0
- package/dist/systems/slab/slab-system.d.ts.map +1 -0
- package/dist/systems/slab/slab-system.js +155 -0
- package/dist/systems/stair/stair-materials.d.ts.map +1 -1
- package/dist/systems/stair/stair-materials.js +25 -2
- package/dist/systems/stair/stair-system.d.ts +2 -0
- package/dist/systems/stair/stair-system.d.ts.map +1 -0
- package/dist/systems/stair/stair-system.js +772 -0
- package/dist/systems/wall/wall-materials.d.ts.map +1 -1
- package/dist/systems/wall/wall-materials.js +2 -2
- package/dist/systems/wall/wall-system.d.ts +11 -0
- package/dist/systems/wall/wall-system.d.ts.map +1 -0
- package/dist/systems/wall/wall-system.js +592 -0
- package/dist/systems/window/window-animation-system.d.ts +2 -0
- package/dist/systems/window/window-animation-system.d.ts.map +1 -0
- package/dist/systems/window/window-animation-system.js +135 -0
- package/dist/systems/window/window-system.d.ts +12 -0
- package/dist/systems/window/window-system.d.ts.map +1 -0
- package/dist/systems/window/window-system.js +1430 -0
- package/package.json +4 -2
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { emitter, sceneRegistry, useInteractive, useScene, } from '@pascal-app/core';
|
|
2
|
+
import { useFrame } from '@react-three/fiber';
|
|
3
|
+
import { AWNING_WINDOW_SASH_NAME, CASEMENT_WINDOW_SASH_NAME, DOUBLE_HUNG_BOTTOM_SASH_NAME, DOUBLE_HUNG_TOP_SASH_NAME, FRENCH_CASEMENT_LEFT_SASH_NAME, FRENCH_CASEMENT_RIGHT_SASH_NAME, HOPPER_WINDOW_SASH_NAME, LOUVERED_WINDOW_SLATS_NAME, SINGLE_HUNG_ACTIVE_SASH_NAME, SLIDING_WINDOW_ACTIVE_PANEL_NAME, } from './window-system';
|
|
4
|
+
const easeWindowAnimation = (value) => value * value * (3 - 2 * value);
|
|
5
|
+
function markWindowDirty(windowId) {
|
|
6
|
+
const scene = useScene.getState();
|
|
7
|
+
const node = scene.nodes[windowId];
|
|
8
|
+
scene.dirtyNodes.add(windowId);
|
|
9
|
+
}
|
|
10
|
+
function applyDirectWindowAnimation(windowId, value) {
|
|
11
|
+
const node = useScene.getState().nodes[windowId];
|
|
12
|
+
if (node?.type !== 'window')
|
|
13
|
+
return false;
|
|
14
|
+
const mesh = sceneRegistry.nodes.get(windowId);
|
|
15
|
+
if (node.windowType === 'sliding') {
|
|
16
|
+
const activePanel = mesh?.getObjectByName(SLIDING_WINDOW_ACTIVE_PANEL_NAME);
|
|
17
|
+
if (!activePanel)
|
|
18
|
+
return false;
|
|
19
|
+
const innerW = node.width - 2 * node.frameThickness;
|
|
20
|
+
const panelOverlap = Math.min(Math.max(node.frameThickness * 0.9, 0.04), innerW * 0.12);
|
|
21
|
+
const travel = Math.max(innerW / 2 - panelOverlap, 0) * value;
|
|
22
|
+
activePanel.position.x = -innerW / 4 - panelOverlap / 4 + travel;
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (node.windowType === 'single-hung') {
|
|
26
|
+
const activeSash = mesh?.getObjectByName(SINGLE_HUNG_ACTIVE_SASH_NAME);
|
|
27
|
+
if (!activeSash)
|
|
28
|
+
return false;
|
|
29
|
+
const innerH = node.height - 2 * node.frameThickness;
|
|
30
|
+
const panelOverlap = Math.min(Math.max(node.frameThickness * 0.9, 0.04), innerH * 0.12);
|
|
31
|
+
const travel = Math.max(innerH / 2 - panelOverlap, 0) * value;
|
|
32
|
+
activeSash.position.y = -innerH / 4 - panelOverlap / 4 + travel;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (node.windowType === 'double-hung') {
|
|
36
|
+
const topSash = mesh?.getObjectByName(DOUBLE_HUNG_TOP_SASH_NAME);
|
|
37
|
+
const bottomSash = mesh?.getObjectByName(DOUBLE_HUNG_BOTTOM_SASH_NAME);
|
|
38
|
+
if (!(topSash && bottomSash))
|
|
39
|
+
return false;
|
|
40
|
+
const innerH = node.height - 2 * node.frameThickness;
|
|
41
|
+
const panelOverlap = Math.min(Math.max(node.frameThickness * 0.9, 0.04), innerH * 0.12);
|
|
42
|
+
const travel = Math.max(innerH / 2 - panelOverlap, 0) * value;
|
|
43
|
+
topSash.position.y = innerH / 4 + panelOverlap / 4 - travel;
|
|
44
|
+
bottomSash.position.y = -innerH / 4 - panelOverlap / 4 + travel;
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (node.windowType === 'louvered') {
|
|
48
|
+
const slats = mesh?.getObjectByName(LOUVERED_WINDOW_SLATS_NAME);
|
|
49
|
+
if (!slats)
|
|
50
|
+
return false;
|
|
51
|
+
const slatAngle = -value * (Math.PI / 3);
|
|
52
|
+
for (const slat of slats.children) {
|
|
53
|
+
slat.rotation.x = slatAngle;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
if (node.windowType === 'casement') {
|
|
58
|
+
if ((node.casementStyle ?? 'single') === 'french') {
|
|
59
|
+
const leftSash = mesh?.getObjectByName(FRENCH_CASEMENT_LEFT_SASH_NAME);
|
|
60
|
+
const rightSash = mesh?.getObjectByName(FRENCH_CASEMENT_RIGHT_SASH_NAME);
|
|
61
|
+
if (!(leftSash && rightSash))
|
|
62
|
+
return false;
|
|
63
|
+
leftSash.rotation.y = -value * (Math.PI / 2);
|
|
64
|
+
rightSash.rotation.y = value * (Math.PI / 2);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
const sash = mesh?.getObjectByName(CASEMENT_WINDOW_SASH_NAME);
|
|
68
|
+
if (!sash)
|
|
69
|
+
return false;
|
|
70
|
+
const hingeSign = (node.hingesSide ?? 'left') === 'left' ? -1 : 1;
|
|
71
|
+
sash.rotation.y = hingeSign * value * (Math.PI / 2);
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (node.windowType === 'awning') {
|
|
75
|
+
const sash = mesh?.getObjectByName(AWNING_WINDOW_SASH_NAME);
|
|
76
|
+
if (!sash)
|
|
77
|
+
return false;
|
|
78
|
+
sash.rotation.x = -value * (Math.PI / 3);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
if (node.windowType === 'hopper') {
|
|
82
|
+
const sash = mesh?.getObjectByName(AWNING_WINDOW_SASH_NAME) ??
|
|
83
|
+
mesh?.getObjectByName(HOPPER_WINDOW_SASH_NAME);
|
|
84
|
+
if (!sash)
|
|
85
|
+
return false;
|
|
86
|
+
sash.rotation.x = -value * (Math.PI / 3);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
export const WindowAnimationSystem = () => {
|
|
92
|
+
useFrame(({ clock }) => {
|
|
93
|
+
const interactive = useInteractive.getState();
|
|
94
|
+
const entries = Object.entries(interactive.windowAnimations);
|
|
95
|
+
if (entries.length === 0)
|
|
96
|
+
return;
|
|
97
|
+
const now = clock.getElapsedTime() * 1000;
|
|
98
|
+
for (const [windowId, animation] of entries) {
|
|
99
|
+
const typedWindowId = windowId;
|
|
100
|
+
const scene = useScene.getState();
|
|
101
|
+
const node = scene.nodes[typedWindowId];
|
|
102
|
+
if (node?.type !== 'window') {
|
|
103
|
+
interactive.cancelWindowAnimation(typedWindowId);
|
|
104
|
+
interactive.removeWindowOpenState(typedWindowId);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const startedAt = animation.startedAt ?? now;
|
|
108
|
+
if (animation.startedAt === null) {
|
|
109
|
+
interactive.startWindowAnimation(typedWindowId, { ...animation, startedAt });
|
|
110
|
+
}
|
|
111
|
+
const progress = Math.min(1, (now - startedAt) / animation.durationMs);
|
|
112
|
+
const value = animation.from + (animation.to - animation.from) * easeWindowAnimation(progress);
|
|
113
|
+
interactive.setWindowOpenState(typedWindowId, { [animation.field]: value });
|
|
114
|
+
const appliedDirectly = applyDirectWindowAnimation(typedWindowId, value);
|
|
115
|
+
if (!appliedDirectly)
|
|
116
|
+
markWindowDirty(typedWindowId);
|
|
117
|
+
if (progress < 1)
|
|
118
|
+
continue;
|
|
119
|
+
interactive.cancelWindowAnimation(typedWindowId);
|
|
120
|
+
if (animation.persist) {
|
|
121
|
+
scene.updateNode(typedWindowId, { [animation.field]: animation.to });
|
|
122
|
+
interactive.removeWindowOpenState(typedWindowId);
|
|
123
|
+
markWindowDirty(typedWindowId);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
interactive.setWindowOpenState(typedWindowId, { [animation.field]: animation.to });
|
|
127
|
+
}
|
|
128
|
+
emitter.emit('window:animation-completed', {
|
|
129
|
+
windowId: typedWindowId,
|
|
130
|
+
field: animation.field,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}, 2);
|
|
134
|
+
return null;
|
|
135
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const CASEMENT_WINDOW_SASH_NAME = "casement-window-sash";
|
|
2
|
+
export declare const FRENCH_CASEMENT_LEFT_SASH_NAME = "french-casement-left-sash";
|
|
3
|
+
export declare const FRENCH_CASEMENT_RIGHT_SASH_NAME = "french-casement-right-sash";
|
|
4
|
+
export declare const SLIDING_WINDOW_ACTIVE_PANEL_NAME = "sliding-window-active-panel";
|
|
5
|
+
export declare const SINGLE_HUNG_ACTIVE_SASH_NAME = "single-hung-active-sash";
|
|
6
|
+
export declare const DOUBLE_HUNG_TOP_SASH_NAME = "double-hung-top-sash";
|
|
7
|
+
export declare const DOUBLE_HUNG_BOTTOM_SASH_NAME = "double-hung-bottom-sash";
|
|
8
|
+
export declare const LOUVERED_WINDOW_SLATS_NAME = "louvered-window-slats";
|
|
9
|
+
export declare const AWNING_WINDOW_SASH_NAME = "awning-window-sash";
|
|
10
|
+
export declare const HOPPER_WINDOW_SASH_NAME = "hopper-window-sash";
|
|
11
|
+
export declare const WindowSystem: () => null;
|
|
12
|
+
//# sourceMappingURL=window-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window-system.d.ts","sourceRoot":"","sources":["../../../src/systems/window/window-system.tsx"],"names":[],"mappings":"AAaA,eAAO,MAAM,yBAAyB,yBAAyB,CAAA;AAC/D,eAAO,MAAM,8BAA8B,8BAA8B,CAAA;AACzE,eAAO,MAAM,+BAA+B,+BAA+B,CAAA;AAC3E,eAAO,MAAM,gCAAgC,gCAAgC,CAAA;AAC7E,eAAO,MAAM,4BAA4B,4BAA4B,CAAA;AACrE,eAAO,MAAM,yBAAyB,yBAAyB,CAAA;AAC/D,eAAO,MAAM,4BAA4B,4BAA4B,CAAA;AACrE,eAAO,MAAM,0BAA0B,0BAA0B,CAAA;AACjE,eAAO,MAAM,uBAAuB,uBAAuB,CAAA;AAC3D,eAAO,MAAM,uBAAuB,uBAAuB,CAAA;AAE3D,eAAO,MAAM,YAAY,YA2BxB,CAAA"}
|