@nice2dev/ui-3d 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +90 -0
  4. package/dist/cjs/core/i18n.js +16 -0
  5. package/dist/cjs/core/i18n.js.map +1 -0
  6. package/dist/cjs/index.js +11 -0
  7. package/dist/cjs/index.js.map +1 -0
  8. package/dist/cjs/model/ModelEditor.js +33 -0
  9. package/dist/cjs/model/ModelEditor.js.map +1 -0
  10. package/dist/cjs/model/ModelEditor.module.css.js +6 -0
  11. package/dist/cjs/model/ModelEditor.module.css.js.map +1 -0
  12. package/dist/cjs/model/ModelEditorLeftPanel.js +40 -0
  13. package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -0
  14. package/dist/cjs/model/ModelEditorMenuBar.js +14 -0
  15. package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -0
  16. package/dist/cjs/model/ModelEditorRightPanel.js +106 -0
  17. package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -0
  18. package/dist/cjs/model/ModelEditorSubComponents.js +99 -0
  19. package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -0
  20. package/dist/cjs/model/ModelEditorTimeline.js +31 -0
  21. package/dist/cjs/model/ModelEditorTimeline.js.map +1 -0
  22. package/dist/cjs/model/ModelEditorToolbar.js +14 -0
  23. package/dist/cjs/model/ModelEditorToolbar.js.map +1 -0
  24. package/dist/cjs/model/ModelEditorViewport.js +20 -0
  25. package/dist/cjs/model/ModelEditorViewport.js.map +1 -0
  26. package/dist/cjs/model/modelEditorTypes.js +122 -0
  27. package/dist/cjs/model/modelEditorTypes.js.map +1 -0
  28. package/dist/cjs/model/useModelEditor.js +1581 -0
  29. package/dist/cjs/model/useModelEditor.js.map +1 -0
  30. package/dist/cjs/nice2dev-ui-3d.css +1 -0
  31. package/dist/esm/core/i18n.js +13 -0
  32. package/dist/esm/core/i18n.js.map +1 -0
  33. package/dist/esm/index.js +3 -0
  34. package/dist/esm/index.js.map +1 -0
  35. package/dist/esm/model/ModelEditor.js +31 -0
  36. package/dist/esm/model/ModelEditor.js.map +1 -0
  37. package/dist/esm/model/ModelEditor.module.css.js +4 -0
  38. package/dist/esm/model/ModelEditor.module.css.js.map +1 -0
  39. package/dist/esm/model/ModelEditorLeftPanel.js +38 -0
  40. package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -0
  41. package/dist/esm/model/ModelEditorMenuBar.js +12 -0
  42. package/dist/esm/model/ModelEditorMenuBar.js.map +1 -0
  43. package/dist/esm/model/ModelEditorRightPanel.js +85 -0
  44. package/dist/esm/model/ModelEditorRightPanel.js.map +1 -0
  45. package/dist/esm/model/ModelEditorSubComponents.js +76 -0
  46. package/dist/esm/model/ModelEditorSubComponents.js.map +1 -0
  47. package/dist/esm/model/ModelEditorTimeline.js +29 -0
  48. package/dist/esm/model/ModelEditorTimeline.js.map +1 -0
  49. package/dist/esm/model/ModelEditorToolbar.js +12 -0
  50. package/dist/esm/model/ModelEditorToolbar.js.map +1 -0
  51. package/dist/esm/model/ModelEditorViewport.js +18 -0
  52. package/dist/esm/model/ModelEditorViewport.js.map +1 -0
  53. package/dist/esm/model/modelEditorTypes.js +97 -0
  54. package/dist/esm/model/modelEditorTypes.js.map +1 -0
  55. package/dist/esm/model/useModelEditor.js +1560 -0
  56. package/dist/esm/model/useModelEditor.js.map +1 -0
  57. package/dist/esm/nice2dev-ui-3d.css +1 -0
  58. package/dist/types/core/i18n.d.ts +27 -0
  59. package/dist/types/index.d.ts +10 -0
  60. package/dist/types/model/ModelEditor.d.ts +17 -0
  61. package/dist/types/model/ModelEditorLeftPanel.d.ts +10 -0
  62. package/dist/types/model/ModelEditorMenuBar.d.ts +11 -0
  63. package/dist/types/model/ModelEditorRightPanel.d.ts +11 -0
  64. package/dist/types/model/ModelEditorSubComponents.d.ts +24 -0
  65. package/dist/types/model/ModelEditorTimeline.d.ts +11 -0
  66. package/dist/types/model/ModelEditorToolbar.d.ts +11 -0
  67. package/dist/types/model/ModelEditorViewport.d.ts +11 -0
  68. package/dist/types/model/modelEditorTypes.d.ts +52 -0
  69. package/dist/types/model/useModelEditor.d.ts +125 -0
  70. package/package.json +89 -0
