@nice2dev/ui-3d 1.0.0 → 1.0.2

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 (204) hide show
  1. package/CHANGELOG.md +115 -1
  2. package/dist/cjs/collaborative/collaborativeScene.js +210 -0
  3. package/dist/cjs/collaborative/collaborativeScene.js.map +1 -0
  4. package/dist/cjs/core/i18n.js +3 -3
  5. package/dist/cjs/core/i18n.js.map +1 -1
  6. package/dist/cjs/dance/DanceBridge.js +162 -0
  7. package/dist/cjs/dance/DanceBridge.js.map +1 -0
  8. package/dist/cjs/dance/DanceScoreEngine.js +210 -0
  9. package/dist/cjs/dance/DanceScoreEngine.js.map +1 -0
  10. package/dist/cjs/dance/PoseDetector.js +199 -0
  11. package/dist/cjs/dance/PoseDetector.js.map +1 -0
  12. package/dist/cjs/index.js +254 -0
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/material/MaterialEditor.module.css.js +6 -0
  15. package/dist/cjs/material/MaterialEditor.module.css.js.map +1 -0
  16. package/dist/cjs/material/NiceMaterialEditor.js +737 -0
  17. package/dist/cjs/material/NiceMaterialEditor.js.map +1 -0
  18. package/dist/cjs/material/materialEditorTypes.js +73 -0
  19. package/dist/cjs/material/materialEditorTypes.js.map +1 -0
  20. package/dist/cjs/material/materialEditorUtils.js +841 -0
  21. package/dist/cjs/material/materialEditorUtils.js.map +1 -0
  22. package/dist/cjs/material/materialNodeDefinitions.js +1285 -0
  23. package/dist/cjs/material/materialNodeDefinitions.js.map +1 -0
  24. package/dist/cjs/model/ModelEditor.js +4 -1
  25. package/dist/cjs/model/ModelEditor.js.map +1 -1
  26. package/dist/cjs/model/ModelEditor.module.css.js +1 -1
  27. package/dist/cjs/model/ModelEditorLeftPanel.js +5 -4
  28. package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -1
  29. package/dist/cjs/model/ModelEditorMenuBar.js +8 -3
  30. package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -1
  31. package/dist/cjs/model/ModelEditorRightPanel.js +27 -26
  32. package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -1
  33. package/dist/cjs/model/ModelEditorSubComponents.js +20 -16
  34. package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -1
  35. package/dist/cjs/model/ModelEditorTimeline.js +5 -4
  36. package/dist/cjs/model/ModelEditorTimeline.js.map +1 -1
  37. package/dist/cjs/model/ModelEditorToolbar.js +4 -3
  38. package/dist/cjs/model/ModelEditorToolbar.js.map +1 -1
  39. package/dist/cjs/model/ModelEditorViewport.js +2 -2
  40. package/dist/cjs/model/ModelEditorViewport.js.map +1 -1
  41. package/dist/cjs/model/ModelViewer.js +68 -0
  42. package/dist/cjs/model/ModelViewer.js.map +1 -0
  43. package/dist/cjs/model/ModelViewer.module.css.js +6 -0
  44. package/dist/cjs/model/ModelViewer.module.css.js.map +1 -0
  45. package/dist/cjs/model/NiceArmatureEditor.js +255 -0
  46. package/dist/cjs/model/NiceArmatureEditor.js.map +1 -0
  47. package/dist/cjs/model/NiceMorphTargetEditor.js +206 -0
  48. package/dist/cjs/model/NiceMorphTargetEditor.js.map +1 -0
  49. package/dist/cjs/model/NiceOctree.js +339 -0
  50. package/dist/cjs/model/NiceOctree.js.map +1 -0
  51. package/dist/cjs/model/NicePhysicsSimulation.js +283 -0
  52. package/dist/cjs/model/NicePhysicsSimulation.js.map +1 -0
  53. package/dist/cjs/model/NiceProceduralGeometry.js +269 -0
  54. package/dist/cjs/model/NiceProceduralGeometry.js.map +1 -0
  55. package/dist/cjs/model/NiceTerrainEditor.js +343 -0
  56. package/dist/cjs/model/NiceTerrainEditor.js.map +1 -0
  57. package/dist/cjs/model/NiceWeightPainter.js +258 -0
  58. package/dist/cjs/model/NiceWeightPainter.js.map +1 -0
  59. package/dist/cjs/model/NiceXRPreview.js +269 -0
  60. package/dist/cjs/model/NiceXRPreview.js.map +1 -0
  61. package/dist/cjs/model/cadModeUtils.js +130 -0
  62. package/dist/cjs/model/cadModeUtils.js.map +1 -0
  63. package/dist/cjs/model/editorShortcuts.js +187 -0
  64. package/dist/cjs/model/editorShortcuts.js.map +1 -0
  65. package/dist/cjs/model/modelEditorTypes.js +11 -0
  66. package/dist/cjs/model/modelEditorTypes.js.map +1 -1
  67. package/dist/cjs/model/modelEditorUtils.js +1049 -0
  68. package/dist/cjs/model/modelEditorUtils.js.map +1 -0
  69. package/dist/cjs/model/simsModeUtils.js +358 -0
  70. package/dist/cjs/model/simsModeUtils.js.map +1 -0
  71. package/dist/cjs/model/useModelEditor.js +319 -115
  72. package/dist/cjs/model/useModelEditor.js.map +1 -1
  73. package/dist/cjs/model/useModelViewer.js +634 -0
  74. package/dist/cjs/model/useModelViewer.js.map +1 -0
  75. package/dist/cjs/nice2dev-ui-3d.css +1 -1
  76. package/dist/cjs/particle/NiceParticleEditor.js +526 -0
  77. package/dist/cjs/particle/NiceParticleEditor.js.map +1 -0
  78. package/dist/cjs/particle/ParticleEditor.module.css.js +6 -0
  79. package/dist/cjs/particle/ParticleEditor.module.css.js.map +1 -0
  80. package/dist/cjs/particle/particleEditorTypes.js +92 -0
  81. package/dist/cjs/particle/particleEditorTypes.js.map +1 -0
  82. package/dist/cjs/particle/particleEditorUtils.js +1084 -0
  83. package/dist/cjs/particle/particleEditorUtils.js.map +1 -0
  84. package/dist/cjs/rendering/NiceCascadedShadows.js +266 -0
  85. package/dist/cjs/rendering/NiceCascadedShadows.js.map +1 -0
  86. package/dist/cjs/rendering/NiceRenderExport.js +341 -0
  87. package/dist/cjs/rendering/NiceRenderExport.js.map +1 -0
  88. package/dist/cjs/rendering/NiceSSAO.js +359 -0
  89. package/dist/cjs/rendering/NiceSSAO.js.map +1 -0
  90. package/dist/cjs/rendering/NiceSSR.js +277 -0
  91. package/dist/cjs/rendering/NiceSSR.js.map +1 -0
  92. package/dist/cjs/rendering/NiceWebGPURenderer.js +215 -0
  93. package/dist/cjs/rendering/NiceWebGPURenderer.js.map +1 -0
  94. package/dist/cjs/ui/dist/index.js +50089 -0
  95. package/dist/cjs/ui/dist/index.js.map +1 -0
  96. package/dist/cjs/uv/NiceUVEditor.js +520 -0
  97. package/dist/cjs/uv/NiceUVEditor.js.map +1 -0
  98. package/dist/cjs/uv/UVEditor.module.css.js +6 -0
  99. package/dist/cjs/uv/UVEditor.module.css.js.map +1 -0
  100. package/dist/cjs/uv/uvEditorTypes.js +98 -0
  101. package/dist/cjs/uv/uvEditorTypes.js.map +1 -0
  102. package/dist/cjs/uv/uvEditorUtils.js +670 -0
  103. package/dist/cjs/uv/uvEditorUtils.js.map +1 -0
  104. package/dist/esm/collaborative/collaborativeScene.js +206 -0
  105. package/dist/esm/collaborative/collaborativeScene.js.map +1 -0
  106. package/dist/esm/dance/DanceBridge.js +158 -0
  107. package/dist/esm/dance/DanceBridge.js.map +1 -0
  108. package/dist/esm/dance/DanceScoreEngine.js +207 -0
  109. package/dist/esm/dance/DanceScoreEngine.js.map +1 -0
  110. package/dist/esm/dance/PoseDetector.js +195 -0
  111. package/dist/esm/dance/PoseDetector.js.map +1 -0
  112. package/dist/esm/index.js +35 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/material/MaterialEditor.module.css.js +4 -0
  115. package/dist/esm/material/MaterialEditor.module.css.js.map +1 -0
  116. package/dist/esm/material/NiceMaterialEditor.js +734 -0
  117. package/dist/esm/material/NiceMaterialEditor.js.map +1 -0
  118. package/dist/esm/material/materialEditorTypes.js +62 -0
  119. package/dist/esm/material/materialEditorTypes.js.map +1 -0
  120. package/dist/esm/material/materialEditorUtils.js +811 -0
  121. package/dist/esm/material/materialEditorUtils.js.map +1 -0
  122. package/dist/esm/material/materialNodeDefinitions.js +1280 -0
  123. package/dist/esm/material/materialNodeDefinitions.js.map +1 -0
  124. package/dist/esm/model/ModelEditor.js +4 -2
  125. package/dist/esm/model/ModelEditor.js.map +1 -1
  126. package/dist/esm/model/ModelEditor.module.css.js +1 -1
  127. package/dist/esm/model/ModelEditorLeftPanel.js +5 -4
  128. package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -1
  129. package/dist/esm/model/ModelEditorMenuBar.js +8 -3
  130. package/dist/esm/model/ModelEditorMenuBar.js.map +1 -1
  131. package/dist/esm/model/ModelEditorRightPanel.js +27 -26
  132. package/dist/esm/model/ModelEditorRightPanel.js.map +1 -1
  133. package/dist/esm/model/ModelEditorSubComponents.js +17 -13
  134. package/dist/esm/model/ModelEditorSubComponents.js.map +1 -1
  135. package/dist/esm/model/ModelEditorTimeline.js +5 -4
  136. package/dist/esm/model/ModelEditorTimeline.js.map +1 -1
  137. package/dist/esm/model/ModelEditorToolbar.js +4 -3
  138. package/dist/esm/model/ModelEditorToolbar.js.map +1 -1
  139. package/dist/esm/model/ModelEditorViewport.js +2 -2
  140. package/dist/esm/model/ModelEditorViewport.js.map +1 -1
  141. package/dist/esm/model/ModelViewer.js +65 -0
  142. package/dist/esm/model/ModelViewer.js.map +1 -0
  143. package/dist/esm/model/ModelViewer.module.css.js +4 -0
  144. package/dist/esm/model/ModelViewer.module.css.js.map +1 -0
  145. package/dist/esm/model/NiceArmatureEditor.js +233 -0
  146. package/dist/esm/model/NiceArmatureEditor.js.map +1 -0
  147. package/dist/esm/model/NiceMorphTargetEditor.js +184 -0
  148. package/dist/esm/model/NiceMorphTargetEditor.js.map +1 -0
  149. package/dist/esm/model/NiceOctree.js +317 -0
  150. package/dist/esm/model/NiceOctree.js.map +1 -0
  151. package/dist/esm/model/NicePhysicsSimulation.js +261 -0
  152. package/dist/esm/model/NicePhysicsSimulation.js.map +1 -0
  153. package/dist/esm/model/NiceProceduralGeometry.js +242 -0
  154. package/dist/esm/model/NiceProceduralGeometry.js.map +1 -0
  155. package/dist/esm/model/NiceTerrainEditor.js +321 -0
  156. package/dist/esm/model/NiceTerrainEditor.js.map +1 -0
  157. package/dist/esm/model/NiceWeightPainter.js +236 -0
  158. package/dist/esm/model/NiceWeightPainter.js.map +1 -0
  159. package/dist/esm/model/NiceXRPreview.js +247 -0
  160. package/dist/esm/model/NiceXRPreview.js.map +1 -0
  161. package/dist/esm/model/cadModeUtils.js +103 -0
  162. package/dist/esm/model/cadModeUtils.js.map +1 -0
  163. package/dist/esm/model/editorShortcuts.js +185 -0
  164. package/dist/esm/model/editorShortcuts.js.map +1 -0
  165. package/dist/esm/model/modelEditorTypes.js +11 -0
  166. package/dist/esm/model/modelEditorTypes.js.map +1 -1
  167. package/dist/esm/model/modelEditorUtils.js +997 -0
  168. package/dist/esm/model/modelEditorUtils.js.map +1 -0
  169. package/dist/esm/model/simsModeUtils.js +325 -0
  170. package/dist/esm/model/simsModeUtils.js.map +1 -0
  171. package/dist/esm/model/useModelEditor.js +204 -0
  172. package/dist/esm/model/useModelEditor.js.map +1 -1
  173. package/dist/esm/model/useModelViewer.js +613 -0
  174. package/dist/esm/model/useModelViewer.js.map +1 -0
  175. package/dist/esm/nice2dev-ui-3d.css +1 -1
  176. package/dist/esm/particle/NiceParticleEditor.js +523 -0
  177. package/dist/esm/particle/NiceParticleEditor.js.map +1 -0
  178. package/dist/esm/particle/ParticleEditor.module.css.js +4 -0
  179. package/dist/esm/particle/ParticleEditor.module.css.js.map +1 -0
  180. package/dist/esm/particle/particleEditorTypes.js +84 -0
  181. package/dist/esm/particle/particleEditorTypes.js.map +1 -0
  182. package/dist/esm/particle/particleEditorUtils.js +1054 -0
  183. package/dist/esm/particle/particleEditorUtils.js.map +1 -0
  184. package/dist/esm/rendering/NiceCascadedShadows.js +244 -0
  185. package/dist/esm/rendering/NiceCascadedShadows.js.map +1 -0
  186. package/dist/esm/rendering/NiceRenderExport.js +319 -0
  187. package/dist/esm/rendering/NiceRenderExport.js.map +1 -0
  188. package/dist/esm/rendering/NiceSSAO.js +337 -0
  189. package/dist/esm/rendering/NiceSSAO.js.map +1 -0
  190. package/dist/esm/rendering/NiceSSR.js +255 -0
  191. package/dist/esm/rendering/NiceSSR.js.map +1 -0
  192. package/dist/esm/rendering/NiceWebGPURenderer.js +193 -0
  193. package/dist/esm/rendering/NiceWebGPURenderer.js.map +1 -0
  194. package/dist/esm/ui/dist/index.js +49686 -0
  195. package/dist/esm/ui/dist/index.js.map +1 -0
  196. package/dist/esm/uv/NiceUVEditor.js +518 -0
  197. package/dist/esm/uv/NiceUVEditor.js.map +1 -0
  198. package/dist/esm/uv/UVEditor.module.css.js +4 -0
  199. package/dist/esm/uv/UVEditor.module.css.js.map +1 -0
  200. package/dist/esm/uv/uvEditorTypes.js +88 -0
  201. package/dist/esm/uv/uvEditorTypes.js.map +1 -0
  202. package/dist/esm/uv/uvEditorUtils.js +621 -0
  203. package/dist/esm/uv/uvEditorUtils.js.map +1 -0
  204. package/package.json +3 -4