@@ -0,0 +1,76 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import * as THREE from 'three';
4
+ import styles from './ModelEditor.module.css.js';
5
+ import { DEG } from './modelEditorTypes.js';
6
+
7
+ /* ═══════════════════════════════════════════
8
+ Sub-components
9
+ ═══════════════════════════════════════════ */
10
+ /** Vec3 input row for position/scale */
11
+ const Vec3Row = ({ label, value, onChange }) => {
12
+ const [, forceUpdate] = useState(0);
13
+ const set = (axis, v) => {
14
+ const n = parseFloat(v);
15
+ if (!isNaN(n)) {
16
+ value[axis] = n;
17
+ forceUpdate((x) => x + 1);
18
+ onChange();
19
+ }
20
+ };
21
+ return (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: label }), jsxs("div", { className: styles.propVec3, children: [jsx("input", { className: styles.propVec3X, value: value.x.toFixed(3), onChange: (e) => set("x", e.target.value) }), jsx("input", { className: styles.propVec3Y, value: value.y.toFixed(3), onChange: (e) => set("y", e.target.value) }), jsx("input", { className: styles.propVec3Z, value: value.z.toFixed(3), onChange: (e) => set("z", e.target.value) })] })] }));
22
+ };
23
+ /** Vec3 input row for rotation (shows degrees) */
24
+ const Vec3RowDeg = ({ label, value, onChange }) => {
25
+ const [, forceUpdate] = useState(0);
26
+ const set = (axis, v) => {
27
+ const n = parseFloat(v);
28
+ if (!isNaN(n)) {
29
+ value[axis] = n / DEG;
30
+ forceUpdate((x) => x + 1);
31
+ onChange();
32
+ }
33
+ };
34
+ return (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: label }), jsxs("div", { className: styles.propVec3, children: [jsx("input", { className: styles.propVec3X, value: (value.x * DEG).toFixed(1), onChange: (e) => set("x", e.target.value) }), jsx("input", { className: styles.propVec3Y, value: (value.y * DEG).toFixed(1), onChange: (e) => set("y", e.target.value) }), jsx("input", { className: styles.propVec3Z, value: (value.z * DEG).toFixed(1), onChange: (e) => set("z", e.target.value) })] })] }));
35
+ };
36
+ /** Material card with editable properties */
37
+ const MaterialCard = ({ material, active, onClick, onUpdate }) => {
38
+ var _a, _b, _c, _d;
39
+ const mat = material;
40
+ const hasColor = "color" in mat;
41
+ const hasMetalness = "metalness" in mat;
42
+ const hasRoughness = "roughness" in mat;
43
+ const hasEmissive = "emissive" in mat;
44
+ const hasMap = "map" in mat;
45
+ const hasNormalMap = "normalMap" in mat;
46
+ const setColor = (hex) => {
47
+ if (hasColor) {
48
+ mat.color.set(hex);
49
+ mat.needsUpdate = true;
50
+ onUpdate();
51
+ }
52
+ };
53
+ const setNum = (prop, val) => {
54
+ mat[prop] = val;
55
+ mat.needsUpdate = true;
56
+ onUpdate();
57
+ };
58
+ return (jsxs("div", { className: `${styles.materialCard} ${active ? styles.materialCardActive : ""}`, onClick: onClick, children: [jsx("div", { className: styles.materialHeader, children: jsx("span", { className: styles.materialName, children: mat.name || mat.type }) }), hasColor && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Color" }), jsx("div", { className: styles.propColorSwatch, style: { background: `#${mat.color.getHexString()}` }, children: jsx("input", { type: "color", value: `#${mat.color.getHexString()}`, onChange: (e) => setColor(e.target.value) }) }), jsxs("span", { style: { fontSize: 10, color: "#888" }, children: ["#", mat.color.getHexString()] })] })), hasMetalness && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Metal" }), jsx("input", { type: "range", min: 0, max: 1, step: 0.01, value: mat.metalness, onChange: (e) => setNum("metalness", parseFloat(e.target.value)), style: { flex: 1, accentColor: "#5566cc" } }), jsx("span", { style: { fontSize: 9, color: "#888", width: 28, textAlign: "right" }, children: mat.metalness.toFixed(2) })] })), hasRoughness && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Rough" }), jsx("input", { type: "range", min: 0, max: 1, step: 0.01, value: mat.roughness, onChange: (e) => setNum("roughness", parseFloat(e.target.value)), style: { flex: 1, accentColor: "#5566cc" } }), jsx("span", { style: { fontSize: 9, color: "#888", width: 28, textAlign: "right" }, children: mat.roughness.toFixed(2) })] })), hasEmissive && mat.emissive && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Emissive" }), jsx("div", { className: styles.propColorSwatch, style: { background: `#${mat.emissive.getHexString()}` }, children: jsx("input", { type: "color", value: `#${mat.emissive.getHexString()}`, onChange: (e) => {
59
+ mat.emissive.set(e.target.value);
60
+ mat.needsUpdate = true;
61
+ onUpdate();
62
+ } }) })] })), jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Opacity" }), jsx("input", { type: "range", min: 0, max: 1, step: 0.01, value: mat.opacity, onChange: (e) => {
63
+ const v = parseFloat(e.target.value);
64
+ mat.opacity = v;
65
+ mat.transparent = v < 1;
66
+ mat.needsUpdate = true;
67
+ onUpdate();
68
+ }, style: { flex: 1, accentColor: "#5566cc" } }), jsx("span", { style: { fontSize: 9, color: "#888", width: 28, textAlign: "right" }, children: mat.opacity.toFixed(2) })] }), jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Side" }), jsxs("select", { className: styles.propSelect, value: mat.side, onChange: (e) => {
69
+ mat.side = parseInt(e.target.value);
70
+ mat.needsUpdate = true;
71
+ onUpdate();
72
+ }, children: [jsx("option", { value: THREE.FrontSide, children: "Front" }), jsx("option", { value: THREE.BackSide, children: "Back" }), jsx("option", { value: THREE.DoubleSide, children: "Double" })] })] }), hasMap && mat.map && (jsxs("div", { className: styles.textureSlot, children: [jsx("div", { className: styles.textureThumb, children: mat.map.image != null && (jsx("img", { src: (_a = mat.map.image.src) !== null && _a !== void 0 ? _a : "", alt: "diffuse" })) }), jsxs("div", { className: styles.textureInfo, children: [jsx("div", { className: styles.textureName, children: "Diffuse Map" }), jsxs("div", { style: { fontSize: 9, color: "#666" }, children: [(_b = mat.map.image) === null || _b === void 0 ? void 0 : _b.width, "\u00D7", (_c = mat.map.image) === null || _c === void 0 ? void 0 : _c.height] })] })] })), hasNormalMap && mat.normalMap && (jsxs("div", { className: styles.textureSlot, children: [jsx("div", { className: styles.textureThumb, children: mat.normalMap.image != null && (jsx("img", { src: (_d = mat.normalMap.image.src) !== null && _d !== void 0 ? _d : "", alt: "normal" })) }), jsx("div", { className: styles.textureInfo, children: jsx("div", { className: styles.textureName, children: "Normal Map" }) })] }))] }));
73
+ };
74
+
75
+ export { MaterialCard, Vec3Row, Vec3RowDeg };
76
+ //# sourceMappingURL=ModelEditorSubComponents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelEditorSubComponents.js","sources":["../../../src/model/ModelEditorSubComponents.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import styles from './ModelEditor.module.css.js';
4
+ import { fmtTime } from './modelEditorTypes.js';
5
+
6
+ const ModelEditorTimeline = React.memo(({ api }) => {
7
+ const { bottomCollapsed, setBottomCollapsed, animations, activeAnimIdx, isPlaying, animTime, animDuration, animSpeed, setAnimSpeed, loopAnim, setLoopAnim, seekAnim, togglePlay, stopAnim, playClip, mergeInputRef, } = api;
8
+ return (jsxs("div", { className: `${styles.bottomPanel} ${bottomCollapsed ? styles.bottomPanelCollapsed : ""}`, children: [jsxs("div", { className: styles.bottomPanelHeader, children: [jsx("span", { className: styles.bottomToggle, onClick: () => setBottomCollapsed((c) => !c), children: bottomCollapsed ? "▶" : "▼" }), jsxs("span", { className: styles.bottomPanelTitle, onClick: () => setBottomCollapsed((c) => !c), children: ["Animation (", animations.length, " clip", animations.length !== 1 ? "s" : "", ")"] }), jsx("div", { className: styles.menuSep }), jsxs("div", { className: styles.transportBar, children: [jsx("button", { className: styles.transportBtn, onClick: () => seekAnim(0), title: "Go to start", children: "\u23EE" }), jsx("button", { className: `${styles.transportBtn} ${isPlaying ? styles.transportBtnActive : ""}`, onClick: togglePlay, title: "Play/Pause (Space)", children: isPlaying ? "⏸" : "▶" }), jsx("button", { className: styles.transportBtn, onClick: stopAnim, title: "Stop", children: "\u23F9" }), jsx("button", { className: `${styles.transportBtn} ${loopAnim ? styles.transportBtnActive : ""}`, onClick: () => setLoopAnim((v) => !v), title: "Loop", children: "\uD83D\uDD01" })] }), jsxs("span", { className: styles.transportTime, children: [fmtTime(animTime), " / ", fmtTime(animDuration)] }), jsx("div", { className: styles.menuSep }), jsx("label", { className: styles.menuLabel, children: "Speed" }), jsx("input", { type: "range", min: 0.1, max: 3, step: 0.1, value: animSpeed, onChange: (e) => setAnimSpeed(parseFloat(e.target.value)), style: { width: 60, accentColor: "#5566cc" } }), jsxs("span", { className: styles.menuLabel, children: [animSpeed.toFixed(1), "\u00D7"] })] }), !bottomCollapsed && (jsxs("div", { className: styles.animListArea, children: [jsxs("div", { className: styles.animList, children: [animations.length === 0 && (jsx("div", { style: { color: "#666", fontSize: 10, padding: 8 }, children: "No animations loaded" })), animations.map((anim, i) => (jsxs("div", { className: `${styles.animItem} ${i === activeAnimIdx ? styles.animItemActive : ""}`, onClick: () => playClip(i), children: [jsx("span", { children: anim.name }), jsxs("span", { className: styles.animDuration, children: [anim.duration.toFixed(1), "s"] })] }, `${anim.name}-${i}`))), jsx("div", { style: { padding: "4px 8px" }, children: jsx("button", { className: styles.btnSecondary, style: { width: "100%", fontSize: 10 }, onClick: () => { var _a; return (_a = mergeInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Add Animation File" }) })] }), jsxs("div", { className: styles.timelineArea, children: [jsxs("div", { className: styles.timelineRuler, children: [animDuration > 0 &&
9
+ Array.from({ length: Math.ceil(animDuration) + 1 }, (_, i) => {
10
+ const pct = (i / animDuration) * 100;
11
+ return (jsxs(React.Fragment, { children: [jsx("div", { className: styles.rulerTick, style: { left: `${pct}%` } }), jsxs("span", { className: styles.rulerLabel, style: { left: `${pct}%` }, children: [i, "s"] })] }, i));
12
+ }), animDuration > 0 && (jsx("div", { className: styles.playhead, style: {
13
+ left: `${(animTime / animDuration) * 100}%`,
14
+ height: "100%",
15
+ }, children: jsx("div", { className: styles.playheadHandle }) }))] }), jsx("div", { className: styles.timelineTracks, style: { height: 140, cursor: "pointer" }, onClick: (e) => {
16
+ if (animDuration <= 0)
17
+ return;
18
+ const rect = e.currentTarget.getBoundingClientRect();
19
+ const pct = (e.clientX - rect.left) / rect.width;
20
+ seekAnim(Math.max(0, Math.min(animDuration, pct * animDuration)));
21
+ }, children: animDuration > 0 && (jsx("div", { className: styles.playhead, style: {
22
+ left: `${(animTime / animDuration) * 100}%`,
23
+ height: "100%",
24
+ } })) })] })] }))] }));
25
+ });
26
+ ModelEditorTimeline.displayName = "ModelEditorTimeline";
27
+
28
+ export { ModelEditorTimeline as default };
29
+ //# sourceMappingURL=ModelEditorTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelEditorTimeline.js","sources":["../../../src/model/ModelEditorTimeline.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import styles from './ModelEditor.module.css.js';
4
+
5
+ const ModelEditorToolbar = React.memo(({ api }) => {
6
+ const { transformMode, setTransformMode, snapEnabled, setSnapEnabled, gizmoSpace, setGizmoSpace, rootObjectRef, focusOnObject, setCameraPreset, deleteSelected, duplicateSelected, selectedNode, } = api;
7
+ return (jsxs("div", { className: styles.toolbar, children: [jsx("button", { className: `${styles.toolBtn} ${transformMode === "translate" ? styles.toolBtnActive : ""}`, onClick: () => setTransformMode("translate"), title: "Translate (G)", children: "\u2725" }), jsx("button", { className: `${styles.toolBtn} ${transformMode === "rotate" ? styles.toolBtnActive : ""}`, onClick: () => setTransformMode("rotate"), title: "Rotate (R)", children: "\u21BB" }), jsx("button", { className: `${styles.toolBtn} ${transformMode === "scale" ? styles.toolBtnActive : ""}`, onClick: () => setTransformMode("scale"), title: "Scale (S)", children: "\u2B21" }), jsx("div", { className: styles.toolSep }), jsx("button", { className: `${styles.toolBtn} ${snapEnabled ? styles.toolBtnActive : ""}`, onClick: () => setSnapEnabled((v) => !v), title: `Snap to Grid (${snapEnabled ? "ON" : "OFF"})`, children: "\uD83E\uDDF2" }), jsx("button", { className: styles.toolBtn, onClick: () => setGizmoSpace((s) => (s === "local" ? "world" : "local")), title: `Orientation: ${gizmoSpace}`, children: gizmoSpace === "local" ? "🔶" : "🌐" }), jsx("div", { className: styles.toolSep }), jsx("button", { className: styles.toolBtn, onClick: () => rootObjectRef.current && focusOnObject(rootObjectRef.current), title: "Focus (F)", children: "\u25CE" }), jsx("button", { className: styles.toolBtn, onClick: () => setCameraPreset("front"), title: "Front view (Numpad 1)", children: "1" }), jsx("button", { className: styles.toolBtn, onClick: () => setCameraPreset("right"), title: "Right view (Numpad 3)", children: "3" }), jsx("button", { className: styles.toolBtn, onClick: () => setCameraPreset("top"), title: "Top view (Numpad 7)", children: "7" }), jsx("div", { className: styles.toolSep }), jsx("button", { className: styles.toolBtn, onClick: deleteSelected, title: "Delete selected (Del)", children: "\uD83D\uDDD1" }), jsx("button", { className: styles.toolBtn, onClick: duplicateSelected, title: "Duplicate (Shift+D)", disabled: !selectedNode, children: "\uD83D\uDCCB" })] }));
8
+ });
9
+ ModelEditorToolbar.displayName = "ModelEditorToolbar";
10
+
11
+ export { ModelEditorToolbar as default };
12
+ //# sourceMappingURL=ModelEditorToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelEditorToolbar.js","sources":["../../../src/model/ModelEditorToolbar.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import React from 'react';
3
+ import styles from './ModelEditor.module.css.js';
4
+
5
+ const ModelEditorViewport = React.memo(({ api }) => {
6
+ const { mountRef, dragOver, handleDragOver, handleDragLeave, handleDrop, handleViewportClick, handleContextMenu, editorMode, polyCount, meshCount, boneCount, shadingMode, setShadingMode, gizmoSpace, setGizmoSpace, contextMenu, closeContextMenu, addPrimitive, addSceneLight, duplicateSelected, deleteSelected, selectedNode, rootObjectRef, focusOnObject, snapEnabled, setSnapEnabled, } = api;
7
+ return (jsxs(Fragment, { children: [jsxs("div", { ref: mountRef, className: `${styles.viewportContainer} ${dragOver ? styles.dragOver : ""}`, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: handleViewportClick, onContextMenu: handleContextMenu, children: [jsxs("div", { className: styles.viewportOverlay, children: [jsxs("span", { className: styles.viewportBadge, children: [editorMode.toUpperCase(), " MODE"] }), jsxs("span", { className: styles.viewportBadge, children: [polyCount.toLocaleString(), " tris \u00B7 ", meshCount, " meshes \u00B7 ", boneCount, " bones"] })] }), jsx("div", { className: styles.viewportShadingBar, children: ["wireframe", "solid", "material", "rendered"].map((m) => (jsx("button", { className: `${styles.shadingBtn} ${shadingMode === m ? styles.shadingBtnActive : ""}`, onClick: (e) => { e.stopPropagation(); setShadingMode(m); }, title: m.charAt(0).toUpperCase() + m.slice(1), children: m === "wireframe" ? "◇" : m === "solid" ? "◆" : m === "material" ? "🎨" : "☀" }, m))) }), jsx("div", { className: styles.viewportGizmoInfo, children: jsx("button", { className: styles.shadingBtn, onClick: (e) => {
8
+ e.stopPropagation();
9
+ setGizmoSpace((s) => (s === "local" ? "world" : "local"));
10
+ }, title: `Orientation: ${gizmoSpace}`, children: gizmoSpace === "local" ? "🔶 Local" : "🌐 World" }) }), dragOver && (jsx("div", { className: styles.viewportDropZone, children: jsx("span", { children: "Drop 3D files here" }) }))] }), contextMenu && (jsxs("div", { className: styles.contextMenu, style: { top: contextMenu.y, left: contextMenu.x }, onClick: closeContextMenu, children: [jsxs("div", { className: styles.contextItem, onClick: () => addPrimitive("cube"), children: [jsx("span", { children: "Add Cube" }), jsx("span", { className: styles.contextKey, children: "Shift+A" })] }), jsx("div", { className: styles.contextItem, onClick: () => addPrimitive("sphere"), children: jsx("span", { children: "Add Sphere" }) }), jsx("div", { className: styles.contextItem, onClick: () => addSceneLight("point"), children: jsx("span", { children: "Add Point Light" }) }), jsx("div", { className: styles.contextSep }), jsxs("div", { className: styles.contextItem, onClick: duplicateSelected, style: !selectedNode ? { opacity: 0.4, pointerEvents: "none" } : {}, children: [jsx("span", { children: "Duplicate" }), jsx("span", { className: styles.contextKey, children: "Shift+D" })] }), jsxs("div", { className: styles.contextItem, onClick: deleteSelected, style: !selectedNode ? { opacity: 0.4, pointerEvents: "none" } : {}, children: [jsx("span", { children: "Delete" }), jsx("span", { className: styles.contextKey, children: "Del" })] }), jsx("div", { className: styles.contextSep }), jsxs("div", { className: styles.contextItem, onClick: () => {
11
+ if (rootObjectRef.current)
12
+ focusOnObject(rootObjectRef.current);
13
+ }, children: [jsx("span", { children: "Focus Camera" }), jsx("span", { className: styles.contextKey, children: "F" })] }), jsx("div", { className: styles.contextItem, onClick: () => setSnapEnabled((v) => !v), children: jsxs("span", { children: [snapEnabled ? "✓ " : "", "Snap to Grid"] }) })] }))] }));
14
+ });
15
+ ModelEditorViewport.displayName = "ModelEditorViewport";
16
+
17
+ export { ModelEditorViewport as default };
18
+ //# sourceMappingURL=ModelEditorViewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelEditorViewport.js","sources":["../../../src/model/ModelEditorViewport.tsx"],"sourcesContent":[null],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import * as THREE from 'three';
2
+
3
+ /**
4
+ * Shared types, constants, and helpers for the ModelEditor.
5
+ */
6
+ /* ═══════════════════════════════════════════
7
+ Constants & helpers
8
+ ═══════════════════════════════════════════ */
9
+ const DEG = 180 / Math.PI;
10
+ const fmtTime = (s) => {
11
+ const m = Math.floor(s / 60);
12
+ const sec = (s % 60).toFixed(2);
13
+ return `${m}:${sec.padStart(5, "0")}`;
14
+ };
15
+ const SUPPORTED_EXTENSIONS = [
16
+ ".fbx",
17
+ ".glb",
18
+ ".gltf",
19
+ ".obj",
20
+ ".mtl",
21
+ ".dae",
22
+ ".stl",
23
+ ".ply",
24
+ ".3ds",
25
+ ".3mf",
26
+ ".amf",
27
+ ".pcd",
28
+ ".vtk",
29
+ ".vtp",
30
+ ".wrl",
31
+ ".vrml",
32
+ ".gcode",
33
+ ".svg",
34
+ ".usdz",
35
+ ];
36
+ /* ═══════════════════════════════════════════
37
+ AI helpers — convert pose3D to AnimationClip
38
+ ═══════════════════════════════════════════ */
39
+ /** Standard bone names mapping from pose keypoints */
40
+ const POSE_TO_BONE = {
41
+ nose: "Head",
42
+ left_eye: "Head",
43
+ right_eye: "Head",
44
+ left_ear: "Head",
45
+ right_ear: "Head",
46
+ left_shoulder: "LeftArm",
47
+ right_shoulder: "RightArm",
48
+ left_elbow: "LeftForeArm",
49
+ right_elbow: "RightForeArm",
50
+ left_wrist: "LeftHand",
51
+ right_wrist: "RightHand",
52
+ left_hip: "LeftUpLeg",
53
+ right_hip: "RightUpLeg",
54
+ left_knee: "LeftLeg",
55
+ right_knee: "RightLeg",
56
+ left_ankle: "LeftFoot",
57
+ right_ankle: "RightFoot",
58
+ };
59
+ function pose3dToClip(result) {
60
+ var _a, _b, _c;
61
+ if (!result.frames || result.frames.length === 0)
62
+ return null;
63
+ const fps = result.fps || 30;
64
+ const tracks = [];
65
+ // Group keypoints by bone across all frames
66
+ const boneData = new Map();
67
+ for (const frame of result.frames) {
68
+ const t = (_a = frame.timestamp_sec) !== null && _a !== void 0 ? _a : frame.frame_index / fps;
69
+ // Take first person
70
+ const person = (_b = frame.persons) === null || _b === void 0 ? void 0 : _b[0];
71
+ if (!person)
72
+ continue;
73
+ for (const kp of person.keypoints) {
74
+ const boneName = POSE_TO_BONE[kp.name];
75
+ if (!boneName)
76
+ continue;
77
+ let data = boneData.get(boneName);
78
+ if (!data) {
79
+ data = { times: [], positions: [] };
80
+ boneData.set(boneName, data);
81
+ }
82
+ data.times.push(t);
83
+ // Scale pose coordinates to reasonable 3D space
84
+ data.positions.push(kp.x * 0.01, kp.y * 0.01, kp.z * 0.01);
85
+ }
86
+ }
87
+ for (const [boneName, data] of boneData) {
88
+ tracks.push(new THREE.VectorKeyframeTrack(`${boneName}.position`, data.times, data.positions));
89
+ }
90
+ if (tracks.length === 0)
91
+ return null;
92
+ const duration = (_c = result.frames[result.frames.length - 1].timestamp_sec) !== null && _c !== void 0 ? _c : result.frame_count / fps;
93
+ return new THREE.AnimationClip("AI_Pose", duration, tracks);
94
+ }
95
+
96
+ export { DEG, POSE_TO_BONE, SUPPORTED_EXTENSIONS, fmtTime, pose3dToClip };
97
+ //# sourceMappingURL=modelEditorTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelEditorTypes.js","sources":["../../../src/model/modelEditorTypes.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}