@@ -0,0 +1,613 @@
1
+ import { useRef, useState, useEffect, useCallback } from 'react';
2
+ import * as THREE from 'three';
3
+ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
4
+ import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';
5
+ import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
6
+ import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
7
+ import { ColladaLoader } from 'three/examples/jsm/loaders/ColladaLoader.js';
8
+ import { STLLoader } from 'three/examples/jsm/loaders/STLLoader.js';
9
+ import { PLYLoader } from 'three/examples/jsm/loaders/PLYLoader.js';
10
+
11
+ /**
12
+ * useModelViewer — lightweight hook for the view-only 3D model viewer.
13
+ *
14
+ * Unlike useModelEditor this hook provides NO editing — just loading,
15
+ * orbit/pan/zoom navigation, optional WASD first-person camera,
16
+ * gamepad support, VR mode, annotations and measurement tools.
17
+ *
18
+ * Designed for ERP real-estate / rental-space visualisation and
19
+ * product presentation.
20
+ */
21
+ /* ═══════════════════════════════════════════
22
+ Quality presets
23
+ ═══════════════════════════════════════════ */
24
+ const QUALITY_MAP = {
25
+ low: { pixelRatio: 0.75, shadowMapSize: 512, antialias: false },
26
+ medium: { pixelRatio: 1, shadowMapSize: 1024, antialias: true },
27
+ high: { pixelRatio: 1, shadowMapSize: 2048, antialias: true },
28
+ ultra: { pixelRatio: 2, shadowMapSize: 4096, antialias: true },
29
+ };
30
+ const TONE_MAP = {
31
+ linear: THREE.LinearToneMapping,
32
+ reinhard: THREE.ReinhardToneMapping,
33
+ cineon: THREE.CineonToneMapping,
34
+ aces: THREE.ACESFilmicToneMapping,
35
+ agx: THREE.AgXToneMapping,
36
+ };
37
+ /* ═══════════════════════════════════════════
38
+ Hook
39
+ ═══════════════════════════════════════════ */
40
+ function useModelViewer(props = {}) {
41
+ const { src, format, navigationMode: initNavMode = 'orbit', quality = 'high', autoRotateSpeed: initAutoRotate = 0, backgroundColor = '#1a1a2e', showGrid: initShowGrid = true, shadows = true, gamepad = false, cameraPresets = [], annotations = [], hotspots = [], floorPlans = [], onHotspotClick, onAnnotationClick, onLoadProgress, onLoad, onError, clippingPlanes = [], measureMode: initMeasureMode = false, measurements = [], onMeasure, minDistance = 0.1, maxDistance = 1000, fov = 50, vr = false, walkSpeed = 5, ambientIntensity = 0.5, directionalIntensity = 0.8, antiAlias = true, toneMapping = 'aces', exposure = 1, } = props;
42
+ /* ── refs ── */
43
+ const mountRef = useRef(null);
44
+ const rendererRef = useRef(null);
45
+ const sceneRef = useRef(new THREE.Scene());
46
+ const cameraRef = useRef(new THREE.PerspectiveCamera(fov, 1, 0.01, 10000));
47
+ const orbitRef = useRef(null);
48
+ const clockRef = useRef(new THREE.Clock());
49
+ const mixerRef = useRef(null);
50
+ const rafRef = useRef(0);
51
+ const rootRef = useRef(null);
52
+ const gridRef = useRef(null);
53
+ const clipsRef = useRef([]);
54
+ const keysRef = useRef(new Set());
55
+ useRef(null);
56
+ const disposeRef = useRef(false);
57
+ /* ── state ── */
58
+ const [loading, setLoading] = useState(false);
59
+ const [loadProgress, setLoadProgress] = useState(0);
60
+ const [error, setError] = useState(null);
61
+ const [navMode, setNavMode] = useState(initNavMode);
62
+ const [projection, setProjection] = useState('perspective');
63
+ const [wireframe, setWireframe] = useState(false);
64
+ const [gridVisible, setGridVisible] = useState(initShowGrid);
65
+ const [autoRotate, setAutoRotate] = useState(initAutoRotate);
66
+ const [polyCount, setPolyCount] = useState(0);
67
+ const [meshCount, setMeshCount] = useState(0);
68
+ const [animNames, setAnimNames] = useState([]);
69
+ const [activeAnimIdx, setActiveAnimIdx] = useState(-1);
70
+ const [isPlaying, setIsPlaying] = useState(false);
71
+ const [animTime, setAnimTime] = useState(0);
72
+ const [animDuration, setAnimDuration] = useState(0);
73
+ const [animSpeed, setAnimSpeed] = useState(1);
74
+ const [isFullscreen, setIsFullscreen] = useState(false);
75
+ const [activeFloorPlanId, setActiveFloorPlanId] = useState(null);
76
+ const [annotationsVisible, setAnnotationsVisible] = useState(true);
77
+ const [clippingEnabled, setClippingEnabled] = useState(clippingPlanes.length > 0);
78
+ const [clippingPosition, setClippingPosition] = useState(0);
79
+ const [clippingAxis, setClippingAxis] = useState('y');
80
+ const [measureModeActive, setMeasureModeActive] = useState(initMeasureMode);
81
+ const [dimensions, setDimensions] = useState(null);
82
+ const [statusText, setStatusText] = useState('Ready');
83
+ /* ── scene setup ── */
84
+ useEffect(() => {
85
+ var _a;
86
+ const mount = mountRef.current;
87
+ if (!mount)
88
+ return;
89
+ disposeRef.current = false;
90
+ const q = QUALITY_MAP[quality];
91
+ const renderer = new THREE.WebGLRenderer({
92
+ antialias: q.antialias && antiAlias,
93
+ alpha: backgroundColor === 'transparent',
94
+ preserveDrawingBuffer: true,
95
+ });
96
+ renderer.setPixelRatio(Math.min(window.devicePixelRatio, q.pixelRatio));
97
+ renderer.setSize(mount.clientWidth, mount.clientHeight);
98
+ renderer.toneMapping = (_a = TONE_MAP[toneMapping]) !== null && _a !== void 0 ? _a : THREE.ACESFilmicToneMapping;
99
+ renderer.toneMappingExposure = exposure;
100
+ renderer.outputColorSpace = THREE.SRGBColorSpace;
101
+ if (shadows) {
102
+ renderer.shadowMap.enabled = true;
103
+ renderer.shadowMap.type = THREE.PCFSoftShadowMap;
104
+ }
105
+ mount.appendChild(renderer.domElement);
106
+ rendererRef.current = renderer;
107
+ const scene = sceneRef.current;
108
+ if (backgroundColor !== 'transparent') {
109
+ scene.background = new THREE.Color(backgroundColor);
110
+ }
111
+ // Lights
112
+ const amb = new THREE.AmbientLight(0xffffff, ambientIntensity);
113
+ scene.add(amb);
114
+ const dir = new THREE.DirectionalLight(0xffffff, directionalIntensity);
115
+ dir.position.set(5, 10, 7);
116
+ if (shadows) {
117
+ dir.castShadow = true;
118
+ dir.shadow.mapSize.setScalar(q.shadowMapSize);
119
+ }
120
+ scene.add(dir);
121
+ const hemi = new THREE.HemisphereLight(0xaaccff, 0x445522, 0.3);
122
+ scene.add(hemi);
123
+ // Grid
124
+ const grid = new THREE.GridHelper(50, 50, 0x444444, 0x333333);
125
+ grid.visible = initShowGrid;
126
+ scene.add(grid);
127
+ gridRef.current = grid;
128
+ // Camera
129
+ const camera = cameraRef.current;
130
+ camera.position.set(5, 4, 8);
131
+ camera.lookAt(0, 0, 0);
132
+ // OrbitControls
133
+ const orbit = new OrbitControls(camera, renderer.domElement);
134
+ orbit.enableDamping = true;
135
+ orbit.dampingFactor = 0.08;
136
+ orbit.minDistance = minDistance;
137
+ orbit.maxDistance = maxDistance;
138
+ orbit.autoRotate = initAutoRotate > 0;
139
+ orbit.autoRotateSpeed = initAutoRotate;
140
+ orbitRef.current = orbit;
141
+ // Resize observer
142
+ const ro = new ResizeObserver(() => {
143
+ if (!mount || disposeRef.current)
144
+ return;
145
+ const w = mount.clientWidth;
146
+ const h = mount.clientHeight;
147
+ camera.aspect = w / h;
148
+ camera.updateProjectionMatrix();
149
+ renderer.setSize(w, h);
150
+ });
151
+ ro.observe(mount);
152
+ // Animation loop
153
+ const animate = () => {
154
+ var _a, _b, _c, _d, _e;
155
+ if (disposeRef.current)
156
+ return;
157
+ rafRef.current = requestAnimationFrame(animate);
158
+ const dt = clockRef.current.getDelta();
159
+ // Gamepad FPS-style nav
160
+ if (gamepad && navMode === 'fps') {
161
+ const pads = (_a = navigator.getGamepads) === null || _a === void 0 ? void 0 : _a.call(navigator);
162
+ const gp = (_b = pads === null || pads === void 0 ? void 0 : pads[0]) !== null && _b !== void 0 ? _b : null;
163
+ if (gp) {
164
+ const lx = (_c = gp.axes[0]) !== null && _c !== void 0 ? _c : 0;
165
+ const ly = (_d = gp.axes[1]) !== null && _d !== void 0 ? _d : 0;
166
+ const rx = (_e = gp.axes[2]) !== null && _e !== void 0 ? _e : 0;
167
+ const fwd = new THREE.Vector3();
168
+ camera.getWorldDirection(fwd);
169
+ fwd.y = 0;
170
+ fwd.normalize();
171
+ const right = new THREE.Vector3().crossVectors(fwd, camera.up).normalize();
172
+ camera.position.addScaledVector(fwd, -ly * walkSpeed * dt);
173
+ camera.position.addScaledVector(right, lx * walkSpeed * dt);
174
+ orbit.target.addScaledVector(fwd, -ly * walkSpeed * dt);
175
+ orbit.target.addScaledVector(right, lx * walkSpeed * dt);
176
+ camera.rotateY(-rx * 2 * dt);
177
+ }
178
+ }
179
+ // Keyboard WASD
180
+ if (navMode === 'fps' || navMode === 'walkthrough') {
181
+ const fwd = new THREE.Vector3();
182
+ camera.getWorldDirection(fwd);
183
+ fwd.y = 0;
184
+ fwd.normalize();
185
+ const right = new THREE.Vector3().crossVectors(fwd, camera.up).normalize();
186
+ const speed = walkSpeed * dt;
187
+ if (keysRef.current.has('w') || keysRef.current.has('arrowup')) {
188
+ camera.position.addScaledVector(fwd, speed);
189
+ orbit.target.addScaledVector(fwd, speed);
190
+ }
191
+ if (keysRef.current.has('s') || keysRef.current.has('arrowdown')) {
192
+ camera.position.addScaledVector(fwd, -speed);
193
+ orbit.target.addScaledVector(fwd, -speed);
194
+ }
195
+ if (keysRef.current.has('a') || keysRef.current.has('arrowleft')) {
196
+ camera.position.addScaledVector(right, -speed);
197
+ orbit.target.addScaledVector(right, -speed);
198
+ }
199
+ if (keysRef.current.has('d') || keysRef.current.has('arrowright')) {
200
+ camera.position.addScaledVector(right, speed);
201
+ orbit.target.addScaledVector(right, speed);
202
+ }
203
+ if (keysRef.current.has('q')) {
204
+ camera.position.y += speed;
205
+ orbit.target.y += speed;
206
+ }
207
+ if (keysRef.current.has('e')) {
208
+ camera.position.y -= speed;
209
+ orbit.target.y -= speed;
210
+ }
211
+ }
212
+ if (mixerRef.current) {
213
+ mixerRef.current.update(dt);
214
+ }
215
+ orbit.update();
216
+ renderer.render(scene, camera);
217
+ };
218
+ animate();
219
+ // Keyboard listeners
220
+ const onKeyDown = (e) => keysRef.current.add(e.key.toLowerCase());
221
+ const onKeyUp = (e) => keysRef.current.delete(e.key.toLowerCase());
222
+ mount.addEventListener('keydown', onKeyDown);
223
+ mount.addEventListener('keyup', onKeyUp);
224
+ // Fullscreen
225
+ const onFSChange = () => setIsFullscreen(!!document.fullscreenElement);
226
+ document.addEventListener('fullscreenchange', onFSChange);
227
+ return () => {
228
+ disposeRef.current = true;
229
+ cancelAnimationFrame(rafRef.current);
230
+ ro.disconnect();
231
+ orbit.dispose();
232
+ renderer.dispose();
233
+ mount.removeEventListener('keydown', onKeyDown);
234
+ mount.removeEventListener('keyup', onKeyUp);
235
+ document.removeEventListener('fullscreenchange', onFSChange);
236
+ if (mount.contains(renderer.domElement)) {
237
+ mount.removeChild(renderer.domElement);
238
+ }
239
+ };
240
+ // eslint-disable-next-line react-hooks/exhaustive-deps
241
+ }, []);
242
+ /* ── update grid visibility ── */
243
+ useEffect(() => {
244
+ if (gridRef.current)
245
+ gridRef.current.visible = gridVisible;
246
+ }, [gridVisible]);
247
+ /* ── update auto-rotate ── */
248
+ useEffect(() => {
249
+ if (orbitRef.current) {
250
+ orbitRef.current.autoRotate = autoRotate > 0;
251
+ orbitRef.current.autoRotateSpeed = autoRotate;
252
+ }
253
+ }, [autoRotate]);
254
+ /* ── wireframe toggle ── */
255
+ useEffect(() => {
256
+ if (!rootRef.current)
257
+ return;
258
+ rootRef.current.traverse((c) => {
259
+ if (c.isMesh) {
260
+ const mat = c.material;
261
+ const mats = Array.isArray(mat) ? mat : [mat];
262
+ mats.forEach((m) => {
263
+ if ('wireframe' in m)
264
+ m.wireframe = wireframe;
265
+ });
266
+ }
267
+ });
268
+ }, [wireframe]);
269
+ /* ── clipping ── */
270
+ useEffect(() => {
271
+ const renderer = rendererRef.current;
272
+ if (!renderer)
273
+ return;
274
+ if (clippingEnabled) {
275
+ const normal = new THREE.Vector3(clippingAxis === 'x' ? 1 : 0, clippingAxis === 'y' ? 1 : 0, clippingAxis === 'z' ? 1 : 0);
276
+ const plane = new THREE.Plane(normal, -clippingPosition);
277
+ renderer.clippingPlanes = [plane];
278
+ }
279
+ else {
280
+ renderer.clippingPlanes = [];
281
+ }
282
+ }, [clippingEnabled, clippingPosition, clippingAxis]);
283
+ /* ── counting helpers ── */
284
+ const countScene = useCallback(() => {
285
+ let tris = 0;
286
+ let meshes = 0;
287
+ sceneRef.current.traverse((c) => {
288
+ if (c.isMesh) {
289
+ meshes++;
290
+ const geo = c.geometry;
291
+ if (geo.index)
292
+ tris += geo.index.count / 3;
293
+ else if (geo.attributes.position)
294
+ tris += geo.attributes.position.count / 3;
295
+ }
296
+ });
297
+ setPolyCount(Math.round(tris));
298
+ setMeshCount(meshes);
299
+ }, []);
300
+ /* ── detect format from URL ── */
301
+ const detectFormat = useCallback((url, hint) => {
302
+ var _a, _b, _c;
303
+ if (hint)
304
+ return hint;
305
+ const ext = (_c = (_b = (_a = url.split('.').pop()) === null || _a === void 0 ? void 0 : _a.split('?')[0]) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : '';
306
+ return ext;
307
+ }, []);
308
+ /* ── load model ── */
309
+ const loadModel = useCallback(async (url, fmt) => {
310
+ var _a, _b, _c;
311
+ setLoading(true);
312
+ setLoadProgress(0);
313
+ setError(null);
314
+ setStatusText('Loading…');
315
+ const detectedFmt = detectFormat(url, fmt);
316
+ const onProgress = (e) => {
317
+ if (e.lengthComputable) {
318
+ const p = e.loaded / e.total;
319
+ setLoadProgress(p);
320
+ onLoadProgress === null || onLoadProgress === void 0 ? void 0 : onLoadProgress(p);
321
+ }
322
+ };
323
+ try {
324
+ let obj = null;
325
+ let clips = [];
326
+ if (detectedFmt === 'fbx') {
327
+ const loader = new FBXLoader();
328
+ const group = await loader.loadAsync(url, onProgress);
329
+ clips = (_a = group.animations) !== null && _a !== void 0 ? _a : [];
330
+ obj = group;
331
+ }
332
+ else if (detectedFmt === 'glb' || detectedFmt === 'gltf') {
333
+ const loader = new GLTFLoader();
334
+ const gltf = await loader.loadAsync(url, onProgress);
335
+ clips = (_b = gltf.animations) !== null && _b !== void 0 ? _b : [];
336
+ obj = gltf.scene;
337
+ }
338
+ else if (detectedFmt === 'obj') {
339
+ const loader = new OBJLoader();
340
+ obj = await loader.loadAsync(url, onProgress);
341
+ }
342
+ else if (detectedFmt === 'dae') {
343
+ const loader = new ColladaLoader();
344
+ const result = await loader.loadAsync(url, onProgress);
345
+ if (result) {
346
+ clips = (_c = result.scene.animations) !== null && _c !== void 0 ? _c : [];
347
+ obj = result.scene;
348
+ }
349
+ }
350
+ else if (detectedFmt === 'stl') {
351
+ const loader = new STLLoader();
352
+ const geo = await loader.loadAsync(url, onProgress);
353
+ const mat = new THREE.MeshStandardMaterial({ color: 0xaaaaaa, metalness: 0.3, roughness: 0.6 });
354
+ const mesh = new THREE.Mesh(geo, mat);
355
+ mesh.castShadow = true;
356
+ mesh.receiveShadow = true;
357
+ obj = mesh;
358
+ }
359
+ else if (detectedFmt === 'ply') {
360
+ const loader = new PLYLoader();
361
+ const geo = await loader.loadAsync(url, onProgress);
362
+ geo.computeVertexNormals();
363
+ const mat = new THREE.MeshStandardMaterial({ color: 0xaaaaaa, vertexColors: !!geo.attributes.color });
364
+ obj = new THREE.Mesh(geo, mat);
365
+ }
366
+ else {
367
+ throw new Error(`Unsupported format: ${detectedFmt}`);
368
+ }
369
+ if (obj) {
370
+ // Remove previous model
371
+ if (rootRef.current) {
372
+ sceneRef.current.remove(rootRef.current);
373
+ }
374
+ // Enable shadows
375
+ obj.traverse((c) => {
376
+ if (c.isMesh) {
377
+ c.castShadow = true;
378
+ c.receiveShadow = true;
379
+ }
380
+ });
381
+ // Auto-scale to normalized size
382
+ const box = new THREE.Box3().setFromObject(obj);
383
+ const size = box.getSize(new THREE.Vector3());
384
+ const maxDim = Math.max(size.x, size.y, size.z);
385
+ if (maxDim > 0) {
386
+ const target = 5;
387
+ if (maxDim > target * 2 || maxDim < target * 0.1) {
388
+ const scale = target / maxDim;
389
+ obj.scale.multiplyScalar(scale);
390
+ }
391
+ }
392
+ // Center model
393
+ const box2 = new THREE.Box3().setFromObject(obj);
394
+ const center = box2.getCenter(new THREE.Vector3());
395
+ obj.position.sub(center);
396
+ obj.position.y += box2.getSize(new THREE.Vector3()).y / 2;
397
+ sceneRef.current.add(obj);
398
+ rootRef.current = obj;
399
+ // Update dimensions
400
+ const finalBox = new THREE.Box3().setFromObject(obj);
401
+ const s = finalBox.getSize(new THREE.Vector3());
402
+ setDimensions({ width: +s.x.toFixed(2), height: +s.y.toFixed(2), depth: +s.z.toFixed(2) });
403
+ // Animations
404
+ clipsRef.current = clips;
405
+ setAnimNames(clips.map((c, i) => c.name || `Clip ${i + 1}`));
406
+ if (clips.length > 0) {
407
+ const mixer = new THREE.AnimationMixer(obj);
408
+ mixerRef.current = mixer;
409
+ }
410
+ countScene();
411
+ setStatusText(`Loaded – ${polyCount} tris, ${meshCount} meshes`);
412
+ onLoad === null || onLoad === void 0 ? void 0 : onLoad();
413
+ }
414
+ }
415
+ catch (err) {
416
+ const msg = err instanceof Error ? err.message : String(err);
417
+ setError(msg);
418
+ setStatusText(`Error: ${msg}`);
419
+ onError === null || onError === void 0 ? void 0 : onError(err instanceof Error ? err : new Error(msg));
420
+ }
421
+ finally {
422
+ setLoading(false);
423
+ setLoadProgress(1);
424
+ }
425
+ }, [countScene, detectFormat, onLoad, onError, onLoadProgress, polyCount, meshCount]);
426
+ /* ── auto-load from src ── */
427
+ useEffect(() => {
428
+ if (src)
429
+ loadModel(src, format);
430
+ }, [src, format, loadModel]);
431
+ /* ── loadFile from disk ── */
432
+ const loadFile = useCallback(async (file) => {
433
+ var _a;
434
+ const url = URL.createObjectURL(file);
435
+ const ext = (_a = file.name.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
436
+ try {
437
+ await loadModel(url, ext);
438
+ }
439
+ finally {
440
+ URL.revokeObjectURL(url);
441
+ }
442
+ }, [loadModel]);
443
+ /* ── loadUrl ── */
444
+ const loadUrl = useCallback(async (url, fmt) => {
445
+ await loadModel(url, fmt);
446
+ }, [loadModel]);
447
+ /* ── animation controls ── */
448
+ const playAnimation = useCallback((index) => {
449
+ if (!mixerRef.current || index < 0 || index >= clipsRef.current.length)
450
+ return;
451
+ mixerRef.current.stopAllAction();
452
+ const clip = clipsRef.current[index];
453
+ const action = mixerRef.current.clipAction(clip);
454
+ action.reset().play();
455
+ setActiveAnimIdx(index);
456
+ setIsPlaying(true);
457
+ setAnimDuration(clip.duration);
458
+ }, []);
459
+ const togglePlay = useCallback(() => {
460
+ if (!mixerRef.current)
461
+ return;
462
+ if (isPlaying) {
463
+ mixerRef.current.timeScale = 0;
464
+ setIsPlaying(false);
465
+ }
466
+ else {
467
+ mixerRef.current.timeScale = animSpeed;
468
+ setIsPlaying(true);
469
+ if (activeAnimIdx < 0 && clipsRef.current.length > 0)
470
+ playAnimation(0);
471
+ }
472
+ }, [isPlaying, animSpeed, activeAnimIdx, playAnimation]);
473
+ const seekAnim = useCallback((t) => {
474
+ if (mixerRef.current)
475
+ mixerRef.current.setTime(t);
476
+ setAnimTime(t);
477
+ }, []);
478
+ /* ── camera presets ── */
479
+ const goToPreset = useCallback((preset) => {
480
+ const cam = cameraRef.current;
481
+ const orbit = orbitRef.current;
482
+ if (!orbit)
483
+ return;
484
+ cam.position.set(...preset.position);
485
+ orbit.target.set(...preset.target);
486
+ if (preset.fov)
487
+ cam.fov = preset.fov;
488
+ cam.updateProjectionMatrix();
489
+ orbit.update();
490
+ }, []);
491
+ const resetCamera = useCallback(() => {
492
+ const cam = cameraRef.current;
493
+ cam.position.set(5, 4, 8);
494
+ if (orbitRef.current) {
495
+ orbitRef.current.target.set(0, 0, 0);
496
+ orbitRef.current.update();
497
+ }
498
+ }, []);
499
+ const zoomToFit = useCallback(() => {
500
+ if (!rootRef.current)
501
+ return;
502
+ const box = new THREE.Box3().setFromObject(rootRef.current);
503
+ const center = box.getCenter(new THREE.Vector3());
504
+ const size = box.getSize(new THREE.Vector3());
505
+ const maxDim = Math.max(size.x, size.y, size.z);
506
+ const cam = cameraRef.current;
507
+ const dist = maxDim / (2 * Math.tan((cam.fov * Math.PI) / 360));
508
+ cam.position.copy(center).add(new THREE.Vector3(0, 0, dist * 1.5));
509
+ if (orbitRef.current) {
510
+ orbitRef.current.target.copy(center);
511
+ orbitRef.current.update();
512
+ }
513
+ }, []);
514
+ /* ── screenshot ── */
515
+ const screenshot = useCallback((width, height) => {
516
+ const renderer = rendererRef.current;
517
+ if (!renderer)
518
+ return '';
519
+ if (width && height) {
520
+ renderer.setSize(width, height);
521
+ cameraRef.current.aspect = width / height;
522
+ cameraRef.current.updateProjectionMatrix();
523
+ }
524
+ renderer.render(sceneRef.current, cameraRef.current);
525
+ const url = renderer.domElement.toDataURL('image/png');
526
+ if (width && height && mountRef.current) {
527
+ const w = mountRef.current.clientWidth;
528
+ const h = mountRef.current.clientHeight;
529
+ renderer.setSize(w, h);
530
+ cameraRef.current.aspect = w / h;
531
+ cameraRef.current.updateProjectionMatrix();
532
+ }
533
+ return url;
534
+ }, []);
535
+ /* ── fullscreen ── */
536
+ const toggleFullscreen = useCallback(() => {
537
+ if (!mountRef.current)
538
+ return;
539
+ if (document.fullscreenElement) {
540
+ document.exitFullscreen();
541
+ }
542
+ else {
543
+ mountRef.current.requestFullscreen();
544
+ }
545
+ }, []);
546
+ /* ── dispose ── */
547
+ const dispose = useCallback(() => {
548
+ var _a;
549
+ disposeRef.current = true;
550
+ cancelAnimationFrame(rafRef.current);
551
+ (_a = rendererRef.current) === null || _a === void 0 ? void 0 : _a.dispose();
552
+ }, []);
553
+ /* ── finalise status text ── */
554
+ useEffect(() => {
555
+ if (!loading && !error && polyCount > 0) {
556
+ setStatusText(`${polyCount.toLocaleString()} triangles · ${meshCount} meshes · ${animNames.length} animation(s)`);
557
+ }
558
+ }, [loading, error, polyCount, meshCount, animNames.length]);
559
+ return {
560
+ mountRef,
561
+ loading,
562
+ loadProgress,
563
+ error,
564
+ navigationMode: navMode,
565
+ setNavigationMode: setNavMode,
566
+ projection,
567
+ setProjection,
568
+ wireframe,
569
+ setWireframe,
570
+ showGrid: gridVisible,
571
+ setShowGrid: setGridVisible,
572
+ autoRotateSpeed: autoRotate,
573
+ setAutoRotateSpeed: setAutoRotate,
574
+ polyCount,
575
+ meshCount,
576
+ animations: animNames,
577
+ activeAnimIdx,
578
+ playAnimation,
579
+ togglePlay,
580
+ isPlaying,
581
+ animTime,
582
+ animDuration,
583
+ seekAnim,
584
+ animSpeed,
585
+ setAnimSpeed,
586
+ goToPreset,
587
+ resetCamera,
588
+ zoomToFit,
589
+ screenshot,
590
+ toggleFullscreen,
591
+ isFullscreen,
592
+ loadFile,
593
+ loadUrl,
594
+ activeFloorPlanId,
595
+ setActiveFloorPlanId,
596
+ annotationsVisible,
597
+ setAnnotationsVisible,
598
+ measureMode: measureModeActive,
599
+ setMeasureMode: setMeasureModeActive,
600
+ clippingEnabled,
601
+ setClippingEnabled,
602
+ clippingPosition,
603
+ setClippingPosition,
604
+ clippingAxis,
605
+ setClippingAxis,
606
+ dimensions,
607
+ statusText,
608
+ dispose,
609
+ };
610
+ }
611
+
612
+ export { useModelViewer };
613
+ //# sourceMappingURL=useModelViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useModelViewer.js","sources":["../../../src/model/useModelViewer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}